// 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);
});
});
});
})();