Crow personas and generated banter
- personas.go: backstory, prompt policy and output policy per crow; Hugin and Munin grounded in Grimnismal 20 and Gylfaginning 38; every working crow also follows a common output policy - Personas go into each crow's instructions; Sentry keeps JSON-only - banter.go: retrieve backstory, relationships and recent flock memory, then the speaking crow generates one line in character; max 2 per list against the list budget, never blocks work, unusable lines dropped - crow.banter event, GET /api/crows, `crows personas` -> PERSONAS.md - UI: epithets on tiles and messages, banter as quiet asides Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UQnSw4RRWp8uqpj3nsnnXF
This commit is contained in:
13 files changed
+824
-8
No files matched your search
@@ -75,3 +75,17 @@ export async function createNest(name: string, crows: string[]): Promise<Nest> {
|
||||
if (!res.ok) throw new Error(String(body.message ?? `Couldn't build that nest (${res.status}).`));
|
||||
return { nestId: String(body.nest_id), name: String(body.name), crows: (body.crows ?? []).map(String) };
|
||||
}
|
||||
|
||||
// ---------- personas ----------
|
||||
export type Persona = { name: string; epithet: string; strength: string; backstory: string };
|
||||
|
||||
export async function getCrows(): Promise<Map<string, Persona>> {
|
||||
const out = new Map<string, Persona>();
|
||||
try {
|
||||
const res = await fetch("/api/crows");
|
||||
if (res.ok) for (const p of await res.json()) out.set(String(p.name), { name: String(p.name), epithet: String(p.epithet), strength: String(p.strength), backstory: String(p.backstory) });
|
||||
} catch {
|
||||
// No personas: tiles show names only.
|
||||
}
|
||||
return out;
|
||||
}
|
||||
Reference in new issue
Block a user