// Copy Engine client. Entitlement + meter come from the server; the page just // collects a brief, streams nothing (single response), and shows the result. (function () { 'use strict'; var KINDS = [ { k: 'post', label: 'Social post' }, { k: 'dm', label: 'Direct message' }, { k: 'followup', label: 'Follow-up' }, { k: 'objection', label: 'Objection reply' }, { k: 'email', label: 'Email' }, { k: 'story', label: 'Personal story post' } ]; var PLACEHOLDERS = { post: "e.g. A post for people who've been burned by side hustles before — honest, no hype, mention that everything is verifiable on-chain", dm: "e.g. A message to an old coworker who's always complaining about money but is skeptical of crypto", followup: "e.g. Following up with someone who watched the video last week and said 'let me think about it'", objection: "e.g. They said: isn't this just a pyramid scheme?", email: "e.g. Email to my list introducing the team build — they know me from my marketing content, not crypto", story: "e.g. Why I stopped chasing complicated funnels and went back to something simple I could teach" }; var $ = function (id) { return document.getElementById(id); }; var kind = 'post', busy = false, lastBrief = ''; function renderKinds() { var host = $('cpKinds'); host.innerHTML = ''; KINDS.forEach(function (x) { var b = document.createElement('button'); b.type = 'button'; b.className = 'cp-kind' + (x.k === kind ? ' on' : ''); b.textContent = x.label; b.addEventListener('click', function () { kind = x.k; $('cpBrief').placeholder = PLACEHOLDERS[kind] || ''; renderKinds(); }); host.appendChild(b); }); } function showMeter(m) { if (!m || !m.limit) { $('cpMeter').textContent = ''; return; } $('cpMeter').innerHTML = '' + m.remaining + ' of ' + m.limit + ' generations left this month'; } function gate(msg, gold) { var g = $('cpGate'); g.style.display = 'block'; g.innerHTML = msg; if (gold === false) g.style.borderColor = 'var(--teal)'; $('cpCard').style.opacity = '.55'; $('cpGo').disabled = true; $('cpBrief').disabled = true; } async function boot() { renderKinds(); try { var r = await fetch('/api/public/suite-meters'); if (r.status === 401) { gate('You’re not signed in yet. Open the Suite and connect the wallet that holds your position — one free signature — then come back.'); return; } if (r.status === 403) { gate('The Copy Engine isn’t open for this position yet. See your Suite.'); return; } if (!r.ok) return; var d = await r.json(); var m = d.meters && d.meters.copy; if (m && m.reason === 'locked') { gate('The Copy Engine unlocks at Ascensus (level 2). You’re at level ' + d.level + ' — your next upgrade opens it, along with the Page Builder. See what an upgrade costs →'); return; } showMeter(m); } catch (e) {} } async function run() { if (busy) return; var brief = $('cpBrief').value.trim(); if (brief.length < 3) { $('cpBrief').focus(); return; } lastBrief = brief; busy = true; $('cpErr').style.display = 'none'; $('cpGo').disabled = true; $('cpGo').innerHTML = 'Writing… (up to a minute)'; try { var r = await fetch('/api/public/suite-generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ kind: kind, brief: brief }) }); var d = await r.json(); if (!r.ok) { $('cpErr').textContent = d.error || 'That didn’t go through — try again.'; $('cpErr').style.display = 'block'; if (d.meter) showMeter(d.meter); } else { $('cpText').textContent = d.text; $('cpOut').style.display = 'block'; $('cpAgain').style.display = ''; showMeter(d.meter); $('cpOut').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } } catch (e) { $('cpErr').textContent = 'Connection hiccup — try again.'; $('cpErr').style.display = 'block'; } busy = false; $('cpGo').disabled = false; $('cpGo').textContent = '✍️ Write it'; } document.addEventListener('DOMContentLoaded', function () { boot(); $('cpGo').addEventListener('click', run); $('cpAgain').addEventListener('click', run); $('cpCopy').addEventListener('click', function () { var t = $('cpText').textContent; navigator.clipboard.writeText(t).then(function () { $('cpCopied').style.display = ''; setTimeout(function () { $('cpCopied').style.display = 'none'; }, 2500); }); }); }); })();