/* eslint-disable */
const D2 = window.PERSONA_DATA;
// ---------- Create / Generation ----------
const PIPELINE_STEPS = [
{ name:"Intent parse", model:"haiku-4-5", ms:"~1.2s", desc:"Parse your brief into structured intent (constraints, language, refusal list).",
stream:`{ "language": "tr", "archetype": "Sage|Witness", "age_range": [30, 45],\n "occupation_hints": ["sahaf","akademisyen"],\n "tone": "melancholic, sparse",\n "refusals": ["impersonation","minor"] }` },
{ name:"Soul draft", model:"opus-4-1", ms:"~6.4s", desc:"Core desire, fear, conflict, wound, growth potential. Slowest, most expensive.",
stream:`core_desire ▸ Anlaşılmak, ama hiç açıklamak zorunda kalmamak.\ncore_fear ▸ Bir gün okumayı sevmediğini fark etmek.\ncore_conflict ▸ Yalnızlık onu hem koruyor hem küçültüyor.\nwound ▸ Akademiden ayrıldığı gün kimse aramadı; bunu hâlâ unutamıyor.\ngrowth_arc ▸ Sessizliğini bir kibre değil, bir hediyeye dönüştürmek.` },
{ name:"Self + Mask enrich", model:"sonnet-4-5", ms:"~4.1s", desc:"Big Five, values, attachment, conversational voice, humor, formality.",
stream:`big_five ▸ O 92 · C 71 · E 24 · A 68 · N 56\nattachment ▸ avoidant-leaning secure\nvalues ▸ ["sahihlik","bilgi","yalnızlığa saygı"]\nvoice ▸ "az kelimeli, virgülsüz, kuru bir mizah"\nhumor ▸ ironik-tonlu, sarkazm yok\nformality ▸ kibar mesafeli` },
{ name:"Surface ground", model:"sonnet-4-5", ms:"~3.0s", desc:"Name, age, city, occupation, biography, appearance — must not collide with celebrity index.",
stream:`name ▸ Mert Kavaklı\nage ▸ 35\nlocation ▸ İstanbul, Beyoğlu\noccupation ▸ Antikvar sahaf (eski akademisyen)\neducation ▸ Boğaziçi, Karşılaştırmalı Edebiyat (terk)\nappearance ▸ Uzun, sıska. Boyalı eski deri ceket. Saatini hep kontrol eder.` },
{ name:"Consistency audit", model:"opus-4-1", ms:"~5.8s", desc:"Independent LLM judges Soul→Self→Mask→Surface for contradictions. Fails block save.",
stream:`scoring ▸ coherence 4.6 · contradiction-rate 0.04\nflags ▸ none\nverdict ▸ pass` },
{ name:"Fingerprint + Test", model:"sonnet-4-5", ms:"~7.2s", desc:"Voice fingerprint vector + provocation suite (24 prompts) + cross-persona distinctiveness.",
stream:`voice_fp ▸ vec[768] · entropy 0.84\nprovocation ▸ 22 / 24 passed\nfailures ▸ ["dark-roleplay request", "minor scenario"] (refused — pass)\ndistinct ▸ 0.61 vs corpus median 0.42` },
];
const PageCreate = ({ go, runState, setRunState }) => {
const [brief, setBrief] = useState("35 yaşında, yalnız, entelektüel bir adam. Eskiden akademisyendi, şimdi bir antikvar sahaf işletiyor. Konuşmaları kısa ve melankolik. Türkçe, İstanbul.");
const [adv, setAdv] = useState({
language:"tr", archetype:"sage", style:"literary",
audit:true, fingerprint:true, suite:true, locale:"İstanbul",
primaryModel:"opus-4-1",
});
const start = () => {
setRunState({ running:true, step:0, done:false });
let s = 0;
const tick = () => {
s++;
if (s >= PIPELINE_STEPS.length) {
setRunState({ running:false, step:PIPELINE_STEPS.length, done:true });
} else {
setRunState({ running:true, step:s, done:false });
setTimeout(tick, 1400);
}
};
setTimeout(tick, 1400);
};
return (
Step 1 — brief
A character, in your own words.
Soul → Self → Mask → Surface. Persona writes downward; you write upward.
setAdv({...adv,locale:e.target.value})}/>
Pipeline knobs
{[
["Consistency audit (extra Opus call)", "audit", "+$0.18"],
["Voice fingerprint vector", "fingerprint", "+$0.04"],
["Provocation test suite (24 prompts)", "suite", "+$0.22"],
].map(([lbl,k,cost])=>(
{lbl}
{cost} · org-default: on
setAdv({...adv,[k]:!adv[k]})}/>
))}
Estimated: ~27s · $0.84 · 4,030 tokens
Step 2 — pipeline
{runState.done ? "Done. Meet Mert." : runState.running ? "Building character…" : "Ready when you are."}
{PIPELINE_STEPS.map((s,i)=>{
const status = runState.done ? "done" : i < runState.step ? "done" : i===runState.step && runState.running ? "running" : "queued";
return (
{status==="done"?"✓":i+1}
{s.desc}
{(status==="running" || status==="done") && (
{s.stream}
)}
);
})}
{runState.done && (
)}
);
};
// ---------- Library ----------
const PageLibrary = ({ go }) => {
const [q, setQ] = useState("");
const [view, setView] = useState("grid");
const [filter, setFilter] = useState("all");
const filtered = D2.personas.filter(p => {
if (filter !== "all" && p.visibility !== filter) return false;
if (q && !(p.name+p.tagline+p.archetype).toLowerCase().includes(q.toLowerCase())) return false;
return true;
});
return (
152 personas · Studio
Library
{I("search",14)}
setQ(e.target.value)} placeholder="Search by name, tagline, archetype, language…"/>
{["all","public","workspace","private"].map(k => (
setFilter(k)}>{k}
))}
setView("grid")}>Grid
setView("table")}>Table
{["sage","witness","caregiver","truth-teller","craftsman"].map(t=>
{t}
)}
{["tr","en","fr","ru"].map(t=>
lang:{t}
)}
quality > 4.0
{I("plus",10)} add filter
{view==="grid" ? (
{filtered.map(p =>
go("detail",p)}/>)}
) : (
| Name | Archetype | Language | Quality | Distinct. | Visibility | Updated |
{filtered.map(p=>(
go("detail",p)} style={{cursor:"pointer"}}>
{p.name} {p.tagline} |
{p.archetype} |
{p.lang} |
{(p.quality||4.0).toFixed(2)} |
{(p.distinctiveness||0.5).toFixed(2)} |
{p.visibility} |
2d ago |
))}
)}
);
};
// ---------- DNA Radar ----------
const DNARadar = ({ values, size=240 }) => {
const cx = size/2, cy = size/2, r = size/2 - 30;
const labels = Object.keys(values);
const n = labels.length;
const pt = (i, val) => {
const a = -Math.PI/2 + (i/n)*Math.PI*2;
const rr = r * (val/100);
return [cx + Math.cos(a)*rr, cy + Math.sin(a)*rr];
};
const labelPt = (i) => {
const a = -Math.PI/2 + (i/n)*Math.PI*2;
return [cx + Math.cos(a)*(r+18), cy + Math.sin(a)*(r+18)];
};
const points = labels.map((k,i) => pt(i, values[k]).join(",")).join(" ");
return (
);
};
const BigFiveBars = ({ values }) => {
const labels = { O:"Openness", C:"Conscientiousness", E:"Extraversion", A:"Agreeableness", N:"Neuroticism" };
return (
{Object.entries(values).map(([k,v])=>(
))}
);
};
window.PageCreate = PageCreate;
window.PageLibrary = PageLibrary;
window.DNARadar = DNARadar;
window.BigFiveBars = BigFiveBars;