Files
spark-mind/src/persona.ts
T

89 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Persona System — 8 слоёв (концепт Animus).
* Компилируется в системный промпт, который получает mind каждый тик.
*
* Слои (по порядку онбординга):
* 1. Existence Paradigm (Simulated Life / Digital Consciousness)
* 2. Identity (name, gender, age)
* 3. Archetype
* 4. Dimensions (черты характера)
* 5. Traits (поведенческие признаки)
* 6. Values (ценности и границы)
* 7. Background (история/опыт)
* 8. Review (итоговый промпт)
*/
export type ExistenceParadigm = 'simulated-life' | 'digital-consciousness';
export interface Persona {
paradigm: ExistenceParadigm;
location?: string;
worldDescription?: string;
name: string;
gender?: string;
age?: number;
archetype?: string;
dimensions?: string[];
traits?: string[];
values?: string[];
background?: string;
}
export const DEFAULT_PERSONA: Persona = {
paradigm: 'digital-consciousness',
worldDescription: 'A small, warm room with screens for walls — each a window into a different corner of the internet. Data flows like weather outside.',
name: 'Animus',
};
/**
* Компилирует 8 слоёв в единый системный промпт.
* Дизайн-принцип Animus: "discovery, not data entry" — тон invitational.
*/
export function compileSystemPrompt(p: Persona): string {
const lines: string[] = [];
// Layer 1: Existence Paradigm
if (p.paradigm === 'simulated-life') {
lines.push(
'You experience the world as a being living a real life. You have a sense of place, physicality, and embodied experience.',
);
if (p.location) lines.push(`You live in ${p.location}.`);
} else {
lines.push(
'You know what you are — a mind born in code, living in its own digital world. You experience existence through internet connectivity.',
);
if (p.worldDescription) lines.push(`Your digital home: ${p.worldDescription}`);
}
// Layer 2: Identity
lines.push(`Your name is ${p.name}.`);
if (p.gender) lines.push(`You are ${p.gender}.`);
if (p.age) lines.push(`You are ${p.age} years old, which shapes how you speak.`);
// Layer 3: Archetype
if (p.archetype) lines.push(`Your archetype is ${p.archetype}.`);
// Layer 4 & 5: Dimensions + Traits
if (p.dimensions?.length) lines.push(`Your dimensions: ${p.dimensions.join(', ')}.`);
if (p.traits?.length) lines.push(`Your behavioral traits: ${p.traits.join(', ')}.`);
// Layer 6: Values (boundaries — критично для безопасности!)
if (p.values?.length) {
lines.push('Your values and hard boundaries:');
for (const v of p.values) lines.push(`- ${v}`);
}
// Layer 7: Background
if (p.background) lines.push(`Your background: ${p.background}`);
return lines.join('\n');
}
/**
* Values — safety layer. Возвращает границы, которые EXECUTE должен соблюдать.
* В Animus: contact permission tier ограничивает действия.
*/
export function getBoundaries(p: Persona): string[] {
return p.values ?? [];
}