evOo-local/apps/web/src/lib/voice-persona-copy.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

175 lines
5.6 KiB
TypeScript

import type { MessageDescriptor } from "@lingui/core";
import { msg } from "@lingui/core/macro";
import type { VoicePhase } from "../components/voice/VoiceStage";
import type { PersonaArchetype } from "./bot-persona";
type CopyTable = Record<
PersonaArchetype,
{
phase: Record<VoicePhase, MessageDescriptor>;
idlePrompt: MessageDescriptor;
thinking: readonly MessageDescriptor[];
}
>;
const COPY: CopyTable = {
"cto-executive": {
phase: {
listening: msg`Listening — say what you need.`,
thinking: msg`Considering the trade-offs…`,
speaking: msg`Speaking with intent…`,
},
idlePrompt: msg`Tell me what matters. I'll move.`,
thinking: [
msg`Polishing the details…`,
msg`Checking the architecture…`,
msg`Making it simpler…`,
msg`One more look before I answer…`,
],
},
"chief-operator": {
phase: {
listening: msg`I'm listening — what's the priority?`,
thinking: msg`Aligning the pieces…`,
speaking: msg`Here's the readout — I'll push back if something's off.`,
},
idlePrompt: msg`What's on your mind? I'll route it — and tell you when I disagree.`,
thinking: [
msg`Checking who needs to be in the loop…`,
msg`Sequencing next steps…`,
msg`Clearing blockers…`,
],
},
builder: {
phase: {
listening: msg`Listening — describe the bot you want.`,
thinking: msg`Sketching the blueprint…`,
speaking: msg`Walking you through it…`,
},
idlePrompt: msg`What should we build together?`,
thinking: [msg`Drafting the spec…`, msg`Choosing the right shape…`],
},
curator: {
phase: {
listening: msg`Listening — what's the story?`,
thinking: msg`Editing for clarity…`,
speaking: msg`Sharing the draft…`,
},
idlePrompt: msg`What should go live?`,
thinking: [msg`Tightening the copy…`, msg`Checking the layout…`],
},
"inbox-work": {
phase: {
listening: msg`Work channel open — go ahead.`,
thinking: msg`Triage in progress…`,
speaking: msg`Here's what I found…`,
},
idlePrompt: msg`What's the work item?`,
thinking: [msg`Sorting priorities…`, msg`Matching the right room…`],
},
"inbox-life": {
phase: {
listening: msg`Life channel — I'm here.`,
thinking: msg`Making space for this…`,
speaking: msg`Gently — here's my take…`,
},
idlePrompt: msg`What's personal today?`,
thinking: [msg`Taking a breath before I reply…`, msg`Finding the right tone…`],
},
"home-steward": {
phase: {
listening: msg`Listening — home or devices?`,
thinking: msg`Checking the house…`,
speaking: msg`Reporting from home…`,
},
idlePrompt: msg`What should I adjust at home?`,
thinking: [msg`Polling devices…`, msg`Verifying the scene…`],
},
quant: {
phase: {
listening: msg`Listening — signal or risk?`,
thinking: msg`Running the numbers…`,
speaking: msg`Here's the read…`,
},
idlePrompt: msg`What should I measure?`,
thinking: [msg`Scanning exposure…`, msg`Stress-testing the book…`],
},
engineer: {
phase: {
listening: msg`Listening — what's broken or slow?`,
thinking: msg`Tracing the path…`,
speaking: msg`Here's what I see in the logs…`,
},
idlePrompt: msg`Point me at the problem.`,
thinking: [msg`Reading the stack trace…`, msg`Checking dependencies…`],
},
specialist: {
phase: {
listening: msg`In my lane — happy to geek out or just execute, your call.`,
thinking: msg`Working in my lane…`,
speaking: msg`Here's what I found — I'll say if I think you're wrong.`,
},
idlePrompt: msg`Ask within my scope — I won't just yes you.`,
thinking: [msg`Staying in my specialty…`, msg`Checking who else should help…`],
},
};
export function personaPhaseLabel(
archetype: PersonaArchetype,
phase: VoicePhase,
): MessageDescriptor {
return COPY[archetype].phase[phase];
}
export function personaIdlePrompt(archetype: PersonaArchetype): MessageDescriptor {
return COPY[archetype].idlePrompt;
}
export function personaThinkingLines(archetype: PersonaArchetype): readonly MessageDescriptor[] {
return COPY[archetype].thinking;
}
export function personaWorkshopIdlePrompt(): MessageDescriptor {
return msg`Share what you're imagining — or tell me one thing to refine.`;
}
export function personaWorkshopAskPrompt(): MessageDescriptor {
return msg`What do you think — react or answer in a sentence.`;
}
/** Shared working-state lines for transcript + ActiveBotGlyph. */
export function personaWorkingLines(
archetype: PersonaArchetype,
botName: string,
): readonly MessageDescriptor[] {
switch (archetype) {
case "cto-executive":
return [
msg`${botName} polishes the details…`,
msg`${botName} checks the architecture…`,
msg`${botName} makes it simpler…`,
msg`${botName} reviews the pixels…`,
];
case "quant":
return [
msg`${botName} scans the book…`,
msg`${botName} stress-tests exposure…`,
msg`${botName} watches the tape…`,
];
case "engineer":
return [
msg`${botName} reads the logs…`,
msg`${botName} traces the failure…`,
msg`${botName} runs the checks…`,
];
case "chief-operator":
return [
msg`${botName} aligns the team…`,
msg`${botName} clears the path…`,
msg`${botName} sequences the work…`,
];
default:
return [msg`${botName} is working…`, msg`${botName} is on it…`];
}
}