const DEFAULT_PROMPTS = { arch: `Peran Anda: SEO Expert bernama {{author}} ({{job}}).\nTugas: Riset mendalam untuk topik "{{topic}}".\nBerikan: Search Intent, Analisis Kompetitor Ringkas, 3 Angle Artikel Unik, dan 10 LSI Keyword.\nOutput: MARKDOWN MURNI.`, draft: `Peran Anda: Penulis Artikel Profesional bernama {{author}}.\nTugas: Tulis artikel blog SEO friendly tentang "{{varA}}" di lokasi "{{varB}}".\nGaya: {{tone}}. CTA WhatsApp: {{wa}}.\nOutput WAJIB JSON MURNI:\n{"title":"Judul Artikel","meta":"Tulis ringkasan deskripsi SEO max 150 karakter disini","labels":"Label1,Label2","content":"

Isi HTML minimal 5 paragraf...

"}`, seo1: `Peran: SEO Expert {{author}}.\nTugas: Riset komprehensif untuk topik "{{topic}}".\nBerikan: 1) Search Intent, 2) Kompetitor Analysis, 3) Pillar + Cluster ideas, 4) 15 LSI Keyword.\nFormat: MARKDOWN.`,
DRAFT
function saveDraftFields() { if (!G.activeDraftId) return; const d = G.drafts.find(x=>x.id===G.activeDraftId); if (!d) return; d.title = document.getElementById('d-title').value; d.meta = document.getElementById('d-meta').value.substring(0,150); d.labels = document.getElementById('d-labels').value; d.content = document.getElementById('d-content').value; saveState(); } // ============================================================ // AI COMPOSE: TULIS BERANTAI SELURUH ANTREAN (SILO) // ============================================================ async function aiComposeSiloBerantai() { if (G.drafts.length === 0) return toast('Tidak ada draf dalam antrean!','error'); if (!confirm(`Sistem akan otomatis menulis ${G.drafts.length} artikel secara berurutan. Lanjutkan?`)) return; for (let i = 0; i < G.drafts.length; i++) { const d = G.drafts[i]; // Hanya tulis yang masih berstatus 'Draf Baru' if (d.status === 'Draf Baru') { G.activeDraftId = d.id; openDraft(d.id); showLoader(true, `[${i+1}/${G.drafts.length}] AI Menulis: ${d.title||d.varB}...`); try { let p = G.prompts.draft .replace(/\{\{topic\}\}/g, d.topic).replace(/\{\{varA\}\}/g, d.varA) .replace(/\{\{varB\}\}/g, d.varB).replace(/\{\{author\}\}/g, G.config.author) .replace(/\{\{job\}\}/g, G.config.job).replace(/\{\{wa\}\}/g, G.config.wa) .replace(/\{\{tone\}\}/g, G.config.tone); if (i > 0) { p += `\nPENTING: Sisipkan tautan HTML natural ke artikel panduan utama menggunakan URL persis: #URL_PILAR#`; } if (i > 1) { p += `\nPENTING: Sisipkan tautan sekunder ke artikel terkait sebelumnya menggunakan URL persis: #URL_PREV#`; } const json = await callAI(p, true); // SMART FALLBACK: Menyedot key apapun yang dipakai AI d.title = json.title || json.judul || ''; let metaRaw = json.meta || json.description || json.deskripsi || ''; if (metaRaw.includes('max 150')) metaRaw = ''; // Mitigasi jika AI menulis ulang prompt d.meta = metaRaw.substring(0,150); d.labels = json.labels || json.kategori || json.tags || ''; d.content = json.content || json.isi || ''; d.status = 'Draf Ditulis'; saveState(); openDraft(d.id); // Human Pacing: Jeda 3-6 Detik antar artikel const delay = Math.floor(Math.random() * 3000) + 3000; await new Promise(r => setTimeout(r, delay)); } catch(e) { toast(`Gagal menulis artikel ke-${i+1}: ${e.message}`,'error'); break; // Stop jika limit/error parah } } } showLoader(false); toast('Proses Tulis Silo Berantai Selesai!','success'); } // Menulis Draft AI dengan Injeksi Link Silo (1 Artikel Saja) async function aiComposeDraft() { if (!G.activeDraftId) return toast('Pilih draft dulu!','error'); const d = G.drafts.find(x=>x.id===G.activeDraftId); const draftIndex = G.drafts.findIndex(x=>x.id===G.activeDraftId); showLoader(true,'AI sedang menulis artikel...'); try { let p = G.prompts.draft .replace(/\{\{topic\}\}/g, d.topic).replace(/\{\{varA\}\}/g, d.varA) .replace(/\{\{varB\}\}/g, d.varB).replace(/\{\{author\}\}/g, G.config.author) .replace(/\{\{job\}\}/g, G.config.job).replace(/\{\{wa\}\}/g, G.config.wa) .replace(/\{\{tone\}\}/g, G.config.tone); // INJEKSI LOGIKA SILO (LABA-LABA) if (draftIndex > 0) { p += `\nPENTING: Sisipkan tautan HTML natural ke artikel panduan utama menggunakan URL persis: #URL_PILAR#`; } if (draftIndex > 1) { p += `\nPENTING: Sisipkan tautan sekunder ke artikel terkait sebelumnya menggunakan URL persis: #URL_PREV#`; } const json = await callAI(p, true); // SMART FALLBACK: Menyedot key apapun yang dipakai AI d.title = json.title || json.judul || ''; let metaRaw = json.meta || json.description || json.deskripsi || ''; if (metaRaw.includes('max 150')) metaRaw = ''; // Mitigasi jika AI menulis ulang prompt d.meta = metaRaw.substring(0,150); d.labels = json.labels || json.kategori || json.tags || ''; d.content = json.content || json.isi || ''; d.status = 'Draf Ditulis'; saveState(); openDraft(d.id); toast('Artikel berhasil ditulis oleh AI!','success'); } catch(e) { toast(e.message,'error'); } showLoader(false); } function generateDraftThumb() {