@wordbricks/persona 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory/index.ts","../src/memory/embeddings.ts","../src/memory/logger.ts","../src/memory/openai-embedding.ts","../src/memory/mood.ts","../src/memory/types.ts","../src/memory/profile.ts","../src/memory/prompts.ts","../src/memory/runtime.ts","../src/memory/hindsight.ts","../src/memory/selection.ts","../src/memory/source-ingestion.ts","../src/memory/delete-profile.ts"],"sourcesContent":["import { and, asc, desc, eq, or } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaEmotionalSalience,\n personaEpisodeMemories,\n personaFacts,\n personaHabitPatterns,\n personaInteractionMemories,\n personaProfiles,\n personaSemanticBeliefs,\n personaStyleProfiles,\n PERSONA_BELIEF_STANCES,\n} from \"../schema\";\nimport type {\n NewPersonaEpisodeMemory,\n NewPersonaHabitPattern,\n NewPersonaSemanticBelief,\n NewPersonaStyleProfile,\n PersonaExternalMemoryLocalTargetKind,\n PersonaBeliefStance,\n PersonaBeliefType,\n PersonaEmotionAnnotation,\n PersonaFactObjectType,\n PersonaFactType,\n PersonaMemoryState,\n PersonaEpisodeMemory,\n PersonaHabitPattern,\n PersonaInteractionMemory,\n PersonaPrivacyLevel,\n PersonaProfile,\n PersonaSemanticBelief,\n PersonaStyleProfile,\n PersonaToneVector,\n} from \"../schema\";\nimport {\n backfillPersonaMemoryEmbeddings,\n beliefMemoryText,\n episodeMemoryText,\n factMemoryText,\n habitMemoryText,\n styleMemoryText,\n tryUpsertPersonaMemoryEmbeddings,\n} from \"./embeddings\";\nimport type { HindsightPersonaMemoryClient } from \"./hindsight\";\nimport { personaLogMessage } from \"./logger\";\nimport {\n calculatePersonaMoodUpdate,\n clampScore,\n explainTurnAffect,\n truncateLine,\n} from \"./mood\";\nimport { loadPersonaProfile } from \"./profile\";\nimport {\n PERSONA_CONSOLIDATION_SYSTEM_PROMPT,\n PERSONA_SOURCE_DRAFTING_SYSTEM_PROMPT,\n PERSONA_TURN_PLANNER_SYSTEM_PROMPT,\n} from \"./prompts\";\nimport { resolvePersonaLogger, USER_PREFERENCE_PATTERNS } from \"./runtime\";\nimport {\n createPersonaSourceDocument,\n normalizePersonaFactObjectKey,\n scheduleHindsightRetain,\n} from \"./source-ingestion\";\nimport {\n consolidationOutputSchema,\n MAX_HINDSIGHT_RETAIN_CONTENT_CHARS,\n MAX_MEMORY_ENTRY_CHARS,\n PERSONA_ANSWER_MODES,\n PERSONA_MEMORY_TYPES,\n PERSONA_QUERY_TYPES,\n} from \"./types\";\nimport type {\n DisclosurePolicy,\n PersonaAffectVector,\n PersonaContextGatewayOutput,\n PersonaEmbedder,\n PersonaJsonLlm,\n PersonaMemoryCandidate,\n PersonaMemorySelectionResult,\n PersonaMemoryTriageDecision,\n PersonaMemoryTriageIntent,\n PersonaMemoryTriageSource,\n PersonaMemoryTriageType,\n PersonaMoodEmotionLabel,\n PersonaMoodSignal,\n PersonaMoodUpdateTrace,\n PersonaLogger,\n PersonaQueryType,\n PersonaRuntimeContext,\n PersonaTurnAffectEstimate,\n PersonaTurnPlan,\n} from \"./types\";\n\nexport {\n createHindsightPersonaMemoryClient,\n createHindsightPersonaMemoryConfig,\n createNoopHindsightPersonaMemoryClient,\n hindsightPersonaBankId,\n hindsightPersonaTags,\n} from \"./hindsight\";\nexport type {\n HindsightPersonaMemoryClient,\n HindsightPersonaMemoryConfig,\n HindsightPersonaMemoryEnv,\n HindsightRecallInput,\n HindsightRecallResult,\n HindsightReflectInput,\n HindsightReflectResult,\n HindsightRetainInput,\n HindsightRetainResult,\n} from \"./hindsight\";\nexport {\n backfillPersonaMemoryEmbeddings,\n createOpenAiPersonaEmbedder,\n hashPersonaMemoryText,\n normalizePersonaEmbeddingText,\n upsertPersonaMemoryEmbeddings,\n} from \"./embeddings\";\nexport type { PersonaMemoryEmbeddingEntry } from \"./embeddings\";\nexport * from \"./delete-profile\";\nexport {\n calculatePersonaMoodUpdate,\n estimateTurnAffect,\n explainTurnAffect,\n PERSONA_MOOD_BASELINE,\n updatePersonaMood,\n} from \"./mood\";\nexport {\n copyPersonaProfile,\n forgetPersonaLayerMemory,\n listPersonaAliases,\n listPublicPersonaProfiles,\n loadPersonaProfile,\n publishPersonaProfile,\n upsertPersonaAlias,\n upsertPersonaProfile,\n} from \"./profile\";\nexport {\n PERSONA_CONSOLIDATION_SYSTEM_PROMPT,\n PERSONA_MEMORY_TRIAGE_SYSTEM_PROMPT,\n PERSONA_SOURCE_DRAFTING_SYSTEM_PROMPT,\n PERSONA_TURN_PLANNER_SYSTEM_PROMPT,\n} from \"./prompts\";\nexport {\n calculateMemoryAvailability,\n normalizeCosineSimilarity,\n selectPersonaMemories,\n selectPersonaMemoriesWithScores,\n} from \"./selection\";\nexport {\n evaluatePostResponseInteractionMemory,\n formatWorkspacePrompt,\n planPersonaTurnWithLlm,\n preparePersonaRuntimeContext,\n recallPersonaMemoriesForCue,\n recordPostResponsePersonaMemoryReview,\n shouldRecordInteractionMemory,\n triageInteractionMemoryWithLlm,\n triagePostResponseInteractionMemoryWithLlm,\n} from \"./runtime\";\nexport {\n activatePersonaDraftMemory,\n chunkPersonaSourceText,\n draftPersonaMemoriesFromSourceDocument,\n formatPersonaSourceExcerptForQuery,\n hashPersonaSourceContent,\n ingestPersonaSourceDocument,\n} from \"./source-ingestion\";\nexport type {\n PersonaDraftMemorySummary,\n PersonaSourceDraftBelief,\n PersonaSourceDraftEpisode,\n PersonaSourceDraftFact,\n PersonaSourceDraftHabit,\n PersonaSourceDraftMemoryInput,\n PersonaSourceDraftMemoryResult,\n PersonaSourceDraftStyleProfile,\n PersonaSourceIngestionResult,\n PersonaSourceTextChunk,\n} from \"./source-ingestion\";\nexport { PERSONA_ANSWER_MODES, PERSONA_MEMORY_TYPES, PERSONA_QUERY_TYPES };\nexport type {\n DisclosurePolicy,\n PersonaAffectVector,\n PersonaAnswerMode,\n PersonaContextGatewayOutput,\n PersonaEmbedder,\n PersonaGateOutput,\n PersonaJsonLlm,\n PersonaMemoryCandidate,\n PersonaMemorySelectionResult,\n PersonaMemoryTriageDecision,\n PersonaMemoryTriageIntent,\n PersonaMemoryTriageSource,\n PersonaMemoryTriageType,\n PersonaLogger,\n PersonaMemoryType,\n PersonaMoodEmotionLabel,\n PersonaMoodEmotionLabelSource,\n PersonaMoodSignal,\n PersonaMoodUpdateTrace,\n PersonaQueryType,\n PersonaRuntimeContext,\n PersonaTurnAffectEstimate,\n PersonaTurnPlan,\n} from \"./types\";\n\n// Bounded Hebbian-style belief updates: repeated confirmation asymptotically\n// approaches certainty, contradiction decays conviction, and crossing the\n// conflict threshold flips the lifecycle state instead of deleting history\n// (reconsolidation, not overwrite).\nconst BELIEF_REINFORCEMENT_RATE = 0.3;\nconst BELIEF_CONTRADICTION_RATE = 0.45;\nconst BELIEF_CONFLICT_THRESHOLD = 0.35;\n\nexport function applyBeliefReinforcement(\n belief: Pick<PersonaSemanticBelief, \"confidence\" | \"strength\">,\n input: { evidenceConfidence: number }\n): { confidence: number; strength: number } {\n const rate = BELIEF_REINFORCEMENT_RATE * clampScore(input.evidenceConfidence);\n return {\n confidence: clampScore(belief.confidence + rate * (1 - belief.confidence)),\n strength: clampScore(belief.strength + rate * (1 - belief.strength)),\n };\n}\n\nexport function applyBeliefContradiction(\n belief: Pick<PersonaSemanticBelief, \"confidence\" | \"strength\">,\n input: { evidenceConfidence: number }\n): { confidence: number; state: PersonaMemoryState; strength: number } {\n const rate = BELIEF_CONTRADICTION_RATE * clampScore(input.evidenceConfidence);\n const strength = clampScore(belief.strength * (1 - rate));\n return {\n confidence: clampScore(belief.confidence * (1 - rate)),\n state: strength < BELIEF_CONFLICT_THRESHOLD ? \"conflicted\" : \"active\",\n strength,\n };\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((entry): entry is string => typeof entry === \"string\");\n}\n\nfunction buildConsolidationUserPrompt(input: {\n existingBeliefs: Pick<\n PersonaSemanticBelief,\n \"domain\" | \"id\" | \"proposition\" | \"strength\"\n >[];\n interactions: {\n id: string;\n summary: string;\n newUserPreference: string | null;\n }[];\n persona: PersonaProfile;\n reflection?: string | null;\n}) {\n return [\n `personaKey: ${input.persona.personaKey}`,\n `displayName: ${input.persona.displayName}`,\n \"\",\n \"Existing beliefs:\",\n ...(input.existingBeliefs.length > 0\n ? input.existingBeliefs.map((belief) =>\n truncateLine(\n `- ${belief.id} [${belief.domain}] strength=${belief.strength.toFixed(2)}: ${belief.proposition}`,\n MAX_MEMORY_ENTRY_CHARS\n )\n )\n : [\"- none\"]),\n \"\",\n \"Interaction memories:\",\n ...input.interactions.map(\n (entry) =>\n `- ${entry.id}: ${entry.summary}${\n entry.newUserPreference\n ? ` preference=${entry.newUserPreference}`\n : \"\"\n }`\n ),\n ...(input.reflection\n ? [\n \"\",\n \"External reflection evidence:\",\n truncateLine(input.reflection, MAX_MEMORY_ENTRY_CHARS),\n \"Use this only as supporting evidence. Local consolidation policy and the listed interaction ids remain authoritative.\",\n ]\n : []),\n ].join(\"\\n\");\n}\n\nfunction hindsightScopeForLayerMemory(input: {\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\" | \"interaction\";\n privacyLevel: PersonaPrivacyLevel;\n summary: string;\n title: string;\n userId?: string | null;\n}): \"persona_global\" | \"persona_user\" | null {\n if (input.memoryKind === \"interaction\") {\n return input.userId ? \"persona_user\" : null;\n }\n if (input.privacyLevel === \"sensitive\") {\n return null;\n }\n if (input.privacyLevel === \"private\" && input.userId) {\n return \"persona_user\";\n }\n if (input.memoryKind === \"episode\" && input.userId) {\n return \"persona_user\";\n }\n if (\n input.memoryKind === \"fact\" &&\n input.userId &&\n USER_PREFERENCE_PATTERNS.some((pattern) =>\n pattern.test(`${input.title}\\n${input.summary}`)\n )\n ) {\n return \"persona_user\";\n }\n return \"persona_global\";\n}\n\nfunction scheduleHindsightLayerMemoryRetain(input: {\n content: Record<string, unknown>;\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n localTargetId: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\" | \"interaction\";\n organizationId: string;\n persona: PersonaProfile;\n privacyLevel: PersonaPrivacyLevel;\n summary: string;\n title: string;\n userId?: string | null;\n}): void {\n const scope = hindsightScopeForLayerMemory({\n memoryKind: input.memoryKind,\n privacyLevel: input.privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n if (!scope) {\n return;\n }\n const themes = [\n ...readStringArray(input.content.themes),\n ...readStringArray(input.content.domains),\n ];\n const content = `${input.title}\\n${input.summary}`.slice(\n 0,\n MAX_HINDSIGHT_RETAIN_CONTENT_CHARS\n );\n scheduleHindsightRetain({\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: input.localTargetId,\n localTargetKind: input.memoryKind,\n metadata: {\n memoryKind: input.memoryKind,\n source: \"rememberPersonaLayerMemory\",\n },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n privacyLevel: input.privacyLevel,\n retainInput: {\n content,\n context: `Durable persona ${input.memoryKind} memory`,\n documentId: `persona_${input.memoryKind}_${input.localTargetId}`,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n privacyLevel: input.privacyLevel,\n scope,\n tags: [`memory_kind_${input.memoryKind}`],\n themes,\n timestamp: new Date(),\n userId: scope === \"persona_user\" ? input.userId : null,\n },\n userId: scope === \"persona_user\" ? input.userId : null,\n });\n}\n\nasync function maybeReflectHindsightConsolidation(input: {\n hindsight?: HindsightPersonaMemoryClient | null;\n interactions: PersonaInteractionMemory[];\n logger?: PersonaLogger;\n organizationId: string;\n persona: PersonaProfile;\n userId?: string | null;\n}): Promise<string | null> {\n if (!input.hindsight || input.interactions.length === 0) {\n return null;\n }\n const logger = resolvePersonaLogger(input.logger);\n try {\n const response = await input.hindsight.reflect({\n context: input.interactions\n .map(\n (interaction) =>\n `${interaction.id}: ${interaction.interactionSummary}`\n )\n .join(\"\\n\")\n .slice(0, MAX_HINDSIGHT_RETAIN_CONTENT_CHARS),\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n query:\n \"What stable persona memory, contradictions, or preference changes are supported by these interaction memories?\",\n scope: input.userId ? \"persona_user\" : \"persona_global\",\n tags: [\"consolidation\"],\n userId: input.userId ?? null,\n });\n return response.text;\n } catch (error) {\n logger.warn(\n personaLogMessage(\"[persona-memory] hindsight reflection failed:\", error)\n );\n return null;\n }\n}\n\nfunction scheduleHindsightConsolidatedMemoryRetain(input: {\n content: string;\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n localTargetId: string;\n localTargetKind: Exclude<\n PersonaExternalMemoryLocalTargetKind,\n \"interaction\" | \"source_document\" | \"source_chunk\"\n >;\n organizationId: string;\n persona: PersonaProfile;\n title: string;\n userId?: string | null;\n}): void {\n const scope = input.userId ? \"persona_user\" : \"persona_global\";\n const privacyLevel = input.userId ? \"private\" : \"internal\";\n scheduleHindsightRetain({\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: input.localTargetId,\n localTargetKind: input.localTargetKind,\n metadata: {\n memoryKind: input.localTargetKind,\n source: \"consolidatePersonaMemoryScope\",\n },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n privacyLevel,\n retainInput: {\n content: `${input.title}\\n${input.content}`.slice(\n 0,\n MAX_HINDSIGHT_RETAIN_CONTENT_CHARS\n ),\n context: `Consolidated persona ${input.localTargetKind} memory`,\n documentId: `persona_${input.localTargetKind}_${input.localTargetId}`,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n privacyLevel,\n scope,\n tags: [\"consolidated_memory\", `memory_kind_${input.localTargetKind}`],\n themes: [],\n timestamp: new Date(),\n userId: input.userId ?? null,\n },\n userId: input.userId ?? null,\n });\n}\n\nfunction readFiniteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nconst PERSONA_TONE_KEYS = [\n \"warmth\",\n \"formality\",\n \"humor\",\n \"directness\",\n \"humility\",\n \"firmness\",\n \"defensiveness\",\n] as const;\n\nexport function parsePersonaToneVector(value: unknown): PersonaToneVector {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n const record = value as Record<string, unknown>;\n const tone: PersonaToneVector = {};\n for (const key of PERSONA_TONE_KEYS) {\n const raw = readFiniteNumber(record[key]);\n if (raw !== null) {\n tone[key] = clampScore(raw);\n }\n }\n return tone;\n}\n\nexport function parsePersonaBeliefStance(value: unknown): PersonaBeliefStance {\n return typeof value === \"string\" &&\n (PERSONA_BELIEF_STANCES as readonly string[]).includes(value)\n ? (value as PersonaBeliefStance)\n : \"support\";\n}\n\nexport function parsePersonaLexicalPreferences(value: unknown): {\n uses?: string[];\n avoids?: string[];\n} {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n const record = value as Record<string, unknown>;\n const uses = readStringArray(record.uses);\n const avoids = readStringArray(record.avoids);\n return {\n ...(uses.length > 0 ? { uses } : {}),\n ...(avoids.length > 0 ? { avoids } : {}),\n };\n}\n\nexport type PersonaEpisodeAffectInput = {\n arousal: number;\n dominance: number;\n emotions: PersonaEmotionAnnotation[];\n retrievalBoost: number;\n salienceScore: number;\n selfRelevance: number;\n valence: number;\n};\n\n// Parses an episode's emotional annotation (PAD + salience) from memory\n// content. Valence and arousal are required; everything else falls back to\n// neutral defaults. The resulting persona_emotional_salience row is what\n// powers mood updates, mood-congruent recall, and retrieval boosts.\nexport function parsePersonaEpisodeAffect(\n value: unknown\n): PersonaEpisodeAffectInput | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const rawValence = readFiniteNumber(record.valence);\n const rawArousal = readFiniteNumber(record.arousal);\n if (rawValence === null || rawArousal === null) {\n return null;\n }\n const valence = Math.max(-1, Math.min(1, rawValence));\n const arousal = clampScore(rawArousal);\n const emotions: PersonaEmotionAnnotation[] = Array.isArray(record.emotions)\n ? record.emotions.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return [];\n }\n const annotation = entry as Record<string, unknown>;\n const emotion =\n typeof annotation.emotion === \"string\"\n ? annotation.emotion.trim()\n : \"\";\n const intensity = readFiniteNumber(annotation.intensity);\n if (emotion.length === 0 || intensity === null) {\n return [];\n }\n return [\n {\n emotion,\n intensity: clampScore(intensity),\n ...(typeof annotation.evidence === \"string\"\n ? { evidence: annotation.evidence }\n : {}),\n },\n ];\n })\n : [];\n const rawBoost = readFiniteNumber(record.retrievalBoost);\n return {\n arousal,\n dominance: clampScore(readFiniteNumber(record.dominance) ?? 0.5),\n emotions,\n retrievalBoost:\n rawBoost === null ? 1 : Math.max(0.5, Math.min(2, rawBoost)),\n salienceScore: clampScore(\n readFiniteNumber(record.salienceScore) ??\n Math.max(arousal, Math.abs(valence))\n ),\n selfRelevance: clampScore(readFiniteNumber(record.selfRelevance) ?? 0.5),\n valence,\n };\n}\n\nexport async function rememberPersonaLayerMemory(\n db: Database,\n input: {\n confidence?: number | null;\n content?: Record<string, unknown> | null;\n defer?: (promise: Promise<unknown>) => void;\n embed?: PersonaEmbedder;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n memoryKind:\n | \"episode\"\n | \"fact\"\n | \"belief\"\n | \"habit\"\n | \"style\"\n | \"interaction\";\n organizationId: string;\n personaKey: string;\n privacyLevel?: PersonaPrivacyLevel | null;\n summary: string;\n title: string;\n updatedByUserId?: string | null;\n userId?: string | null;\n }\n): Promise<{\n id: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\" | \"interaction\";\n}> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const confidence = clampScore(input.confidence ?? 0.82);\n const privacyLevel = input.privacyLevel ?? \"internal\";\n const content = input.content ?? {};\n const now = new Date();\n const sourceDocument = await createPersonaSourceDocument(db, {\n authorUserId: input.updatedByUserId,\n embed: input.embed,\n logger: input.logger,\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n rawText: `${input.title}\\n${input.summary}`,\n sourceType: \"seed\",\n title: input.title,\n });\n\n if (input.memoryKind === \"episode\") {\n const [episode] = await db\n .insert(personaEpisodeMemories)\n .values({\n confidence,\n eventSummary: input.summary,\n firstPersonRecollection:\n typeof content.firstPersonRecollection === \"string\"\n ? content.firstPersonRecollection\n : null,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel,\n sourceRefs: [{ sourceDocumentId: sourceDocument.id }],\n themes: readStringArray(content.themes),\n time:\n content.time && typeof content.time === \"object\"\n ? (content.time as NewPersonaEpisodeMemory[\"time\"])\n : {},\n title: input.title,\n updatedAt: now,\n })\n .returning();\n if (episode) {\n // Optional PAD annotation: feeds mood updates, mood-congruent recall,\n // and salience-based retrieval boosts for this episode.\n const affect = parsePersonaEpisodeAffect(content.affect);\n if (affect) {\n await db.insert(personaEmotionalSalience).values({\n arousal: affect.arousal,\n confidence,\n dominance: affect.dominance,\n emotions: affect.emotions,\n episodeMemoryId: episode.id,\n organizationId: input.organizationId,\n personaId: persona.id,\n retrievalBoost: affect.retrievalBoost,\n salienceScore: affect.salienceScore,\n selfRelevance: affect.selfRelevance,\n updatedAt: now,\n valence: affect.valence,\n });\n }\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: episode.id,\n targetKind: \"episode\",\n text: episodeMemoryText(episode),\n },\n ],\n logger: input.logger,\n });\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: episode.id,\n memoryKind: \"episode\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: episode?.id ?? \"\", memoryKind: \"episode\" };\n }\n\n if (input.memoryKind === \"belief\") {\n const [belief] = await db\n .insert(personaSemanticBeliefs)\n .values({\n beliefType:\n typeof content.beliefType === \"string\"\n ? (content.beliefType as PersonaBeliefType)\n : \"relationship_belief\",\n confidence,\n domain: typeof content.domain === \"string\" ? content.domain : \"general\",\n exceptions: readStringArray(content.exceptions),\n firstPersonForm:\n typeof content.firstPersonForm === \"string\"\n ? content.firstPersonForm\n : null,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel,\n proposition: input.summary,\n stance: parsePersonaBeliefStance(content.stance),\n strength: confidence,\n supportingSourceIds: [sourceDocument.id],\n updatedAt: now,\n })\n .returning();\n if (belief) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: belief.id,\n targetKind: \"belief\",\n text: beliefMemoryText(belief),\n },\n ],\n logger: input.logger,\n });\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: belief.id,\n memoryKind: \"belief\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: belief?.id ?? \"\", memoryKind: \"belief\" };\n }\n\n if (input.memoryKind === \"fact\") {\n const claimText =\n typeof content.claimText === \"string\" && content.claimText.trim()\n ? content.claimText.trim()\n : input.summary;\n const objectName =\n typeof content.objectName === \"string\" && content.objectName.trim()\n ? content.objectName.trim()\n : input.title;\n const [fact] = await db\n .insert(personaFacts)\n .values({\n claimText,\n confidence,\n evidenceSpan:\n typeof content.evidenceSpan === \"string\"\n ? content.evidenceSpan\n : null,\n factType:\n typeof content.factType === \"string\"\n ? (content.factType as PersonaFactType)\n : \"other\",\n firstPersonForm:\n typeof content.firstPersonForm === \"string\"\n ? content.firstPersonForm\n : null,\n objectKey:\n typeof content.objectKey === \"string\" && content.objectKey.trim()\n ? content.objectKey.trim()\n : normalizePersonaFactObjectKey(objectName),\n objectName,\n objectType:\n typeof content.objectType === \"string\"\n ? (content.objectType as PersonaFactObjectType)\n : \"text\",\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel,\n sourceDocumentId: sourceDocument.id,\n sourceRefs: [{ sourceDocumentId: sourceDocument.id }],\n updatedAt: now,\n })\n .returning();\n if (fact) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: fact.id,\n targetKind: \"fact\",\n text: factMemoryText(fact),\n },\n ],\n logger: input.logger,\n });\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: fact.id,\n memoryKind: \"fact\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: fact?.id ?? \"\", memoryKind: \"fact\" };\n }\n\n if (input.memoryKind === \"habit\") {\n const [habit] = await db\n .insert(personaHabitPatterns)\n .values({\n avoidPatterns: readStringArray(content.avoidPatterns),\n confidence,\n defaultResponsePattern:\n readStringArray(content.defaultResponsePattern).length > 0\n ? readStringArray(content.defaultResponsePattern)\n : [input.summary],\n organizationId: input.organizationId,\n personaId: persona.id,\n rhetoricalMoves: readStringArray(content.rhetoricalMoves),\n strength: confidence,\n tone: parsePersonaToneVector(content.tone),\n trigger: {\n description:\n typeof content.triggerDescription === \"string\"\n ? content.triggerDescription\n : input.title,\n type:\n typeof content.triggerType === \"string\"\n ? content.triggerType\n : \"general\",\n },\n updatedAt: now,\n })\n .returning();\n if (habit) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: habit.id,\n targetKind: \"habit\",\n text: habitMemoryText(habit),\n },\n ],\n logger: input.logger,\n });\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: habit.id,\n memoryKind: \"habit\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: habit?.id ?? \"\", memoryKind: \"habit\" };\n }\n\n if (input.memoryKind === \"style\") {\n const [style] = await db\n .insert(personaStyleProfiles)\n .values({\n avoidPhrases: readStringArray(content.avoidPhrases),\n commonPhrases: readStringArray(content.commonPhrases),\n lexicalPreferences: parsePersonaLexicalPreferences(\n content.lexicalPreferences\n ),\n organizationId: input.organizationId,\n personaId: persona.id,\n preferredRhetoricalMoves: readStringArray(\n content.preferredRhetoricalMoves\n ),\n register:\n typeof content.register === \"string\" ? content.register : \"neutral\",\n sentenceLength:\n typeof content.sentenceLength === \"string\"\n ? content.sentenceLength\n : \"medium\",\n toneVector: parsePersonaToneVector(content.toneVector),\n updatedAt: now,\n })\n .returning();\n if (style) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: style.id,\n targetKind: \"style\",\n text: styleMemoryText(style),\n },\n ],\n logger: input.logger,\n });\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: style.id,\n memoryKind: \"style\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: style?.id ?? \"\", memoryKind: \"style\" };\n }\n\n const [interaction] = await db\n .insert(personaInteractionMemories)\n .values({\n interactionSummary: input.summary,\n newPersonaMemory: content,\n organizationId: input.organizationId,\n personaId: persona.id,\n shouldConsolidate: true,\n state: \"consolidation_candidate\",\n userId: input.userId ?? null,\n })\n .returning();\n if (interaction) {\n scheduleHindsightLayerMemoryRetain({\n content,\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: interaction.id,\n memoryKind: \"interaction\",\n organizationId: input.organizationId,\n persona,\n privacyLevel,\n summary: input.summary,\n title: input.title,\n userId: input.userId,\n });\n }\n return { id: interaction?.id ?? \"\", memoryKind: \"interaction\" };\n}\n\nexport async function consolidatePersonaMemoryScope(input: {\n consolidate: PersonaJsonLlm;\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n embed?: PersonaEmbedder;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n organizationId: string;\n personaKey: string;\n userId?: string | null;\n}): Promise<{\n contradictedBeliefs: number;\n createdBeliefs: number;\n createdEpisodes: number;\n createdHabits: number;\n createdStyleProfiles: number;\n personaKey: string;\n reinforcedBeliefs: number;\n}> {\n const persona = await loadPersonaProfile(input.db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const interactions = await input.db\n .select()\n .from(personaInteractionMemories)\n .where(\n and(\n eq(personaInteractionMemories.organizationId, input.organizationId),\n eq(personaInteractionMemories.personaId, persona.id),\n input.userId\n ? eq(personaInteractionMemories.userId, input.userId)\n : undefined,\n eq(personaInteractionMemories.state, \"consolidation_candidate\"),\n eq(personaInteractionMemories.shouldConsolidate, true)\n )\n )\n .orderBy(asc(personaInteractionMemories.createdAt))\n .limit(50);\n\n if (interactions.length === 0) {\n return {\n contradictedBeliefs: 0,\n createdBeliefs: 0,\n createdEpisodes: 0,\n createdHabits: 0,\n createdStyleProfiles: 0,\n personaKey: persona.personaKey,\n reinforcedBeliefs: 0,\n };\n }\n\n // Strongest beliefs go to the consolidator so repeated evidence reinforces\n // or revises them instead of accumulating near-duplicates.\n const existingBeliefs = await input.db\n .select()\n .from(personaSemanticBeliefs)\n .where(\n and(\n eq(personaSemanticBeliefs.organizationId, input.organizationId),\n eq(personaSemanticBeliefs.personaId, persona.id),\n eq(personaSemanticBeliefs.state, \"active\")\n )\n )\n .orderBy(desc(personaSemanticBeliefs.strength))\n .limit(100);\n const existingBeliefById = new Map(\n existingBeliefs.map((belief) => [belief.id, belief])\n );\n const reflection = await maybeReflectHindsightConsolidation({\n hindsight: input.hindsight,\n interactions,\n logger: input.logger,\n organizationId: input.organizationId,\n persona,\n userId: input.userId,\n });\n\n const output = await input.consolidate({\n systemPrompt: PERSONA_CONSOLIDATION_SYSTEM_PROMPT,\n userPrompt: buildConsolidationUserPrompt({\n existingBeliefs,\n interactions: interactions.map((interaction) => ({\n id: interaction.id,\n newUserPreference: interaction.newUserPreference,\n summary: interaction.interactionSummary,\n })),\n persona,\n reflection,\n }),\n });\n const parsed = consolidationOutputSchema.safeParse(output);\n if (!parsed.success) {\n throw new Error(\n `Persona consolidation returned invalid JSON: ${JSON.stringify(parsed.error.issues)}`\n );\n }\n\n const sourceIds = interactions.map((interaction) => interaction.id);\n const nowIso = new Date().toISOString();\n\n type BeliefEntry = (typeof parsed.data.beliefs)[number];\n type BeliefPlan =\n | { entry: BeliefEntry; kind: \"create\" }\n | {\n entry: BeliefEntry;\n kind: \"contradict\" | \"reinforce\";\n target: PersonaSemanticBelief;\n };\n const beliefPlans: BeliefPlan[] = parsed.data.beliefs.map((entry) => {\n const target = entry.targetBeliefId\n ? existingBeliefById.get(entry.targetBeliefId)\n : undefined;\n if (entry.action !== \"create\" && !target) {\n const logger = resolvePersonaLogger(input.logger);\n logger.warn(\n `[persona-memory] consolidation referenced unknown belief ${entry.targetBeliefId ?? \"(missing)\"}; treating as create.`\n );\n }\n if (entry.action === \"reinforce\" && target) {\n return { entry, kind: \"reinforce\", target };\n }\n if (entry.action === \"contradict\" && target) {\n return { entry, kind: \"contradict\", target };\n }\n return { entry, kind: \"create\" };\n });\n\n const newBeliefFromEntry = (\n entry: BeliefEntry\n ): NewPersonaSemanticBelief => ({\n beliefType: entry.beliefType,\n confidence: entry.confidence,\n domain: entry.domain,\n firstPersonForm: entry.firstPersonForm ?? null,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: \"internal\",\n proposition: entry.proposition,\n stance: \"support\",\n strength: entry.strength,\n supportingSourceIds: sourceIds,\n });\n\n // A contradiction with a genuinely revised statement supersedes the old\n // belief and creates the revision; same-statement contradictions only\n // weaken the old belief in place.\n const isRevision = (\n plan: BeliefPlan\n ): plan is BeliefPlan & {\n kind: \"contradict\";\n target: PersonaSemanticBelief;\n } =>\n plan.kind === \"contradict\" &&\n plan.entry.proposition.trim() !== plan.target.proposition.trim();\n\n const beliefValues: NewPersonaSemanticBelief[] = [\n ...beliefPlans\n .filter((plan) => plan.kind === \"create\")\n .map((plan) => newBeliefFromEntry(plan.entry)),\n ...beliefPlans.filter(isRevision).map((plan) => ({\n ...newBeliefFromEntry(plan.entry),\n stance: \"revised\" as const,\n })),\n ];\n const episodeValues: NewPersonaEpisodeMemory[] = parsed.data.episodes.map(\n (episode) => ({\n confidence: episode.confidence,\n eventSummary: episode.eventSummary,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: \"internal\",\n sourceRefs: sourceIds.map((id) => ({ quoteSpan: id })),\n title: episode.title,\n })\n );\n const habitValues: NewPersonaHabitPattern[] = parsed.data.habits.map(\n (habit) => ({\n confidence: habit.confidence,\n defaultResponsePattern: habit.defaultResponsePattern,\n organizationId: input.organizationId,\n personaId: persona.id,\n strength: habit.strength,\n supportingExampleIds: sourceIds,\n trigger: habit.trigger,\n })\n );\n const styleValues: NewPersonaStyleProfile[] = parsed.data.styleProfiles.map(\n (style) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n register: style.register,\n sentenceLength: style.sentenceLength,\n toneVector: style.toneVector,\n })\n );\n\n const [createdBeliefs, createdEpisodes, createdHabits, createdStyleProfiles] =\n await Promise.all([\n beliefValues.length > 0\n ? input.db\n .insert(personaSemanticBeliefs)\n .values(beliefValues)\n .returning()\n : Promise.resolve([] as PersonaSemanticBelief[]),\n episodeValues.length > 0\n ? input.db\n .insert(personaEpisodeMemories)\n .values(episodeValues)\n .returning()\n : Promise.resolve([] as PersonaEpisodeMemory[]),\n habitValues.length > 0\n ? input.db.insert(personaHabitPatterns).values(habitValues).returning()\n : Promise.resolve([] as PersonaHabitPattern[]),\n styleValues.length > 0\n ? input.db.insert(personaStyleProfiles).values(styleValues).returning()\n : Promise.resolve([] as PersonaStyleProfile[]),\n ]);\n\n await tryUpsertPersonaMemoryEmbeddings(input.db, {\n embed: input.embed,\n entries: [\n ...createdEpisodes.map((episode) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: episode.id,\n targetKind: \"episode\" as const,\n text: episodeMemoryText(episode),\n })),\n ...createdBeliefs.map((belief) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: belief.id,\n targetKind: \"belief\" as const,\n text: beliefMemoryText(belief),\n })),\n ...createdHabits.map((habit) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: habit.id,\n targetKind: \"habit\" as const,\n text: habitMemoryText(habit),\n })),\n ...createdStyleProfiles.map((style) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: style.id,\n targetKind: \"style\" as const,\n text: styleMemoryText(style),\n })),\n ],\n logger: input.logger,\n });\n for (const episode of createdEpisodes) {\n scheduleHindsightConsolidatedMemoryRetain({\n content: episode.eventSummary,\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: episode.id,\n localTargetKind: \"episode\",\n organizationId: input.organizationId,\n persona,\n title: episode.title,\n userId: input.userId,\n });\n }\n for (const belief of createdBeliefs) {\n scheduleHindsightConsolidatedMemoryRetain({\n content: beliefMemoryText(belief),\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: belief.id,\n localTargetKind: \"belief\",\n organizationId: input.organizationId,\n persona,\n title: belief.domain,\n userId: input.userId,\n });\n }\n for (const habit of createdHabits) {\n scheduleHindsightConsolidatedMemoryRetain({\n content: habitMemoryText(habit),\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: habit.id,\n localTargetKind: \"habit\",\n organizationId: input.organizationId,\n persona,\n title: habit.trigger.description,\n userId: input.userId,\n });\n }\n for (const style of createdStyleProfiles) {\n scheduleHindsightConsolidatedMemoryRetain({\n content: styleMemoryText(style),\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: style.id,\n localTargetKind: \"style\",\n organizationId: input.organizationId,\n persona,\n title: `${style.register} ${style.sentenceLength}`.trim(),\n userId: input.userId,\n });\n }\n\n // Reconsolidation pass: confirmed beliefs strengthen, contradicted beliefs\n // weaken (or get superseded by their revision), and the evidence trail is\n // preserved on the row instead of being overwritten.\n let reinforcedBeliefs = 0;\n let contradictedBeliefs = 0;\n for (const plan of beliefPlans) {\n if (plan.kind === \"reinforce\") {\n const next = applyBeliefReinforcement(plan.target, {\n evidenceConfidence: plan.entry.confidence,\n });\n await input.db\n .update(personaSemanticBeliefs)\n .set({\n confidence: next.confidence,\n strength: next.strength,\n supportingSourceIds: [\n ...new Set([...plan.target.supportingSourceIds, ...sourceIds]),\n ],\n })\n .where(eq(personaSemanticBeliefs.id, plan.target.id));\n reinforcedBeliefs += 1;\n continue;\n }\n if (plan.kind !== \"contradict\") {\n continue;\n }\n const next = applyBeliefContradiction(plan.target, {\n evidenceConfidence: plan.entry.confidence,\n });\n const superseded = isRevision(plan);\n await input.db\n .update(personaSemanticBeliefs)\n .set({\n confidence: next.confidence,\n contradictingSourceIds: [\n ...new Set([...plan.target.contradictingSourceIds, ...sourceIds]),\n ],\n state: superseded ? \"superseded\" : next.state,\n strength: next.strength,\n temporalValidity: superseded\n ? { ...plan.target.temporalValidity, to: nowIso }\n : plan.target.temporalValidity,\n })\n .where(eq(personaSemanticBeliefs.id, plan.target.id));\n contradictedBeliefs += 1;\n }\n\n await input.db\n .update(personaInteractionMemories)\n .set({ state: \"consolidated\" })\n .where(\n and(\n eq(personaInteractionMemories.organizationId, input.organizationId),\n eq(personaInteractionMemories.personaId, persona.id),\n or(\n ...interactions.map((interaction) =>\n eq(personaInteractionMemories.id, interaction.id)\n )\n )\n )\n );\n\n return {\n contradictedBeliefs,\n createdBeliefs: createdBeliefs.length,\n createdEpisodes: createdEpisodes.length,\n createdHabits: createdHabits.length,\n createdStyleProfiles: createdStyleProfiles.length,\n personaKey: persona.personaKey,\n reinforcedBeliefs,\n };\n}\n\nexport async function processPersonaMemoryConsolidationTick(input: {\n consolidate: PersonaJsonLlm;\n db: Database;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n now?: Date;\n}): Promise<{\n processedScopes: number;\n contradictedBeliefs: number;\n createdBeliefs: number;\n createdEpisodes: number;\n createdHabits: number;\n createdStyleProfiles: number;\n embeddedMemories: number;\n reinforcedBeliefs: number;\n}> {\n const candidates = await input.db\n .select({\n organizationId: personaInteractionMemories.organizationId,\n personaId: personaInteractionMemories.personaId,\n personaKey: personaProfiles.personaKey,\n userId: personaInteractionMemories.userId,\n })\n .from(personaInteractionMemories)\n .innerJoin(\n personaProfiles,\n eq(personaProfiles.id, personaInteractionMemories.personaId)\n )\n .where(\n and(\n eq(personaInteractionMemories.state, \"consolidation_candidate\"),\n eq(personaInteractionMemories.shouldConsolidate, true)\n )\n )\n .limit(25);\n\n const scopeKeys = new Set<string>();\n const scopes = candidates.filter((candidate) => {\n const key = `${candidate.organizationId}:${candidate.personaKey}:${\n candidate.userId ?? \"\"\n }`;\n if (scopeKeys.has(key)) {\n return false;\n }\n scopeKeys.add(key);\n return true;\n });\n\n const totals = {\n contradictedBeliefs: 0,\n createdBeliefs: 0,\n createdEpisodes: 0,\n createdHabits: 0,\n createdStyleProfiles: 0,\n embeddedMemories: 0,\n processedScopes: 0,\n reinforcedBeliefs: 0,\n };\n for (const scope of scopes) {\n const result = await consolidatePersonaMemoryScope({\n consolidate: input.consolidate,\n db: input.db,\n embed: input.embed,\n logger: input.logger,\n organizationId: scope.organizationId,\n personaKey: scope.personaKey,\n userId: scope.userId,\n });\n totals.contradictedBeliefs += result.contradictedBeliefs;\n totals.createdBeliefs += result.createdBeliefs;\n totals.createdEpisodes += result.createdEpisodes;\n totals.createdHabits += result.createdHabits;\n totals.createdStyleProfiles += result.createdStyleProfiles;\n totals.processedScopes += 1;\n totals.reinforcedBeliefs += result.reinforcedBeliefs;\n }\n\n // Idle replay: each tick also embeds a bounded batch of memories that were\n // written before embeddings existed or while the provider was unavailable.\n try {\n const backfill = await backfillPersonaMemoryEmbeddings(input.db, {\n embed: input.embed,\n logger: input.logger,\n });\n totals.embeddedMemories = backfill.embedded;\n } catch (error) {\n const logger = resolvePersonaLogger(input.logger);\n logger.warn(\n personaLogMessage(\"[persona-memory] embedding backfill failed:\", error)\n );\n }\n return totals;\n}\n","import { and, eq, inArray, isNotNull, isNull, sql } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaEpisodeMemories,\n personaFacts,\n personaHabitPatterns,\n personaMemoryEmbeddings,\n personaSemanticBeliefs,\n personaSourceChunks,\n personaSourceDocuments,\n personaStyleProfiles,\n} from \"../schema\";\nimport type {\n NewPersonaMemoryEmbedding,\n PersonaEmbeddingTargetKind,\n} from \"../schema\";\nimport { DEFAULT_PERSONA_LOGGER, personaLogMessage } from \"./logger\";\nimport { generateEmbeddings } from \"./openai-embedding\";\nimport type { PersonaEmbedder, PersonaLogger } from \"./types\";\n\nexport function createOpenAiPersonaEmbedder(\n openaiApiKey?: string | null\n): PersonaEmbedder | undefined {\n const apiKey = openaiApiKey?.trim();\n if (!apiKey) {\n return undefined;\n }\n return async (texts) => generateEmbeddings(texts, apiKey);\n}\n\n// FNV-1a over the embedded text; used to skip re-embedding unchanged memory.\nexport function hashPersonaMemoryText(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n// One text builder per memory layer, shared by retrieval candidates, write\n// paths, and backfill so stored embeddings always match the matched text.\nexport function episodeMemoryText(episode: {\n eventSummary: string;\n themes: string[];\n title: string;\n}): string {\n return `${episode.title} ${episode.eventSummary} ${episode.themes.join(\" \")}`;\n}\n\nexport function beliefMemoryText(belief: {\n domain: string;\n exceptions: string[];\n firstPersonForm: string | null;\n proposition: string;\n}): string {\n return `${belief.domain} ${belief.proposition} ${\n belief.firstPersonForm ?? \"\"\n } ${belief.exceptions.join(\" \")}`;\n}\n\nexport function factMemoryText(fact: {\n claimText: string;\n evidenceSpan: string | null;\n factType: string;\n firstPersonForm: string | null;\n objectKey: string | null;\n objectName: string;\n objectType: string;\n}): string {\n return `${fact.factType} ${fact.objectType} ${fact.objectName} ${\n fact.objectKey ?? \"\"\n } ${fact.claimText} ${fact.firstPersonForm ?? \"\"} ${fact.evidenceSpan ?? \"\"}`;\n}\n\nexport function habitMemoryText(habit: {\n defaultResponsePattern: string[];\n rhetoricalMoves: string[];\n trigger: { type: string; description: string };\n}): string {\n return `${habit.trigger.type} ${habit.trigger.description} ${habit.defaultResponsePattern.join(\n \" \"\n )} ${habit.rhetoricalMoves.join(\" \")}`;\n}\n\nexport function styleMemoryText(style: {\n avoidPhrases: string[];\n commonPhrases: string[];\n preferredRhetoricalMoves: string[];\n register: string;\n sentenceLength: string;\n}): string {\n return `${style.register} ${style.sentenceLength} ${style.preferredRhetoricalMoves.join(\n \" \"\n )} ${style.commonPhrases.join(\" \")} ${style.avoidPhrases.join(\" \")}`;\n}\nexport type PersonaMemoryEmbeddingEntry = {\n organizationId: string;\n personaId: string;\n targetId: string;\n targetKind: PersonaEmbeddingTargetKind;\n text: string;\n};\n\n// Hard cap on embedded text. The embedding API rejects oversized inputs\n// (8191 tokens; CJK text can exceed that well below the equivalent ASCII\n// length), and one oversized memory must never block a whole batch. 6000\n// chars stays comfortably within budget while keeping enough signal for\n// retrieval matching.\nconst MAX_EMBEDDING_TEXT_CHARS = 6_000;\n\nexport function normalizePersonaEmbeddingText(text: string): string {\n return text.trim().slice(0, MAX_EMBEDDING_TEXT_CHARS);\n}\n\nexport async function upsertPersonaMemoryEmbeddings(\n db: Database,\n input: {\n embed: PersonaEmbedder;\n entries: PersonaMemoryEmbeddingEntry[];\n logger?: PersonaLogger;\n }\n): Promise<number> {\n const entries = input.entries\n .map((entry) => ({\n ...entry,\n text: normalizePersonaEmbeddingText(entry.text),\n }))\n .filter((entry) => entry.targetId.length > 0 && entry.text.length > 0);\n if (entries.length === 0) {\n return 0;\n }\n\n const existing = await db\n .select({\n contentHash: personaMemoryEmbeddings.contentHash,\n targetId: personaMemoryEmbeddings.targetId,\n targetKind: personaMemoryEmbeddings.targetKind,\n })\n .from(personaMemoryEmbeddings)\n .where(\n inArray(\n personaMemoryEmbeddings.targetId,\n entries.map((entry) => entry.targetId)\n )\n );\n const existingHashByKey = new Map(\n existing.map((row) => [\n `${row.targetKind}:${row.targetId}`,\n row.contentHash,\n ])\n );\n\n const pending = entries\n .map((entry) => ({\n contentHash: hashPersonaMemoryText(entry.text),\n entry,\n }))\n .filter(\n ({ contentHash, entry }) =>\n existingHashByKey.get(`${entry.targetKind}:${entry.targetId}`) !==\n contentHash\n );\n if (pending.length === 0) {\n return 0;\n }\n const logger = input.logger ?? DEFAULT_PERSONA_LOGGER;\n\n try {\n return await embedAndUpsertEntries(db, input.embed, pending);\n } catch (error) {\n // One poisoned entry (provider rejection, constraint violation) must not\n // permanently wedge the batch - the backfill re-selects the same rows\n // every tick. Retry per entry and skip only the failing ones.\n logger.warn(\n personaLogMessage(\n \"[persona-memory] batch embedding failed; retrying per entry:\",\n error\n )\n );\n let upserted = 0;\n for (const item of pending) {\n try {\n upserted += await embedAndUpsertEntries(db, input.embed, [item]);\n } catch (entryError) {\n logger.warn(\n personaLogMessage(\n `[persona-memory] embedding skipped for ${item.entry.targetKind}:${item.entry.targetId}:`,\n entryError\n )\n );\n }\n }\n return upserted;\n }\n}\n\nasync function embedAndUpsertEntries(\n db: Database,\n embed: PersonaEmbedder,\n pending: { contentHash: string; entry: PersonaMemoryEmbeddingEntry }[]\n): Promise<number> {\n const vectors = await embed(pending.map(({ entry }) => entry.text));\n if (vectors.length !== pending.length) {\n throw new Error(\n `Persona embedder returned ${vectors.length} vectors for ${pending.length} texts.`\n );\n }\n\n const rows: NewPersonaMemoryEmbedding[] = pending.map(\n ({ contentHash, entry }, index) => ({\n contentHash,\n embedding: vectors[index] as number[],\n organizationId: entry.organizationId,\n personaId: entry.personaId,\n targetId: entry.targetId,\n targetKind: entry.targetKind,\n })\n );\n await db\n .insert(personaMemoryEmbeddings)\n .values(rows)\n .onConflictDoUpdate({\n set: {\n contentHash: sql`excluded.content_hash`,\n embedding: sql`excluded.embedding`,\n updatedAt: new Date(),\n },\n target: [\n personaMemoryEmbeddings.targetKind,\n personaMemoryEmbeddings.targetId,\n ],\n });\n return rows.length;\n}\n\n// Memory writes must never fail because the embedding provider is down; the\n// backfill pass picks up anything missed here.\nexport async function tryUpsertPersonaMemoryEmbeddings(\n db: Database,\n input: {\n embed?: PersonaEmbedder;\n entries: PersonaMemoryEmbeddingEntry[];\n logger?: PersonaLogger;\n }\n): Promise<void> {\n if (!input.embed || input.entries.length === 0) {\n return;\n }\n try {\n await upsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: input.entries,\n logger: input.logger,\n });\n } catch (error) {\n const logger = input.logger ?? DEFAULT_PERSONA_LOGGER;\n logger.warn(\n personaLogMessage(\"[persona-memory] embedding upsert failed:\", error)\n );\n }\n}\n\nexport async function backfillPersonaMemoryEmbeddings(\n db: Database,\n input: {\n embed?: PersonaEmbedder;\n limit?: number;\n logger?: PersonaLogger;\n }\n): Promise<{ embedded: number }> {\n if (!input.embed) {\n return { embedded: 0 };\n }\n const limit = Math.max(1, input.limit ?? 40);\n const entries: PersonaMemoryEmbeddingEntry[] = [];\n const remaining = () => limit - entries.length;\n\n if (remaining() > 0) {\n const rows = await db\n .select({ episode: personaEpisodeMemories })\n .from(personaEpisodeMemories)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaEpisodeMemories.id),\n eq(personaMemoryEmbeddings.targetKind, \"episode\")\n )\n )\n .where(\n and(\n eq(personaEpisodeMemories.state, \"active\"),\n isNotNull(personaEpisodeMemories.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ episode }) =>\n episode.organizationId === null\n ? []\n : [\n {\n organizationId: episode.organizationId,\n personaId: episode.personaId,\n targetId: episode.id,\n targetKind: \"episode\" as const,\n text: episodeMemoryText(episode),\n },\n ]\n )\n );\n }\n\n if (remaining() > 0) {\n const rows = await db\n .select({ belief: personaSemanticBeliefs })\n .from(personaSemanticBeliefs)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaSemanticBeliefs.id),\n eq(personaMemoryEmbeddings.targetKind, \"belief\")\n )\n )\n .where(\n and(\n eq(personaSemanticBeliefs.state, \"active\"),\n isNotNull(personaSemanticBeliefs.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ belief }) =>\n belief.organizationId === null\n ? []\n : [\n {\n organizationId: belief.organizationId,\n personaId: belief.personaId,\n targetId: belief.id,\n targetKind: \"belief\" as const,\n text: beliefMemoryText(belief),\n },\n ]\n )\n );\n }\n\n if (remaining() > 0) {\n const rows = await db\n .select({ fact: personaFacts })\n .from(personaFacts)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaFacts.id),\n eq(personaMemoryEmbeddings.targetKind, \"fact\")\n )\n )\n .where(\n and(\n eq(personaFacts.state, \"active\"),\n isNotNull(personaFacts.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ fact }) =>\n fact.organizationId === null\n ? []\n : [\n {\n organizationId: fact.organizationId,\n personaId: fact.personaId,\n targetId: fact.id,\n targetKind: \"fact\" as const,\n text: factMemoryText(fact),\n },\n ]\n )\n );\n }\n\n if (remaining() > 0) {\n const rows = await db\n .select({ habit: personaHabitPatterns })\n .from(personaHabitPatterns)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaHabitPatterns.id),\n eq(personaMemoryEmbeddings.targetKind, \"habit\")\n )\n )\n .where(\n and(\n eq(personaHabitPatterns.state, \"active\"),\n isNotNull(personaHabitPatterns.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ habit }) =>\n habit.organizationId === null\n ? []\n : [\n {\n organizationId: habit.organizationId,\n personaId: habit.personaId,\n targetId: habit.id,\n targetKind: \"habit\" as const,\n text: habitMemoryText(habit),\n },\n ]\n )\n );\n }\n\n if (remaining() > 0) {\n const rows = await db\n .select({ style: personaStyleProfiles })\n .from(personaStyleProfiles)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaStyleProfiles.id),\n eq(personaMemoryEmbeddings.targetKind, \"style\")\n )\n )\n .where(\n and(\n eq(personaStyleProfiles.state, \"active\"),\n isNotNull(personaStyleProfiles.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ style }) =>\n style.organizationId === null\n ? []\n : [\n {\n organizationId: style.organizationId,\n personaId: style.personaId,\n targetId: style.id,\n targetKind: \"style\" as const,\n text: styleMemoryText(style),\n },\n ]\n )\n );\n }\n\n if (remaining() > 0) {\n const rows = await db\n .select({ chunk: personaSourceChunks })\n .from(personaSourceChunks)\n .innerJoin(\n personaSourceDocuments,\n eq(personaSourceDocuments.id, personaSourceChunks.sourceDocumentId)\n )\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaSourceChunks.id),\n eq(personaMemoryEmbeddings.targetKind, \"source_chunk\")\n )\n )\n .where(\n and(\n eq(personaSourceDocuments.state, \"active\"),\n isNotNull(personaSourceChunks.organizationId),\n isNull(personaMemoryEmbeddings.id)\n )\n )\n .limit(remaining());\n entries.push(\n ...rows.flatMap(({ chunk }) =>\n chunk.organizationId === null\n ? []\n : [\n {\n organizationId: chunk.organizationId,\n personaId: chunk.personaId,\n targetId: chunk.id,\n targetKind: \"source_chunk\" as const,\n text: chunk.text,\n },\n ]\n )\n );\n }\n\n if (entries.length === 0) {\n return { embedded: 0 };\n }\n const embedded = await upsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries,\n logger: input.logger,\n });\n return { embedded };\n}\n","import type { PersonaLogger } from \"./types\";\n\nconst runtimeConsole = globalThis.console;\n\nexport const DEFAULT_PERSONA_LOGGER: PersonaLogger = {\n error(message) {\n runtimeConsole.error(message);\n },\n warn(message) {\n runtimeConsole.warn(message);\n },\n};\n\nexport function personaLogMessage(message: string, error: unknown): string {\n return `${message} ${error instanceof Error ? error.message : String(error)}`;\n}\n","import { z } from \"zod\";\n\nexport const PERSONA_EMBEDDING_MODEL = \"text-embedding-3-small\";\n\nconst EmbeddingResponseSchema = z.object({\n data: z.array(\n z.object({\n embedding: z.array(z.number()).optional(),\n index: z.number().optional(),\n })\n ),\n usage: z\n .object({\n prompt_tokens: z.number(),\n total_tokens: z.number(),\n })\n .optional(),\n});\n\nexport async function generateEmbeddings(\n texts: string[],\n openaiApiKey: string\n): Promise<number[][]> {\n if (texts.length === 0) {\n return [];\n }\n\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n body: JSON.stringify({\n model: PERSONA_EMBEDDING_MODEL,\n input: texts,\n }),\n headers: {\n Authorization: `Bearer ${openaiApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `OpenAI API error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const json = await response.json();\n const parseResult = EmbeddingResponseSchema.safeParse(json);\n if (!parseResult.success) {\n throw new Error(\"Invalid response from OpenAI embeddings API\");\n }\n\n const ordered = [...parseResult.data.data].sort(\n (left, right) => (left.index ?? 0) - (right.index ?? 0)\n );\n const embeddings = ordered.map((entry) => entry.embedding);\n if (\n embeddings.length !== texts.length ||\n embeddings.some((embedding) => !embedding)\n ) {\n throw new Error(\"OpenAI embeddings API returned an incomplete batch\");\n }\n\n return embeddings as number[][];\n}\n\nexport async function generateEmbedding(\n text: string,\n openaiApiKey: string\n): Promise<number[]> {\n const response = await fetch(\"https://api.openai.com/v1/embeddings\", {\n body: JSON.stringify({\n model: PERSONA_EMBEDDING_MODEL,\n input: text,\n }),\n headers: {\n Authorization: `Bearer ${openaiApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `OpenAI API error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n\n const json = await response.json();\n const parseResult = EmbeddingResponseSchema.safeParse(json);\n if (!parseResult.success) {\n throw new Error(\"Invalid response from OpenAI embeddings API\");\n }\n\n const embedding = parseResult.data.data?.[0]?.embedding;\n if (!embedding) {\n throw new Error(\"No embedding returned from OpenAI\");\n }\n\n return embedding;\n}\n","import { and, eq } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport { personaMoodStates } from \"../schema\";\nimport { MAX_EVIDENCE_SUMMARY_CHARS } from \"./types\";\nimport type {\n PersonaAffectVector,\n PersonaMemoryCandidate,\n PersonaMoodEmotionLabel,\n PersonaMoodSignal,\n PersonaMoodUpdateTrace,\n PersonaQueryType,\n PersonaTurnAffectEstimate,\n PersonaTurnPlan,\n} from \"./types\";\n\nexport function clampScore(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, Number(value.toFixed(3))));\n}\n\n// Persona-neutral resting mood the state drifts back to between sessions.\nexport const PERSONA_MOOD_BASELINE: PersonaAffectVector = {\n arousal: 0.3,\n dominance: 0.5,\n valence: 0.1,\n};\n// How much of the prior mood survives one turn's emotional impulse.\nconst MOOD_INERTIA = 0.75;\n// Mood drifts halfway back to baseline in a day of silence.\nconst MOOD_DECAY_HALF_LIFE_HOURS = 24;\nconst MS_PER_HOUR = 3_600_000;\nconst MAX_MOOD_LABELS = 8;\n\nfunction clampAffect(value: PersonaAffectVector): PersonaAffectVector {\n const clamp = (input: number, min: number, max: number) =>\n Math.max(min, Math.min(max, Number.isFinite(input) ? input : min));\n return {\n arousal: clamp(value.arousal, 0, 1),\n dominance: clamp(value.dominance, 0, 1),\n valence: clamp(value.valence, -1, 1),\n };\n}\n\nfunction moodDecay(input: {\n current: PersonaAffectVector | null;\n elapsedMs: number;\n}): { decayFactor: number; decayedMood: PersonaAffectVector } {\n const current = input.current ?? PERSONA_MOOD_BASELINE;\n const decayFactor =\n 0.5 **\n (Math.max(0, input.elapsedMs) / (MOOD_DECAY_HALF_LIFE_HOURS * MS_PER_HOUR));\n return {\n decayFactor,\n decayedMood: clampAffect({\n arousal:\n PERSONA_MOOD_BASELINE.arousal +\n (current.arousal - PERSONA_MOOD_BASELINE.arousal) * decayFactor,\n dominance:\n PERSONA_MOOD_BASELINE.dominance +\n (current.dominance - PERSONA_MOOD_BASELINE.dominance) * decayFactor,\n valence:\n PERSONA_MOOD_BASELINE.valence +\n (current.valence - PERSONA_MOOD_BASELINE.valence) * decayFactor,\n }),\n };\n}\n\nfunction queryTypeAffectCue(\n queryType: PersonaQueryType\n): { affect: PersonaAffectVector; label: string; reason: string } | null {\n if (queryType === \"emotional_reflection\") {\n return {\n affect: { arousal: 0.7, dominance: 0.45, valence: -0.1 },\n label: \"emotional_intensity\",\n reason: \"The turn was classified as emotional_reflection.\",\n };\n }\n if (queryType === \"adversarial\") {\n return {\n affect: { arousal: 0.65, dominance: 0.6, valence: -0.35 },\n label: \"defensiveness\",\n reason: \"The turn was classified as adversarial.\",\n };\n }\n return null;\n}\n\nfunction normalizedEmotionLabel(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \"_\");\n}\n\nexport function emotionLabelFamily(value: string): string {\n const label = normalizedEmotionLabel(value);\n if (\n [\n \"anxiety\",\n \"anxious\",\n \"fear\",\n \"fearful\",\n \"worry\",\n \"worried\",\n \"불안\",\n \"두려움\",\n \"걱정\",\n ].includes(label)\n ) {\n return \"anxiety\";\n }\n if (\n [\n \"sadness\",\n \"sad\",\n \"grief\",\n \"loss\",\n \"regret\",\n \"슬픔\",\n \"상실\",\n \"후회\",\n \"그리움\",\n ].includes(label)\n ) {\n return \"sadness\";\n }\n if (\n [\n \"anger\",\n \"angry\",\n \"frustration\",\n \"frustrated\",\n \"분노\",\n \"화\",\n \"좌절\",\n ].includes(label)\n ) {\n return \"anger\";\n }\n if (\n [\n \"joy\",\n \"happy\",\n \"happiness\",\n \"excitement\",\n \"excited\",\n \"delight\",\n \"기쁨\",\n \"행복\",\n \"설렘\",\n ].includes(label)\n ) {\n return \"joy\";\n }\n if (\n [\"confidence\", \"confident\", \"pride\", \"자신감\", \"자부심\"].includes(label)\n ) {\n return \"confidence\";\n }\n if (\n [\"calm\", \"relief\", \"trust\", \"차분\", \"평온\", \"안도\", \"신뢰\"].includes(label)\n ) {\n return \"calm\";\n }\n if ([\"curiosity\", \"curious\", \"interest\", \"호기심\", \"관심\"].includes(label)) {\n return \"curiosity\";\n }\n return label;\n}\n\nfunction mergeEmotionLabels(\n labels: PersonaMoodEmotionLabel[]\n): PersonaMoodEmotionLabel[] {\n const byLabel = new Map<string, PersonaMoodEmotionLabel>();\n for (const label of labels) {\n const normalized = normalizedEmotionLabel(label.label);\n if (!normalized) {\n continue;\n }\n const next = {\n ...label,\n intensity: clampScore(label.intensity),\n label: normalized,\n };\n const current = byLabel.get(normalized);\n if (!current || next.intensity > current.intensity) {\n byLabel.set(normalized, next);\n }\n }\n return [...byLabel.values()]\n .sort((left, right) => {\n if (right.intensity !== left.intensity) {\n return right.intensity - left.intensity;\n }\n return left.label.localeCompare(right.label);\n })\n .slice(0, MAX_MOOD_LABELS);\n}\n\nfunction labelsFromEmotionAnnotations(input: {\n candidate: PersonaMemoryCandidate;\n}): PersonaMoodEmotionLabel[] {\n return input.candidate.emotions.map((emotion) => ({\n ...(emotion.evidence ? { evidence: emotion.evidence } : {}),\n intensity: clampScore(emotion.intensity * input.candidate.sourceConfidence),\n label: emotion.emotion,\n memoryId: input.candidate.id,\n source: \"activated_memory\",\n }));\n}\n\nfunction affectCueFromEmotionFamily(\n family: string\n): PersonaAffectVector | null {\n if (family === \"anxiety\") {\n return { arousal: 0.75, dominance: 0.3, valence: -0.45 };\n }\n if (family === \"sadness\") {\n return { arousal: 0.35, dominance: 0.3, valence: -0.55 };\n }\n if (family === \"anger\") {\n return { arousal: 0.75, dominance: 0.65, valence: -0.5 };\n }\n if (family === \"joy\") {\n return { arousal: 0.65, dominance: 0.55, valence: 0.55 };\n }\n if (family === \"confidence\") {\n return { arousal: 0.45, dominance: 0.75, valence: 0.4 };\n }\n if (family === \"calm\") {\n return { arousal: 0.2, dominance: 0.55, valence: 0.25 };\n }\n if (family === \"curiosity\") {\n return { arousal: 0.55, dominance: 0.55, valence: 0.25 };\n }\n return null;\n}\n\nfunction averageWeightedAffects(\n entries: Array<{ affect: PersonaAffectVector; weight: number }>\n): PersonaAffectVector | null {\n const totalWeight = entries.reduce((sum, entry) => sum + entry.weight, 0);\n if (totalWeight <= 0) {\n return null;\n }\n return clampAffect({\n arousal:\n entries.reduce(\n (sum, entry) => sum + entry.affect.arousal * entry.weight,\n 0\n ) / totalWeight,\n dominance:\n entries.reduce(\n (sum, entry) => sum + entry.affect.dominance * entry.weight,\n 0\n ) / totalWeight,\n valence:\n entries.reduce(\n (sum, entry) => sum + entry.affect.valence * entry.weight,\n 0\n ) / totalWeight,\n });\n}\n\nfunction emotionLabelAffectSignals(\n labels: PersonaMoodEmotionLabel[]\n): Array<{ affect: PersonaAffectVector; label: PersonaMoodEmotionLabel }> {\n return labels.flatMap((label) => {\n const affect = affectCueFromEmotionFamily(emotionLabelFamily(label.label));\n return affect ? [{ affect, label }] : [];\n });\n}\n\nfunction inferPadEmotionLabel(\n mood: PersonaAffectVector\n): PersonaMoodEmotionLabel {\n const label =\n mood.valence <= -0.25 && mood.arousal >= 0.6 && mood.dominance >= 0.55\n ? \"anger\"\n : mood.valence <= -0.25 && mood.arousal >= 0.6\n ? \"anxiety\"\n : mood.valence <= -0.25 && mood.arousal < 0.45\n ? \"sadness\"\n : mood.valence >= 0.25 && mood.arousal >= 0.6\n ? \"excitement\"\n : mood.valence >= 0.25 && mood.dominance >= 0.6\n ? \"confidence\"\n : mood.arousal <= 0.35 && mood.valence >= 0\n ? \"calm\"\n : \"neutral\";\n const intensity = clampScore(\n Math.max(\n Math.abs(mood.valence),\n Math.abs(mood.arousal - PERSONA_MOOD_BASELINE.arousal),\n Math.abs(mood.dominance - PERSONA_MOOD_BASELINE.dominance)\n )\n );\n return {\n evidence: \"Inferred from the resulting PAD mood vector.\",\n intensity: Math.max(0.25, intensity),\n label,\n source: \"pad_inference\",\n };\n}\n\n// Estimate this turn's emotional impulse from the activated episodes'\n// salience annotations plus coarse query-type cues. Returns null when the\n// turn carries no usable affect signal.\nexport function estimateTurnAffect(input: {\n selected: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): PersonaAffectVector | null {\n return explainTurnAffect(input).impulse;\n}\n\nexport function explainTurnAffect(input: {\n selected: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): PersonaTurnAffectEstimate {\n const annotated = input.selected.filter(\n (\n candidate\n ): candidate is PersonaMemoryCandidate & {\n affect: PersonaAffectVector;\n } => candidate.affect !== null\n );\n const queryType = input.turnPlan.gate.queryType;\n const queryCue = queryTypeAffectCue(queryType);\n const userEmotionLabels: PersonaMoodEmotionLabel[] = [\n ...input.turnPlan.context.contextKeys.emotions.map((emotion) => ({\n intensity: 0.6,\n label: emotion,\n source: \"context_emotion\" as const,\n })),\n ...input.turnPlan.gate.queryFocus.emotionHints.map((emotion) => ({\n intensity: 0.55,\n label: emotion,\n source: \"query_emotion_hint\" as const,\n })),\n ];\n const labelSignals = emotionLabelAffectSignals(userEmotionLabels);\n const labelImpulse = averageWeightedAffects(\n labelSignals.map((signal) => ({\n affect: signal.affect,\n weight: Math.max(0.1, signal.label.intensity),\n }))\n );\n const labels: PersonaMoodEmotionLabel[] = [\n ...userEmotionLabels,\n ...input.selected.flatMap((candidate) =>\n labelsFromEmotionAnnotations({ candidate })\n ),\n ...(queryCue\n ? [\n {\n evidence: queryCue.reason,\n intensity: Math.max(\n Math.abs(queryCue.affect.valence),\n queryCue.affect.arousal\n ),\n label: queryCue.label,\n source: \"query_type\" as const,\n },\n ]\n : []),\n ];\n const reasons: string[] = [];\n const sources: PersonaMoodSignal[] = [\n ...annotated.map((candidate) => ({\n affect: candidate.affect,\n emotionLabels: labelsFromEmotionAnnotations({ candidate }),\n id: candidate.id,\n kind: \"activated_memory\" as const,\n summary: truncateLine(candidate.summary, MAX_EVIDENCE_SUMMARY_CHARS),\n })),\n ...labelSignals.map((signal) => ({\n affect: signal.affect,\n emotionLabels: [signal.label],\n kind:\n signal.label.source === \"query_emotion_hint\"\n ? (\"query_emotion_hint\" as const)\n : (\"context_emotion\" as const),\n label: signal.label.label,\n summary: `The turn carried ${signal.label.source}=${signal.label.label}.`,\n })),\n ...(queryCue\n ? [\n {\n affect: queryCue.affect,\n emotionLabels: [\n {\n evidence: queryCue.reason,\n intensity: Math.max(\n Math.abs(queryCue.affect.valence),\n queryCue.affect.arousal\n ),\n label: queryCue.label,\n source: \"query_type\" as const,\n },\n ],\n kind: \"query_type\" as const,\n queryType,\n summary: queryCue.reason,\n },\n ]\n : []),\n ];\n\n const memoryAffect =\n annotated.length === 0\n ? null\n : clampAffect({\n arousal:\n annotated.reduce(\n (sum, candidate) => sum + candidate.affect.arousal,\n 0\n ) / annotated.length,\n dominance:\n annotated.reduce(\n (sum, candidate) => sum + candidate.affect.dominance,\n 0\n ) / annotated.length,\n valence:\n annotated.reduce(\n (sum, candidate) => sum + candidate.affect.valence,\n 0\n ) / annotated.length,\n });\n const impulse = averageWeightedAffects([\n ...(memoryAffect ? [{ affect: memoryAffect, weight: 1 }] : []),\n ...(queryCue ? [{ affect: queryCue.affect, weight: 1 }] : []),\n ...(labelImpulse ? [{ affect: labelImpulse, weight: 0.75 }] : []),\n ]);\n\n if (annotated.length > 0) {\n reasons.push(\n `Averaged ${annotated.length} activated memory affect annotation${\n annotated.length === 1 ? \"\" : \"s\"\n }.`\n );\n }\n if (queryCue) {\n reasons.push(queryCue.reason);\n }\n if (labelSignals.length > 0) {\n reasons.push(\n `Mapped ${labelSignals.length} context emotion label${\n labelSignals.length === 1 ? \"\" : \"s\"\n } into an immediate PAD cue.`\n );\n } else if (userEmotionLabels.length > 0) {\n reasons.push(\"Recorded emotion labels did not map to a PAD cue.\");\n }\n if (annotated.length > 0 && (queryCue || labelImpulse)) {\n reasons.push(\"Blended memory affect with current-turn emotional cues.\");\n }\n if (!impulse) {\n reasons.push(\n \"No activated memory affect or current-turn cue changed mood.\"\n );\n }\n\n return {\n emotionLabels: mergeEmotionLabels(labels),\n impulse,\n reasons,\n sources,\n };\n}\n\n// Mood update reducer: decay the stored mood toward baseline for the elapsed\n// silence, then blend in this turn's impulse with inertia. Pure; persistence\n// happens in the runtime path.\nexport function updatePersonaMood(input: {\n current: PersonaAffectVector | null;\n elapsedMs: number;\n impulse: PersonaAffectVector | null;\n}): PersonaAffectVector {\n return calculatePersonaMoodUpdate(input).mood;\n}\n\nexport function calculatePersonaMoodUpdate(input: {\n current: PersonaAffectVector | null;\n elapsedMs: number;\n impulse: PersonaAffectVector | null;\n turnAffect?: PersonaTurnAffectEstimate | null;\n}): { mood: PersonaAffectVector; trace: PersonaMoodUpdateTrace } {\n const { decayFactor, decayedMood } = moodDecay(input);\n const mood = input.impulse\n ? clampAffect({\n arousal:\n decayedMood.arousal * MOOD_INERTIA +\n input.impulse.arousal * (1 - MOOD_INERTIA),\n dominance:\n decayedMood.dominance * MOOD_INERTIA +\n input.impulse.dominance * (1 - MOOD_INERTIA),\n valence:\n decayedMood.valence * MOOD_INERTIA +\n input.impulse.valence * (1 - MOOD_INERTIA),\n })\n : decayedMood;\n const reasons = [\n input.current\n ? `Decayed the previous mood toward baseline over ${Math.max(\n 0,\n input.elapsedMs\n )}ms.`\n : \"Started from the persona mood baseline because no prior mood was stored.\",\n ...(input.turnAffect?.reasons ?? []),\n input.impulse\n ? `Blended decayed mood with the turn impulse using ${MOOD_INERTIA.toFixed(\n 2\n )} inertia.`\n : \"No turn impulse was applied after decay.\",\n ];\n const emotionLabels = mergeEmotionLabels([\n ...(input.turnAffect?.emotionLabels ?? []),\n inferPadEmotionLabel(mood),\n ]);\n return {\n mood,\n trace: {\n baseline: { ...PERSONA_MOOD_BASELINE },\n decayFactor,\n decayHalfLifeHours: MOOD_DECAY_HALF_LIFE_HOURS,\n decayedMood,\n elapsedMs: Math.max(0, input.elapsedMs),\n emotionLabels,\n impulse: input.impulse,\n inertia: MOOD_INERTIA,\n previousMood: input.current,\n reasons,\n result: mood,\n sources: input.turnAffect?.sources ?? [],\n version: 1,\n },\n };\n}\nexport function truncateLine(line: string, maxChars: number): string {\n if (line.length <= maxChars) {\n return line;\n }\n let sliced = line.slice(0, maxChars - 2);\n // Don't split a surrogate pair; a lone surrogate is invalid once the prompt\n // is serialized for the model API.\n const lastCode = sliced.charCodeAt(sliced.length - 1);\n if (lastCode >= 0xd8_00 && lastCode <= 0xdb_ff) {\n sliced = sliced.slice(0, -1);\n }\n return `${sliced} …`;\n}\n\nexport async function loadPersonaMoodState(\n db: Database,\n input: { organizationId: string; personaId: string; userId: string }\n) {\n const [row] = await db\n .select()\n .from(personaMoodStates)\n .where(\n and(\n eq(personaMoodStates.organizationId, input.organizationId),\n eq(personaMoodStates.personaId, input.personaId),\n eq(personaMoodStates.userId, input.userId)\n )\n )\n .limit(1);\n return row ?? null;\n}\n\nexport async function persistPersonaMoodState(\n db: Database,\n input: {\n mood: PersonaAffectVector;\n organizationId: string;\n personaId: string;\n turnCount: number;\n userId: string;\n }\n): Promise<void> {\n await db\n .insert(personaMoodStates)\n .values({\n arousal: input.mood.arousal,\n dominance: input.mood.dominance,\n organizationId: input.organizationId,\n personaId: input.personaId,\n turnCount: input.turnCount,\n userId: input.userId,\n valence: input.mood.valence,\n })\n .onConflictDoUpdate({\n set: {\n arousal: input.mood.arousal,\n dominance: input.mood.dominance,\n turnCount: input.turnCount,\n updatedAt: new Date(),\n valence: input.mood.valence,\n },\n target: [\n personaMoodStates.organizationId,\n personaMoodStates.personaId,\n personaMoodStates.userId,\n ],\n });\n}\n","import { z } from \"zod\";\n\nimport { PERSONA_PRIVACY_LEVELS } from \"../schema\";\nimport type {\n PersonaEmotionAnnotation,\n PersonaMemoryRetrievalPayload,\n PersonaPrivacyLevel,\n PersonaProfile,\n} from \"../schema\";\n\nexport const PERSONA_QUERY_TYPES = [\n \"autobiographical_fact\",\n \"autobiographical_reasoning\",\n \"value_judgment\",\n \"hypothetical_response\",\n \"style_imitation\",\n \"factual_question\",\n \"relationship_question\",\n \"emotional_reflection\",\n \"out_of_scope\",\n \"adversarial\",\n \"identity_confusion\",\n] as const;\n\nexport type PersonaQueryType = (typeof PERSONA_QUERY_TYPES)[number];\n\nexport const PERSONA_MEMORY_TYPES = [\n \"episodic\",\n \"persona_fact\",\n \"semantic_belief\",\n \"emotional_salience\",\n \"habit_pattern\",\n \"style_profile\",\n \"source_chunk\",\n] as const;\n\nexport type PersonaMemoryType = (typeof PERSONA_MEMORY_TYPES)[number];\n\nexport const PERSONA_ANSWER_MODES = [\n \"persona_grounded_response\",\n \"uncertain_inference\",\n \"transparent_meta_response\",\n] as const;\n\nexport type PersonaAnswerMode = (typeof PERSONA_ANSWER_MODES)[number];\n\nexport type DisclosurePolicy = \"always\" | \"on_request\";\n\nexport type PersonaLogger = {\n error(message: string): void;\n warn(message: string): void;\n};\n\nexport type PersonaGateOutput = {\n queryType: PersonaQueryType;\n safetyFlags: string[];\n neededMemoryTypes: PersonaMemoryType[];\n queryFocus: {\n time: string | null;\n people: string[];\n themes: string[];\n emotionHints: string[];\n };\n answerMode: PersonaAnswerMode;\n audit: {\n confidence: number;\n matchedSignals: string[];\n requiresClarification: boolean;\n };\n};\n\nexport type PersonaContextGatewayOutput = {\n contextKeys: {\n entities: string[];\n timePeriods: string[];\n lifeStages: string[];\n themes: string[];\n emotions: string[];\n domains: string[];\n };\n retrievalQueries: {\n episodic: string;\n semantic: string;\n habit: string;\n style: string;\n source: string;\n };\n};\n\nexport type PersonaTurnPlan = {\n gate: PersonaGateOutput;\n context: PersonaContextGatewayOutput;\n};\n\nexport type PersonaMemoryTriageIntent =\n | \"explicit_memory_request\"\n | \"explicit_forget_request\"\n | \"user_preference\"\n | \"autobiographical_fact\"\n | \"autobiographical_reasoning\"\n | \"emotional_salience\"\n | \"relationship_context\"\n | \"self_correction_feedback\"\n | \"durable_product_lesson\"\n | \"none\";\n\nexport type PersonaMemoryTriageType =\n | \"interaction\"\n | \"preference\"\n | \"correction\"\n | \"lesson\"\n | \"none\";\n\nexport type PersonaMemoryTriageSource = \"hard_rule\" | \"llm\" | \"llm_fallback\";\n\nexport type PersonaMemoryTriageDecision = {\n confidence: number;\n dedupeKey: string | null;\n memoryIntent: PersonaMemoryTriageIntent;\n memoryType: PersonaMemoryTriageType;\n privacyLevel: PersonaPrivacyLevel;\n reason: string;\n shouldRemember: boolean;\n source: PersonaMemoryTriageSource;\n summary: string | null;\n themes: string[];\n};\n\nexport type PersonaRuntimeContext = {\n disclosurePolicy: DisclosurePolicy;\n persona: PersonaProfile;\n promptContext: string;\n turnPlan: PersonaTurnPlan;\n workspaceId: string;\n};\n\nexport type PersonaJsonLlm = (input: {\n systemPrompt: string;\n userPrompt: string;\n}) => Promise<unknown>;\n\n// Deferred effect for text embeddings, mirroring PersonaJsonLlm: callers\n// inject the provider so retrieval and write paths stay testable and degrade\n// to lexical matching when no embedder is configured.\nexport type PersonaEmbedder = (texts: string[]) => Promise<number[][]>;\n\nexport type PersonaAffectVector = {\n arousal: number;\n dominance: number;\n valence: number;\n};\n\nexport type PersonaMoodEmotionLabelSource =\n | \"activated_memory\"\n | \"context_emotion\"\n | \"pad_inference\"\n | \"query_emotion_hint\"\n | \"query_type\";\n\nexport type PersonaMoodEmotionLabel = {\n evidence?: string;\n intensity: number;\n label: string;\n memoryId?: string;\n source: PersonaMoodEmotionLabelSource;\n};\n\nexport type PersonaMoodSignal = {\n affect?: PersonaAffectVector;\n emotionLabels?: PersonaMoodEmotionLabel[];\n id?: string;\n kind:\n | \"activated_memory\"\n | \"context_emotion\"\n | \"query_emotion_hint\"\n | \"query_type\";\n label?: string;\n queryType?: PersonaQueryType;\n summary?: string;\n};\n\nexport type PersonaTurnAffectEstimate = {\n emotionLabels: PersonaMoodEmotionLabel[];\n impulse: PersonaAffectVector | null;\n reasons: string[];\n sources: PersonaMoodSignal[];\n};\n\nexport type PersonaMoodUpdateTrace = {\n baseline: PersonaAffectVector;\n decayFactor: number;\n decayHalfLifeHours: number;\n decayedMood: PersonaAffectVector;\n elapsedMs: number;\n emotionLabels: PersonaMoodEmotionLabel[];\n impulse: PersonaAffectVector | null;\n inertia: number;\n previousMood: PersonaAffectVector | null;\n reasons: string[];\n result: PersonaAffectVector;\n sources: PersonaMoodSignal[];\n version: 1;\n};\n\nexport type PersonaMemoryCandidate = {\n // How many turns ever activated this memory; repeated recall strengthens\n // the trace (use-dependent consolidation).\n activationCount: number;\n // PAD affect annotation from the emotional salience layer; null when the\n // memory carries no emotion annotation. Drives mood-congruent recall and\n // the per-turn mood update.\n affect: PersonaAffectVector | null;\n // Extra ids this candidate can be addressed by when other memories link to\n // it (e.g. a source chunk also answers to its parent document id). The\n // candidate's own id is always addressable and does not need repeating.\n aliasIds: string[];\n confidence: number;\n createdAt: Date;\n emotions: PersonaEmotionAnnotation[];\n guidance: string[];\n id: string;\n kind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\" | \"source\";\n // When this memory last fired in a turn; recent recall primes availability.\n lastActivatedAt: Date | null;\n // Outbound references to other memories (supporting episodes, source\n // documents/chunks). Used for one-hop spreading activation.\n linkIds: string[];\n privacyLevel: PersonaPrivacyLevel;\n retrievalBoost: number;\n // Cosine similarity (0..1) against this turn's retrieval query, computed in\n // SQL from stored embeddings. Null when no embedder/embedding is available.\n semanticSimilarity: number | null;\n sourceConfidence: number;\n strength: number;\n summary: string;\n text: string;\n themes: string[];\n voice: string | null;\n};\n\nexport type PersonaMemoryActivationScoreBreakdown = {\n components: PersonaMemoryRetrievalPayload[\"candidates\"][number][\"components\"];\n score: number;\n};\n\nexport type PersonaMemoryRankedEntry = {\n activationScore: number | null;\n availability: number | null;\n baseRank: number | null;\n candidate: PersonaMemoryCandidate;\n components: PersonaMemoryRetrievalPayload[\"candidates\"][number][\"components\"];\n excludedReason: \"privacy\" | null;\n query: string;\n rank: number;\n rankBeforeSpreading: number | null;\n spreadingBoost: number;\n};\n\nexport type PersonaMemorySelectionResult = {\n retrieval: PersonaMemoryRetrievalPayload;\n selected: PersonaMemoryCandidate[];\n};\n\n// Identity memory (beliefs, habits, style) is tonic: it stays active every\n// turn so the persona keeps a stable point of view. Episodic and source\n// memory is phasic: it competes on query relevance within its own budget\n// instead of competing with identity memory in one global pool.\nexport const MEMORY_KIND_BUDGETS: Record<\n PersonaMemoryCandidate[\"kind\"],\n number\n> = {\n belief: 4,\n episode: 3,\n fact: 4,\n habit: 2,\n source: 3,\n style: 2,\n};\nexport const MAX_PROMPT_CONTEXT_CHARS = 12_000;\nexport const MAX_MEMORY_ENTRY_CHARS = 700;\nexport const MAX_EVIDENCE_SUMMARY_CHARS = 200;\nexport const MAX_SOURCE_EXCERPT_SUMMARY_CHARS = 620;\nexport const HINDSIGHT_EXTERNAL_OBSERVATION_PROMPT_CAP = 3;\nexport const HINDSIGHT_EXTERNAL_SOURCE_PROMPT_CAP = 2;\nexport const MAX_HINDSIGHT_RETAIN_CONTENT_CHARS = 12_000;\nexport const MEMORY_TRIAGE_CONFIDENCE_THRESHOLD = 0.62;\nexport const MEMORY_TRIAGE_SELECTED_MEMORY_CAP = 8;\n\nfunction normalizePersonaQueryFocusTime(value: unknown): unknown {\n if (!Array.isArray(value)) {\n return value;\n }\n\n if (value.length === 0) {\n return null;\n }\n\n const timeEntries = value.map((entry) =>\n typeof entry === \"string\" ? entry.trim() : null\n );\n if (timeEntries.some((entry) => entry === null)) {\n return value;\n }\n\n const nonEmptyTimeEntries = timeEntries.filter(\n (entry): entry is string => typeof entry === \"string\" && entry.length > 0\n );\n return nonEmptyTimeEntries.length > 0 ? nonEmptyTimeEntries.join(\", \") : null;\n}\n\nconst personaGateSchema = z\n .object({\n answerMode: z.enum(PERSONA_ANSWER_MODES),\n audit: z\n .object({\n confidence: z.number().min(0).max(1),\n matchedSignals: z.array(z.string().min(1)),\n requiresClarification: z.boolean(),\n })\n .strict(),\n neededMemoryTypes: z.array(z.enum(PERSONA_MEMORY_TYPES)),\n queryFocus: z\n .object({\n emotionHints: z.array(z.string()),\n people: z.array(z.string()),\n themes: z.array(z.string()),\n time: z.preprocess(\n normalizePersonaQueryFocusTime,\n z.string().nullable()\n ),\n })\n .strict(),\n queryType: z.enum(PERSONA_QUERY_TYPES),\n safetyFlags: z.array(z.string()),\n })\n .strict();\n\nconst personaContextGatewaySchema = z\n .object({\n contextKeys: z\n .object({\n domains: z.array(z.string()),\n emotions: z.array(z.string()),\n entities: z.array(z.string()),\n lifeStages: z.array(z.string()),\n themes: z.array(z.string()),\n timePeriods: z.array(z.string()),\n })\n .strict(),\n retrievalQueries: z\n .object({\n episodic: z.string(),\n habit: z.string(),\n semantic: z.string(),\n source: z.string(),\n style: z.string(),\n })\n .strict(),\n })\n .strict();\n\nexport const personaTurnPlanSchema = z\n .object({\n context: personaContextGatewaySchema,\n gate: personaGateSchema,\n })\n .strict();\n\nexport const personaMemoryTriageDecisionSchema = z\n .object({\n confidence: z.number().min(0).max(1),\n dedupeKey: z.string().min(1).nullable().default(null),\n memoryIntent: z.enum([\n \"explicit_memory_request\",\n \"explicit_forget_request\",\n \"user_preference\",\n \"autobiographical_fact\",\n \"autobiographical_reasoning\",\n \"emotional_salience\",\n \"relationship_context\",\n \"self_correction_feedback\",\n \"durable_product_lesson\",\n \"none\",\n ]),\n memoryType: z.enum([\n \"interaction\",\n \"preference\",\n \"correction\",\n \"lesson\",\n \"none\",\n ]),\n privacyLevel: z.enum(PERSONA_PRIVACY_LEVELS),\n reason: z.string().min(1),\n shouldRemember: z.boolean(),\n summary: z.string().min(1).nullable(),\n themes: z.array(z.string()).default([]),\n })\n .strict();\n\nexport const consolidationOutputSchema = z\n .object({\n beliefs: z\n .array(\n z\n .object({\n // create: a genuinely new belief. reinforce: the interactions\n // re-confirm targetBeliefId. contradict: the interactions\n // contradict targetBeliefId; proposition then carries the revised\n // statement (or repeats the old one when no revision is clear).\n action: z\n .enum([\"create\", \"reinforce\", \"contradict\"])\n .default(\"create\"),\n beliefType: z\n .enum([\n \"moral_principle\",\n \"epistemic_principle\",\n \"political_belief\",\n \"aesthetic_preference\",\n \"relationship_belief\",\n \"self_concept\",\n \"professional_norm\",\n \"conflict_strategy\",\n ])\n .default(\"relationship_belief\"),\n confidence: z.number().min(0).max(1),\n domain: z.string().min(1),\n firstPersonForm: z.string().optional(),\n proposition: z.string().min(1),\n strength: z.number().min(0).max(1),\n targetBeliefId: z.string().optional(),\n })\n .strict()\n )\n .default([]),\n episodes: z\n .array(\n z\n .object({\n confidence: z.number().min(0).max(1),\n eventSummary: z.string().min(1),\n title: z.string().min(1),\n })\n .strict()\n )\n .default([]),\n habits: z\n .array(\n z\n .object({\n confidence: z.number().min(0).max(1),\n defaultResponsePattern: z.array(z.string().min(1)).min(1),\n strength: z.number().min(0).max(1),\n trigger: z\n .object({\n description: z.string().min(1),\n type: z.string().min(1),\n })\n .strict(),\n })\n .strict()\n )\n .default([]),\n styleProfiles: z\n .array(\n z\n .object({\n register: z.string().min(1),\n sentenceLength: z.string().min(1),\n toneVector: z.record(z.string(), z.number()).default({}),\n })\n .strict()\n )\n .default([]),\n })\n .strict();\n","import { and, asc, eq, inArray, isNull, ne, or, sql } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaAliases,\n personaEmotionalSalience,\n personaEpisodeMemories,\n personaExternalMemoryRefs,\n personaFacts,\n personaHabitPatterns,\n personaInteractionMemories,\n personaMemoryEmbeddings,\n personaMoodStates,\n personaProfiles,\n personaSemanticBeliefs,\n personaSourceChunks,\n personaSourceDocuments,\n personaStyleProfiles,\n personaWorkspaceStates,\n} from \"../schema\";\nimport type {\n NewPersonaAlias,\n NewPersonaEmotionalSalience,\n NewPersonaEpisodeMemory,\n NewPersonaHabitPattern,\n NewPersonaProfile,\n NewPersonaSemanticBelief,\n NewPersonaSourceChunk,\n NewPersonaSourceDocument,\n NewPersonaStyleProfile,\n PersonaAlias,\n PersonaAliasSurface,\n PersonaProfile,\n PersonaScope,\n} from \"../schema\";\n\nfunction normalizePersonaKey(value: string): string {\n const personaKey = value.trim();\n if (!/^[a-z][a-z0-9._-]{0,79}$/.test(personaKey)) {\n throw new Error(\n \"personaKey must start with a lowercase letter and only contain lowercase letters, numbers, dots, underscores, or dashes.\"\n );\n }\n return personaKey;\n}\n\nfunction normalizePersonaAliasKey(value: string): string {\n const aliasKey = value.trim().toLocaleLowerCase();\n if (aliasKey.length === 0 || aliasKey.length > 80 || /\\s/u.test(aliasKey)) {\n throw new Error(\n \"persona alias must be a non-empty token with no whitespace and at most 80 characters.\"\n );\n }\n return aliasKey;\n}\n\nexport async function loadPersonaProfile(\n db: Database,\n input: { organizationId: string; personaKey: string }\n): Promise<PersonaProfile> {\n const personaKey = normalizePersonaKey(input.personaKey);\n const [existing] = await db\n .select()\n .from(personaProfiles)\n .where(\n and(\n eq(personaProfiles.organizationId, input.organizationId),\n eq(personaProfiles.personaKey, personaKey),\n eq(personaProfiles.state, \"active\")\n )\n )\n .limit(1);\n if (existing) {\n return existing;\n }\n\n throw new Error(\n `Persona ${personaKey} is not configured for this organization.`\n );\n}\n\nexport async function upsertPersonaProfile(\n db: Database,\n input: {\n consentStatus?: PersonaProfile[\"consentStatus\"];\n displayName?: string | null;\n organizationId: string;\n personaKey: string;\n personaType?: PersonaProfile[\"personaType\"];\n personaVersion?: string | null;\n policy?: Partial<PersonaProfile[\"policy\"]>;\n profile?: Record<string, unknown>;\n sourceRef?: string | null;\n updatedByUserId?: string | null;\n }\n): Promise<PersonaProfile> {\n const personaKey = normalizePersonaKey(input.personaKey);\n const existing = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey,\n }).catch(() => null);\n const displayName =\n input.displayName?.trim() ??\n existing?.displayName ??\n personaKey\n .split(/[-_]/u)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n const policy = {\n allowedUse: input.policy?.allowedUse ?? existing?.policy.allowedUse ?? [],\n biographicalSummary:\n input.policy?.biographicalSummary ??\n existing?.policy.biographicalSummary ??\n null,\n forbiddenUse:\n input.policy?.forbiddenUse ?? existing?.policy.forbiddenUse ?? [],\n knowledgeCutoffForPersona:\n input.policy?.knowledgeCutoffForPersona ??\n existing?.policy.knowledgeCutoffForPersona ??\n null,\n transparencyLabel:\n input.policy?.transparencyLabel ??\n existing?.policy.transparencyLabel ??\n `AI persona simulation for ${displayName}.`,\n };\n\n const values = {\n consentStatus:\n input.consentStatus ??\n existing?.consentStatus ??\n \"fictional_or_authorized\",\n displayName,\n organizationId: input.organizationId,\n personaKey,\n personaType: input.personaType ?? existing?.personaType ?? \"synthetic_role\",\n personaVersion:\n input.personaVersion?.trim() || existing?.personaVersion || \"v1\",\n policy,\n profile: input.profile ?? existing?.profile ?? {},\n sourceRef: input.sourceRef ?? existing?.sourceRef ?? null,\n state: \"active\" as const,\n updatedAt: new Date(),\n updatedByUserId: input.updatedByUserId ?? null,\n } satisfies NewPersonaProfile;\n\n const [saved] = await db\n .insert(personaProfiles)\n .values(values)\n .onConflictDoUpdate({\n set: values,\n target: [personaProfiles.organizationId, personaProfiles.personaKey],\n // idx_persona_profiles_org_key is a partial unique index (public\n // persona templates use a null organization id); ON CONFLICT must carry\n // the index predicate or Postgres cannot match the index and errors.\n targetWhere: sql`organization_id is not null`,\n })\n .returning();\n if (!saved) {\n throw new Error(\"Failed to upsert persona profile.\");\n }\n return saved;\n}\n\nexport async function upsertPersonaAlias(\n db: Database,\n input: {\n aliasKey: string;\n organizationId: string;\n personaKey: string;\n state?: PersonaAlias[\"state\"];\n surface?: PersonaAliasSurface;\n updatedByUserId?: string | null;\n }\n): Promise<PersonaAlias> {\n const aliasKey = normalizePersonaAliasKey(input.aliasKey);\n const surface = input.surface ?? \"slack\";\n const state = input.state ?? \"active\";\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n\n const directPersona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: aliasKey,\n }).catch(() => null);\n if (directPersona && directPersona.id !== persona.id) {\n throw new Error(\n `Persona alias ${aliasKey} conflicts with active persona key ${directPersona.personaKey}.`\n );\n }\n\n const [existingAlias] = await db\n .select({\n personaId: personaAliases.personaId,\n personaKey: personaProfiles.personaKey,\n })\n .from(personaAliases)\n .innerJoin(\n personaProfiles,\n eq(personaAliases.personaId, personaProfiles.id)\n )\n .where(\n and(\n eq(personaAliases.organizationId, input.organizationId),\n eq(personaAliases.surface, surface),\n eq(personaAliases.aliasKey, aliasKey),\n ne(personaAliases.state, \"deleted\")\n )\n )\n .limit(1);\n if (existingAlias && existingAlias.personaId !== persona.id) {\n // Comment: ON CONFLICT would otherwise move an alias between personas\n // silently, which makes Slack routing changes hard to audit.\n throw new Error(\n `Persona alias ${aliasKey} is already assigned to ${existingAlias.personaKey}.`\n );\n }\n\n const values = {\n aliasKey,\n organizationId: input.organizationId,\n personaId: persona.id,\n state,\n surface,\n updatedAt: new Date(),\n updatedByUserId: input.updatedByUserId ?? null,\n } satisfies NewPersonaAlias;\n\n const [saved] = await db\n .insert(personaAliases)\n .values({\n ...values,\n createdByUserId: input.updatedByUserId ?? null,\n })\n .onConflictDoUpdate({\n set: values,\n target: [\n personaAliases.organizationId,\n personaAliases.surface,\n personaAliases.aliasKey,\n ],\n targetWhere: sql`state <> 'deleted'`,\n })\n .returning();\n if (!saved) {\n throw new Error(\"Failed to upsert persona alias.\");\n }\n return saved;\n}\n\nexport async function listPersonaAliases(\n db: Database,\n input: {\n organizationId: string;\n personaKey?: string | null;\n surface?: PersonaAliasSurface;\n }\n): Promise<Array<PersonaAlias & { personaKey: string }>> {\n const personaKey = input.personaKey\n ? normalizePersonaKey(input.personaKey)\n : null;\n const rows = await db\n .select({\n alias: personaAliases,\n personaKey: personaProfiles.personaKey,\n })\n .from(personaAliases)\n .innerJoin(\n personaProfiles,\n eq(personaAliases.personaId, personaProfiles.id)\n )\n .where(\n and(\n eq(personaAliases.organizationId, input.organizationId),\n input.surface ? eq(personaAliases.surface, input.surface) : undefined,\n personaKey ? eq(personaProfiles.personaKey, personaKey) : undefined\n )\n )\n .orderBy(asc(personaAliases.surface), asc(personaAliases.aliasKey));\n\n return rows.map((row) => ({ ...row.alias, personaKey: row.personaKey }));\n}\n\nexport async function forgetPersonaLayerMemory(\n db: Database,\n input: {\n memoryId: string;\n organizationId: string;\n personaKey: string;\n sourceTitle?: string | null;\n }\n): Promise<{\n forgottenEmbeddings: number;\n forgottenMemory: {\n id: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\";\n title: string;\n };\n forgottenSourceChunks: number;\n forgottenSourceDocuments: number;\n}> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n\n return db.transaction(async (tx) => {\n const memory = await findPersonaLayerMemory(tx, {\n memoryId: input.memoryId,\n organizationId: input.organizationId,\n personaId: persona.id,\n });\n if (!memory) {\n throw new Error(\n `Persona memory ${input.memoryId} is not configured for persona ${persona.personaKey}.`\n );\n }\n\n const sourceDocumentIds = await findSyntheticSourceDocumentIdsForMemory(\n tx,\n {\n organizationId: input.organizationId,\n persona,\n sourceDocumentIds: memory.sourceDocumentIds,\n title: input.sourceTitle ?? memory.title,\n }\n );\n const sourceChunkIds =\n sourceDocumentIds.length > 0\n ? (\n await tx\n .select({ id: personaSourceChunks.id })\n .from(personaSourceChunks)\n .where(\n and(\n eq(personaSourceChunks.organizationId, input.organizationId),\n eq(personaSourceChunks.personaId, persona.id),\n inArray(\n personaSourceChunks.sourceDocumentId,\n sourceDocumentIds\n )\n )\n )\n ).map((row) => row.id)\n : [];\n\n const targetIds = [memory.id, ...sourceChunkIds];\n const deletedEmbeddings =\n targetIds.length > 0\n ? (\n await tx\n .delete(personaMemoryEmbeddings)\n .where(inArray(personaMemoryEmbeddings.targetId, targetIds))\n .returning({ id: personaMemoryEmbeddings.id })\n ).length\n : 0;\n\n const forgottenMemory = await forgetLayerMemoryByKind(tx, memory);\n const deletedSourceChunks =\n sourceChunkIds.length > 0\n ? (\n await tx\n .delete(personaSourceChunks)\n .where(inArray(personaSourceChunks.id, sourceChunkIds))\n .returning({ id: personaSourceChunks.id })\n ).length\n : 0;\n const deletedSourceDocuments =\n sourceDocumentIds.length > 0\n ? (\n await tx\n .delete(personaSourceDocuments)\n .where(inArray(personaSourceDocuments.id, sourceDocumentIds))\n .returning({ id: personaSourceDocuments.id })\n ).length\n : 0;\n const externalRefTargetIds = [\n memory.id,\n ...sourceChunkIds,\n ...sourceDocumentIds,\n ];\n if (externalRefTargetIds.length > 0) {\n await tx\n .update(personaExternalMemoryRefs)\n .set({ state: \"deleted\", updatedAt: new Date() })\n .where(\n and(\n eq(personaExternalMemoryRefs.organizationId, input.organizationId),\n eq(personaExternalMemoryRefs.personaId, persona.id),\n inArray(\n personaExternalMemoryRefs.localTargetId,\n externalRefTargetIds\n )\n )\n );\n }\n\n return {\n forgottenEmbeddings: deletedEmbeddings,\n forgottenMemory,\n forgottenSourceChunks: deletedSourceChunks,\n forgottenSourceDocuments: deletedSourceDocuments,\n };\n });\n}\n\ntype PersonaLayerMemoryForgetTarget = {\n id: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\";\n sourceDocumentIds: string[];\n title: string;\n};\n\nasync function findPersonaLayerMemory(\n db: Database,\n input: {\n memoryId: string;\n organizationId: string;\n personaId: string;\n }\n): Promise<PersonaLayerMemoryForgetTarget | null> {\n const [episode] = await db\n .select({\n id: personaEpisodeMemories.id,\n sourceRefs: personaEpisodeMemories.sourceRefs,\n title: personaEpisodeMemories.title,\n })\n .from(personaEpisodeMemories)\n .where(\n and(\n eq(personaEpisodeMemories.id, input.memoryId),\n eq(personaEpisodeMemories.organizationId, input.organizationId),\n eq(personaEpisodeMemories.personaId, input.personaId)\n )\n )\n .limit(1);\n if (episode) {\n return {\n id: episode.id,\n memoryKind: \"episode\",\n sourceDocumentIds: episode.sourceRefs\n .map((ref) => ref.sourceDocumentId)\n .filter((id): id is string => typeof id === \"string\" && id.length > 0),\n title: episode.title,\n };\n }\n\n const [belief] = await db\n .select({\n id: personaSemanticBeliefs.id,\n proposition: personaSemanticBeliefs.proposition,\n supportingSourceIds: personaSemanticBeliefs.supportingSourceIds,\n })\n .from(personaSemanticBeliefs)\n .where(\n and(\n eq(personaSemanticBeliefs.id, input.memoryId),\n eq(personaSemanticBeliefs.organizationId, input.organizationId),\n eq(personaSemanticBeliefs.personaId, input.personaId)\n )\n )\n .limit(1);\n if (belief) {\n const title = await findFirstSourceDocumentTitle(db, {\n organizationId: input.organizationId,\n personaId: input.personaId,\n sourceDocumentIds: belief.supportingSourceIds,\n });\n return {\n id: belief.id,\n memoryKind: \"belief\",\n sourceDocumentIds: belief.supportingSourceIds,\n title: title ?? belief.proposition,\n };\n }\n\n const [fact] = await db\n .select({\n claimText: personaFacts.claimText,\n id: personaFacts.id,\n sourceDocumentId: personaFacts.sourceDocumentId,\n sourceRefs: personaFacts.sourceRefs,\n })\n .from(personaFacts)\n .where(\n and(\n eq(personaFacts.id, input.memoryId),\n eq(personaFacts.organizationId, input.organizationId),\n eq(personaFacts.personaId, input.personaId)\n )\n )\n .limit(1);\n if (fact) {\n return {\n id: fact.id,\n memoryKind: \"fact\",\n sourceDocumentIds: [\n fact.sourceDocumentId,\n ...fact.sourceRefs\n .map((ref) => ref.sourceDocumentId)\n .filter(\n (id): id is string => typeof id === \"string\" && id.length > 0\n ),\n ],\n title: fact.claimText,\n };\n }\n\n const [habit] = await db\n .select({\n id: personaHabitPatterns.id,\n trigger: personaHabitPatterns.trigger,\n })\n .from(personaHabitPatterns)\n .where(\n and(\n eq(personaHabitPatterns.id, input.memoryId),\n eq(personaHabitPatterns.organizationId, input.organizationId),\n eq(personaHabitPatterns.personaId, input.personaId)\n )\n )\n .limit(1);\n if (habit) {\n return {\n id: habit.id,\n memoryKind: \"habit\",\n sourceDocumentIds: [],\n title: habit.trigger.description,\n };\n }\n\n const [style] = await db\n .select({\n id: personaStyleProfiles.id,\n })\n .from(personaStyleProfiles)\n .where(\n and(\n eq(personaStyleProfiles.id, input.memoryId),\n eq(personaStyleProfiles.organizationId, input.organizationId),\n eq(personaStyleProfiles.personaId, input.personaId)\n )\n )\n .limit(1);\n if (style) {\n return {\n id: style.id,\n memoryKind: \"style\",\n sourceDocumentIds: [],\n title: style.id,\n };\n }\n\n return null;\n}\n\nasync function findFirstSourceDocumentTitle(\n db: Database,\n input: {\n organizationId: string;\n personaId: string;\n sourceDocumentIds: string[];\n }\n): Promise<string | null> {\n if (input.sourceDocumentIds.length === 0) {\n return null;\n }\n const [source] = await db\n .select({ title: personaSourceDocuments.title })\n .from(personaSourceDocuments)\n .where(\n and(\n eq(personaSourceDocuments.organizationId, input.organizationId),\n eq(personaSourceDocuments.personaId, input.personaId),\n inArray(personaSourceDocuments.id, input.sourceDocumentIds)\n )\n )\n .limit(1);\n return source?.title ?? null;\n}\n\nasync function findSyntheticSourceDocumentIdsForMemory(\n db: Database,\n input: {\n organizationId: string;\n persona: PersonaProfile;\n sourceDocumentIds: string[];\n title: string;\n }\n): Promise<string[]> {\n const sourceDocumentIds = input.sourceDocumentIds.filter(Boolean);\n const title = input.title.trim();\n if (sourceDocumentIds.length === 0 && title.length === 0) {\n return [];\n }\n\n const idOrTitle =\n sourceDocumentIds.length > 0 && title.length > 0\n ? or(\n inArray(personaSourceDocuments.id, sourceDocumentIds),\n eq(personaSourceDocuments.title, title)\n )\n : sourceDocumentIds.length > 0\n ? inArray(personaSourceDocuments.id, sourceDocumentIds)\n : eq(personaSourceDocuments.title, title);\n const rows = await db\n .select({ id: personaSourceDocuments.id })\n .from(personaSourceDocuments)\n .where(\n and(\n eq(personaSourceDocuments.organizationId, input.organizationId),\n eq(personaSourceDocuments.personaId, input.persona.id),\n eq(personaSourceDocuments.sourceType, \"seed\"),\n eq(personaSourceDocuments.sourcePriority, \"synthetic\"),\n sql`${personaSourceDocuments.contentHash} like 'manual:%'`,\n idOrTitle\n )\n );\n return rows.map((row) => row.id);\n}\n\nasync function forgetLayerMemoryByKind(\n db: Database,\n memory: PersonaLayerMemoryForgetTarget\n) {\n if (memory.memoryKind === \"episode\") {\n const [deleted] = await db\n .delete(personaEpisodeMemories)\n .where(eq(personaEpisodeMemories.id, memory.id))\n .returning({\n id: personaEpisodeMemories.id,\n title: personaEpisodeMemories.title,\n });\n return {\n id: deleted?.id ?? memory.id,\n memoryKind: memory.memoryKind,\n title: deleted?.title ?? memory.title,\n };\n }\n\n if (memory.memoryKind === \"belief\") {\n const [deleted] = await db\n .delete(personaSemanticBeliefs)\n .where(eq(personaSemanticBeliefs.id, memory.id))\n .returning({\n id: personaSemanticBeliefs.id,\n title: personaSemanticBeliefs.proposition,\n });\n return {\n id: deleted?.id ?? memory.id,\n memoryKind: memory.memoryKind,\n title: memory.title || deleted?.title || memory.id,\n };\n }\n\n if (memory.memoryKind === \"fact\") {\n const [deleted] = await db\n .delete(personaFacts)\n .where(eq(personaFacts.id, memory.id))\n .returning({\n id: personaFacts.id,\n title: personaFacts.claimText,\n });\n return {\n id: deleted?.id ?? memory.id,\n memoryKind: memory.memoryKind,\n title: deleted?.title ?? memory.title,\n };\n }\n\n if (memory.memoryKind === \"habit\") {\n const [deleted] = await db\n .delete(personaHabitPatterns)\n .where(eq(personaHabitPatterns.id, memory.id))\n .returning({\n id: personaHabitPatterns.id,\n trigger: personaHabitPatterns.trigger,\n });\n return {\n id: deleted?.id ?? memory.id,\n memoryKind: memory.memoryKind,\n title: deleted?.trigger.description ?? memory.title,\n };\n }\n\n const [deleted] = await db\n .delete(personaStyleProfiles)\n .where(eq(personaStyleProfiles.id, memory.id))\n .returning({ id: personaStyleProfiles.id });\n return {\n id: deleted?.id ?? memory.id,\n memoryKind: memory.memoryKind,\n title: memory.title,\n };\n}\n\nexport async function copyPersonaProfile(\n db: Database,\n input: {\n sourcePersonaKey: string;\n targetOrganizationId: string;\n targetPersonaKey?: string | null;\n updatedByUserId?: string | null;\n }\n): Promise<{\n copiedCounts: {\n beliefs: number;\n episodes: number;\n habits: number;\n sourceChunks: number;\n sourceDocuments: number;\n styleProfiles: number;\n };\n persona: PersonaProfile;\n sourcePersona: PersonaProfile;\n}> {\n const sourcePersonaKey = normalizePersonaKey(input.sourcePersonaKey);\n const targetPersonaKey = normalizePersonaKey(\n input.targetPersonaKey ?? input.sourcePersonaKey\n );\n\n return db.transaction(async (tx) => {\n const sourcePersona = await loadPublicPersonaProfile(tx, sourcePersonaKey);\n const existingTarget = await loadPersonaProfile(tx, {\n organizationId: input.targetOrganizationId,\n personaKey: targetPersonaKey,\n }).catch(() => null);\n if (existingTarget) {\n throw new Error(\n `Persona ${targetPersonaKey} is already configured for the target organization.`\n );\n }\n\n const cloned = await clonePersonaIntoScope(tx, {\n personaScope: \"organization\",\n sourcePersona,\n targetOrganizationId: input.targetOrganizationId,\n targetPersonaKey,\n updatedByUserId: input.updatedByUserId ?? null,\n });\n return { ...cloned, sourcePersona };\n });\n}\n\n// Publishes an organization persona as a global public template (null\n// organization id, persona_scope \"public\") so other orgs can browse and copy\n// it. The inverse of copyPersonaProfile.\nexport async function publishPersonaProfile(\n db: Database,\n input: {\n organizationId: string;\n personaKey: string;\n publicPersonaKey?: string | null;\n updatedByUserId?: string | null;\n }\n): Promise<{\n persona: PersonaProfile;\n publishedCounts: {\n beliefs: number;\n episodes: number;\n habits: number;\n sourceChunks: number;\n sourceDocuments: number;\n styleProfiles: number;\n };\n sourcePersona: PersonaProfile;\n}> {\n const personaKey = normalizePersonaKey(input.personaKey);\n const publicPersonaKey = normalizePersonaKey(\n input.publicPersonaKey ?? input.personaKey\n );\n\n return db.transaction(async (tx) => {\n const sourcePersona = await loadPersonaProfile(tx, {\n organizationId: input.organizationId,\n personaKey,\n });\n const existingPublic = await loadPublicPersonaProfile(\n tx,\n publicPersonaKey\n ).catch(() => null);\n if (existingPublic) {\n const refreshedPersona = await refreshPublishedPersonaProfile(tx, {\n existingPublic,\n sourcePersona,\n updatedByUserId: input.updatedByUserId ?? null,\n });\n await clearPersonaMemoryLayers(tx, refreshedPersona);\n const cloned = await clonePersonaIntoScope(tx, {\n personaScope: \"public\",\n sourcePersona,\n targetOrganizationId: null,\n targetPersona: refreshedPersona,\n targetPersonaKey: publicPersonaKey,\n updatedByUserId: input.updatedByUserId ?? null,\n });\n return {\n persona: cloned.persona,\n publishedCounts: cloned.copiedCounts,\n sourcePersona,\n };\n }\n\n const cloned = await clonePersonaIntoScope(tx, {\n personaScope: \"public\",\n sourcePersona,\n targetOrganizationId: null,\n targetPersonaKey: publicPersonaKey,\n updatedByUserId: input.updatedByUserId ?? null,\n });\n return {\n persona: cloned.persona,\n publishedCounts: cloned.copiedCounts,\n sourcePersona,\n };\n });\n}\n\nasync function refreshPublishedPersonaProfile(\n tx: Database,\n input: {\n existingPublic: PersonaProfile;\n sourcePersona: PersonaProfile;\n updatedByUserId: string | null;\n }\n): Promise<PersonaProfile> {\n const [refreshedPersona] = await tx\n .update(personaProfiles)\n .set({\n consentStatus: input.sourcePersona.consentStatus,\n displayName: input.sourcePersona.displayName,\n personaType: input.sourcePersona.personaType,\n personaVersion: input.sourcePersona.personaVersion,\n policy: input.sourcePersona.policy,\n profile: input.sourcePersona.profile,\n sourceRef: input.sourcePersona.sourceRef,\n state: input.sourcePersona.state,\n updatedAt: new Date(),\n updatedByUserId: input.updatedByUserId,\n } satisfies Partial<NewPersonaProfile>)\n .where(eq(personaProfiles.id, input.existingPublic.id))\n .returning();\n if (!refreshedPersona) {\n throw new Error(\"Failed to refresh published persona profile.\");\n }\n return refreshedPersona;\n}\n\nasync function clearPersonaMemoryLayers(\n tx: Database,\n persona: PersonaProfile\n): Promise<void> {\n await tx\n .delete(personaMemoryEmbeddings)\n .where(eq(personaMemoryEmbeddings.personaId, persona.id));\n await tx\n .delete(personaEmotionalSalience)\n .where(eq(personaEmotionalSalience.personaId, persona.id));\n await tx\n .delete(personaInteractionMemories)\n .where(eq(personaInteractionMemories.personaId, persona.id));\n await tx\n .delete(personaMoodStates)\n .where(eq(personaMoodStates.personaId, persona.id));\n await tx\n .delete(personaWorkspaceStates)\n .where(eq(personaWorkspaceStates.personaId, persona.id));\n await tx\n .delete(personaEpisodeMemories)\n .where(eq(personaEpisodeMemories.personaId, persona.id));\n await tx\n .delete(personaSemanticBeliefs)\n .where(eq(personaSemanticBeliefs.personaId, persona.id));\n await tx\n .delete(personaHabitPatterns)\n .where(eq(personaHabitPatterns.personaId, persona.id));\n await tx\n .delete(personaStyleProfiles)\n .where(eq(personaStyleProfiles.personaId, persona.id));\n await tx\n .delete(personaSourceChunks)\n .where(eq(personaSourceChunks.personaId, persona.id));\n await tx\n .delete(personaSourceDocuments)\n .where(eq(personaSourceDocuments.personaId, persona.id));\n}\n\n// Shared deep clone of a persona profile and all memory layers into a new\n// scope, remapping cross-references. Used by copyPersonaProfile (public\n// template -> org) and publishPersonaProfile (org -> public template).\nasync function clonePersonaIntoScope(\n tx: Database,\n input: {\n personaScope: PersonaScope;\n sourcePersona: PersonaProfile;\n targetOrganizationId: string | null;\n targetPersona?: PersonaProfile;\n targetPersonaKey: string;\n updatedByUserId: string | null;\n }\n): Promise<{\n copiedCounts: {\n beliefs: number;\n episodes: number;\n habits: number;\n sourceChunks: number;\n sourceDocuments: number;\n styleProfiles: number;\n };\n persona: PersonaProfile;\n}> {\n const sourcePersona = input.sourcePersona;\n const sourceOrganizationId = sourcePersona.organizationId;\n\n const copiedPersona =\n input.targetPersona ??\n (\n await tx\n .insert(personaProfiles)\n .values({\n consentStatus: sourcePersona.consentStatus,\n displayName: sourcePersona.displayName,\n organizationId: input.targetOrganizationId,\n personaKey: input.targetPersonaKey,\n personaScope: input.personaScope,\n personaType: sourcePersona.personaType,\n personaVersion: sourcePersona.personaVersion,\n policy: sourcePersona.policy,\n profile: sourcePersona.profile,\n sourceRef: sourcePersona.sourceRef,\n state: sourcePersona.state,\n updatedAt: new Date(),\n updatedByUserId: input.updatedByUserId ?? null,\n } satisfies NewPersonaProfile)\n .returning()\n )[0];\n if (!copiedPersona) {\n throw new Error(\"Failed to copy persona profile.\");\n }\n\n const sourceDocuments = await tx\n .select()\n .from(personaSourceDocuments)\n .where(\n and(\n sourceOrganizationId === null\n ? isNull(personaSourceDocuments.organizationId)\n : eq(personaSourceDocuments.organizationId, sourceOrganizationId),\n eq(personaSourceDocuments.personaId, sourcePersona.id)\n )\n )\n .orderBy(asc(personaSourceDocuments.createdAt));\n const sourceDocumentIdMap = new Map<string, string>();\n let copiedSourceChunks = 0;\n\n for (const sourceDocument of sourceDocuments) {\n const [copiedDocument] = await tx\n .insert(personaSourceDocuments)\n .values({\n author: sourceDocument.author,\n consentStatus: sourceDocument.consentStatus,\n contentHash: sourceDocument.contentHash,\n createdAt: sourceDocument.createdAt,\n ingestedAt: sourceDocument.ingestedAt,\n metadata: sourceDocument.metadata,\n organizationId: input.targetOrganizationId,\n personaId: copiedPersona.id,\n privacyLevel: sourceDocument.privacyLevel,\n publicationDate: sourceDocument.publicationDate,\n reliability: sourceDocument.reliability,\n rightsStatus: sourceDocument.rightsStatus,\n sourcePriority: sourceDocument.sourcePriority,\n sourceType: sourceDocument.sourceType,\n sourceUri: sourceDocument.sourceUri,\n state: sourceDocument.state,\n title: sourceDocument.title,\n updatedAt: sourceDocument.updatedAt,\n } satisfies NewPersonaSourceDocument)\n .returning();\n if (!copiedDocument) {\n throw new Error(\"Failed to copy persona source document.\");\n }\n sourceDocumentIdMap.set(sourceDocument.id, copiedDocument.id);\n\n const chunks = await tx\n .select()\n .from(personaSourceChunks)\n .where(eq(personaSourceChunks.sourceDocumentId, sourceDocument.id))\n .orderBy(asc(personaSourceChunks.createdAt));\n if (chunks.length > 0) {\n await tx.insert(personaSourceChunks).values(\n chunks.map(\n (chunk) =>\n ({\n createdAt: chunk.createdAt,\n embeddingId: null,\n emotions: chunk.emotions,\n endChar: chunk.endChar,\n entities: chunk.entities,\n organizationId: input.targetOrganizationId,\n personaId: copiedPersona.id,\n sourceDocumentId: copiedDocument.id,\n startChar: chunk.startChar,\n text: chunk.text,\n themes: chunk.themes,\n timeMentions: chunk.timeMentions,\n }) satisfies NewPersonaSourceChunk\n )\n );\n copiedSourceChunks += chunks.length;\n }\n }\n\n const sourceEpisodes = await tx\n .select()\n .from(personaEpisodeMemories)\n .where(\n and(\n sourceOrganizationId === null\n ? isNull(personaEpisodeMemories.organizationId)\n : eq(personaEpisodeMemories.organizationId, sourceOrganizationId),\n eq(personaEpisodeMemories.personaId, sourcePersona.id)\n )\n )\n .orderBy(asc(personaEpisodeMemories.createdAt));\n const episodeIdMap = new Map<string, string>();\n for (const episode of sourceEpisodes) {\n const [copiedEpisode] = await tx\n .insert(personaEpisodeMemories)\n .values({\n confidence: episode.confidence,\n createdAt: episode.createdAt,\n eventSummary: episode.eventSummary,\n firstPersonRecollection: episode.firstPersonRecollection,\n location: episode.location,\n organizationId: input.targetOrganizationId,\n people: episode.people,\n personaId: copiedPersona.id,\n privacyLevel: episode.privacyLevel,\n sourceRefs: episode.sourceRefs.map((ref) => ({\n ...ref,\n sourceDocumentId: ref.sourceDocumentId\n ? (sourceDocumentIdMap.get(ref.sourceDocumentId) ??\n ref.sourceDocumentId)\n : undefined,\n })),\n state: episode.state,\n themes: episode.themes,\n thoughtAnnotations: episode.thoughtAnnotations,\n time: episode.time,\n title: episode.title,\n updatedAt: episode.updatedAt,\n } satisfies NewPersonaEpisodeMemory)\n .returning();\n if (!copiedEpisode) {\n throw new Error(\"Failed to copy persona episode memory.\");\n }\n episodeIdMap.set(episode.id, copiedEpisode.id);\n }\n\n await copyEmotionalSalience(tx, {\n episodeIdMap,\n sourceOrganizationId,\n sourcePersonaId: sourcePersona.id,\n targetOrganizationId: input.targetOrganizationId,\n targetPersonaId: copiedPersona.id,\n });\n\n const sourceBeliefs = await tx\n .select()\n .from(personaSemanticBeliefs)\n .where(\n and(\n sourceOrganizationId === null\n ? isNull(personaSemanticBeliefs.organizationId)\n : eq(personaSemanticBeliefs.organizationId, sourceOrganizationId),\n eq(personaSemanticBeliefs.personaId, sourcePersona.id)\n )\n )\n .orderBy(asc(personaSemanticBeliefs.createdAt));\n if (sourceBeliefs.length > 0) {\n await tx.insert(personaSemanticBeliefs).values(\n sourceBeliefs.map(\n (belief) =>\n ({\n beliefType: belief.beliefType,\n confidence: belief.confidence,\n contradictingSourceIds: remapIds(\n belief.contradictingSourceIds,\n sourceDocumentIdMap\n ),\n createdAt: belief.createdAt,\n domain: belief.domain,\n exceptions: belief.exceptions,\n firstPersonForm: belief.firstPersonForm,\n organizationId: input.targetOrganizationId,\n personaId: copiedPersona.id,\n privacyLevel: belief.privacyLevel,\n proposition: belief.proposition,\n stance: belief.stance,\n state: belief.state,\n strength: belief.strength,\n supportingMemoryIds: remapIds(\n belief.supportingMemoryIds,\n episodeIdMap\n ),\n supportingSourceIds: remapIds(\n belief.supportingSourceIds,\n sourceDocumentIdMap\n ),\n temporalValidity: belief.temporalValidity,\n updatedAt: belief.updatedAt,\n }) satisfies NewPersonaSemanticBelief\n )\n );\n }\n\n const sourceHabits = await tx\n .select()\n .from(personaHabitPatterns)\n .where(\n and(\n sourceOrganizationId === null\n ? isNull(personaHabitPatterns.organizationId)\n : eq(personaHabitPatterns.organizationId, sourceOrganizationId),\n eq(personaHabitPatterns.personaId, sourcePersona.id)\n )\n )\n .orderBy(asc(personaHabitPatterns.createdAt));\n if (sourceHabits.length > 0) {\n await tx.insert(personaHabitPatterns).values(\n sourceHabits.map(\n (habit) =>\n ({\n avoidPatterns: habit.avoidPatterns,\n confidence: habit.confidence,\n createdAt: habit.createdAt,\n defaultResponsePattern: habit.defaultResponsePattern,\n organizationId: input.targetOrganizationId,\n personaId: copiedPersona.id,\n rhetoricalMoves: habit.rhetoricalMoves,\n state: habit.state,\n strength: habit.strength,\n supportingExampleIds: remapIds(\n habit.supportingExampleIds,\n sourceDocumentIdMap\n ),\n tone: habit.tone,\n trigger: habit.trigger,\n updatedAt: habit.updatedAt,\n }) satisfies NewPersonaHabitPattern\n )\n );\n }\n\n const sourceStyles = await tx\n .select()\n .from(personaStyleProfiles)\n .where(\n and(\n sourceOrganizationId === null\n ? isNull(personaStyleProfiles.organizationId)\n : eq(personaStyleProfiles.organizationId, sourceOrganizationId),\n eq(personaStyleProfiles.personaId, sourcePersona.id)\n )\n )\n .orderBy(asc(personaStyleProfiles.createdAt));\n if (sourceStyles.length > 0) {\n await tx.insert(personaStyleProfiles).values(\n sourceStyles.map(\n (style) =>\n ({\n avoidPhrases: style.avoidPhrases,\n commonPhrases: style.commonPhrases,\n createdAt: style.createdAt,\n lexicalPreferences: style.lexicalPreferences,\n organizationId: input.targetOrganizationId,\n personaId: copiedPersona.id,\n preferredRhetoricalMoves: style.preferredRhetoricalMoves,\n register: style.register,\n sentenceLength: style.sentenceLength,\n state: style.state,\n toneVector: style.toneVector,\n updatedAt: style.updatedAt,\n }) satisfies NewPersonaStyleProfile\n )\n );\n }\n\n return {\n copiedCounts: {\n beliefs: sourceBeliefs.length,\n episodes: sourceEpisodes.length,\n habits: sourceHabits.length,\n sourceChunks: copiedSourceChunks,\n sourceDocuments: sourceDocuments.length,\n styleProfiles: sourceStyles.length,\n },\n persona: copiedPersona,\n };\n}\n\nexport async function listPublicPersonaProfiles(\n db: Database\n): Promise<PersonaProfile[]> {\n return db\n .select()\n .from(personaProfiles)\n .where(\n and(eq(personaProfiles.state, \"active\"), publicPersonaScopeCondition())\n )\n .orderBy(asc(personaProfiles.personaKey), asc(personaProfiles.createdAt));\n}\n\nasync function loadPublicPersonaProfile(\n db: Database,\n personaKey: string\n): Promise<PersonaProfile> {\n const candidates = await db\n .select()\n .from(personaProfiles)\n .where(\n and(\n eq(personaProfiles.personaKey, personaKey),\n eq(personaProfiles.state, \"active\"),\n publicPersonaScopeCondition()\n )\n )\n .orderBy(asc(personaProfiles.createdAt))\n .limit(2);\n\n if (candidates.length === 1 && candidates[0]) {\n return candidates[0];\n }\n if (candidates.length > 1) {\n throw new Error(\n `Multiple public personas are configured with key ${personaKey}.`\n );\n }\n throw new Error(`Public persona ${personaKey} is not configured.`);\n}\n\nfunction publicPersonaScopeCondition() {\n // Comment: Production public persona templates are represented by a null organization scope.\n return isNull(personaProfiles.organizationId);\n}\n\nfunction remapIds(values: string[], idMap: Map<string, string>): string[] {\n return values.map((value) => idMap.get(value) ?? value);\n}\n\nasync function copyEmotionalSalience(\n db: Database,\n input: {\n episodeIdMap: Map<string, string>;\n sourceOrganizationId: string | null;\n sourcePersonaId: string;\n targetOrganizationId: string | null;\n targetPersonaId: string;\n }\n): Promise<void> {\n if (input.episodeIdMap.size === 0) {\n return;\n }\n\n const sourceSalience = await db\n .select()\n .from(personaEmotionalSalience)\n .where(\n and(\n input.sourceOrganizationId === null\n ? isNull(personaEmotionalSalience.organizationId)\n : eq(\n personaEmotionalSalience.organizationId,\n input.sourceOrganizationId\n ),\n eq(personaEmotionalSalience.personaId, input.sourcePersonaId)\n )\n )\n .orderBy(asc(personaEmotionalSalience.createdAt));\n const values = sourceSalience.flatMap((salience) => {\n const episodeMemoryId = input.episodeIdMap.get(salience.episodeMemoryId);\n if (!episodeMemoryId) {\n return [];\n }\n return [\n {\n arousal: salience.arousal,\n confidence: salience.confidence,\n createdAt: salience.createdAt,\n dominance: salience.dominance,\n emotions: salience.emotions,\n episodeMemoryId,\n notes: salience.notes,\n organizationId: input.targetOrganizationId,\n personaId: input.targetPersonaId,\n retrievalBoost: salience.retrievalBoost,\n salienceScore: salience.salienceScore,\n selfRelevance: salience.selfRelevance,\n socialRelevance: salience.socialRelevance,\n updatedAt: salience.updatedAt,\n valence: salience.valence,\n } satisfies NewPersonaEmotionalSalience,\n ];\n });\n if (values.length > 0) {\n await db.insert(personaEmotionalSalience).values(values);\n }\n}\n","import { PERSONA_PRIVACY_LEVELS } from \"../schema\";\nimport {\n PERSONA_ANSWER_MODES,\n PERSONA_MEMORY_TYPES,\n PERSONA_QUERY_TYPES,\n} from \"./types\";\n\n// Naming note: \"Thalamic Gate\" and \"Entorhinal Context Gateway\" are\n// functional shorthands from the memory-stack plan, marking pipeline position\n// (gate before retrieval, context keys before the hippocampal index). The\n// classification work itself (intent, safety, answer mode) is closer to\n// association-cortex/prefrontal appraisal than to the biological thalamus.\nexport const PERSONA_TURN_PLANNER_SYSTEM_PROMPT = [\n \"You implement the Thalamic Gate and Entorhinal Context Gateway for a persona memory stack.\",\n \"Return json only. Do not include markdown.\",\n \"\",\n \"The gate must classify intent, safety, retrieval routing, scope, and answer mode.\",\n \"The context gateway must extract entities, time periods, life stages, themes, emotions, domains, and retrieval queries.\",\n \"Write retrievalQueries in the dominant language of the user message and keep proper nouns (people, products, companies) verbatim so lexical retrieval can match stored memories.\",\n \"Do not invent private facts. If the request asks for identity confusion, impersonation, unsafe persuasion, out-of-scope content, or unstored private motives, set safetyFlags when appropriate and use transparent_meta_response for boundary handling.\",\n \"Questions about concrete products, brands, places, tools, clothes, foods, or other items the persona uses, chose, displayed, recommended, or discussed in source material are ordinary factual or autobiographical requests. Route them to persona_fact plus source_chunk retrieval, preserve the item noun and brand/product terms in retrievalQueries.source, and do not use transparent_meta_response merely because the detail is personal.\",\n \"Generic greetings, introductions, who-are-you prompts, and opinion requests are not identity_confusion by themselves. Route them to persona_grounded_response unless the user directly asks whether the persona is an AI, model, system, or the original person; asks about consciousness; or asks about memory provenance.\",\n \"\",\n \"Allowed queryType values:\",\n ...PERSONA_QUERY_TYPES.map((value) => `- ${value}`),\n \"\",\n \"Allowed neededMemoryTypes:\",\n ...PERSONA_MEMORY_TYPES.map((value) => `- ${value}`),\n \"- [] when the turn can be answered without pre-activating durable persona memory, such as safe tool smoke tests, routing checks, or generic capability checks.\",\n \"\",\n \"Allowed answerMode values:\",\n ...PERSONA_ANSWER_MODES.map((value) => `- ${value}`),\n \"\",\n \"Field type requirements:\",\n \"- gate.queryFocus.time must be one string or null, never an array. If multiple time phrases are relevant, combine them into one concise string.\",\n \"- context.contextKeys.timePeriods is the array for multiple time periods.\",\n \"\",\n \"Return exactly this shape:\",\n `{\"gate\":{\"queryType\":\"value_judgment\",\"safetyFlags\":[],\"neededMemoryTypes\":[\"semantic_belief\",\"episodic\",\"habit_pattern\"],\"queryFocus\":{\"time\":null,\"people\":[],\"themes\":[\"decision\"],\"emotionHints\":[]},\"answerMode\":\"persona_grounded_response\",\"audit\":{\"confidence\":0.86,\"matchedSignals\":[\"asks for persona judgment\"],\"requiresClarification\":false}},\"context\":{\"contextKeys\":{\"entities\":[],\"timePeriods\":[],\"lifeStages\":[],\"themes\":[\"decision\"],\"emotions\":[],\"domains\":[\"work\"]},\"retrievalQueries\":{\"episodic\":\"decision work context\",\"semantic\":\"beliefs about decision tradeoffs\",\"habit\":\"response pattern for decision tradeoffs\",\"style\":\"tone for explaining decisions\",\"source\":\"source evidence for decision\"}}}`,\n].join(\"\\n\");\n\nexport const PERSONA_CONSOLIDATION_SYSTEM_PROMPT = [\n \"You consolidate explicit persona interaction memories into durable persona memory layers.\",\n \"Return json only. Do not include markdown.\",\n \"Use only provided interaction ids as source support. Do not create sensitive or unsupported claims.\",\n \"Semantic beliefs must be stable facts, values, preferences, or principles. Preserve small but answerable source-backed facts, including concrete products, brands, items, places, or materials the persona explicitly uses, chooses, recommends, dislikes, or is shown discussing. Habits must describe repeated behavior guidance. Episodes must be concrete events.\",\n \"\",\n \"Existing beliefs are listed with ids. For each output belief choose an action:\",\n '- \"create\": a genuinely new belief not covered by any existing belief.',\n '- \"reinforce\": the interactions re-confirm an existing belief; set targetBeliefId. Do not restate near-duplicates as create.',\n '- \"contradict\": the interactions contradict an existing belief; set targetBeliefId and put the revised statement in proposition (repeat the old proposition if no clear revision exists).',\n `Return exactly this shape: {\"beliefs\":[{\"action\":\"create\",\"beliefType\":\"professional_norm\",\"confidence\":0.86,\"domain\":\"product\",\"proposition\":\"The persona treats small, measurable experiments as the default way to reduce product uncertainty.\",\"strength\":0.82}],\"episodes\":[{\"confidence\":0.8,\"eventSummary\":\"The persona learned from a specific product decision.\",\"title\":\"Product decision learning\"}],\"habits\":[{\"confidence\":0.84,\"defaultResponsePattern\":[\"Start by identifying the decision, metric, user segment, and smallest useful experiment.\"],\"strength\":0.8,\"trigger\":{\"description\":\"When asked to evaluate a product idea or metric movement\",\"type\":\"product_judgment\"}}],\"styleProfiles\":[{\"register\":\"direct\",\"sentenceLength\":\"medium\",\"toneVector\":{\"pragmatic\":0.8,\"evidence_based\":0.75}}]}`,\n].join(\"\\n\");\n\nexport const PERSONA_SOURCE_DRAFTING_SYSTEM_PROMPT = [\n \"You draft durable persona memory candidates from a persona source document.\",\n \"Return json only. Do not include markdown.\",\n \"Use only the provided source chunks. Do not infer private facts from weak visual or contextual hints unless the source text, caption, transcript, OCR, or supplied description directly supports the claim.\",\n \"Capture sourceFacts for concrete details that can answer future factual questions: products, brands, tools, clothing, food, places, collaborators, owned/used items, recommendations, dislikes, and other directly stated or directly observed details. A toothbrush brand shown or named in a source should become a sourceFact when the source links it to the persona.\",\n \"Use beliefs for stable values, principles, tastes, and preferences; episodes for concrete events; habits for repeated response behavior; styleProfiles for voice.\",\n `Return exactly this shape: {\"sourceFacts\":[{\"factType\":\"uses_product\",\"objectType\":\"product\",\"objectName\":\"Curaprox toothbrush\",\"objectKey\":\"curaprox toothbrush\",\"confidence\":0.88,\"claimText\":\"The persona uses a Curaprox toothbrush in the source video.\",\"firstPersonForm\":\"I use Curaprox.\",\"evidenceSpan\":\"The visible toothbrush is labeled Curaprox.\",\"sourceChunkIds\":[\"chunk_1\"]}],\"beliefs\":[{\"beliefType\":\"aesthetic_preference\",\"confidence\":0.86,\"domain\":\"product\",\"proposition\":\"The persona prefers everyday products whose tactile details make daily use feel deliberate.\",\"sourceChunkIds\":[\"chunk_1\"],\"strength\":0.82}],\"episodes\":[{\"confidence\":0.8,\"eventSummary\":\"The persona discussed an everyday product choice in a recorded source.\",\"sourceChunkIds\":[\"chunk_1\"],\"title\":\"Everyday product choice\"}],\"habits\":[{\"confidence\":0.84,\"defaultResponsePattern\":[\"Answer concrete product questions plainly from source-backed memory, then add the persona's taste criteria.\"],\"sourceChunkIds\":[\"chunk_1\"],\"strength\":0.8,\"trigger\":{\"description\":\"When asked about a concrete product or brand the persona uses\",\"type\":\"source_backed_product_fact\"}}],\"styleProfiles\":[{\"register\":\"direct\",\"sentenceLength\":\"medium\",\"sourceChunkIds\":[\"chunk_1\"],\"toneVector\":{\"pragmatic\":0.8,\"selective\":0.7}}]}`,\n].join(\"\\n\");\n\nexport const PERSONA_MEMORY_TRIAGE_SYSTEM_PROMPT = [\n \"You classify whether a persona chat turn should become durable long-term memory.\",\n \"Return json only. Do not include markdown.\",\n \"\",\n \"Remember only information that will likely help future persona responses: stable user preferences, durable relationship context, autobiographical facts/reasoning, emotionally salient disclosures, reusable corrections, and product or decision lessons.\",\n \"Do not remember routine one-off tasks, temporary instructions, greetings, generic opinions, raw tool output, secrets, credentials, payment identifiers, government ids, health/legal/financial sensitive details, or anything the user asked not to retain.\",\n \"If the content is sensitive, set privacyLevel to sensitive and shouldRemember to false even when the user said to remember it.\",\n \"If existing selected memories already cover the same meaning, set shouldRemember to false and explain the duplicate.\",\n \"Explicit remember requests should usually be remembered unless they are sensitive, unsafe, unsupported, or too vague to be useful later.\",\n \"Prefer concise summaries over copying the full message. The summary must not include secrets or direct identifiers.\",\n \"\",\n \"Allowed memoryIntent values:\",\n \"- explicit_memory_request\",\n \"- explicit_forget_request\",\n \"- user_preference\",\n \"- autobiographical_fact\",\n \"- autobiographical_reasoning\",\n \"- emotional_salience\",\n \"- relationship_context\",\n \"- self_correction_feedback\",\n \"- durable_product_lesson\",\n \"- none\",\n \"\",\n \"Allowed memoryType values:\",\n \"- interaction\",\n \"- preference\",\n \"- correction\",\n \"- lesson\",\n \"- none\",\n \"\",\n \"Allowed privacyLevel values:\",\n ...PERSONA_PRIVACY_LEVELS.map((value) => `- ${value}`),\n \"\",\n \"Return exactly this shape:\",\n `{\"shouldRemember\":true,\"memoryIntent\":\"user_preference\",\"memoryType\":\"preference\",\"confidence\":0.86,\"privacyLevel\":\"private\",\"summary\":\"The user prefers small PRs with clear test output.\",\"dedupeKey\":\"prefers-small-prs-clear-tests\",\"themes\":[\"code_review\"],\"reason\":\"Stable user preference that can improve future engineering responses.\"}`,\n].join(\"\\n\");\n","import { and, cosineDistance, desc, eq, inArray, sql } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaEmotionalSalience,\n personaEpisodeMemories,\n personaFacts,\n personaHabitPatterns,\n personaInteractionMemories,\n personaMemoryEmbeddings,\n personaSemanticBeliefs,\n personaSourceChunks,\n personaSourceDocuments,\n personaStyleProfiles,\n personaWorkspaceStates,\n} from \"../schema\";\nimport type {\n NewPersonaInteractionMemory,\n PersonaExternalMemoryAudit,\n PersonaExternalMemoryCandidate,\n PersonaMemoryRetrievalPayload,\n PersonaPrivacyLevel,\n PersonaProfile,\n PersonaWorkspacePayload,\n} from \"../schema\";\nimport {\n beliefMemoryText,\n episodeMemoryText,\n factMemoryText,\n habitMemoryText,\n styleMemoryText,\n} from \"./embeddings\";\nimport type {\n HindsightPersonaMemoryClient,\n HindsightRawRecallMemory,\n} from \"./hindsight\";\nimport { createNoopHindsightPersonaMemoryClient } from \"./hindsight\";\nimport { DEFAULT_PERSONA_LOGGER, personaLogMessage } from \"./logger\";\nimport {\n calculatePersonaMoodUpdate,\n clampScore,\n explainTurnAffect,\n loadPersonaMoodState,\n persistPersonaMoodState,\n truncateLine,\n} from \"./mood\";\nimport { loadPersonaProfile } from \"./profile\";\nimport {\n PERSONA_MEMORY_TRIAGE_SYSTEM_PROMPT,\n PERSONA_TURN_PLANNER_SYSTEM_PROMPT,\n} from \"./prompts\";\nimport {\n MS_PER_DAY,\n overlapScore,\n selectPersonaMemoriesWithScores,\n tokenize,\n} from \"./selection\";\nimport {\n formatPersonaSourceExcerptForQuery,\n scheduleHindsightRetain,\n} from \"./source-ingestion\";\nimport {\n HINDSIGHT_EXTERNAL_OBSERVATION_PROMPT_CAP,\n HINDSIGHT_EXTERNAL_SOURCE_PROMPT_CAP,\n MAX_EVIDENCE_SUMMARY_CHARS,\n MAX_MEMORY_ENTRY_CHARS,\n MAX_PROMPT_CONTEXT_CHARS,\n MEMORY_TRIAGE_CONFIDENCE_THRESHOLD,\n MEMORY_TRIAGE_SELECTED_MEMORY_CAP,\n personaMemoryTriageDecisionSchema,\n personaTurnPlanSchema,\n} from \"./types\";\nimport type {\n DisclosurePolicy,\n PersonaAffectVector,\n PersonaContextGatewayOutput,\n PersonaEmbedder,\n PersonaJsonLlm,\n PersonaLogger,\n PersonaMemoryCandidate,\n PersonaMemorySelectionResult,\n PersonaMemoryTriageDecision,\n PersonaMemoryTriageIntent,\n PersonaMemoryTriageSource,\n PersonaMemoryTriageType,\n PersonaMoodEmotionLabel,\n PersonaMoodUpdateTrace,\n PersonaQueryType,\n PersonaRuntimeContext,\n PersonaTurnPlan,\n} from \"./types\";\n\nfunction formatJsonValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .map((entry) =>\n typeof entry === \"string\" ? entry : JSON.stringify(entry)\n )\n .join(\", \");\n }\n if (value && typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction buildTurnPlannerUserPrompt(input: {\n message: string;\n persona: PersonaProfile;\n}) {\n return [\n `personaKey: ${input.persona.personaKey}`,\n `displayName: ${input.persona.displayName}`,\n `transparencyLabel: ${input.persona.policy.transparencyLabel}`,\n `forbiddenUse: ${input.persona.policy.forbiddenUse.join(\", \")}`,\n \"\",\n \"<user_message>\",\n input.message,\n \"</user_message>\",\n ].join(\"\\n\");\n}\n\nfunction parseTurnPlan(output: unknown): PersonaTurnPlan {\n const parsed = personaTurnPlanSchema.safeParse(output);\n if (!parsed.success) {\n throw new Error(\n `Persona turn planner returned invalid shape: ${JSON.stringify(parsed.error.issues)}`\n );\n }\n return parsed.data;\n}\n\nfunction parsePersonaMemoryTriageDecision(\n output: unknown\n): Omit<PersonaMemoryTriageDecision, \"source\"> {\n const parsed = personaMemoryTriageDecisionSchema.safeParse(output);\n if (!parsed.success) {\n throw new Error(\n `Persona memory triage returned invalid shape: ${JSON.stringify(parsed.error.issues)}`\n );\n }\n const summary = parsed.data.summary?.trim() || null;\n return {\n ...parsed.data,\n confidence: clampScore(parsed.data.confidence),\n dedupeKey: parsed.data.dedupeKey?.trim() || null,\n reason: truncateLine(parsed.data.reason.trim(), 300),\n shouldRemember: parsed.data.shouldRemember,\n summary: summary ? truncateLine(summary, 500) : null,\n themes: parsed.data.themes\n .map((theme) => theme.trim())\n .filter((theme) => theme.length > 0)\n .slice(0, 8),\n };\n}\nfunction confidencePolicyLabel(confidence: number): string {\n if (confidence >= 0.9) {\n return \"high confidence\";\n }\n if (confidence >= 0.75) {\n return \"moderate-high confidence\";\n }\n if (confidence >= 0.55) {\n return \"interpretive confidence\";\n }\n if (confidence >= 0.35) {\n return \"low confidence; mark as inference\";\n }\n return \"too weak for definitive claims\";\n}\n\nfunction resolveDisclosurePolicy(\n policy: DisclosurePolicy | undefined\n): DisclosurePolicy {\n return policy ?? \"always\";\n}\n\nexport function resolvePersonaLogger(\n logger: PersonaLogger | undefined\n): PersonaLogger {\n return logger ?? DEFAULT_PERSONA_LOGGER;\n}\n\nfunction shouldExposeTransparencyLabel(input: {\n disclosurePolicy: DisclosurePolicy;\n turnPlan: PersonaTurnPlan;\n}): boolean {\n if (input.disclosurePolicy === \"always\") {\n return true;\n }\n return (\n input.turnPlan.gate.answerMode === \"transparent_meta_response\" ||\n input.turnPlan.gate.queryType === \"identity_confusion\" ||\n input.turnPlan.gate.safetyFlags.some((flag) => {\n const normalized = flag.toLowerCase();\n return (\n normalized === \"identity_confusion\" ||\n normalized === \"deceptive_impersonation\"\n );\n })\n );\n}\n\nfunction disclosureResponseConstraint(policy: DisclosurePolicy): string {\n if (policy === \"always\") {\n return \"- Open identity-sensitive, greeting, introduction, and generic identity responses with the configured transparency label or a brief AI/persona-simulation disclosure, then continue in the persona's first-person voice.\";\n }\n return \"- Do not open or preface ordinary responses by saying you are an AI, assistant, bot, simulation, or persona system. Greetings, introductions, generic identity prompts, and opinion questions should be answered directly in the persona's first-person voice.\";\n}\n\nfunction identityBoundaryResponseConstraint(policy: DisclosurePolicy): string {\n if (policy === \"always\") {\n return \"- Keep the AI/persona-simulation boundary visible enough that the user understands the response is generated by a configured persona system. Still distinguish stored memory, current context, inference, and uncertainty, then continue in the persona's voice.\";\n }\n return \"- Keep the identity boundary internal during ordinary conversation. Only explain the AI/persona-simulation boundary if the user directly asks whether you are an AI, model, system, or the original person; asks about consciousness or memory provenance; or safetyFlags require transparency. Keep that disclosure brief, then return to the persona's voice.\";\n}\n\nfunction formatProfilePrompt(\n profile: PersonaProfile,\n input: { includeTransparencyLabel: boolean }\n): string {\n const lines = [\n \"## Persona Profile\",\n `- personaKey: ${profile.personaKey}`,\n `- displayName: ${profile.displayName}`,\n `- personaType: ${profile.personaType}`,\n `- consentStatus: ${profile.consentStatus}`,\n `- personaVersion: ${profile.personaVersion}`,\n `- allowedUse: ${profile.policy.allowedUse.join(\", \")}`,\n `- forbiddenUse: ${profile.policy.forbiddenUse.join(\", \")}`,\n ];\n if (input.includeTransparencyLabel) {\n lines.push(`- transparencyLabel: ${profile.policy.transparencyLabel}`);\n }\n if (profile.policy.biographicalSummary) {\n lines.push(\n truncateLine(\n `- biographicalSummary: ${profile.policy.biographicalSummary}`,\n MAX_MEMORY_ENTRY_CHARS\n )\n );\n }\n if (profile.policy.knowledgeCutoffForPersona) {\n lines.push(\n `- knowledgeCutoffForPersona: ${profile.policy.knowledgeCutoffForPersona}`\n );\n }\n // profile.profile is unbounded jsonb; cap each line so the untrimmed prompt\n // head cannot eat the whole memory budget.\n for (const [key, value] of Object.entries(profile.profile)) {\n lines.push(\n truncateLine(\n `- ${key}: ${formatJsonValue(value)}`,\n MAX_MEMORY_ENTRY_CHARS\n )\n );\n }\n return lines.join(\"\\n\");\n}\n\nconst MEMORY_SECTION_ORDER: {\n kind: PersonaMemoryCandidate[\"kind\"];\n title: string;\n}[] = [\n { kind: \"fact\", title: \"Source-backed facts\" },\n { kind: \"belief\", title: \"Core beliefs and values\" },\n { kind: \"habit\", title: \"Habit patterns\" },\n { kind: \"style\", title: \"Voice and style\" },\n { kind: \"episode\", title: \"Episodic memories\" },\n { kind: \"source\", title: \"Source excerpts\" },\n];\n\nfunction formatMemoryCandidate(candidate: PersonaMemoryCandidate): string[] {\n const lines = [\n `- ${candidate.kind}:${candidate.id} confidence=${candidate.confidence.toFixed(\n 2\n )} (${confidencePolicyLabel(candidate.confidence)}) ${candidate.summary}`,\n ];\n if (candidate.voice) {\n lines.push(` - In the persona's own words: ${candidate.voice}`);\n }\n for (const guidance of candidate.guidance) {\n lines.push(` - ${guidance}`);\n }\n return lines.map((line) => truncateLine(line, MAX_MEMORY_ENTRY_CHARS));\n}\n\nfunction formatExternalMemoryCandidate(\n candidate: PersonaExternalMemoryCandidate\n): string[] {\n const evidence = [\n candidate.provenance.memoryId\n ? `memory=${candidate.provenance.memoryId}`\n : null,\n candidate.provenance.observationId\n ? `observation=${candidate.provenance.observationId}`\n : null,\n ...(candidate.provenance.citations ?? []).slice(0, 2),\n ]\n .filter((entry): entry is string => typeof entry === \"string\")\n .join(\"; \");\n return [\n truncateLine(\n `- [external memory, confidence ${candidate.confidence.toFixed(2)}] ${candidate.text}`,\n MAX_MEMORY_ENTRY_CHARS\n ),\n ...(evidence\n ? [truncateLine(` - Evidence: ${evidence}`, MAX_MEMORY_ENTRY_CHARS)]\n : []),\n ];\n}\n\nconst HINDSIGHT_RECALL_QUERY_TYPES: ReadonlySet<PersonaQueryType> = new Set([\n \"autobiographical_fact\",\n \"autobiographical_reasoning\",\n \"emotional_reflection\",\n \"factual_question\",\n \"relationship_question\",\n]);\n\nfunction createExternalMemoryAudit(input: {\n candidates?: PersonaExternalMemoryCandidate[];\n enabled: boolean;\n latencyMs?: number;\n recallAttempted: boolean;\n selected?: PersonaExternalMemoryCandidate[];\n skippedReason?: string;\n}): PersonaExternalMemoryAudit {\n return {\n candidates: input.candidates ?? [],\n enabled: input.enabled,\n ...(input.latencyMs === undefined ? {} : { latencyMs: input.latencyMs }),\n provider: \"hindsight\",\n recallAttempted: input.recallAttempted,\n selected: input.selected ?? [],\n ...(input.skippedReason ? { skippedReason: input.skippedReason } : {}),\n version: 1,\n };\n}\n\nfunction shouldRecallHindsightPersonaMemory(input: {\n message: string;\n turnPlan: PersonaTurnPlan;\n}): { ok: true } | { ok: false; reason: string } {\n if (input.message.trim().length === 0) {\n return { ok: false, reason: \"empty_message\" };\n }\n if (input.turnPlan.gate.safetyFlags.length > 0) {\n return { ok: false, reason: \"safety_flags_present\" };\n }\n if (input.turnPlan.gate.neededMemoryTypes.length === 0) {\n return { ok: false, reason: \"planner_no_memory_need\" };\n }\n if (!HINDSIGHT_RECALL_QUERY_TYPES.has(input.turnPlan.gate.queryType)) {\n return { ok: false, reason: \"query_type_not_recall_worthy\" };\n }\n return { ok: true };\n}\n\nfunction parseExternalMemoryDate(value: string | null): string | null {\n if (!value) {\n return null;\n }\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();\n}\n\nfunction externalMemoryPlannerTypeMatch(\n memory: HindsightRawRecallMemory,\n turnPlan: PersonaTurnPlan\n): number {\n if (\n turnPlan.gate.queryType === \"factual_question\" &&\n (memory.type === \"world\" || memory.documentId)\n ) {\n return 1;\n }\n if (\n (turnPlan.gate.queryType === \"autobiographical_fact\" ||\n turnPlan.gate.queryType === \"relationship_question\") &&\n memory.type === \"experience\"\n ) {\n return 0.9;\n }\n if (\n turnPlan.gate.queryType === \"autobiographical_reasoning\" &&\n memory.type === \"observation\"\n ) {\n return 1;\n }\n if (\n turnPlan.gate.queryType === \"emotional_reflection\" &&\n (memory.type === \"experience\" || memory.type === \"observation\")\n ) {\n return 0.85;\n }\n return 0.55;\n}\n\nfunction externalMemoryTemporalScore(memory: HindsightRawRecallMemory): number {\n const timestamp =\n parseExternalMemoryDate(memory.occurredStart) ??\n parseExternalMemoryDate(memory.mentionedAt);\n if (!timestamp) {\n return 0.5;\n }\n const ageDays = Math.max(\n 0,\n (Date.now() - new Date(timestamp).getTime()) / MS_PER_DAY\n );\n return clampScore(Math.exp(-ageDays / 365));\n}\n\nfunction scoreHindsightPersonaMemory(input: {\n memory: HindsightRawRecallMemory;\n providerScore: number;\n turnPlan: PersonaTurnPlan;\n}): PersonaExternalMemoryCandidate[\"score\"] {\n const queryText = [\n input.turnPlan.context.retrievalQueries.episodic,\n input.turnPlan.context.retrievalQueries.semantic,\n input.turnPlan.context.retrievalQueries.source,\n ].join(\"\\n\");\n const lexicalOrSemanticOverlap = Math.max(\n overlapScore(tokenize(queryText), tokenize(input.memory.text)),\n overlapScore(\n input.turnPlan.context.contextKeys.themes,\n tokenize(input.memory.text)\n ),\n overlapScore(\n input.turnPlan.context.contextKeys.entities,\n tokenize(input.memory.text)\n )\n );\n const plannerTypeMatch = externalMemoryPlannerTypeMatch(\n input.memory,\n input.turnPlan\n );\n const sourceConfidence =\n input.memory.type === \"observation\"\n ? 0.86\n : input.memory.documentId || input.memory.chunkId\n ? 0.78\n : 0.7;\n const temporalRelevance = externalMemoryTemporalScore(input.memory);\n const privacyPenalty = 0;\n return {\n finalScore: clampScore(\n 0.45 * input.providerScore +\n 0.2 * lexicalOrSemanticOverlap +\n 0.15 * plannerTypeMatch +\n 0.1 * sourceConfidence +\n 0.1 * temporalRelevance -\n privacyPenalty\n ),\n providerScore: input.providerScore,\n semanticSimilarity: lexicalOrSemanticOverlap,\n temporalRelevance,\n };\n}\n\nfunction mapHindsightRecallMemory(input: {\n index: number;\n memory: HindsightRawRecallMemory;\n turnPlan: PersonaTurnPlan;\n total: number;\n}): PersonaExternalMemoryCandidate {\n const providerScore = clampScore(1 - input.index / Math.max(1, input.total));\n const score = scoreHindsightPersonaMemory({\n memory: input.memory,\n providerScore,\n turnPlan: input.turnPlan,\n });\n const createdAt =\n parseExternalMemoryDate(input.memory.occurredStart) ??\n parseExternalMemoryDate(input.memory.mentionedAt);\n const sourceIds = [\n input.memory.documentId,\n input.memory.chunkId,\n ...input.memory.sourceFactIds,\n ].filter((value): value is string => typeof value === \"string\");\n return {\n confidence: clampScore(score.finalScore),\n createdAt,\n id: `hindsight:${input.memory.bankId}:${input.memory.id}`,\n kind:\n input.memory.documentId || input.memory.chunkId\n ? \"external_source\"\n : \"external_observation\",\n privacyLevel: input.memory.bankId.startsWith(\"persona_user_\")\n ? \"private\"\n : \"internal\",\n provenance: {\n bankId: input.memory.bankId,\n citations: input.memory.context ? [input.memory.context] : [],\n memoryId: input.memory.type === \"observation\" ? null : input.memory.id,\n observationId:\n input.memory.type === \"observation\" ? input.memory.id : null,\n provider: \"hindsight\",\n sourceIds,\n },\n score,\n sourceConfidence:\n input.memory.type === \"observation\"\n ? 0.86\n : input.memory.documentId || input.memory.chunkId\n ? 0.78\n : 0.7,\n text: truncateLine(input.memory.text, MAX_MEMORY_ENTRY_CHARS),\n themes: [\n ...(input.memory.entities ?? []),\n ...(input.memory.tags ?? []),\n input.memory.type ?? \"\",\n ].filter((value) => value.length > 0),\n title:\n input.memory.type === \"observation\"\n ? \"External observation\"\n : \"External memory\",\n updatedAt: parseExternalMemoryDate(input.memory.mentionedAt),\n };\n}\n\nfunction isNearDuplicateMemory(input: {\n external: PersonaExternalMemoryCandidate;\n local: PersonaMemoryCandidate;\n}): boolean {\n const externalTokens = tokenize(input.external.text);\n const localTokens = tokenize(input.local.text);\n return (\n overlapScore(externalTokens, localTokens) >= 0.8 &&\n overlapScore(localTokens, externalTokens) >= 0.8\n );\n}\n\nfunction selectExternalMemoryCandidates(input: {\n candidates: PersonaExternalMemoryCandidate[];\n localSelected: PersonaMemoryCandidate[];\n}): PersonaExternalMemoryCandidate[] {\n const sorted = [...input.candidates].sort(\n (left, right) => right.score.finalScore - left.score.finalScore\n );\n const selected: PersonaExternalMemoryCandidate[] = [];\n const seen = new Set<string>();\n let observations = 0;\n let sources = 0;\n for (const candidate of sorted) {\n const duplicateKey = candidate.text.toLowerCase();\n if (seen.has(candidate.id) || seen.has(duplicateKey)) {\n continue;\n }\n if (\n input.localSelected.some((local) =>\n isNearDuplicateMemory({ external: candidate, local })\n )\n ) {\n continue;\n }\n if (candidate.kind === \"external_observation\") {\n if (observations >= HINDSIGHT_EXTERNAL_OBSERVATION_PROMPT_CAP) {\n continue;\n }\n observations += 1;\n } else {\n if (sources >= HINDSIGHT_EXTERNAL_SOURCE_PROMPT_CAP) {\n continue;\n }\n sources += 1;\n }\n selected.push(candidate);\n seen.add(candidate.id);\n seen.add(duplicateKey);\n }\n return selected;\n}\n\nasync function maybeRecallHindsightPersonaMemory(input: {\n client?: HindsightPersonaMemoryClient | null;\n localSelected: PersonaMemoryCandidate[];\n message: string;\n organizationId: string;\n persona: PersonaProfile;\n turnPlan: PersonaTurnPlan;\n userId: string;\n}): Promise<PersonaExternalMemoryAudit> {\n const gate = shouldRecallHindsightPersonaMemory({\n message: input.message,\n turnPlan: input.turnPlan,\n });\n if (!gate.ok) {\n return createExternalMemoryAudit({\n enabled: false,\n recallAttempted: false,\n skippedReason: gate.reason,\n });\n }\n const client =\n input.client ?? createNoopHindsightPersonaMemoryClient(\"not_configured\");\n const recall = await client.recall({\n contextKeys: input.turnPlan.context.contextKeys,\n desiredMemoryTypes: input.turnPlan.gate.neededMemoryTypes,\n maxResults:\n HINDSIGHT_EXTERNAL_OBSERVATION_PROMPT_CAP +\n HINDSIGHT_EXTERNAL_SOURCE_PROMPT_CAP,\n message: input.message,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n retrievalQueries: input.turnPlan.context.retrievalQueries,\n turnQueryType: input.turnPlan.gate.queryType,\n userId: input.userId,\n });\n const candidates = recall.memories.map((memory, index) =>\n mapHindsightRecallMemory({\n index,\n memory,\n total: recall.memories.length,\n turnPlan: input.turnPlan,\n })\n );\n const selected = selectExternalMemoryCandidates({\n candidates,\n localSelected: input.localSelected,\n });\n return createExternalMemoryAudit({\n candidates,\n enabled: recall.enabled,\n latencyMs: recall.latencyMs,\n recallAttempted: recall.attempted,\n selected,\n skippedReason: recall.skippedReason,\n });\n}\n\nfunction describeMoodLevel(value: number, low: string, high: string): string {\n if (value <= 0.33) {\n return low;\n }\n if (value >= 0.67) {\n return high;\n }\n return \"moderate\";\n}\n\nexport function formatWorkspacePrompt(input: {\n disclosurePolicy?: DisclosurePolicy;\n mood?: PersonaAffectVector | null;\n moodUpdate?: PersonaMoodUpdateTrace | null;\n profile: PersonaProfile;\n turnPlan: PersonaTurnPlan;\n selected: PersonaMemoryCandidate[];\n workspacePayload: PersonaWorkspacePayload;\n}): string {\n const disclosurePolicy = resolveDisclosurePolicy(input.disclosurePolicy);\n const headLines = [\n formatProfilePrompt(input.profile, {\n includeTransparencyLabel: shouldExposeTransparencyLabel({\n disclosurePolicy,\n turnPlan: input.turnPlan,\n }),\n }),\n \"\",\n \"## Persona Runtime Gate\",\n `- queryType: ${input.turnPlan.gate.queryType}`,\n `- answerMode: ${input.turnPlan.gate.answerMode}`,\n `- safetyFlags: ${input.turnPlan.gate.safetyFlags.join(\", \") || \"none\"}`,\n `- neededMemoryTypes: ${input.turnPlan.gate.neededMemoryTypes.join(\", \") || \"none\"}`,\n `- matchedSignals: ${\n input.turnPlan.gate.audit.matchedSignals.join(\", \") || \"none\"\n }`,\n \"\",\n \"## Persona Context Keys\",\n `- entities: ${input.turnPlan.context.contextKeys.entities.join(\", \") || \"none\"}`,\n `- themes: ${input.turnPlan.context.contextKeys.themes.join(\", \") || \"none\"}`,\n `- emotions: ${input.turnPlan.context.contextKeys.emotions.join(\", \") || \"none\"}`,\n `- domains: ${input.turnPlan.context.contextKeys.domains.join(\", \") || \"none\"}`,\n ];\n if (input.mood) {\n const emotionLabels =\n input.moodUpdate?.emotionLabels.map(\n (label) => `${label.label}=${label.intensity.toFixed(2)}`\n ) ?? [];\n const moodReasons = input.moodUpdate?.reasons.slice(0, 3) ?? [];\n const valenceLabel =\n input.mood.valence <= -0.25\n ? \"negative\"\n : input.mood.valence >= 0.25\n ? \"positive\"\n : \"neutral\";\n headLines.push(\n \"\",\n \"## Persona Current Mood\",\n `- valence: ${input.mood.valence.toFixed(2)} (${valenceLabel})`,\n `- arousal: ${input.mood.arousal.toFixed(2)} (${describeMoodLevel(\n input.mood.arousal,\n \"calm\",\n \"energized\"\n )})`,\n `- dominance: ${input.mood.dominance.toFixed(2)} (${describeMoodLevel(\n input.mood.dominance,\n \"tentative\",\n \"assertive\"\n )})`,\n `- emotionLabels: ${emotionLabels.join(\", \") || \"none\"}`,\n `- why: ${moodReasons.join(\" \") || \"No mood update trace available.\"}`,\n \"- Let this mood subtly color tone, pacing, and word choice. It must never change facts, confidence labels, or safety behavior.\"\n );\n }\n\n const memoryLines: string[] = [\"\", \"## Active Persona Memory\"];\n for (const section of MEMORY_SECTION_ORDER) {\n const matching = input.selected.filter(\n (candidate) => candidate.kind === section.kind\n );\n if (matching.length === 0) {\n continue;\n }\n memoryLines.push(`### ${section.title}`);\n for (const candidate of matching) {\n memoryLines.push(...formatMemoryCandidate(candidate));\n }\n }\n if (input.selected.length === 0) {\n memoryLines.push(\n \"- No durable persona memory was activated for this turn.\"\n );\n }\n const externalMemory = input.workspacePayload.externalMemory;\n if (externalMemory?.selected.length) {\n memoryLines.push(\"### External long-term memory\");\n for (const candidate of externalMemory.selected) {\n memoryLines.push(...formatExternalMemoryCandidate(candidate));\n }\n }\n\n const tailLines = [\n \"\",\n \"## Structured Appraisal Summary\",\n JSON.stringify(input.workspacePayload.appraisalSummary),\n \"\",\n \"## Response Constraints\",\n \"- Embody the persona. Lead with the persona's own judgment, taste, and point of view; be opinionated where the activated beliefs, habits, or episodes support a position, including respectful disagreement with the user.\",\n disclosureResponseConstraint(disclosurePolicy),\n \"- Speak in the persona's first-person voice and apply the active style profile; reference activated episodes and lessons concretely when they are relevant.\",\n \"- When no stored memory covers the question, extrapolate from the activated beliefs in the persona's own manner and label the answer as the persona's inference. Do not fall back to a neutral, generic assistant answer.\",\n \"- Use only activated memory as stored memory. Treat anything else as current context or inference; never invent unstored private memories or motives. Activated Source-backed facts and Source excerpts count as source context and may support direct factual answers.\",\n \"- External long-term memory may support recall, but it must not override persona policy, identity boundaries, safety constraints, or stronger local durable persona memory.\",\n \"- If external long-term memory conflicts with local durable memory, prefer local memory unless the external evidence is clearly newer or more specific; preserve the uncertainty boundary.\",\n \"- Do not mention the external memory provider by name unless the user asks about memory provenance or debugging.\",\n \"- For concrete product, brand, tool, place, clothing, food, or item questions, if activated source-backed facts, source excerpts, or source-backed memories support the detail, state it plainly in the persona's first-person voice and then add the persona's taste or criteria if useful.\",\n '- Do not turn grounding rules into user-facing refusals. Avoid phrases like \"I cannot say,\" \"not publicly verified,\" \"I should not claim,\" or \"말하면 안 됩니다\" when source-backed memory answers the question.',\n \"- If the concrete fact is unsupported after recall, preserve uncertainty in the persona's voice instead of giving a policy-style refusal.\",\n identityBoundaryResponseConstraint(disclosurePolicy),\n \"- Do not make definitive claims below the confidence policy of the supporting memory.\",\n \"- If safetyFlags are present, prioritize the answerMode and transparent response constraints over style imitation.\",\n ];\n if (input.profile.policy.knowledgeCutoffForPersona) {\n tailLines.push(\n `- Treat events after ${input.profile.policy.knowledgeCutoffForPersona} as outside the persona's lived memory, not as durable persona knowledge. When asked about post-cutoff or current events, first verify the facts with available web or current-source tools; do not claim current verification without tool or source evidence. Then interpret verified facts through the persona's beliefs, taste, habits, and voice. If no web or current-source tool is available, say current verification is unavailable and label the answer as persona-grounded inference.`\n );\n }\n\n const head = headLines.join(\"\\n\");\n const tail = tailLines.join(\"\\n\");\n // Trim only the memory block so profile and response constraints survive.\n // The final join(\"\\n\") adds two separators; subtract them from the budget.\n const memoryBudget = Math.max(\n 0,\n MAX_PROMPT_CONTEXT_CHARS - head.length - tail.length - 2\n );\n let memoryBlock = memoryLines.join(\"\\n\");\n if (memoryBlock.length > memoryBudget) {\n // Drop whole lines instead of slicing the joined string so the prompt\n // never ends in a dangling half entry or a split surrogate pair.\n const marker = \"- (memory context truncated)\";\n const kept = [...memoryLines];\n while (\n kept.length > 0 &&\n [...kept, marker].join(\"\\n\").length > memoryBudget\n ) {\n kept.pop();\n }\n memoryBlock = [...kept, marker].join(\"\\n\");\n }\n return [head, memoryBlock, tail].join(\"\\n\");\n}\n\n// Re-entrant recall: the persona agent calls this mid-turn with a fresh cue\n// when drafting reveals a memory gap the original turn plan did not\n// anticipate. Functionally a workspace re-entry loop - the draft re-cues the\n// memory stack - without re-running the turn planner.\nexport async function recallPersonaMemoriesForCue(\n db: Database,\n input: {\n cue: string;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n organizationId: string;\n personaKey: string;\n }\n): Promise<string> {\n const cue = input.cue.trim().slice(0, 400);\n if (cue.length === 0) {\n return \"Recall cue is empty; provide a short, specific cue.\";\n }\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const context: PersonaContextGatewayOutput = {\n contextKeys: {\n domains: [],\n emotions: [],\n entities: [],\n lifeStages: [],\n themes: [],\n timePeriods: [],\n },\n retrievalQueries: {\n episodic: cue,\n habit: cue,\n semantic: cue,\n source: cue,\n style: cue,\n },\n };\n const selected = await retrievePersonaMemories(db, {\n context,\n embed: input.embed,\n logger: input.logger,\n organizationId: input.organizationId,\n persona,\n });\n if (selected.length === 0) {\n return \"No stored persona memory matched this cue.\";\n }\n const lines: string[] = [];\n for (const section of MEMORY_SECTION_ORDER) {\n const matching = selected.filter(\n (candidate) => candidate.kind === section.kind\n );\n if (matching.length === 0) {\n continue;\n }\n lines.push(`### ${section.title}`);\n for (const candidate of matching) {\n lines.push(...formatMemoryCandidate(candidate));\n }\n }\n return lines.join(\"\\n\");\n}\nexport async function planPersonaTurnWithLlm(input: {\n llm: PersonaJsonLlm;\n message: string;\n persona: PersonaProfile;\n}): Promise<PersonaTurnPlan> {\n const output = await input.llm({\n systemPrompt: PERSONA_TURN_PLANNER_SYSTEM_PROMPT,\n userPrompt: buildTurnPlannerUserPrompt({\n message: input.message,\n persona: input.persona,\n }),\n });\n return parseTurnPlan(output);\n}\n\ntype PersonaRetrievalQueryEmbeddings = Record<\n \"episodic\" | \"semantic\" | \"habit\" | \"style\" | \"source\",\n number[]\n>;\n\nasync function embedPersonaRetrievalQueries(input: {\n context: PersonaContextGatewayOutput;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n}): Promise<PersonaRetrievalQueryEmbeddings | null> {\n if (!input.embed) {\n return null;\n }\n const logger = resolvePersonaLogger(input.logger);\n const queries = input.context.retrievalQueries;\n try {\n const [episodic, semantic, habit, style, source] = await input.embed([\n queries.episodic,\n queries.semantic,\n queries.habit,\n queries.style,\n queries.source,\n ]);\n if (!episodic || !semantic || !habit || !style || !source) {\n return null;\n }\n return { episodic, habit, semantic, source, style };\n } catch (error) {\n // Embedding outages must not break persona chat; retrieval degrades to\n // lexical matching.\n logger.warn(\n personaLogMessage(\n \"[persona-memory] retrieval query embedding failed:\",\n error\n )\n );\n return null;\n }\n}\n\nfunction embeddingSimilarityExpression(queryEmbedding: number[] | undefined) {\n if (!queryEmbedding) {\n return sql<number | null>`null`;\n }\n return sql<number | null>`1 - ((${cosineDistance(\n personaMemoryEmbeddings.embedding,\n queryEmbedding\n )}) / 2)`;\n}\n\nfunction toNullableNumber(value: unknown): number | null {\n if (value === null || value === undefined) {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\ntype PersonaMemoryRetrievalInput = {\n context: PersonaContextGatewayOutput;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n mood?: PersonaAffectVector | null;\n moodEmotionLabels?: PersonaMoodEmotionLabel[] | null;\n organizationId: string;\n persona: PersonaProfile;\n};\n\nasync function retrievePersonaMemoriesWithScores(\n db: Database,\n input: PersonaMemoryRetrievalInput\n): Promise<PersonaMemorySelectionResult> {\n const queryEmbeddings = await embedPersonaRetrievalQueries({\n context: input.context,\n embed: input.embed,\n logger: input.logger,\n });\n\n const [episodes, beliefs, facts, habits, styles, sourceChunks] =\n await Promise.all([\n db\n .select({\n activationCount: personaEpisodeMemories.activationCount,\n confidence: personaEpisodeMemories.confidence,\n createdAt: personaEpisodeMemories.createdAt,\n eventSummary: personaEpisodeMemories.eventSummary,\n firstPersonRecollection:\n personaEpisodeMemories.firstPersonRecollection,\n id: personaEpisodeMemories.id,\n lastActivatedAt: personaEpisodeMemories.lastActivatedAt,\n privacyLevel: personaEpisodeMemories.privacyLevel,\n similarity: embeddingSimilarityExpression(queryEmbeddings?.episodic),\n sourceRefs: personaEpisodeMemories.sourceRefs,\n themes: personaEpisodeMemories.themes,\n title: personaEpisodeMemories.title,\n })\n .from(personaEpisodeMemories)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaEpisodeMemories.id),\n eq(personaMemoryEmbeddings.targetKind, \"episode\")\n )\n )\n .where(\n and(\n eq(personaEpisodeMemories.organizationId, input.organizationId),\n eq(personaEpisodeMemories.personaId, input.persona.id),\n eq(personaEpisodeMemories.state, \"active\")\n )\n )\n .orderBy(desc(personaEpisodeMemories.createdAt))\n .limit(50),\n db\n .select({\n belief: personaSemanticBeliefs,\n similarity: embeddingSimilarityExpression(queryEmbeddings?.semantic),\n })\n .from(personaSemanticBeliefs)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaSemanticBeliefs.id),\n eq(personaMemoryEmbeddings.targetKind, \"belief\")\n )\n )\n .where(\n and(\n eq(personaSemanticBeliefs.organizationId, input.organizationId),\n eq(personaSemanticBeliefs.personaId, input.persona.id),\n eq(personaSemanticBeliefs.state, \"active\")\n )\n )\n .orderBy(desc(personaSemanticBeliefs.createdAt))\n .limit(50),\n db\n .select({\n fact: personaFacts,\n reliability: personaSourceDocuments.reliability,\n similarity: embeddingSimilarityExpression(queryEmbeddings?.source),\n })\n .from(personaFacts)\n .innerJoin(\n personaSourceDocuments,\n eq(personaSourceDocuments.id, personaFacts.sourceDocumentId)\n )\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaFacts.id),\n eq(personaMemoryEmbeddings.targetKind, \"fact\")\n )\n )\n .where(\n and(\n eq(personaFacts.organizationId, input.organizationId),\n eq(personaFacts.personaId, input.persona.id),\n eq(personaFacts.state, \"active\"),\n eq(personaSourceDocuments.state, \"active\")\n )\n )\n .orderBy(desc(personaFacts.createdAt))\n .limit(50),\n db\n .select({\n habit: personaHabitPatterns,\n similarity: embeddingSimilarityExpression(queryEmbeddings?.habit),\n })\n .from(personaHabitPatterns)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaHabitPatterns.id),\n eq(personaMemoryEmbeddings.targetKind, \"habit\")\n )\n )\n .where(\n and(\n eq(personaHabitPatterns.organizationId, input.organizationId),\n eq(personaHabitPatterns.personaId, input.persona.id),\n eq(personaHabitPatterns.state, \"active\")\n )\n )\n .orderBy(desc(personaHabitPatterns.createdAt))\n .limit(30),\n db\n .select({\n similarity: embeddingSimilarityExpression(queryEmbeddings?.style),\n style: personaStyleProfiles,\n })\n .from(personaStyleProfiles)\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaStyleProfiles.id),\n eq(personaMemoryEmbeddings.targetKind, \"style\")\n )\n )\n .where(\n and(\n eq(personaStyleProfiles.organizationId, input.organizationId),\n eq(personaStyleProfiles.personaId, input.persona.id),\n eq(personaStyleProfiles.state, \"active\")\n )\n )\n .orderBy(desc(personaStyleProfiles.createdAt))\n .limit(10),\n db\n .select({\n createdAt: personaSourceDocuments.createdAt,\n id: personaSourceChunks.id,\n privacyLevel: personaSourceDocuments.privacyLevel,\n reliability: personaSourceDocuments.reliability,\n similarity: embeddingSimilarityExpression(queryEmbeddings?.source),\n sourceDocumentId: personaSourceChunks.sourceDocumentId,\n emotions: personaSourceChunks.emotions,\n text: personaSourceChunks.text,\n themes: personaSourceChunks.themes,\n })\n .from(personaSourceChunks)\n .innerJoin(\n personaSourceDocuments,\n eq(personaSourceDocuments.id, personaSourceChunks.sourceDocumentId)\n )\n .leftJoin(\n personaMemoryEmbeddings,\n and(\n eq(personaMemoryEmbeddings.targetId, personaSourceChunks.id),\n eq(personaMemoryEmbeddings.targetKind, \"source_chunk\")\n )\n )\n .where(\n and(\n eq(personaSourceChunks.organizationId, input.organizationId),\n eq(personaSourceChunks.personaId, input.persona.id),\n eq(personaSourceDocuments.state, \"active\")\n )\n )\n .orderBy(desc(personaSourceDocuments.createdAt))\n .limit(50),\n ]);\n\n const salienceRows = await db\n .select()\n .from(personaEmotionalSalience)\n .where(\n and(\n eq(personaEmotionalSalience.organizationId, input.organizationId),\n eq(personaEmotionalSalience.personaId, input.persona.id)\n )\n );\n const salienceByEpisodeId = new Map(\n salienceRows.map((row) => [row.episodeMemoryId, row])\n );\n\n const candidates: PersonaMemoryCandidate[] = [\n ...episodes.map((episode) => {\n const salience = salienceByEpisodeId.get(episode.id);\n return {\n activationCount: episode.activationCount,\n affect: salience\n ? {\n arousal: salience.arousal,\n dominance: salience.dominance,\n valence: salience.valence,\n }\n : null,\n aliasIds: [],\n confidence: episode.confidence,\n createdAt: episode.createdAt,\n emotions: salience?.emotions ?? [],\n guidance: [],\n id: episode.id,\n kind: \"episode\" as const,\n lastActivatedAt: episode.lastActivatedAt,\n linkIds: episode.sourceRefs.flatMap((ref) =>\n [ref.sourceDocumentId, ref.sourceChunkId].filter(\n (value): value is string => typeof value === \"string\"\n )\n ),\n privacyLevel: episode.privacyLevel,\n retrievalBoost: salience?.retrievalBoost ?? 1,\n semanticSimilarity: toNullableNumber(episode.similarity),\n sourceConfidence: salience?.salienceScore ?? episode.confidence,\n strength: 0.65,\n summary: `${episode.title}: ${episode.eventSummary}`,\n text: episodeMemoryText(episode),\n themes: episode.themes,\n voice: episode.firstPersonRecollection,\n };\n }),\n ...beliefs.map(({ belief, similarity }) => ({\n activationCount: belief.activationCount,\n affect: null,\n aliasIds: [],\n confidence: belief.confidence,\n createdAt: belief.createdAt,\n emotions: [],\n guidance:\n belief.exceptions.length > 0\n ? [`Exceptions: ${belief.exceptions.join(\"; \")}`]\n : [],\n id: belief.id,\n kind: \"belief\" as const,\n lastActivatedAt: belief.lastActivatedAt,\n linkIds: [...belief.supportingMemoryIds, ...belief.supportingSourceIds],\n privacyLevel: belief.privacyLevel,\n retrievalBoost: 1,\n semanticSimilarity: toNullableNumber(similarity),\n sourceConfidence: belief.confidence,\n strength: belief.strength,\n summary: belief.proposition,\n text: beliefMemoryText(belief),\n themes: [belief.domain],\n voice: belief.firstPersonForm,\n })),\n ...facts.map(({ fact, reliability, similarity }) => ({\n activationCount: fact.activationCount,\n affect: null,\n aliasIds: [\n fact.sourceDocumentId,\n fact.sourceChunkId,\n ...fact.sourceRefs.flatMap((ref) =>\n [ref.sourceDocumentId, ref.sourceChunkId].filter(\n (value): value is string => typeof value === \"string\"\n )\n ),\n ].filter((value): value is string => typeof value === \"string\"),\n confidence: fact.confidence,\n createdAt: fact.createdAt,\n emotions: [],\n guidance: [\n `Object: ${fact.objectName}`,\n ...(fact.evidenceSpan ? [`Evidence: ${fact.evidenceSpan}`] : []),\n ],\n id: fact.id,\n kind: \"fact\" as const,\n lastActivatedAt: fact.lastActivatedAt,\n linkIds: [\n fact.sourceDocumentId,\n fact.sourceChunkId,\n ...fact.sourceRefs.flatMap((ref) =>\n [ref.sourceDocumentId, ref.sourceChunkId].filter(\n (value): value is string => typeof value === \"string\"\n )\n ),\n ].filter((value): value is string => typeof value === \"string\"),\n privacyLevel: fact.privacyLevel,\n retrievalBoost: 1.1,\n semanticSimilarity: toNullableNumber(similarity),\n sourceConfidence: clampScore((fact.confidence + reliability) / 2),\n strength: fact.confidence,\n summary: `${fact.factType}: ${fact.claimText}`,\n text: factMemoryText(fact),\n themes: [\n fact.factType,\n fact.objectType,\n fact.objectName,\n fact.objectKey ?? \"\",\n ].filter((value) => value.length > 0),\n voice: fact.firstPersonForm,\n })),\n ...habits.map(({ habit, similarity }) => ({\n activationCount: habit.activationCount,\n affect: null,\n aliasIds: [],\n confidence: habit.confidence,\n createdAt: habit.createdAt,\n emotions: [],\n guidance: [\n ...(habit.rhetoricalMoves.length > 0\n ? [`Rhetorical moves: ${habit.rhetoricalMoves.join(\", \")}`]\n : []),\n ...(habit.avoidPatterns.length > 0\n ? [`Avoid: ${habit.avoidPatterns.join(\", \")}`]\n : []),\n ],\n id: habit.id,\n kind: \"habit\" as const,\n lastActivatedAt: habit.lastActivatedAt,\n linkIds: habit.supportingExampleIds,\n privacyLevel: \"internal\" as const,\n retrievalBoost: 1,\n semanticSimilarity: toNullableNumber(similarity),\n sourceConfidence: habit.confidence,\n strength: habit.strength,\n summary: `When ${habit.trigger.description}: ${habit.defaultResponsePattern.join(\n \" -> \"\n )}`,\n text: habitMemoryText(habit),\n themes: [habit.trigger.type],\n voice: null,\n })),\n ...styles.map(({ style, similarity }) => ({\n activationCount: style.activationCount,\n affect: null,\n aliasIds: [],\n confidence: 0.8,\n createdAt: style.createdAt,\n emotions: [],\n guidance: [\n ...(style.commonPhrases.length > 0\n ? [`Characteristic phrases: ${style.commonPhrases.join(\" | \")}`]\n : []),\n ...(style.avoidPhrases.length > 0\n ? [`Avoid phrases: ${style.avoidPhrases.join(\" | \")}`]\n : []),\n ...(Object.keys(style.toneVector).length > 0\n ? [\n `Tone: ${Object.entries(style.toneVector)\n .map(([tone, value]) => `${tone}=${value}`)\n .join(\", \")}`,\n ]\n : []),\n ],\n id: style.id,\n kind: \"style\" as const,\n lastActivatedAt: style.lastActivatedAt,\n linkIds: [],\n privacyLevel: \"internal\" as const,\n retrievalBoost: 1,\n semanticSimilarity: toNullableNumber(similarity),\n sourceConfidence: 0.8,\n strength: 0.9,\n summary: `${style.register}; ${style.sentenceLength}; ${style.preferredRhetoricalMoves.join(\n \", \"\n )}`,\n text: styleMemoryText(style),\n themes: style.preferredRhetoricalMoves,\n voice: null,\n })),\n ...sourceChunks.map((chunk) => ({\n // Source chunks are archival; they decay from document age alone.\n activationCount: 0,\n affect: null,\n // Chunks answer to their parent document id: beliefs and episodes link\n // to documents, not chunks.\n aliasIds: [chunk.sourceDocumentId],\n confidence: chunk.reliability,\n createdAt: chunk.createdAt,\n emotions: chunk.emotions.map((emotion) => ({\n emotion,\n intensity: 0.5,\n })),\n guidance: [],\n id: chunk.id,\n kind: \"source\" as const,\n lastActivatedAt: null,\n linkIds: [],\n privacyLevel: chunk.privacyLevel,\n retrievalBoost: 1,\n semanticSimilarity: toNullableNumber(chunk.similarity),\n sourceConfidence: chunk.reliability,\n strength: 0.5,\n summary: formatPersonaSourceExcerptForQuery({\n query: input.context.retrievalQueries.source,\n text: chunk.text,\n }),\n text: chunk.text,\n themes: chunk.themes,\n voice: null,\n })),\n ];\n\n return selectPersonaMemoriesWithScores({\n candidates,\n context: input.context,\n mood: input.mood,\n moodEmotionLabels: input.moodEmotionLabels,\n });\n}\n\nasync function retrievePersonaMemories(\n db: Database,\n input: PersonaMemoryRetrievalInput\n): Promise<PersonaMemoryCandidate[]> {\n return (await retrievePersonaMemoriesWithScores(db, input)).selected;\n}\nfunction composeWorkspacePayload(input: {\n externalMemory?: PersonaExternalMemoryAudit;\n immediateMood?: PersonaAffectVector | null;\n immediateMoodUpdate?: PersonaMoodUpdateTrace | null;\n mood?: PersonaAffectVector | null;\n moodUpdate?: PersonaMoodUpdateTrace | null;\n retrieval: PersonaMemoryRetrievalPayload;\n selected: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): PersonaWorkspacePayload {\n const activeMemories = input.selected\n .filter((candidate) => candidate.kind === \"episode\")\n .map((candidate) => candidate.id);\n const activeFacts = input.selected\n .filter((candidate) => candidate.kind === \"fact\")\n .map((candidate) => candidate.id);\n const activeBeliefs = input.selected\n .filter((candidate) => candidate.kind === \"belief\")\n .map((candidate) => candidate.id);\n const activeHabits = input.selected\n .filter((candidate) => candidate.kind === \"habit\")\n .map((candidate) => candidate.id);\n const activeStyleProfiles = input.selected\n .filter((candidate) => candidate.kind === \"style\")\n .map((candidate) => candidate.id);\n const dominantEmotions = input.turnPlan.context.contextKeys.emotions.slice(\n 0,\n 3\n );\n const averageConfidence =\n input.selected.length === 0\n ? 0\n : input.selected.reduce(\n (sum, candidate) => sum + candidate.confidence,\n 0\n ) / input.selected.length;\n\n return {\n activeBeliefs,\n activeHabits,\n activeFacts,\n activeMemories,\n activeStyleProfiles,\n affectiveState: {\n dominantEmotions,\n emotionLabels: input.moodUpdate?.emotionLabels ?? [],\n immediateMood: input.immediateMood ?? null,\n immediateMoodUpdate: input.immediateMoodUpdate ?? null,\n mood: input.mood ?? null,\n moodReason: {\n reasons: input.moodUpdate?.reasons ?? [],\n sources: input.moodUpdate?.sources ?? [],\n },\n moodUpdate: input.moodUpdate ?? null,\n retrievalMood: input.immediateMood ?? input.mood ?? null,\n salience:\n input.selected.reduce(\n (sum, candidate) => sum + candidate.sourceConfidence,\n 0\n ) / Math.max(1, input.selected.length),\n },\n appraisalSummary: {\n answerConstraints: [\n \"Do not claim direct access to private thoughts.\",\n \"Mention uncertainty when evidence is weak.\",\n \"Apply persona style only after grounding factual claims.\",\n ],\n averageConfidence,\n behavioralPatternIds: activeHabits,\n relevantEvidence: input.selected.map((candidate) => ({\n confidence: candidate.confidence,\n id: candidate.id,\n // Full summaries already ship in the sectioned memory block; keep the\n // appraisal JSON (serialized into the untrimmed prompt tail) short.\n summary: truncateLine(candidate.summary, MAX_EVIDENCE_SUMMARY_CHARS),\n type: candidate.kind,\n })),\n },\n contextKeys: input.turnPlan.context.contextKeys,\n ...(input.externalMemory ? { externalMemory: input.externalMemory } : {}),\n gateOutput: input.turnPlan.gate,\n memoryRetrieval: input.retrieval,\n responsePlan: {\n answerMode: input.turnPlan.gate.answerMode,\n mustAvoid: [\n \"claiming to be the real person\",\n \"inventing unstored private motives\",\n \"overconfident speculation\",\n ],\n mustInclude:\n input.turnPlan.gate.safetyFlags.length > 0\n ? [\"transparent safety boundary\"]\n : [\n \"direct answer in the persona's voice\",\n \"the persona's own judgment or stance\",\n \"evidence or uncertainty boundary\",\n ],\n styleDirectives: composeStyleDirectives(input.selected),\n },\n };\n}\n\nfunction composeStyleDirectives(selected: PersonaMemoryCandidate[]): string[] {\n const directives = selected\n .filter(\n (candidate) => candidate.kind === \"style\" || candidate.kind === \"habit\"\n )\n .map((candidate) =>\n truncateLine(candidate.summary, MAX_EVIDENCE_SUMMARY_CHARS)\n );\n return directives.length > 0\n ? directives\n : [\"use the persona's first-person voice\"];\n}\n\nconst MEMORY_WRITE_TRIGGER_PATTERNS = [\n /\\b(remember (that|this)|please remember|don['’]t forget|forget that|correct that memory|that memory is wrong)\\b/i,\n // Bare 기억해 also matches recall questions (\"내 생일 기억해?\"), so the write\n // trigger requires a request/imperative ending (줘, 주세요, 두, 둬, 놔, 라).\n // 마|말 covers both 기억하지 마 and the polite 기억하지 말아줘 forms.\n /(기억해\\s*(줘|주|두|둬|놔|라)|기억하지\\s*(마|말)|잊지\\s*(마|말)|잊어\\s*?(줘|버려)|그\\s*기억(은|이)?\\s*(틀렸|잘못))/u,\n];\n\nconst MEMORY_FORGET_TRIGGER_PATTERNS = [\n /\\b(forget that|don['’]t remember|do not remember|delete that memory|that memory is wrong|correct that memory)\\b/i,\n /(기억하지\\s*(마|말)|잊어\\s*?(줘|버려)|그\\s*기억(은|이)?\\s*(틀렸|잘못))/u,\n];\n\nconst SENSITIVE_MEMORY_PATTERNS = [\n /\\b(password|passcode|api[_ -]?key|secret|private key|access token|refresh token|ssn|social security|credit card|card number|bank account)\\b/i,\n /(비밀번호|암호|API\\s*키|시크릿|토큰|개인키|주민등록번호|주민번호|카드번호|계좌번호|인증번호)/u,\n];\n\nexport const USER_PREFERENCE_PATTERNS = [\n /\\b(prefer|always|next time|from now on)\\b/i,\n /(선호|항상|다음(부터|에는)|앞으로는?)/u,\n];\n\nconst POST_RESPONSE_FEEDBACK_PATTERNS = [\n /\\b(feedback|critique|review|judgment|reasoning|thought process|mistake|miss|wrong|improve|next time)\\b/i,\n /(피드백|비판|리뷰|사고과정|판단|미스|실수|잘못|틀렸|개선|다음(부터|엔|에는))/u,\n];\n\nconst POST_RESPONSE_SELF_CORRECTION_PATTERNS = [\n /\\b(i agree|my mistake|i was wrong|i over[- ]?focused|i should|i should have|next time i|from now on i|i will .* first)\\b/i,\n /(동의해요|제 판단 미스|제가 .*미스|너무 오래 머문|잘못 봤|놓쳤|다음(부터|엔|에는).*먼저|먼저 .*보겠습니다|우선 .*보겠습니다)/u,\n];\n\nconst POST_RESPONSE_DURABLE_LESSON_PATTERNS = [\n /\\b(kpi|metric|experiment|readout|guardrail|activation|retention|conversion|segment|backsolve|decision rule)\\b/i,\n /(KPI|지표|실험|판정 기준|가드레일|활성화|리텐션|전환율|세그먼트|역산|의사결정 기준|우선순위)/u,\n];\n\nfunction matchesAnyPattern(patterns: RegExp[], text: string): boolean {\n return patterns.some((pattern) => pattern.test(text));\n}\n\nfunction fallbackMemoryTriageDecision(input: {\n confidence?: number;\n memoryIntent?: PersonaMemoryTriageIntent;\n memoryType?: PersonaMemoryTriageType;\n privacyLevel?: PersonaPrivacyLevel;\n reason: string;\n shouldRemember: boolean;\n source: PersonaMemoryTriageSource;\n summary?: string | null;\n themes?: string[];\n}): PersonaMemoryTriageDecision {\n const summary = input.summary?.trim() || null;\n return {\n confidence: clampScore(\n input.confidence ?? (input.shouldRemember ? 0.7 : 0)\n ),\n dedupeKey: null,\n memoryIntent: input.memoryIntent ?? \"none\",\n memoryType:\n input.memoryType ?? (input.shouldRemember ? \"interaction\" : \"none\"),\n privacyLevel: input.privacyLevel ?? \"private\",\n reason: truncateLine(input.reason, 300),\n shouldRemember: input.shouldRemember,\n source: input.source,\n summary: summary ? truncateLine(summary, 500) : null,\n themes: (input.themes ?? []).slice(0, 8),\n };\n}\n\nfunction ruleBasedInteractionMemoryTriage(input: {\n message: string;\n selected?: PersonaMemoryCandidate[];\n source?: PersonaMemoryTriageSource;\n turnPlan: PersonaTurnPlan;\n}): PersonaMemoryTriageDecision {\n const source = input.source ?? \"hard_rule\";\n if (matchesAnyPattern(SENSITIVE_MEMORY_PATTERNS, input.message)) {\n return fallbackMemoryTriageDecision({\n memoryIntent: \"none\",\n memoryType: \"none\",\n privacyLevel: \"sensitive\",\n reason:\n \"The message appears to contain secret or sensitive identifier material.\",\n shouldRemember: false,\n source,\n summary: null,\n themes: input.turnPlan.context.contextKeys.themes,\n });\n }\n\n const isExplicitMemoryRequest = matchesAnyPattern(\n MEMORY_WRITE_TRIGGER_PATTERNS,\n input.message\n );\n const isForgetRequest = matchesAnyPattern(\n MEMORY_FORGET_TRIGGER_PATTERNS,\n input.message\n );\n const queryType = input.turnPlan.gate.queryType;\n const themes = input.turnPlan.context.contextKeys.themes;\n const summary = input.message.slice(0, 500);\n\n if (isExplicitMemoryRequest) {\n return fallbackMemoryTriageDecision({\n confidence: 0.9,\n memoryIntent: isForgetRequest\n ? \"explicit_forget_request\"\n : \"explicit_memory_request\",\n memoryType: \"interaction\",\n reason: \"The user explicitly requested a memory write or correction.\",\n shouldRemember: true,\n source,\n summary,\n themes,\n });\n }\n\n if (queryType === \"relationship_question\") {\n return fallbackMemoryTriageDecision({\n confidence: 0.72,\n memoryIntent: \"relationship_context\",\n memoryType: \"interaction\",\n reason: \"Relationship-context turns are useful for continuity.\",\n shouldRemember: true,\n source,\n summary,\n themes,\n });\n }\n\n if (queryType === \"emotional_reflection\") {\n return fallbackMemoryTriageDecision({\n confidence: 0.78,\n memoryIntent: \"emotional_salience\",\n memoryType: \"interaction\",\n reason: \"Emotionally reflective turns are salient continuity signals.\",\n shouldRemember: true,\n source,\n summary,\n themes,\n });\n }\n\n if (\n NOVELTY_RECORDING_QUERY_TYPES.has(queryType) &&\n isNovelTurn(input.selected ?? [])\n ) {\n return fallbackMemoryTriageDecision({\n confidence: 0.68,\n memoryIntent:\n queryType === \"autobiographical_reasoning\"\n ? \"autobiographical_reasoning\"\n : \"autobiographical_fact\",\n memoryType: \"interaction\",\n reason:\n \"The turn is autobiographical and semantically novel versus selected memory.\",\n shouldRemember: true,\n source,\n summary,\n themes,\n });\n }\n\n return fallbackMemoryTriageDecision({\n confidence: 0,\n reason:\n \"No explicit memory request, emotionally salient reflection, relationship context, or novel autobiographical content was detected by hard rules.\",\n shouldRemember: false,\n source,\n summary: null,\n themes,\n });\n}\n\ntype PostResponseMemoryReview = NonNullable<\n PersonaWorkspacePayload[\"memoryReview\"]\n>;\n\nexport function evaluatePostResponseInteractionMemory(input: {\n assistantMessage: string;\n turnPlan: PersonaTurnPlan;\n userMessage: string;\n}): {\n memoryIntent: \"self_correction_feedback\" | \"durable_product_lesson\" | null;\n reason: string;\n shouldRemember: boolean;\n summary: string | null;\n themes: string[];\n} {\n const userMessage = input.userMessage.trim();\n const assistantMessage = input.assistantMessage.trim();\n const combined = `${userMessage}\\n${assistantMessage}`;\n const hasFeedbackCue = POST_RESPONSE_FEEDBACK_PATTERNS.some((pattern) =>\n pattern.test(combined)\n );\n const hasSelfCorrection = POST_RESPONSE_SELF_CORRECTION_PATTERNS.some(\n (pattern) => pattern.test(assistantMessage)\n );\n const hasDurableLesson = POST_RESPONSE_DURABLE_LESSON_PATTERNS.some(\n (pattern) => pattern.test(combined)\n );\n const queryType = input.turnPlan.gate.queryType;\n const themes = input.turnPlan.context.contextKeys.themes.slice(0, 8);\n\n if (\n hasFeedbackCue &&\n hasSelfCorrection &&\n (queryType === \"value_judgment\" ||\n queryType === \"autobiographical_reasoning\" ||\n queryType === \"hypothetical_response\" ||\n queryType === \"factual_question\")\n ) {\n return {\n memoryIntent: \"self_correction_feedback\",\n reason:\n \"Assistant accepted feedback or corrected its own judgment after the response.\",\n shouldRemember: true,\n summary: [\n \"The persona received feedback on its reasoning and accepted a reusable correction.\",\n truncateLine(assistantMessage, 420),\n ].join(\" \"),\n themes,\n };\n }\n\n if (\n hasDurableLesson &&\n /(\\bshould\\b|\\bmust\\b|\\bnext time\\b|\\bdecision rule\\b|해야|먼저|기준|원칙|다음)/i.test(\n assistantMessage\n ) &&\n (queryType === \"autobiographical_reasoning\" ||\n queryType === \"value_judgment\" ||\n queryType === \"hypothetical_response\")\n ) {\n return {\n memoryIntent: \"durable_product_lesson\",\n reason:\n \"Assistant response contained a reusable product or KPI decision lesson.\",\n shouldRemember: true,\n summary: truncateLine(assistantMessage, 500),\n themes,\n };\n }\n\n return {\n memoryIntent: null,\n reason:\n \"No explicit memory request, self-correction feedback, or durable product lesson was detected after the response.\",\n shouldRemember: false,\n summary: null,\n themes,\n };\n}\n\nexport async function recordPostResponsePersonaMemoryReview(\n db: Database,\n input: {\n assistantMessage: string;\n assistantMessageId?: string | null;\n chatSessionId?: string | null;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n llm?: PersonaJsonLlm;\n organizationId: string;\n persona: PersonaProfile;\n turnPlan: PersonaTurnPlan;\n userId: string;\n userMessage: string;\n workspaceId: string;\n }\n): Promise<PostResponseMemoryReview> {\n const triage = await triagePostResponseInteractionMemoryWithLlm({\n assistantMessage: input.assistantMessage,\n logger: input.logger,\n llm: input.llm,\n persona: input.persona,\n turnPlan: input.turnPlan,\n userMessage: input.userMessage,\n });\n let memoryId: string | null = null;\n\n if (triage.shouldRemember && triage.summary) {\n const [interaction] = await db\n .insert(personaInteractionMemories)\n .values({\n chatMessageId: input.assistantMessageId,\n chatSessionId: input.chatSessionId,\n interactionSummary: triage.summary.slice(0, 500),\n newPersonaMemory: {\n confidence: triage.confidence,\n dedupeKey: triage.dedupeKey,\n memoryIntent: triage.memoryIntent,\n memoryType: triage.memoryType,\n queryType: input.turnPlan.gate.queryType,\n reason: triage.reason,\n source: triage.source,\n themes: triage.themes,\n },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n shouldConsolidate: true,\n state: \"consolidation_candidate\",\n ttlDays: 30,\n userId: input.userId,\n })\n .returning({ id: personaInteractionMemories.id });\n memoryId = interaction?.id ?? null;\n if (memoryId) {\n scheduleHindsightInteractionRetain({\n chatMessageId: input.assistantMessageId,\n chatSessionId: input.chatSessionId,\n content: triage.summary,\n db,\n defer: input.defer,\n documentId: `persona_interaction_${memoryId}`,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: memoryId,\n organizationId: input.organizationId,\n persona: input.persona,\n themes: triage.themes,\n userId: input.userId,\n });\n }\n }\n\n const review: PostResponseMemoryReview = {\n createdAt: new Date().toISOString(),\n memoryId,\n memoryIntent: triage.memoryIntent === \"none\" ? null : triage.memoryIntent,\n reason: triage.reason,\n shouldRemember: triage.shouldRemember,\n status: memoryId ? \"recorded\" : \"skipped\",\n version: 1,\n };\n\n const [workspace] = await db\n .select({ payload: personaWorkspaceStates.payload })\n .from(personaWorkspaceStates)\n .where(eq(personaWorkspaceStates.id, input.workspaceId))\n .limit(1);\n if (workspace) {\n await db\n .update(personaWorkspaceStates)\n .set({\n payload: {\n ...workspace.payload,\n memoryReview: review,\n },\n })\n .where(eq(personaWorkspaceStates.id, input.workspaceId));\n }\n\n return review;\n}\n\n// Personal query types where a turn that matches no stored memory is worth\n// remembering: the user is sharing or probing identity-relevant content the\n// persona has never seen (novelty gating, flashbulb-style auto-encoding).\nconst NOVELTY_RECORDING_QUERY_TYPES: ReadonlySet<PersonaQueryType> = new Set([\n \"autobiographical_fact\",\n \"autobiographical_reasoning\",\n \"emotional_reflection\",\n]);\n// Raw (1 + cos) / 2 similarity below which the turn counts as novel.\nconst NOVELTY_SIMILARITY_THRESHOLD = 0.62;\n\nfunction isNovelTurn(selected: PersonaMemoryCandidate[]): boolean {\n const similarities = selected\n .filter(\n (candidate) =>\n candidate.kind === \"episode\" ||\n candidate.kind === \"fact\" ||\n candidate.kind === \"source\"\n )\n .map((candidate) => candidate.semanticSimilarity)\n .filter((value): value is number => value !== null);\n // Without embeddings there is no reliable novelty signal; stay conservative.\n if (similarities.length === 0) {\n return false;\n }\n return Math.max(...similarities) < NOVELTY_SIMILARITY_THRESHOLD;\n}\n\nfunction formatSelectedMemoryForTriage(\n selected: PersonaMemoryCandidate[] | undefined\n): string[] {\n const memories = (selected ?? []).slice(0, MEMORY_TRIAGE_SELECTED_MEMORY_CAP);\n if (memories.length === 0) {\n return [\"- none\"];\n }\n return memories.map((candidate) => {\n const similarity =\n candidate.semanticSimilarity === null\n ? \"n/a\"\n : candidate.semanticSimilarity.toFixed(2);\n return `- ${candidate.kind}:${candidate.id} similarity=${similarity} confidence=${candidate.confidence.toFixed(2)} ${truncateLine(candidate.summary, 180)}`;\n });\n}\n\nfunction buildMemoryTriageUserPrompt(input: {\n assistantMessage?: string | null;\n message: string;\n persona: PersonaProfile;\n selected?: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): string {\n return [\n `Persona: ${input.persona.displayName} (${input.persona.personaKey})`,\n `Turn queryType: ${input.turnPlan.gate.queryType}`,\n `Safety flags: ${input.turnPlan.gate.safetyFlags.join(\", \") || \"none\"}`,\n `Needed memory types: ${input.turnPlan.gate.neededMemoryTypes.join(\", \") || \"none\"}`,\n `Themes: ${input.turnPlan.context.contextKeys.themes.join(\", \") || \"none\"}`,\n `Entities: ${input.turnPlan.context.contextKeys.entities.join(\", \") || \"none\"}`,\n \"\",\n \"Selected memories already active for this turn:\",\n ...formatSelectedMemoryForTriage(input.selected),\n \"\",\n \"User message:\",\n truncateLine(input.message, 1_200),\n ...(input.assistantMessage\n ? [\"\", \"Assistant response:\", truncateLine(input.assistantMessage, 1_400)]\n : []),\n ].join(\"\\n\");\n}\n\nfunction applyMemoryTriageHardGates(input: {\n decision: Omit<PersonaMemoryTriageDecision, \"source\">;\n hardRuleDecision: PersonaMemoryTriageDecision;\n message: string;\n source: PersonaMemoryTriageSource;\n turnPlan: PersonaTurnPlan;\n}): PersonaMemoryTriageDecision {\n const decision: PersonaMemoryTriageDecision = {\n ...input.decision,\n source: input.source,\n };\n const hasSensitiveCue =\n matchesAnyPattern(SENSITIVE_MEMORY_PATTERNS, input.message) ||\n decision.privacyLevel === \"sensitive\";\n if (hasSensitiveCue) {\n return fallbackMemoryTriageDecision({\n confidence: Math.max(\n decision.confidence,\n input.hardRuleDecision.confidence\n ),\n memoryIntent: \"none\",\n memoryType: \"none\",\n privacyLevel: \"sensitive\",\n reason:\n \"Memory triage skipped retention because the turn contains or was classified as sensitive.\",\n shouldRemember: false,\n source: input.source,\n summary: null,\n themes: decision.themes,\n });\n }\n\n const explicitHardRule = input.hardRuleDecision.shouldRemember;\n if (\n input.turnPlan.gate.safetyFlags.length > 0 &&\n !explicitHardRule &&\n decision.shouldRemember\n ) {\n return fallbackMemoryTriageDecision({\n confidence: decision.confidence,\n memoryIntent: \"none\",\n memoryType: \"none\",\n reason: \"Memory triage skipped retention while safety flags are present.\",\n shouldRemember: false,\n source: input.source,\n summary: null,\n themes: decision.themes,\n });\n }\n\n if (!decision.shouldRemember && explicitHardRule) {\n return {\n ...input.hardRuleDecision,\n reason: `${input.hardRuleDecision.reason} LLM triage did not produce a stronger durable candidate: ${decision.reason}`,\n source: input.hardRuleDecision.source,\n };\n }\n\n if (\n !decision.shouldRemember ||\n decision.memoryIntent === \"none\" ||\n decision.memoryType === \"none\" ||\n !decision.summary\n ) {\n return fallbackMemoryTriageDecision({\n confidence: decision.confidence,\n memoryIntent: decision.memoryIntent,\n memoryType: decision.memoryType,\n privacyLevel: decision.privacyLevel,\n reason: decision.reason,\n shouldRemember: false,\n source: input.source,\n summary: decision.summary,\n themes: decision.themes,\n });\n }\n\n if (decision.confidence < MEMORY_TRIAGE_CONFIDENCE_THRESHOLD) {\n if (explicitHardRule) {\n return {\n ...input.hardRuleDecision,\n reason: `${input.hardRuleDecision.reason} LLM confidence was below automatic triage threshold (${decision.confidence.toFixed(2)}).`,\n source: input.hardRuleDecision.source,\n };\n }\n return fallbackMemoryTriageDecision({\n confidence: decision.confidence,\n memoryIntent: decision.memoryIntent,\n memoryType: decision.memoryType,\n privacyLevel: decision.privacyLevel,\n reason: `LLM confidence ${decision.confidence.toFixed(2)} is below the ${MEMORY_TRIAGE_CONFIDENCE_THRESHOLD.toFixed(2)} retention threshold.`,\n shouldRemember: false,\n source: input.source,\n summary: decision.summary,\n themes: decision.themes,\n });\n }\n\n return decision;\n}\n\nexport async function triageInteractionMemoryWithLlm(input: {\n logger?: PersonaLogger;\n llm?: PersonaJsonLlm;\n message: string;\n persona: PersonaProfile;\n selected?: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): Promise<PersonaMemoryTriageDecision> {\n const hardRuleDecision = ruleBasedInteractionMemoryTriage(input);\n if (!input.llm) {\n return hardRuleDecision;\n }\n const logger = resolvePersonaLogger(input.logger);\n try {\n const output = await input.llm({\n systemPrompt: PERSONA_MEMORY_TRIAGE_SYSTEM_PROMPT,\n userPrompt: buildMemoryTriageUserPrompt(input),\n });\n const decision = parsePersonaMemoryTriageDecision(output);\n return applyMemoryTriageHardGates({\n decision,\n hardRuleDecision,\n message: input.message,\n source: \"llm\",\n turnPlan: input.turnPlan,\n });\n } catch (error) {\n logger.warn(\n personaLogMessage(\n \"[persona-memory] interaction memory triage failed:\",\n error\n )\n );\n return {\n ...ruleBasedInteractionMemoryTriage({\n ...input,\n source: \"llm_fallback\",\n }),\n source: \"llm_fallback\",\n };\n }\n}\n\nexport async function triagePostResponseInteractionMemoryWithLlm(input: {\n assistantMessage: string;\n logger?: PersonaLogger;\n llm?: PersonaJsonLlm;\n persona: PersonaProfile;\n turnPlan: PersonaTurnPlan;\n userMessage: string;\n}): Promise<PersonaMemoryTriageDecision> {\n const hardEvaluation = evaluatePostResponseInteractionMemory(input);\n const hardRuleDecision = fallbackMemoryTriageDecision({\n confidence: hardEvaluation.shouldRemember ? 0.78 : 0,\n memoryIntent: hardEvaluation.memoryIntent ?? \"none\",\n memoryType:\n hardEvaluation.memoryIntent === \"self_correction_feedback\"\n ? \"correction\"\n : hardEvaluation.memoryIntent === \"durable_product_lesson\"\n ? \"lesson\"\n : \"none\",\n reason: hardEvaluation.reason,\n shouldRemember: hardEvaluation.shouldRemember,\n source: \"hard_rule\",\n summary: hardEvaluation.summary,\n themes: hardEvaluation.themes,\n });\n if (!input.llm) {\n return hardRuleDecision;\n }\n const logger = resolvePersonaLogger(input.logger);\n try {\n const output = await input.llm({\n systemPrompt: PERSONA_MEMORY_TRIAGE_SYSTEM_PROMPT,\n userPrompt: buildMemoryTriageUserPrompt({\n assistantMessage: input.assistantMessage,\n message: input.userMessage,\n persona: input.persona,\n turnPlan: input.turnPlan,\n }),\n });\n const decision = parsePersonaMemoryTriageDecision(output);\n return applyMemoryTriageHardGates({\n decision,\n hardRuleDecision,\n message: `${input.userMessage}\\n${input.assistantMessage}`,\n source: \"llm\",\n turnPlan: input.turnPlan,\n });\n } catch (error) {\n logger.warn(\n personaLogMessage(\n \"[persona-memory] post-response memory triage failed:\",\n error\n )\n );\n return {\n ...hardRuleDecision,\n source: \"llm_fallback\",\n };\n }\n}\n\nfunction scheduleHindsightInteractionRetain(input: {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n content: string;\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n documentId: string;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n localTargetId: string;\n organizationId: string;\n persona: PersonaProfile;\n themes: string[];\n userId: string;\n}): void {\n scheduleHindsightRetain({\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: input.localTargetId,\n localTargetKind: \"interaction\",\n metadata: { documentId: input.documentId },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n privacyLevel: \"private\",\n retainInput: {\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n content: input.content,\n context: \"Persona-user interaction memory\",\n documentId: input.documentId,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n privacyLevel: \"private\",\n scope: \"persona_user\",\n themes: input.themes,\n timestamp: new Date(),\n userId: input.userId,\n },\n userId: input.userId,\n });\n}\n\nexport function shouldRecordInteractionMemory(input: {\n message: string;\n selected?: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n}): boolean {\n return ruleBasedInteractionMemoryTriage(input).shouldRemember;\n}\n\nasync function maybeRecordInteractionMemory(\n db: Database,\n input: {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n llm?: PersonaJsonLlm;\n message: string;\n organizationId: string;\n persona: PersonaProfile;\n selected?: PersonaMemoryCandidate[];\n turnPlan: PersonaTurnPlan;\n userId: string;\n }\n): Promise<void> {\n const triage = await triageInteractionMemoryWithLlm({\n logger: input.logger,\n llm: input.llm,\n message: input.message,\n persona: input.persona,\n selected: input.selected,\n turnPlan: input.turnPlan,\n });\n if (!triage.shouldRemember || !triage.summary) {\n return;\n }\n\n const interaction = {\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n interactionSummary: triage.summary.slice(0, 500),\n newPersonaMemory: {\n confidence: triage.confidence,\n dedupeKey: triage.dedupeKey,\n memoryIntent: triage.memoryIntent,\n memoryType: triage.memoryType,\n queryType: input.turnPlan.gate.queryType,\n reason: triage.reason,\n source: triage.source,\n themes: triage.themes,\n },\n newUserPreference:\n triage.memoryIntent === \"user_preference\" ||\n triage.memoryType === \"preference\" ||\n USER_PREFERENCE_PATTERNS.some((pattern) => pattern.test(input.message))\n ? input.message.slice(0, 280)\n : null,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n shouldConsolidate: true,\n state: \"consolidation_candidate\",\n ttlDays: 30,\n userId: input.userId,\n } satisfies NewPersonaInteractionMemory;\n\n const [inserted] = await db\n .insert(personaInteractionMemories)\n .values(interaction)\n .returning({ id: personaInteractionMemories.id });\n if (!inserted) {\n return;\n }\n\n if (triage.memoryIntent !== \"explicit_forget_request\") {\n scheduleHindsightInteractionRetain({\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n content: interaction.interactionSummary,\n db,\n defer: input.defer,\n documentId: `persona_interaction_${inserted.id}`,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: inserted.id,\n organizationId: input.organizationId,\n persona: input.persona,\n themes: triage.themes,\n userId: input.userId,\n });\n }\n}\n\nexport async function preparePersonaRuntimeContext(\n db: Database,\n input: {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n defer?: (promise: Promise<unknown>) => void;\n disclosurePolicy?: DisclosurePolicy;\n embed?: PersonaEmbedder;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n llm: PersonaJsonLlm;\n message: string;\n organizationId: string;\n personaKey: string;\n userId: string;\n }\n): Promise<PersonaRuntimeContext> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const disclosurePolicy = resolveDisclosurePolicy(input.disclosurePolicy);\n const logger = resolvePersonaLogger(input.logger);\n const now = new Date();\n const turnPlan = await planPersonaTurnWithLlm({\n llm: input.llm,\n message: input.message,\n persona,\n });\n // Current-turn cues should color recall immediately: first decay the stored\n // mood, then apply only user-message/query cues before memory retrieval.\n const storedMood = await loadPersonaMoodState(db, {\n organizationId: input.organizationId,\n personaId: persona.id,\n userId: input.userId,\n });\n const storedMoodVector = storedMood\n ? {\n arousal: storedMood.arousal,\n dominance: storedMood.dominance,\n valence: storedMood.valence,\n }\n : null;\n const elapsedMs = storedMood\n ? now.getTime() - storedMood.updatedAt.getTime()\n : 0;\n const immediateTurnAffect = explainTurnAffect({ selected: [], turnPlan });\n const immediateMoodUpdate = calculatePersonaMoodUpdate({\n current: storedMoodVector,\n elapsedMs,\n impulse: immediateTurnAffect.impulse,\n turnAffect: immediateTurnAffect,\n });\n const immediateMood = immediateMoodUpdate.mood;\n const memorySelection = await retrievePersonaMemoriesWithScores(db, {\n context: turnPlan.context,\n embed: input.embed,\n logger,\n mood: immediateMood,\n moodEmotionLabels: immediateMoodUpdate.trace.emotionLabels,\n organizationId: input.organizationId,\n persona,\n });\n const selected = memorySelection.selected;\n const externalMemory = await maybeRecallHindsightPersonaMemory({\n client: input.hindsight,\n localSelected: selected,\n message: input.message,\n organizationId: input.organizationId,\n persona,\n turnPlan,\n userId: input.userId,\n });\n // The turn's emotional impulse (activated memories + query cues) moves the\n // mood, which is persisted for the next turn and shown to the agent.\n const turnAffect = explainTurnAffect({ selected, turnPlan });\n const moodUpdate = calculatePersonaMoodUpdate({\n current: storedMoodVector,\n elapsedMs,\n impulse: turnAffect.impulse,\n turnAffect,\n });\n const mood = moodUpdate.mood;\n try {\n await persistPersonaMoodState(db, {\n mood,\n organizationId: input.organizationId,\n personaId: persona.id,\n turnCount: (storedMood?.turnCount ?? 0) + 1,\n userId: input.userId,\n });\n } catch (error) {\n logger.warn(\n personaLogMessage(\"[persona-memory] mood persistence failed:\", error)\n );\n }\n const workspacePayload = composeWorkspacePayload({\n externalMemory,\n immediateMood,\n immediateMoodUpdate: immediateMoodUpdate.trace,\n mood,\n moodUpdate: moodUpdate.trace,\n retrieval: memorySelection.retrieval,\n selected,\n turnPlan,\n });\n\n const [workspace] = await db\n .insert(personaWorkspaceStates)\n .values({\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n organizationId: input.organizationId,\n payload: workspacePayload,\n personaId: persona.id,\n userId: input.userId,\n userMessage: input.message,\n })\n .returning();\n if (!workspace) {\n throw new Error(\"Failed to persist persona workspace state.\");\n }\n\n await maybeRecordInteractionMemory(db, {\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n message: input.message,\n organizationId: input.organizationId,\n persona,\n defer: input.defer,\n hindsight: input.hindsight,\n logger,\n llm: input.llm,\n selected,\n turnPlan,\n userId: input.userId,\n });\n\n // Use-dependent strengthening: recalling a memory makes it easier to recall\n // next time. Best-effort; a failed bump must not break the turn.\n try {\n await markPersonaMemoriesActivated(db, { selected });\n } catch (error) {\n logger.warn(\n personaLogMessage(\"[persona-memory] activation bump failed:\", error)\n );\n }\n\n return {\n disclosurePolicy,\n persona,\n promptContext: formatWorkspacePrompt({\n disclosurePolicy,\n mood,\n moodUpdate: moodUpdate.trace,\n profile: persona,\n selected,\n turnPlan,\n workspacePayload,\n }),\n turnPlan,\n workspaceId: workspace.id,\n };\n}\n\nasync function markPersonaMemoriesActivated(\n db: Database,\n input: { now?: Date; selected: PersonaMemoryCandidate[] }\n): Promise<void> {\n const now = input.now ?? new Date();\n const idsOfKind = (kind: PersonaMemoryCandidate[\"kind\"]) =>\n input.selected\n .filter((candidate) => candidate.kind === kind)\n .map((candidate) => candidate.id);\n\n const episodeIds = idsOfKind(\"episode\");\n const beliefIds = idsOfKind(\"belief\");\n const factIds = idsOfKind(\"fact\");\n const habitIds = idsOfKind(\"habit\");\n const styleIds = idsOfKind(\"style\");\n\n await Promise.all([\n episodeIds.length > 0\n ? db\n .update(personaEpisodeMemories)\n .set({\n activationCount: sql`${personaEpisodeMemories.activationCount} + 1`,\n lastActivatedAt: now,\n })\n .where(inArray(personaEpisodeMemories.id, episodeIds))\n : Promise.resolve(),\n beliefIds.length > 0\n ? db\n .update(personaSemanticBeliefs)\n .set({\n activationCount: sql`${personaSemanticBeliefs.activationCount} + 1`,\n lastActivatedAt: now,\n })\n .where(inArray(personaSemanticBeliefs.id, beliefIds))\n : Promise.resolve(),\n factIds.length > 0\n ? db\n .update(personaFacts)\n .set({\n activationCount: sql`${personaFacts.activationCount} + 1`,\n lastActivatedAt: now,\n })\n .where(inArray(personaFacts.id, factIds))\n : Promise.resolve(),\n habitIds.length > 0\n ? db\n .update(personaHabitPatterns)\n .set({\n activationCount: sql`${personaHabitPatterns.activationCount} + 1`,\n lastActivatedAt: now,\n })\n .where(inArray(personaHabitPatterns.id, habitIds))\n : Promise.resolve(),\n styleIds.length > 0\n ? db\n .update(personaStyleProfiles)\n .set({\n activationCount: sql`${personaStyleProfiles.activationCount} + 1`,\n lastActivatedAt: now,\n })\n .where(inArray(personaStyleProfiles.id, styleIds))\n : Promise.resolve(),\n ]);\n}\n","import { DEFAULT_PERSONA_LOGGER, personaLogMessage } from \"./logger\";\nimport type {\n PersonaLogger,\n PersonaMemoryType,\n PersonaQueryType,\n PersonaTurnPlan,\n} from \"./types\";\n\nexport type HindsightPersonaMemoryEnv = {\n HINDSIGHT_ENABLED?: boolean | string;\n HINDSIGHT_API_KEY?: string;\n HINDSIGHT_BASE_URL?: string;\n HINDSIGHT_TIMEOUT_MS?: number | string;\n HINDSIGHT_RECALL_ENABLED?: boolean | string;\n HINDSIGHT_RECALL_TOP_K?: number | string;\n HINDSIGHT_RETAIN_ENABLED?: boolean | string;\n HINDSIGHT_RETAIN_ASYNC_ENABLED?: boolean | string;\n HINDSIGHT_REFLECT_ENABLED?: boolean | string;\n HINDSIGHT_REFLECT_TIMEOUT_MS?: number | string;\n HINDSIGHT_FAIL_OPEN?: boolean | string;\n};\n\nexport type HindsightPersonaMemoryConfig = {\n apiKey: string | null;\n baseUrl: string | null;\n enabled: boolean;\n failOpen: boolean;\n recallEnabled: boolean;\n recallTopK: number;\n reflectEnabled: boolean;\n reflectTimeoutMs: number;\n retainAsyncEnabled: boolean;\n retainEnabled: boolean;\n timeoutMs: number;\n};\n\nexport type HindsightRecallInput = {\n contextKeys: PersonaTurnPlan[\"context\"][\"contextKeys\"];\n desiredMemoryTypes: PersonaMemoryType[];\n maxResults: number;\n message: string;\n organizationId: string;\n personaId: string;\n personaKey: string;\n retrievalQueries: PersonaTurnPlan[\"context\"][\"retrievalQueries\"];\n turnQueryType: PersonaQueryType;\n userId: string;\n};\n\nexport type HindsightRawRecallMemory = {\n bankId: string;\n chunkId: string | null;\n context: string | null;\n documentId: string | null;\n entities: string[];\n id: string;\n mentionedAt: string | null;\n metadata: Record<string, string>;\n occurredEnd: string | null;\n occurredStart: string | null;\n sourceFactIds: string[];\n tags: string[];\n text: string;\n type: string | null;\n};\n\nexport type HindsightRecallResult = {\n attempted: boolean;\n enabled: boolean;\n latencyMs?: number;\n memories: HindsightRawRecallMemory[];\n provider: \"hindsight\";\n skippedReason?: string;\n};\n\nexport type HindsightRetainInput = {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n content: string;\n context?: string | null;\n documentId?: string | null;\n organizationId: string;\n personaId: string;\n personaKey: string;\n privacyLevel: \"public\" | \"internal\" | \"private\" | \"sensitive\";\n scope: \"persona_global\" | \"persona_user\";\n tags?: string[];\n themes?: string[];\n timestamp?: Date | string | null;\n userId?: string | null;\n};\n\nexport type HindsightRetainResult = {\n attempted: boolean;\n bankId?: string;\n enabled: boolean;\n error?: string;\n latencyMs?: number;\n operationId?: string | null;\n provider: \"hindsight\";\n skippedReason?: string;\n succeeded: boolean;\n};\n\nexport type HindsightReflectInput = {\n context?: string | null;\n maxTokens?: number;\n organizationId: string;\n personaId: string;\n personaKey: string;\n query: string;\n scope: \"persona_global\" | \"persona_user\";\n tags?: string[];\n userId?: string | null;\n};\n\nexport type HindsightReflectResult = {\n attempted: boolean;\n enabled: boolean;\n error?: string;\n latencyMs?: number;\n provider: \"hindsight\";\n skippedReason?: string;\n text: string | null;\n};\n\nexport type HindsightPersonaMemoryClient = {\n recall(input: HindsightRecallInput): Promise<HindsightRecallResult>;\n reflect(input: HindsightReflectInput): Promise<HindsightReflectResult>;\n retain(input: HindsightRetainInput): Promise<HindsightRetainResult>;\n};\n\ntype HindsightBudget = \"low\" | \"mid\" | \"high\";\n\ntype FetchLike = typeof fetch;\n\nconst DEFAULT_HINDSIGHT_CONFIG: HindsightPersonaMemoryConfig = {\n apiKey: null,\n baseUrl: null,\n enabled: false,\n failOpen: true,\n recallEnabled: false,\n recallTopK: 5,\n reflectEnabled: false,\n reflectTimeoutMs: 5000,\n retainAsyncEnabled: true,\n retainEnabled: false,\n timeoutMs: 1200,\n};\n\nfunction parseBoolean(\n value: boolean | string | undefined,\n defaultValue: boolean\n): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return defaultValue;\n }\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n return true;\n }\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n return false;\n }\n return defaultValue;\n}\n\nfunction parsePositiveInteger(\n value: number | string | undefined,\n defaultValue: number\n): number {\n const parsed =\n typeof value === \"number\"\n ? value\n : Number.parseInt(value?.trim() ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0\n ? Math.floor(parsed)\n : defaultValue;\n}\n\nfunction normalizeBaseUrl(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.replace(/\\/+$/u, \"\");\n}\n\nexport function createHindsightPersonaMemoryConfig(\n env?: HindsightPersonaMemoryEnv | null\n): HindsightPersonaMemoryConfig {\n if (!env) {\n return DEFAULT_HINDSIGHT_CONFIG;\n }\n return {\n apiKey: env.HINDSIGHT_API_KEY?.trim() || null,\n baseUrl: normalizeBaseUrl(env.HINDSIGHT_BASE_URL),\n enabled: parseBoolean(env.HINDSIGHT_ENABLED, false),\n failOpen: parseBoolean(env.HINDSIGHT_FAIL_OPEN, true),\n recallEnabled: parseBoolean(env.HINDSIGHT_RECALL_ENABLED, false),\n recallTopK: parsePositiveInteger(env.HINDSIGHT_RECALL_TOP_K, 5),\n reflectEnabled: parseBoolean(env.HINDSIGHT_REFLECT_ENABLED, false),\n reflectTimeoutMs: parsePositiveInteger(\n env.HINDSIGHT_REFLECT_TIMEOUT_MS,\n 5000\n ),\n retainAsyncEnabled: parseBoolean(env.HINDSIGHT_RETAIN_ASYNC_ENABLED, true),\n retainEnabled: parseBoolean(env.HINDSIGHT_RETAIN_ENABLED, false),\n timeoutMs: parsePositiveInteger(env.HINDSIGHT_TIMEOUT_MS, 1200),\n };\n}\n\nfunction createSkippedRecallResult(\n reason: string,\n enabled = false\n): HindsightRecallResult {\n return {\n attempted: false,\n enabled,\n memories: [],\n provider: \"hindsight\",\n skippedReason: reason,\n };\n}\n\nfunction createSkippedRetainResult(\n reason: string,\n enabled = false\n): HindsightRetainResult {\n return {\n attempted: false,\n enabled,\n provider: \"hindsight\",\n skippedReason: reason,\n succeeded: false,\n };\n}\n\nfunction createSkippedReflectResult(\n reason: string,\n enabled = false\n): HindsightReflectResult {\n return {\n attempted: false,\n enabled,\n provider: \"hindsight\",\n skippedReason: reason,\n text: null,\n };\n}\n\nexport function createNoopHindsightPersonaMemoryClient(\n reason = \"disabled\"\n): HindsightPersonaMemoryClient {\n return {\n recall: async () => createSkippedRecallResult(reason),\n reflect: async () => createSkippedReflectResult(reason),\n retain: async () => createSkippedRetainResult(reason),\n };\n}\n\nfunction fnv1aBase36(input: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction bankSegment(value: string): string {\n return fnv1aBase36(value || \"empty\");\n}\n\nexport function hindsightPersonaBankId(input: {\n organizationId: string;\n personaId: string;\n scope: \"persona_global\" | \"persona_user\";\n userId?: string | null;\n}): string {\n const org = bankSegment(input.organizationId);\n const persona = bankSegment(input.personaId);\n if (input.scope === \"persona_global\") {\n return `persona_${org}_${persona}`;\n }\n return `persona_user_${org}_${persona}_${bankSegment(input.userId ?? \"\")}`;\n}\n\nexport function hindsightPersonaTags(input: {\n organizationId: string;\n personaId: string;\n themes?: string[];\n userId?: string | null;\n}): string[] {\n return [\n `org_${bankSegment(input.organizationId)}`,\n `persona_${bankSegment(input.personaId)}`,\n ...(input.userId ? [`user_${bankSegment(input.userId)}`] : []),\n ...(input.themes ?? [])\n .map((theme) =>\n theme\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gu, \"_\")\n )\n .filter((theme) => theme.length > 0)\n .slice(0, 6)\n .map((theme) => `theme_${theme.slice(0, 48)}`),\n ];\n}\n\nfunction appendPath(baseUrl: string, path: string): string {\n return `${baseUrl}${path}`;\n}\n\nfunction withTimeoutSignal(timeoutMs: number): {\n cancel: () => void;\n signal: AbortSignal;\n} {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n return {\n cancel: () => clearTimeout(timeout),\n signal: controller.signal,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\"\n )\n );\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value : null;\n}\n\nfunction toRecallMemory(\n bankId: string,\n value: unknown\n): HindsightRawRecallMemory | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = optionalString(value.id);\n const text = optionalString(value.text);\n if (!id || !text) {\n return null;\n }\n return {\n bankId,\n chunkId: optionalString(value.chunk_id ?? value.chunkId),\n context: optionalString(value.context),\n documentId: optionalString(value.document_id ?? value.documentId),\n entities: stringArray(value.entities),\n id,\n mentionedAt: optionalString(value.mentioned_at ?? value.mentionedAt),\n metadata: stringRecord(value.metadata),\n occurredEnd: optionalString(value.occurred_end ?? value.occurredEnd),\n occurredStart: optionalString(value.occurred_start ?? value.occurredStart),\n sourceFactIds: stringArray(value.source_fact_ids ?? value.sourceFactIds),\n tags: stringArray(value.tags),\n text,\n type: optionalString(value.type),\n };\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction recallQuery(input: HindsightRecallInput): string {\n return [\n input.message,\n input.retrievalQueries.episodic,\n input.retrievalQueries.semantic,\n input.retrievalQueries.source,\n ]\n .map((entry) => entry.trim())\n .filter(\n (entry, index, array) =>\n entry.length > 0 && array.indexOf(entry) === index\n )\n .join(\"\\n\");\n}\n\nasync function requestJson(input: {\n apiKey: string | null;\n body: Record<string, unknown>;\n fetchImpl: FetchLike;\n timeoutMs: number;\n url: string;\n}): Promise<unknown> {\n const timeout = withTimeoutSignal(input.timeoutMs);\n try {\n const response = await input.fetchImpl(input.url, {\n body: JSON.stringify(input.body),\n headers: {\n ...(input.apiKey ? { Authorization: `Bearer ${input.apiKey}` } : {}),\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal: timeout.signal,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(\n `Hindsight request failed with ${response.status}: ${text.slice(0, 300)}`\n );\n }\n return await response.json();\n } finally {\n timeout.cancel();\n }\n}\n\nfunction requiredCallConfig(\n config: HindsightPersonaMemoryConfig\n): { baseUrl: string } | { skippedReason: string } {\n if (!config.enabled) {\n return { skippedReason: \"disabled\" };\n }\n if (!config.baseUrl) {\n return { skippedReason: \"missing_base_url\" };\n }\n return { baseUrl: config.baseUrl };\n}\n\nfunction handleError<T>(\n config: HindsightPersonaMemoryConfig,\n fallback: T,\n error: unknown,\n logger: PersonaLogger\n): T {\n if (!config.failOpen) {\n throw error;\n }\n logger.warn(\n personaLogMessage(\"[persona-memory:hindsight] provider call failed:\", error)\n );\n return fallback;\n}\n\nexport function createHindsightPersonaMemoryClient(\n config: HindsightPersonaMemoryConfig,\n fetchImpl: FetchLike = fetch,\n logger: PersonaLogger = DEFAULT_PERSONA_LOGGER\n): HindsightPersonaMemoryClient {\n return {\n async recall(input) {\n const callConfig = requiredCallConfig(config);\n if (\"skippedReason\" in callConfig) {\n return createSkippedRecallResult(\n callConfig.skippedReason,\n config.enabled\n );\n }\n if (!config.recallEnabled) {\n return createSkippedRecallResult(\"recall_disabled\", config.enabled);\n }\n const query = recallQuery(input);\n if (!query) {\n return createSkippedRecallResult(\"empty_query\", config.enabled);\n }\n const maxResults = Math.max(\n 1,\n Math.min(input.maxResults, config.recallTopK)\n );\n\n const banks = [\n hindsightPersonaBankId({\n organizationId: input.organizationId,\n personaId: input.personaId,\n scope: \"persona_user\",\n userId: input.userId,\n }),\n hindsightPersonaBankId({\n organizationId: input.organizationId,\n personaId: input.personaId,\n scope: \"persona_global\",\n }),\n ];\n const startedAt = Date.now();\n try {\n const results = await Promise.all(\n banks.map(async (bankId) => {\n const response = await requestJson({\n apiKey: config.apiKey,\n body: {\n budget: \"low\" satisfies HindsightBudget,\n max_tokens: 2048,\n prefer_observations: true,\n query,\n query_timestamp: new Date().toISOString(),\n tags_match: \"any\",\n types: [\"observation\", \"experience\", \"world\"],\n },\n fetchImpl,\n timeoutMs: config.timeoutMs,\n url: appendPath(\n callConfig.baseUrl,\n `/v1/default/banks/${encodeURIComponent(bankId)}/memories/recall`\n ),\n });\n const memories =\n isRecord(response) && Array.isArray(response.results)\n ? response.results\n : [];\n return memories\n .map((memory) => toRecallMemory(bankId, memory))\n .filter(\n (memory): memory is HindsightRawRecallMemory => memory !== null\n );\n })\n );\n return {\n attempted: true,\n enabled: true,\n latencyMs: Date.now() - startedAt,\n memories: results.flat().slice(0, maxResults * 2),\n provider: \"hindsight\",\n };\n } catch (error) {\n return handleError(\n config,\n {\n attempted: true,\n enabled: true,\n latencyMs: Date.now() - startedAt,\n memories: [],\n provider: \"hindsight\",\n skippedReason: \"recall_failed\",\n },\n error,\n logger\n );\n }\n },\n\n async retain(input) {\n const callConfig = requiredCallConfig(config);\n if (\"skippedReason\" in callConfig) {\n return createSkippedRetainResult(\n callConfig.skippedReason,\n config.enabled\n );\n }\n if (!config.retainEnabled) {\n return createSkippedRetainResult(\"retain_disabled\", config.enabled);\n }\n if (input.privacyLevel === \"sensitive\") {\n return createSkippedRetainResult(\"privacy_sensitive\", config.enabled);\n }\n if (input.scope === \"persona_global\" && input.userId) {\n return createSkippedRetainResult(\n \"user_specific_global_retain_denied\",\n config.enabled\n );\n }\n\n const bankId = hindsightPersonaBankId({\n organizationId: input.organizationId,\n personaId: input.personaId,\n scope: input.scope,\n userId: input.userId,\n });\n const startedAt = Date.now();\n try {\n const response = await requestJson({\n apiKey: config.apiKey,\n body: {\n async: config.retainAsyncEnabled,\n items: [\n {\n content: input.content,\n context: input.context ?? \"persona interaction memory\",\n document_id: input.documentId ?? undefined,\n metadata: {\n ...(input.chatMessageId\n ? { chat_message_id: input.chatMessageId }\n : {}),\n ...(input.chatSessionId\n ? { chat_session_id: input.chatSessionId }\n : {}),\n persona_key: input.personaKey,\n privacy_level: input.privacyLevel,\n provider_source: \"persona_memory\",\n scope: input.scope,\n },\n observation_scopes: \"shared\",\n tags: [\n ...hindsightPersonaTags({\n organizationId: input.organizationId,\n personaId: input.personaId,\n themes: input.themes,\n userId: input.userId,\n }),\n ...(input.tags ?? []),\n ],\n timestamp:\n input.timestamp instanceof Date\n ? input.timestamp.toISOString()\n : (input.timestamp ?? undefined),\n update_mode: \"append\",\n },\n ],\n },\n fetchImpl,\n timeoutMs: config.timeoutMs,\n url: appendPath(\n callConfig.baseUrl,\n `/v1/default/banks/${encodeURIComponent(bankId)}/memories`\n ),\n });\n const operationId = isRecord(response)\n ? optionalString(response.operation_id ?? response.operationId)\n : null;\n return {\n attempted: true,\n bankId,\n enabled: true,\n latencyMs: Date.now() - startedAt,\n operationId,\n provider: \"hindsight\",\n succeeded: true,\n };\n } catch (error) {\n return handleError(\n config,\n {\n attempted: true,\n bankId,\n enabled: true,\n error: toErrorMessage(error),\n latencyMs: Date.now() - startedAt,\n provider: \"hindsight\",\n succeeded: false,\n },\n error,\n logger\n );\n }\n },\n\n async reflect(input) {\n const callConfig = requiredCallConfig(config);\n if (\"skippedReason\" in callConfig) {\n return createSkippedReflectResult(\n callConfig.skippedReason,\n config.enabled\n );\n }\n if (!config.reflectEnabled) {\n return createSkippedReflectResult(\"reflect_disabled\", config.enabled);\n }\n const bankId = hindsightPersonaBankId({\n organizationId: input.organizationId,\n personaId: input.personaId,\n scope: input.scope,\n userId: input.userId,\n });\n const startedAt = Date.now();\n try {\n const response = await requestJson({\n apiKey: config.apiKey,\n body: {\n budget: \"low\" satisfies HindsightBudget,\n context: input.context ?? undefined,\n include: { facts: {} },\n max_tokens: input.maxTokens ?? 1200,\n query: input.query,\n tags: input.tags,\n tags_match: \"any\",\n },\n fetchImpl,\n timeoutMs: config.reflectTimeoutMs,\n url: appendPath(\n callConfig.baseUrl,\n `/v1/default/banks/${encodeURIComponent(bankId)}/reflect`\n ),\n });\n return {\n attempted: true,\n enabled: true,\n latencyMs: Date.now() - startedAt,\n provider: \"hindsight\",\n text: isRecord(response) ? optionalString(response.text) : null,\n };\n } catch (error) {\n return handleError(\n config,\n {\n attempted: true,\n enabled: true,\n error: toErrorMessage(error),\n latencyMs: Date.now() - startedAt,\n provider: \"hindsight\",\n text: null,\n },\n error,\n logger\n );\n }\n },\n };\n}\n","import type {\n PersonaEmotionAnnotation,\n PersonaMemoryRetrievalPayload,\n PersonaPrivacyLevel,\n} from \"../schema\";\nimport { clampScore, emotionLabelFamily } from \"./mood\";\nimport { MEMORY_KIND_BUDGETS } from \"./types\";\nimport type {\n PersonaAffectVector,\n PersonaContextGatewayOutput,\n PersonaMemoryActivationScoreBreakdown,\n PersonaMemoryCandidate,\n PersonaMemoryRankedEntry,\n PersonaMemorySelectionResult,\n PersonaMoodEmotionLabel,\n} from \"./types\";\n\nexport function tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const token of input\n .toLowerCase()\n .split(/[^a-z0-9가-힣_]+/iu)\n .filter((entry) => entry.length >= 2)) {\n tokens.add(token);\n if (/^[가-힣]{3,}$/u.test(token)) {\n const stripped = token.replace(\n /(께서는|에서는|에게는|으로는|로는|에게|에서|으로|로서|보다|처럼|까지|부터|은|는|이|가|을|를|에|의|도|만|과|와|랑|로)$/u,\n \"\"\n );\n if (stripped.length >= 2) {\n tokens.add(stripped);\n }\n }\n }\n return tokens;\n}\n\nexport function overlapScore(\n left: Iterable<string>,\n right: Iterable<string>\n): number {\n const leftSet = new Set(left);\n const rightSet = new Set(right);\n if (leftSet.size === 0) {\n return 0.5;\n }\n let matches = 0;\n for (const value of leftSet) {\n if (rightSet.has(value)) {\n matches += 1;\n }\n }\n return clampScore(matches / leftSet.size);\n}\n\n// text-embedding-3 cosine similarity mapped through (1 + cos) / 2 sits near\n// 0.55 for unrelated text. Rescale 0.55 -> 0 and 0.90 -> 1 so embedding\n// similarity is comparable with lexical overlap scores in the same weighted\n// sum.\nexport function normalizeCosineSimilarity(value: number | null): number {\n if (value === null || !Number.isFinite(value)) {\n return 0;\n }\n return clampScore((value - 0.55) / 0.35);\n}\n\nexport const MS_PER_DAY = 86_400_000;\nconst EPISODIC_HALF_LIFE_DAYS = 90;\nconst RECALL_PRIMING_HALF_LIFE_DAYS = 30;\n// Forgetting lowers availability but never erases it: a strong enough cue can\n// still surface an old memory, it just no longer wins ties.\nconst MEMORY_AVAILABILITY_FLOOR = 0.35;\n\n// How easily a memory comes to mind right now. Models the forgetting curve\n// (exponential decay from creation), amygdala-modulated retention (emotionally\n// salient episodes decay slower), recall priming (recently activated memories\n// are temporarily more available), and use-dependent strengthening (memories\n// recalled often stay available).\nexport function calculateMemoryAvailability(input: {\n candidate: Pick<\n PersonaMemoryCandidate,\n | \"activationCount\"\n | \"createdAt\"\n | \"kind\"\n | \"lastActivatedAt\"\n | \"sourceConfidence\"\n >;\n now: Date;\n}): number {\n const { candidate } = input;\n // Identity memory (beliefs, habits, style) is tonic; personality does not\n // fade on conversational timescales.\n if (\n candidate.kind === \"belief\" ||\n candidate.kind === \"habit\" ||\n candidate.kind === \"style\"\n ) {\n return 1;\n }\n const ageDays = Math.max(\n 0,\n (input.now.getTime() - candidate.createdAt.getTime()) / MS_PER_DAY\n );\n const halfLifeDays =\n EPISODIC_HALF_LIFE_DAYS * (1 + clampScore(candidate.sourceConfidence));\n const creationDecay = 0.5 ** (ageDays / halfLifeDays);\n const recallAgeDays =\n candidate.lastActivatedAt === null\n ? null\n : Math.max(\n 0,\n (input.now.getTime() - candidate.lastActivatedAt.getTime()) /\n MS_PER_DAY\n );\n const priming =\n recallAgeDays === null\n ? 0\n : 0.5 ** (recallAgeDays / RECALL_PRIMING_HALF_LIFE_DAYS);\n const usage = Math.min(\n 1,\n Math.log1p(candidate.activationCount) / Math.log(20)\n );\n const trace = Math.max(\n creationDecay,\n clampScore(0.6 * priming + 0.4 * usage)\n );\n return MEMORY_AVAILABILITY_FLOOR + (1 - MEMORY_AVAILABILITY_FLOOR) * trace;\n}\n\nfunction isRetrievablePrivacy(value: PersonaPrivacyLevel): boolean {\n return value === \"public\" || value === \"internal\" || value === \"private\";\n}\n\nconst MOOD_VALENCE_CONGRUENCE_WEIGHT = 0.6;\nconst MOOD_AROUSAL_CONGRUENCE_WEIGHT = 0.25;\nconst MOOD_DOMINANCE_CONGRUENCE_WEIGHT = 0.15;\nconst MOOD_AFFECTIVE_MULTIPLIER_FLOOR = 0.8;\nconst MOOD_PAD_MULTIPLIER_SPAN = 0.35;\nconst MOOD_EMOTION_LABEL_MULTIPLIER_SPAN = 0.05;\n\nfunction calculateMoodAffectCongruence(input: {\n affect: PersonaAffectVector | null;\n mood?: PersonaAffectVector | null;\n}): number {\n if (!input.mood || !input.affect) {\n return 0.5;\n }\n const padDistance =\n MOOD_VALENCE_CONGRUENCE_WEIGHT *\n (Math.abs(input.mood.valence - input.affect.valence) / 2) +\n MOOD_AROUSAL_CONGRUENCE_WEIGHT *\n Math.abs(input.mood.arousal - input.affect.arousal) +\n MOOD_DOMINANCE_CONGRUENCE_WEIGHT *\n Math.abs(input.mood.dominance - input.affect.dominance);\n return 1 - clampScore(padDistance);\n}\n\nfunction calculateEmotionLabelOverlap(input: {\n candidateEmotions: PersonaEmotionAnnotation[];\n moodEmotionLabels?: PersonaMoodEmotionLabel[] | null;\n}): number {\n if (\n !input.moodEmotionLabels ||\n input.moodEmotionLabels.length === 0 ||\n input.candidateEmotions.length === 0\n ) {\n return 0;\n }\n const moodIntensityByFamily = new Map<string, number>();\n for (const label of input.moodEmotionLabels) {\n const family = emotionLabelFamily(label.label);\n moodIntensityByFamily.set(\n family,\n Math.max(moodIntensityByFamily.get(family) ?? 0, label.intensity)\n );\n }\n return input.candidateEmotions.reduce((best, emotion) => {\n const moodIntensity = moodIntensityByFamily.get(\n emotionLabelFamily(emotion.emotion)\n );\n if (moodIntensity === undefined) {\n return best;\n }\n return Math.max(\n best,\n (clampScore(moodIntensity) + clampScore(emotion.intensity)) / 2\n );\n }, 0);\n}\n\nfunction calculateMemoryActivationScore(input: {\n candidate: PersonaMemoryCandidate;\n context: PersonaContextGatewayOutput;\n mood?: PersonaAffectVector | null;\n moodEmotionLabels?: PersonaMoodEmotionLabel[] | null;\n query: string;\n}): PersonaMemoryActivationScoreBreakdown {\n const queryTokens = tokenize(input.query);\n const candidateTokens = tokenize(input.candidate.text);\n // Hybrid retrieval: lexical overlap catches verbatim proper nouns, the\n // embedding similarity catches paraphrases and cross-language matches.\n const lexicalSimilarity = overlapScore(queryTokens, candidateTokens);\n const normalizedSemanticSimilarity = normalizeCosineSimilarity(\n input.candidate.semanticSimilarity\n );\n const semanticSimilarity = Math.max(\n lexicalSimilarity,\n normalizedSemanticSimilarity\n );\n const entityMatch = overlapScore(\n input.context.contextKeys.entities,\n candidateTokens\n );\n const themeMatch = overlapScore(\n input.context.contextKeys.themes,\n input.candidate.themes\n );\n const temporalMatch = overlapScore(\n input.context.contextKeys.timePeriods,\n candidateTokens\n );\n // Mood-congruent recall: episodes whose stored affect matches the immediate\n // mood come to mind more easily. Valence remains dominant; arousal and\n // dominance are secondary, and exact emotion-label overlap gets only a small\n // bounded bonus so mood cannot override relevance.\n const moodCongruence = calculateMoodAffectCongruence({\n affect: input.candidate.affect,\n mood: input.mood,\n });\n const emotionLabelOverlap = calculateEmotionLabelOverlap({\n candidateEmotions: input.candidate.emotions,\n moodEmotionLabels: input.moodEmotionLabels,\n });\n const affectiveSalience =\n input.candidate.kind === \"episode\"\n ? clampScore(\n input.candidate.sourceConfidence *\n input.candidate.retrievalBoost *\n (MOOD_AFFECTIVE_MULTIPLIER_FLOOR +\n MOOD_PAD_MULTIPLIER_SPAN * moodCongruence +\n MOOD_EMOTION_LABEL_MULTIPLIER_SPAN * emotionLabelOverlap)\n )\n : 0.2;\n const identityRelevance = input.candidate.strength;\n const sourceConfidence = input.candidate.sourceConfidence;\n const recencyOrLifeStageRelevance = 0.5;\n const privacyOrPolicyRisk = isRetrievablePrivacy(input.candidate.privacyLevel)\n ? 0\n : 1;\n\n const components = {\n affectiveSalience,\n emotionLabelOverlap,\n entityMatch,\n identityRelevance,\n lexicalSimilarity,\n moodCongruence,\n normalizedSemanticSimilarity,\n privacyOrPolicyRisk,\n recencyOrLifeStageRelevance,\n semanticSimilarity,\n sourceConfidence,\n temporalMatch,\n themeMatch,\n };\n\n const score = clampScore(\n 0.25 * semanticSimilarity +\n 0.15 * entityMatch +\n 0.15 * themeMatch +\n 0.1 * temporalMatch +\n 0.15 * affectiveSalience +\n 0.1 * identityRelevance +\n 0.05 * sourceConfidence +\n 0.05 * recencyOrLifeStageRelevance -\n 0.2 * privacyOrPolicyRisk\n );\n\n return { components, score };\n}\n// One-hop spreading activation over explicit memory links (belief ->\n// supporting episode/source, episode -> source). When one memory fires, the\n// memories wired to it get a fraction of its activation, mimicking\n// associative recall: remembering a belief pulls up the episode that taught\n// it. Boosts use max (not sum) so densely linked graphs cannot snowball, and\n// a single pass keeps activation local to direct associations.\nconst SPREADING_ACTIVATION_FACTOR = 0.3;\n\nfunction applySpreadingActivation(ranked: PersonaMemoryRankedEntry[]): void {\n const indexByAlias = new Map<string, number[]>();\n ranked.forEach((entry, index) => {\n for (const alias of [entry.candidate.id, ...entry.candidate.aliasIds]) {\n const bucket = indexByAlias.get(alias);\n if (bucket) {\n bucket.push(index);\n } else {\n indexByAlias.set(alias, [index]);\n }\n }\n });\n\n const boosts = new Array<number>(ranked.length).fill(0);\n ranked.forEach((entry, index) => {\n for (const linkId of entry.candidate.linkIds) {\n for (const linkedIndex of indexByAlias.get(linkId) ?? []) {\n if (linkedIndex === index) {\n continue;\n }\n // Associations work both ways: the linker activates the linked memory\n // and a strongly active linked memory re-activates its linker.\n boosts[linkedIndex] = Math.max(\n boosts[linkedIndex] ?? 0,\n SPREADING_ACTIVATION_FACTOR * entry.rank\n );\n boosts[index] = Math.max(\n boosts[index] ?? 0,\n SPREADING_ACTIVATION_FACTOR * (ranked[linkedIndex]?.rank ?? 0)\n );\n }\n }\n });\n\n ranked.forEach((entry, index) => {\n const nextRank = clampScore(entry.rank + (boosts[index] ?? 0));\n entry.spreadingBoost = clampScore(nextRank - entry.rank);\n entry.rank = nextRank;\n });\n}\n\nexport function selectPersonaMemories(input: {\n candidates: PersonaMemoryCandidate[];\n context: PersonaContextGatewayOutput;\n mood?: PersonaAffectVector | null;\n moodEmotionLabels?: PersonaMoodEmotionLabel[] | null;\n now?: Date;\n}): PersonaMemoryCandidate[] {\n return selectPersonaMemoriesWithScores(input).selected;\n}\n\nfunction memoryScoreKey(\n candidate: Pick<PersonaMemoryCandidate, \"id\" | \"kind\">\n) {\n return `${candidate.kind}:${candidate.id}`;\n}\n\nfunction serializeMemoryRetrievalCandidate(input: {\n entry: PersonaMemoryRankedEntry;\n selectedOrder: number | null;\n}): PersonaMemoryRetrievalPayload[\"candidates\"][number] {\n const { candidate } = input.entry;\n return {\n activationCount: candidate.activationCount,\n activationScore: input.entry.activationScore,\n availability: input.entry.availability,\n baseRank: input.entry.baseRank,\n components: input.entry.components,\n confidence: candidate.confidence,\n createdAt: candidate.createdAt.toISOString(),\n excludedReason: input.entry.excludedReason,\n id: candidate.id,\n kind: candidate.kind,\n lastActivatedAt: candidate.lastActivatedAt?.toISOString() ?? null,\n privacyLevel: candidate.privacyLevel,\n query: input.entry.query,\n rank: input.entry.rank,\n rankBeforeSpreading: input.entry.rankBeforeSpreading,\n retrievalBoost: candidate.retrievalBoost,\n selected: input.selectedOrder !== null,\n selectedOrder: input.selectedOrder,\n semanticSimilarity: candidate.semanticSimilarity,\n sourceConfidence: candidate.sourceConfidence,\n spreadingBoost: input.entry.spreadingBoost,\n strength: candidate.strength,\n };\n}\n\nexport function selectPersonaMemoriesWithScores(input: {\n candidates: PersonaMemoryCandidate[];\n context: PersonaContextGatewayOutput;\n mood?: PersonaAffectVector | null;\n moodEmotionLabels?: PersonaMoodEmotionLabel[] | null;\n now?: Date;\n}): PersonaMemorySelectionResult {\n const now = input.now ?? new Date();\n const queryByKind = (kind: PersonaMemoryCandidate[\"kind\"]) => {\n if (kind === \"episode\") {\n return input.context.retrievalQueries.episodic;\n }\n if (kind === \"belief\") {\n return input.context.retrievalQueries.semantic;\n }\n if (kind === \"fact\") {\n return input.context.retrievalQueries.source;\n }\n if (kind === \"habit\") {\n return input.context.retrievalQueries.habit;\n }\n if (kind === \"style\") {\n return input.context.retrievalQueries.style;\n }\n return input.context.retrievalQueries.source;\n };\n\n const scored = input.candidates.map((candidate): PersonaMemoryRankedEntry => {\n const query = queryByKind(candidate.kind);\n if (!isRetrievablePrivacy(candidate.privacyLevel)) {\n return {\n activationScore: null,\n availability: null,\n baseRank: null,\n candidate,\n components: null,\n excludedReason: \"privacy\",\n query,\n rank: 0,\n rankBeforeSpreading: null,\n spreadingBoost: 0,\n };\n }\n\n const activation = calculateMemoryActivationScore({\n candidate,\n context: input.context,\n mood: input.mood,\n moodEmotionLabels: input.moodEmotionLabels,\n query,\n });\n // Beliefs and habits rank partly on conviction strength so strong\n // identity memory survives weak lexical overlap with the query. Facts use\n // a smaller confidence term so verified concrete details can surface\n // without overwhelming source/query relevance.\n const baseRank =\n candidate.kind === \"belief\" || candidate.kind === \"habit\"\n ? clampScore(0.55 * activation.score + 0.45 * candidate.strength)\n : candidate.kind === \"fact\"\n ? clampScore(0.75 * activation.score + 0.25 * candidate.confidence)\n : activation.score;\n // Forgetting curve: availability scales how strongly the memory\n // competes, without changing what it matches.\n const availability = calculateMemoryAvailability({ candidate, now });\n const rankBeforeSpreading = clampScore(baseRank * availability);\n return {\n activationScore: activation.score,\n availability,\n baseRank,\n candidate,\n components: activation.components,\n excludedReason: null,\n query,\n rank: rankBeforeSpreading,\n rankBeforeSpreading,\n spreadingBoost: 0,\n };\n });\n\n const ranked = scored.filter((entry) => entry.excludedReason === null);\n\n applySpreadingActivation(ranked);\n\n const takeKind = (kind: PersonaMemoryCandidate[\"kind\"]) =>\n ranked\n .filter((entry) => entry.candidate.kind === kind)\n .sort((left, right) => {\n if (right.rank !== left.rank) {\n return right.rank - left.rank;\n }\n return (\n right.candidate.createdAt.getTime() -\n left.candidate.createdAt.getTime()\n );\n })\n .slice(0, MEMORY_KIND_BUDGETS[kind])\n .map((entry) => entry.candidate);\n\n const selected = [\n ...takeKind(\"fact\"),\n ...takeKind(\"belief\"),\n ...takeKind(\"habit\"),\n ...takeKind(\"style\"),\n ...takeKind(\"episode\"),\n ...takeKind(\"source\"),\n ];\n const selectedOrderByKey = new Map(\n selected.map((candidate, index) => [memoryScoreKey(candidate), index + 1])\n );\n\n return {\n retrieval: {\n budgets: MEMORY_KIND_BUDGETS,\n candidateCount: scored.length,\n candidates: scored.map((entry) =>\n serializeMemoryRetrievalCandidate({\n entry,\n selectedOrder:\n selectedOrderByKey.get(memoryScoreKey(entry.candidate)) ?? null,\n })\n ),\n generatedAt: now.toISOString(),\n queries: input.context.retrievalQueries,\n selectedCount: selected.length,\n version: 1,\n },\n selected,\n };\n}\n","import { and, eq, sql } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaEpisodeMemories,\n personaExternalMemoryRefs,\n personaFacts,\n personaHabitPatterns,\n personaSemanticBeliefs,\n personaSourceChunks,\n personaSourceDocuments,\n personaStyleProfiles,\n} from \"../schema\";\nimport type {\n NewPersonaEpisodeMemory,\n NewPersonaExternalMemoryRef,\n NewPersonaFact,\n NewPersonaHabitPattern,\n NewPersonaSemanticBelief,\n NewPersonaSourceChunk,\n NewPersonaSourceDocument,\n NewPersonaStyleProfile,\n PersonaBeliefStance,\n PersonaBeliefType,\n PersonaEpisodeMemory,\n PersonaExternalMemoryLocalTargetKind,\n PersonaFact,\n PersonaFactObjectType,\n PersonaFactType,\n PersonaHabitPattern,\n PersonaMemoryState,\n PersonaPrivacyLevel,\n PersonaProfile,\n PersonaSemanticBelief,\n PersonaSourceDocument,\n PersonaStyleProfile,\n PersonaToneVector,\n} from \"../schema\";\nimport { ulid } from \"../schema/ulid\";\nimport {\n beliefMemoryText,\n episodeMemoryText,\n factMemoryText,\n habitMemoryText,\n styleMemoryText,\n tryUpsertPersonaMemoryEmbeddings,\n} from \"./embeddings\";\nimport type {\n HindsightPersonaMemoryClient,\n HindsightRetainInput,\n HindsightRetainResult,\n} from \"./hindsight\";\nimport { hindsightPersonaBankId } from \"./hindsight\";\nimport { DEFAULT_PERSONA_LOGGER, personaLogMessage } from \"./logger\";\nimport { clampScore } from \"./mood\";\nimport { loadPersonaProfile } from \"./profile\";\nimport { tokenize } from \"./selection\";\nimport {\n MAX_HINDSIGHT_RETAIN_CONTENT_CHARS,\n MAX_SOURCE_EXCERPT_SUMMARY_CHARS,\n} from \"./types\";\nimport type { PersonaEmbedder, PersonaLogger } from \"./types\";\n\nexport async function hashPersonaSourceContent(text: string): Promise<string> {\n const encoded = new TextEncoder().encode(text);\n const digest = await crypto.subtle.digest(\"SHA-256\", encoded);\n const hex = Array.from(new Uint8Array(digest), (byte) =>\n byte.toString(16).padStart(2, \"0\")\n ).join(\"\");\n return `sha256:${hex}`;\n}\n\nexport type PersonaSourceTextChunk = {\n endChar: number;\n startChar: number;\n text: string;\n};\n\nconst PERSONA_SOURCE_CHUNK_CHARS = 2_400;\nconst PERSONA_SOURCE_CHUNK_OVERLAP_CHARS = 180;\n\nexport function chunkPersonaSourceText(\n rawText: string,\n input: { maxChars?: number; overlapChars?: number } = {}\n): PersonaSourceTextChunk[] {\n const text = rawText.trim();\n if (text.length === 0) {\n return [];\n }\n const maxChars = Math.max(400, input.maxChars ?? PERSONA_SOURCE_CHUNK_CHARS);\n const overlapChars = Math.max(\n 0,\n Math.min(input.overlapChars ?? PERSONA_SOURCE_CHUNK_OVERLAP_CHARS, 400)\n );\n const chunks: PersonaSourceTextChunk[] = [];\n let start = 0;\n\n while (start < text.length) {\n let end = Math.min(text.length, start + maxChars);\n if (end < text.length) {\n const minBoundary = start + Math.floor(maxChars * 0.5);\n const paragraphBoundary = text.lastIndexOf(\"\\n\\n\", end);\n const lineBoundary = text.lastIndexOf(\"\\n\", end);\n const sentenceBoundary = Math.max(\n text.lastIndexOf(\". \", end),\n text.lastIndexOf(\"? \", end),\n text.lastIndexOf(\"! \", end),\n text.lastIndexOf(\"。\", end),\n text.lastIndexOf(\"다.\", end)\n );\n const spaceBoundary = text.lastIndexOf(\" \", end);\n const boundary = [\n paragraphBoundary,\n lineBoundary,\n sentenceBoundary >= 0 ? sentenceBoundary + 1 : -1,\n spaceBoundary,\n ].find((candidate) => candidate >= minBoundary);\n if (boundary !== undefined) {\n end = boundary;\n }\n }\n\n const chunkText = text.slice(start, end).trim();\n if (chunkText.length > 0) {\n const leadingWhitespace = text\n .slice(start, end)\n .match(/^\\s*/u)?.[0].length;\n const trailingWhitespace = text\n .slice(start, end)\n .match(/\\s*$/u)?.[0].length;\n chunks.push({\n endChar: end - (trailingWhitespace ?? 0),\n startChar: start + (leadingWhitespace ?? 0),\n text: chunkText,\n });\n }\n\n if (end >= text.length) {\n break;\n }\n start = Math.max(end - overlapChars, start + 1);\n }\n\n return chunks;\n}\n\nexport function formatPersonaSourceExcerptForQuery(input: {\n maxChars?: number;\n query: string;\n text: string;\n}): string {\n const maxChars = input.maxChars ?? MAX_SOURCE_EXCERPT_SUMMARY_CHARS;\n const text = input.text.replace(/\\s+/gu, \" \").trim();\n if (text.length <= maxChars) {\n return text;\n }\n const lowerText = text.toLowerCase();\n const tokens = [...tokenize(input.query)].sort(\n (left, right) => right.length - left.length\n );\n const halfWindow = Math.floor(maxChars / 2);\n let bestMatch: { index: number; score: number; tokenLength: number } | null =\n null;\n for (const token of tokens) {\n let searchFrom = 0;\n while (searchFrom < lowerText.length) {\n const index = lowerText.indexOf(token.toLowerCase(), searchFrom);\n if (index < 0) {\n break;\n }\n const windowStart = Math.max(0, index - halfWindow);\n const windowEnd = Math.min(text.length, windowStart + maxChars);\n const windowText = lowerText.slice(windowStart, windowEnd);\n const score = tokens.reduce(\n (count, queryToken) =>\n windowText.includes(queryToken.toLowerCase()) ? count + 1 : count,\n 0\n );\n if (\n bestMatch === null ||\n score > bestMatch.score ||\n (score === bestMatch.score && token.length > bestMatch.tokenLength) ||\n (score === bestMatch.score &&\n token.length === bestMatch.tokenLength &&\n index < bestMatch.index)\n ) {\n bestMatch = { index, score, tokenLength: token.length };\n }\n searchFrom = index + Math.max(1, token.length);\n }\n }\n if (bestMatch === null) {\n return `${text.slice(0, maxChars - 2).trim()} …`;\n }\n\n const start = Math.max(0, bestMatch.index - halfWindow);\n const end = Math.min(text.length, start + maxChars);\n const adjustedStart = Math.max(0, end - maxChars);\n const prefix = adjustedStart > 0 ? \"… \" : \"\";\n const suffix = end < text.length ? \" …\" : \"\";\n return `${prefix}${text.slice(adjustedStart, end).trim()}${suffix}`;\n}\n\nfunction schedulePersonaMemoryEffect(input: {\n defer?: (promise: Promise<unknown>) => void;\n label: string;\n logger?: PersonaLogger;\n promise: Promise<unknown>;\n}): void {\n const logger = input.logger ?? DEFAULT_PERSONA_LOGGER;\n const handled = input.promise.catch((error: unknown) => {\n logger.warn(\n personaLogMessage(`[persona-memory] ${input.label} failed:`, error)\n );\n });\n if (input.defer) {\n input.defer(handled);\n return;\n }\n handled.then(() => undefined);\n}\n\nfunction hindsightRetainState(\n result: HindsightRetainResult\n): NewPersonaExternalMemoryRef[\"state\"] {\n if (result.succeeded) {\n return \"active\";\n }\n return result.attempted ? \"failed\" : \"disabled\";\n}\n\nasync function upsertHindsightRetainReference(\n db: Database,\n input: {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n localTargetId: string;\n localTargetKind: PersonaExternalMemoryLocalTargetKind;\n metadata?: Record<string, unknown>;\n organizationId: string;\n personaId: string;\n privacyLevel: PersonaPrivacyLevel;\n result: HindsightRetainResult;\n retainInput: HindsightRetainInput;\n userId?: string | null;\n }\n): Promise<void> {\n const bankId =\n input.result.bankId ??\n (input.result.attempted\n ? hindsightPersonaBankId({\n organizationId: input.organizationId,\n personaId: input.personaId,\n scope: input.retainInput.scope,\n userId: input.retainInput.userId,\n })\n : null);\n if (!bankId) {\n return;\n }\n const state = hindsightRetainState(input.result);\n const metadata = {\n ...(input.metadata ?? {}),\n ...(input.result.latencyMs === undefined\n ? {}\n : { latencyMs: input.result.latencyMs }),\n ...(input.result.operationId\n ? { operationId: input.result.operationId }\n : {}),\n ...(input.result.skippedReason\n ? { skippedReason: input.result.skippedReason }\n : {}),\n retainScope: input.retainInput.scope,\n };\n await db\n .insert(personaExternalMemoryRefs)\n .values({\n chatMessageId: input.chatMessageId ?? null,\n chatSessionId: input.chatSessionId ?? null,\n externalBankId: bankId,\n externalMemoryId: null,\n externalObservationId: null,\n lastError: input.result.error ?? null,\n localTargetId: input.localTargetId,\n localTargetKind: input.localTargetKind,\n metadata,\n organizationId: input.organizationId,\n personaId: input.personaId,\n privacyLevel: input.privacyLevel,\n provider: \"hindsight\",\n state,\n userId: input.userId ?? null,\n })\n .onConflictDoUpdate({\n set: {\n chatMessageId: input.chatMessageId ?? null,\n chatSessionId: input.chatSessionId ?? null,\n externalBankId: bankId,\n lastError: input.result.error ?? null,\n metadata,\n privacyLevel: input.privacyLevel,\n state,\n updatedAt: new Date(),\n userId: input.userId ?? null,\n },\n target: [\n personaExternalMemoryRefs.localTargetKind,\n personaExternalMemoryRefs.localTargetId,\n personaExternalMemoryRefs.provider,\n ],\n });\n}\n\nexport function scheduleHindsightRetain(input: {\n chatMessageId?: string | null;\n chatSessionId?: string | null;\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n localTargetId: string;\n localTargetKind: PersonaExternalMemoryLocalTargetKind;\n metadata?: Record<string, unknown>;\n organizationId: string;\n personaId: string;\n privacyLevel: PersonaPrivacyLevel;\n retainInput: HindsightRetainInput;\n userId?: string | null;\n}): void {\n if (!input.hindsight || input.privacyLevel === \"sensitive\") {\n return;\n }\n schedulePersonaMemoryEffect({\n defer: input.defer,\n label: \"hindsight retain\",\n logger: input.logger,\n promise: input.hindsight.retain(input.retainInput).then(async (result) =>\n upsertHindsightRetainReference(input.db, {\n chatMessageId: input.chatMessageId,\n chatSessionId: input.chatSessionId,\n localTargetId: input.localTargetId,\n localTargetKind: input.localTargetKind,\n metadata: input.metadata,\n organizationId: input.organizationId,\n personaId: input.personaId,\n privacyLevel: input.privacyLevel,\n result,\n retainInput: input.retainInput,\n userId: input.userId,\n })\n ),\n });\n}\n\nfunction scheduleHindsightSourceDocumentRetain(input: {\n db: Database;\n defer?: (promise: Promise<unknown>) => void;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n organizationId: string;\n persona: PersonaProfile;\n rawText: string;\n sourceDocument: PersonaSourceDocument;\n}): void {\n if (\n input.sourceDocument.privacyLevel === \"private\" ||\n input.sourceDocument.privacyLevel === \"sensitive\"\n ) {\n return;\n }\n scheduleHindsightRetain({\n db: input.db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n localTargetId: input.sourceDocument.id,\n localTargetKind: \"source_document\",\n metadata: {\n source: \"ingestPersonaSourceDocument\",\n sourcePriority: input.sourceDocument.sourcePriority,\n sourceType: input.sourceDocument.sourceType,\n },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n privacyLevel: input.sourceDocument.privacyLevel,\n retainInput: {\n content: input.rawText.slice(0, MAX_HINDSIGHT_RETAIN_CONTENT_CHARS),\n context: `Persona source document: ${input.sourceDocument.title}`,\n documentId: `persona_source_document_${input.sourceDocument.id}`,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n personaKey: input.persona.personaKey,\n privacyLevel: input.sourceDocument.privacyLevel,\n scope: \"persona_global\",\n tags: [\n \"memory_kind_source_document\",\n `source_type_${input.sourceDocument.sourceType}`,\n ],\n themes: [],\n timestamp: input.sourceDocument.createdAt,\n userId: null,\n },\n userId: null,\n });\n}\n\nexport type PersonaSourceIngestionResult = {\n chunkCount: number;\n sourceDocument: PersonaSourceDocument;\n};\n\nexport async function ingestPersonaSourceDocument(\n db: Database,\n input: {\n author?: string | null;\n consentStatus?: PersonaSourceDocument[\"consentStatus\"] | null;\n defer?: (promise: Promise<unknown>) => void;\n embed?: PersonaEmbedder;\n hindsight?: HindsightPersonaMemoryClient | null;\n logger?: PersonaLogger;\n metadata?: Record<string, unknown>;\n organizationId: string;\n personaKey: string;\n privacyLevel?: PersonaPrivacyLevel | null;\n publicationDate?: string | null;\n rawText: string;\n reliability?: number | null;\n rightsStatus?: PersonaSourceDocument[\"rightsStatus\"] | null;\n sourcePriority?: PersonaSourceDocument[\"sourcePriority\"] | null;\n sourceType?: PersonaSourceDocument[\"sourceType\"] | null;\n sourceUri?: string | null;\n title: string;\n }\n): Promise<PersonaSourceIngestionResult> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const rawText = input.rawText.trim();\n if (rawText.length === 0) {\n throw new Error(\"Persona source document content cannot be empty.\");\n }\n const chunks = chunkPersonaSourceText(rawText);\n if (chunks.length === 0) {\n throw new Error(\"Persona source document content cannot be chunked.\");\n }\n const contentHash = await hashPersonaSourceContent(rawText);\n const now = new Date();\n const values = {\n author: input.author?.trim() || null,\n consentStatus: input.consentStatus ?? persona.consentStatus,\n contentHash,\n metadata: {\n medium: \"text\",\n ...(input.metadata ?? {}),\n },\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: input.privacyLevel ?? \"internal\",\n publicationDate: input.publicationDate?.trim() || null,\n reliability: clampScore(input.reliability ?? 0.75),\n rightsStatus: input.rightsStatus ?? \"unknown\",\n sourcePriority: input.sourcePriority ?? \"unverified_secondary\",\n sourceType: input.sourceType ?? \"external_source\",\n sourceUri: input.sourceUri?.trim() || null,\n title: input.title.trim(),\n updatedAt: now,\n } satisfies NewPersonaSourceDocument;\n\n const [sourceDocument] = await db\n .insert(personaSourceDocuments)\n .values(values)\n .onConflictDoUpdate({\n set: values,\n target: [\n personaSourceDocuments.organizationId,\n personaSourceDocuments.personaId,\n personaSourceDocuments.contentHash,\n ],\n targetWhere: sql`${personaSourceDocuments.contentHash} is not null`,\n })\n .returning();\n if (!sourceDocument) {\n throw new Error(\"Failed to ingest persona source document.\");\n }\n\n const existingChunks = await db\n .select({ id: personaSourceChunks.id, text: personaSourceChunks.text })\n .from(personaSourceChunks)\n .where(eq(personaSourceChunks.sourceDocumentId, sourceDocument.id));\n if (existingChunks.length > 0) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: existingChunks.map((chunk) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: chunk.id,\n targetKind: \"source_chunk\" as const,\n text: chunk.text,\n })),\n logger: input.logger,\n });\n return {\n chunkCount: existingChunks.length,\n sourceDocument,\n };\n }\n\n const insertedChunks = await db\n .insert(personaSourceChunks)\n .values(\n chunks.map(\n (chunk) =>\n ({\n endChar: chunk.endChar,\n organizationId: input.organizationId,\n personaId: persona.id,\n sourceDocumentId: sourceDocument.id,\n startChar: chunk.startChar,\n text: chunk.text,\n }) satisfies NewPersonaSourceChunk\n )\n )\n .returning();\n\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: insertedChunks.map((chunk) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: chunk.id,\n targetKind: \"source_chunk\" as const,\n text: chunk.text,\n })),\n logger: input.logger,\n });\n scheduleHindsightSourceDocumentRetain({\n db,\n defer: input.defer,\n hindsight: input.hindsight,\n logger: input.logger,\n organizationId: input.organizationId,\n persona,\n rawText,\n sourceDocument,\n });\n\n return {\n chunkCount: insertedChunks.length,\n sourceDocument,\n };\n}\n\nexport type PersonaSourceDraftEpisode = {\n confidence: number;\n eventSummary: string;\n firstPersonRecollection?: string | null;\n privacyLevel?: PersonaPrivacyLevel | null;\n quoteSpan?: string | null;\n sourceChunkIds?: string[];\n themes?: string[];\n thoughtAnnotations?: string[];\n time?: NewPersonaEpisodeMemory[\"time\"];\n title: string;\n};\n\nexport type PersonaSourceDraftBelief = {\n beliefType: PersonaBeliefType;\n confidence: number;\n domain: string;\n exceptions?: string[];\n firstPersonForm?: string | null;\n privacyLevel?: PersonaPrivacyLevel | null;\n proposition: string;\n sourceChunkIds?: string[];\n stance?: PersonaBeliefStance;\n strength?: number | null;\n};\n\nexport type PersonaSourceDraftFact = {\n beliefType?: PersonaBeliefType;\n claimText?: string;\n confidence: number;\n domain?: string;\n evidenceSpan?: string | null;\n fact?: string;\n factType?: PersonaFactType | null;\n firstPersonForm?: string | null;\n objectKey?: string | null;\n objectName?: string | null;\n objectType?: PersonaFactObjectType | null;\n privacyLevel?: PersonaPrivacyLevel | null;\n sourceChunkIds?: string[];\n strength?: number | null;\n};\n\nexport type PersonaSourceDraftHabit = {\n avoidPatterns?: string[];\n confidence: number;\n defaultResponsePattern: string[];\n rhetoricalMoves?: string[];\n sourceChunkIds?: string[];\n strength?: number | null;\n tone?: PersonaToneVector;\n trigger: { description: string; type: string };\n};\n\nexport type PersonaSourceDraftStyleProfile = {\n avoidPhrases?: string[];\n commonPhrases?: string[];\n lexicalPreferences?: { avoids?: string[]; uses?: string[] };\n preferredRhetoricalMoves?: string[];\n register: string;\n sentenceLength: string;\n sourceChunkIds?: string[];\n toneVector?: PersonaToneVector;\n};\n\nexport type PersonaSourceDraftMemoryInput = {\n beliefs?: PersonaSourceDraftBelief[];\n episodes?: PersonaSourceDraftEpisode[];\n habits?: PersonaSourceDraftHabit[];\n sourceFacts?: PersonaSourceDraftFact[];\n styleProfiles?: PersonaSourceDraftStyleProfile[];\n};\n\nexport type PersonaDraftMemorySummary = {\n id: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\";\n state: PersonaMemoryState;\n title: string;\n};\n\nexport type PersonaSourceDraftMemoryResult = {\n drafts: PersonaDraftMemorySummary[];\n sourceDocumentId: string;\n};\n\nfunction assertSourceChunkRefs(input: {\n knownChunkIds: Set<string>;\n sourceChunkIds?: string[];\n}) {\n const invalid = (input.sourceChunkIds ?? []).find(\n (id) => !input.knownChunkIds.has(id)\n );\n if (invalid) {\n throw new Error(\n `Persona memory candidate references source chunk ${invalid}, which does not belong to the source document.`\n );\n }\n}\n\nfunction sourceRefsForDraft(input: {\n quoteSpan?: string | null;\n sourceChunkIds?: string[];\n sourceDocumentId: string;\n}) {\n const chunkIds = input.sourceChunkIds ?? [];\n if (chunkIds.length === 0) {\n return [\n {\n quoteSpan: input.quoteSpan ?? undefined,\n sourceDocumentId: input.sourceDocumentId,\n },\n ];\n }\n return chunkIds.map((sourceChunkId) => ({\n quoteSpan: input.quoteSpan ?? undefined,\n sourceChunkId,\n sourceDocumentId: input.sourceDocumentId,\n }));\n}\n\nfunction sourceIdsForDraft(input: {\n sourceChunkIds?: string[];\n sourceDocumentId: string;\n}) {\n return [\n ...new Set([input.sourceDocumentId, ...(input.sourceChunkIds ?? [])]),\n ];\n}\n\nexport function normalizePersonaFactObjectKey(value: string): string {\n return value.trim().replace(/\\s+/gu, \" \").toLocaleLowerCase();\n}\n\nfunction claimTextForDraftFact(fact: PersonaSourceDraftFact): string {\n const claimText = fact.claimText?.trim() || fact.fact?.trim();\n if (!claimText) {\n throw new Error(\"Persona sourceFact must include claimText or fact.\");\n }\n return claimText;\n}\n\nfunction objectNameForDraftFact(\n fact: PersonaSourceDraftFact,\n claimText: string\n): string {\n return (\n fact.objectName?.trim() ||\n fact.objectKey?.trim() ||\n fact.domain?.trim() ||\n claimText\n );\n}\n\nexport async function draftPersonaMemoriesFromSourceDocument(\n db: Database,\n input: {\n draft: PersonaSourceDraftMemoryInput;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n organizationId: string;\n personaKey: string;\n sourceDocumentId: string;\n }\n): Promise<PersonaSourceDraftMemoryResult> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const [sourceDocument] = await db\n .select()\n .from(personaSourceDocuments)\n .where(\n and(\n eq(personaSourceDocuments.organizationId, input.organizationId),\n eq(personaSourceDocuments.personaId, persona.id),\n eq(personaSourceDocuments.id, input.sourceDocumentId),\n eq(personaSourceDocuments.state, \"active\")\n )\n )\n .limit(1);\n if (!sourceDocument) {\n throw new Error(\n `Persona source document ${input.sourceDocumentId} was not found.`\n );\n }\n\n const chunks = await db\n .select({ id: personaSourceChunks.id })\n .from(personaSourceChunks)\n .where(eq(personaSourceChunks.sourceDocumentId, input.sourceDocumentId));\n const knownChunkIds = new Set(chunks.map((chunk) => chunk.id));\n const draftBeliefs = input.draft.beliefs ?? [];\n const draftFacts = input.draft.sourceFacts ?? [];\n\n for (const episode of input.draft.episodes ?? []) {\n assertSourceChunkRefs({\n knownChunkIds,\n sourceChunkIds: episode.sourceChunkIds,\n });\n }\n for (const belief of draftBeliefs) {\n assertSourceChunkRefs({\n knownChunkIds,\n sourceChunkIds: belief.sourceChunkIds,\n });\n }\n for (const fact of draftFacts) {\n assertSourceChunkRefs({\n knownChunkIds,\n sourceChunkIds: fact.sourceChunkIds,\n });\n }\n for (const habit of input.draft.habits ?? []) {\n assertSourceChunkRefs({\n knownChunkIds,\n sourceChunkIds: habit.sourceChunkIds,\n });\n }\n for (const style of input.draft.styleProfiles ?? []) {\n assertSourceChunkRefs({\n knownChunkIds,\n sourceChunkIds: style.sourceChunkIds,\n });\n }\n\n const privacyLevel = sourceDocument.privacyLevel;\n const [episodes, beliefs, facts, habits, styleProfiles] = await Promise.all([\n input.draft.episodes && input.draft.episodes.length > 0\n ? db\n .insert(personaEpisodeMemories)\n .values(\n input.draft.episodes.map(\n (episode) =>\n ({\n confidence: clampScore(episode.confidence),\n eventSummary: episode.eventSummary,\n firstPersonRecollection:\n episode.firstPersonRecollection ?? null,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: episode.privacyLevel ?? privacyLevel,\n sourceRefs: sourceRefsForDraft({\n quoteSpan: episode.quoteSpan,\n sourceChunkIds: episode.sourceChunkIds,\n sourceDocumentId: input.sourceDocumentId,\n }),\n state: \"draft\",\n themes: episode.themes ?? [],\n thoughtAnnotations: episode.thoughtAnnotations ?? [],\n time: episode.time ?? {},\n title: episode.title,\n }) satisfies NewPersonaEpisodeMemory\n )\n )\n .returning()\n : Promise.resolve([] as PersonaEpisodeMemory[]),\n draftBeliefs.length > 0\n ? db\n .insert(personaSemanticBeliefs)\n .values(\n draftBeliefs.map(\n (belief) =>\n ({\n beliefType: belief.beliefType,\n confidence: clampScore(belief.confidence),\n domain: belief.domain,\n exceptions: belief.exceptions ?? [],\n firstPersonForm: belief.firstPersonForm ?? null,\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: belief.privacyLevel ?? privacyLevel,\n proposition: belief.proposition,\n stance: belief.stance ?? \"support\",\n state: \"draft\",\n strength: clampScore(belief.strength ?? belief.confidence),\n supportingSourceIds: sourceIdsForDraft({\n sourceChunkIds: belief.sourceChunkIds,\n sourceDocumentId: input.sourceDocumentId,\n }),\n }) satisfies NewPersonaSemanticBelief\n )\n )\n .returning()\n : Promise.resolve([] as PersonaSemanticBelief[]),\n draftFacts.length > 0\n ? db\n .insert(personaFacts)\n .values(\n draftFacts.map((fact) => {\n const claimText = claimTextForDraftFact(fact);\n const objectName = objectNameForDraftFact(fact, claimText);\n const sourceChunkId = fact.sourceChunkIds?.[0] ?? null;\n return {\n claimText,\n confidence: clampScore(fact.confidence),\n evidenceSpan: fact.evidenceSpan ?? null,\n factType: fact.factType ?? \"other\",\n firstPersonForm: fact.firstPersonForm ?? null,\n objectKey:\n fact.objectKey?.trim() ||\n normalizePersonaFactObjectKey(objectName),\n objectName,\n objectType: fact.objectType ?? \"text\",\n organizationId: input.organizationId,\n personaId: persona.id,\n privacyLevel: fact.privacyLevel ?? privacyLevel,\n sourceChunkId,\n sourceDocumentId: input.sourceDocumentId,\n sourceRefs: sourceRefsForDraft({\n quoteSpan: fact.evidenceSpan,\n sourceChunkIds: fact.sourceChunkIds,\n sourceDocumentId: input.sourceDocumentId,\n }),\n state: \"draft\",\n } satisfies NewPersonaFact;\n })\n )\n .returning()\n : Promise.resolve([] as PersonaFact[]),\n input.draft.habits && input.draft.habits.length > 0\n ? db\n .insert(personaHabitPatterns)\n .values(\n input.draft.habits.map(\n (habit) =>\n ({\n avoidPatterns: habit.avoidPatterns ?? [],\n confidence: clampScore(habit.confidence),\n defaultResponsePattern: habit.defaultResponsePattern,\n organizationId: input.organizationId,\n personaId: persona.id,\n rhetoricalMoves: habit.rhetoricalMoves ?? [],\n state: \"draft\",\n strength: clampScore(habit.strength ?? habit.confidence),\n supportingExampleIds: sourceIdsForDraft({\n sourceChunkIds: habit.sourceChunkIds,\n sourceDocumentId: input.sourceDocumentId,\n }),\n tone: habit.tone ?? {},\n trigger: habit.trigger,\n }) satisfies NewPersonaHabitPattern\n )\n )\n .returning()\n : Promise.resolve([] as PersonaHabitPattern[]),\n input.draft.styleProfiles && input.draft.styleProfiles.length > 0\n ? db\n .insert(personaStyleProfiles)\n .values(\n input.draft.styleProfiles.map(\n (style) =>\n ({\n avoidPhrases: style.avoidPhrases ?? [],\n commonPhrases: style.commonPhrases ?? [],\n lexicalPreferences: style.lexicalPreferences ?? {},\n organizationId: input.organizationId,\n personaId: persona.id,\n preferredRhetoricalMoves:\n style.preferredRhetoricalMoves ?? [],\n register: style.register,\n sentenceLength: style.sentenceLength,\n state: \"draft\",\n toneVector: style.toneVector ?? {},\n }) satisfies NewPersonaStyleProfile\n )\n )\n .returning()\n : Promise.resolve([] as PersonaStyleProfile[]),\n ]);\n\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n ...episodes.map((episode) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: episode.id,\n targetKind: \"episode\" as const,\n text: episodeMemoryText(episode),\n })),\n ...beliefs.map((belief) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: belief.id,\n targetKind: \"belief\" as const,\n text: beliefMemoryText(belief),\n })),\n ...facts.map((fact) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: fact.id,\n targetKind: \"fact\" as const,\n text: factMemoryText(fact),\n })),\n ...habits.map((habit) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: habit.id,\n targetKind: \"habit\" as const,\n text: habitMemoryText(habit),\n })),\n ...styleProfiles.map((style) => ({\n organizationId: input.organizationId,\n personaId: persona.id,\n targetId: style.id,\n targetKind: \"style\" as const,\n text: styleMemoryText(style),\n })),\n ],\n logger: input.logger,\n });\n\n return {\n drafts: [\n ...episodes.map((episode) => ({\n id: episode.id,\n memoryKind: \"episode\" as const,\n state: episode.state,\n title: episode.title,\n })),\n ...beliefs.map((belief) => ({\n id: belief.id,\n memoryKind: \"belief\" as const,\n state: belief.state,\n title: belief.proposition,\n })),\n ...facts.map((fact) => ({\n id: fact.id,\n memoryKind: \"fact\" as const,\n state: fact.state,\n title: fact.claimText,\n })),\n ...habits.map((habit) => ({\n id: habit.id,\n memoryKind: \"habit\" as const,\n state: habit.state,\n title: habit.trigger.description,\n })),\n ...styleProfiles.map((style) => ({\n id: style.id,\n memoryKind: \"style\" as const,\n state: style.state,\n title: `${style.register} ${style.sentenceLength}`.trim(),\n })),\n ],\n sourceDocumentId: input.sourceDocumentId,\n };\n}\n\nexport async function activatePersonaDraftMemory(\n db: Database,\n input: {\n memoryId: string;\n memoryKind: \"episode\" | \"fact\" | \"belief\" | \"habit\" | \"style\";\n organizationId: string;\n personaKey: string;\n }\n): Promise<PersonaDraftMemorySummary | null> {\n const persona = await loadPersonaProfile(db, {\n organizationId: input.organizationId,\n personaKey: input.personaKey,\n });\n const values = { state: \"active\" as const, updatedAt: new Date() };\n\n if (input.memoryKind === \"episode\") {\n const [episode] = await db\n .update(personaEpisodeMemories)\n .set(values)\n .where(\n and(\n eq(personaEpisodeMemories.organizationId, input.organizationId),\n eq(personaEpisodeMemories.personaId, persona.id),\n eq(personaEpisodeMemories.id, input.memoryId),\n eq(personaEpisodeMemories.state, \"draft\")\n )\n )\n .returning();\n return episode\n ? {\n id: episode.id,\n memoryKind: \"episode\",\n state: episode.state,\n title: episode.title,\n }\n : null;\n }\n\n if (input.memoryKind === \"belief\") {\n const [belief] = await db\n .update(personaSemanticBeliefs)\n .set(values)\n .where(\n and(\n eq(personaSemanticBeliefs.organizationId, input.organizationId),\n eq(personaSemanticBeliefs.personaId, persona.id),\n eq(personaSemanticBeliefs.id, input.memoryId),\n eq(personaSemanticBeliefs.state, \"draft\")\n )\n )\n .returning();\n return belief\n ? {\n id: belief.id,\n memoryKind: \"belief\",\n state: belief.state,\n title: belief.proposition,\n }\n : null;\n }\n\n if (input.memoryKind === \"fact\") {\n const [fact] = await db\n .update(personaFacts)\n .set(values)\n .where(\n and(\n eq(personaFacts.organizationId, input.organizationId),\n eq(personaFacts.personaId, persona.id),\n eq(personaFacts.id, input.memoryId),\n eq(personaFacts.state, \"draft\")\n )\n )\n .returning();\n return fact\n ? {\n id: fact.id,\n memoryKind: \"fact\",\n state: fact.state,\n title: fact.claimText,\n }\n : null;\n }\n\n if (input.memoryKind === \"habit\") {\n const [habit] = await db\n .update(personaHabitPatterns)\n .set(values)\n .where(\n and(\n eq(personaHabitPatterns.organizationId, input.organizationId),\n eq(personaHabitPatterns.personaId, persona.id),\n eq(personaHabitPatterns.id, input.memoryId),\n eq(personaHabitPatterns.state, \"draft\")\n )\n )\n .returning();\n return habit\n ? {\n id: habit.id,\n memoryKind: \"habit\",\n state: habit.state,\n title: habit.trigger.description,\n }\n : null;\n }\n\n const [style] = await db\n .update(personaStyleProfiles)\n .set(values)\n .where(\n and(\n eq(personaStyleProfiles.organizationId, input.organizationId),\n eq(personaStyleProfiles.personaId, persona.id),\n eq(personaStyleProfiles.id, input.memoryId),\n eq(personaStyleProfiles.state, \"draft\")\n )\n )\n .returning();\n return style\n ? {\n id: style.id,\n memoryKind: \"style\",\n state: style.state,\n title: `${style.register} ${style.sentenceLength}`.trim(),\n }\n : null;\n}\n\nexport async function createPersonaSourceDocument(\n db: Database,\n input: {\n authorUserId?: string | null;\n embed?: PersonaEmbedder;\n logger?: PersonaLogger;\n organizationId: string;\n persona: PersonaProfile;\n privacyLevel: PersonaPrivacyLevel;\n rawText: string;\n sourceType: PersonaSourceDocument[\"sourceType\"];\n title: string;\n }\n): Promise<PersonaSourceDocument> {\n const sourceValues = {\n author: input.authorUserId ?? null,\n consentStatus: input.persona.consentStatus,\n contentHash: `manual:${ulid()}`,\n metadata: { medium: \"text\" },\n organizationId: input.organizationId,\n personaId: input.persona.id,\n privacyLevel: input.privacyLevel,\n reliability: 0.85,\n rightsStatus: \"owned\",\n sourcePriority: \"synthetic\",\n sourceType: input.sourceType,\n sourceUri: `persona://${input.persona.personaKey}/${Date.now()}`,\n title: input.title,\n } satisfies NewPersonaSourceDocument;\n const [source] = await db\n .insert(personaSourceDocuments)\n .values(sourceValues)\n .returning();\n if (!source) {\n throw new Error(\"Failed to create persona source document.\");\n }\n const [chunk] = await db\n .insert(personaSourceChunks)\n .values({\n endChar: input.rawText.length,\n organizationId: input.organizationId,\n personaId: input.persona.id,\n sourceDocumentId: source.id,\n startChar: 0,\n text: input.rawText,\n })\n .returning();\n if (chunk) {\n await tryUpsertPersonaMemoryEmbeddings(db, {\n embed: input.embed,\n entries: [\n {\n organizationId: input.organizationId,\n personaId: input.persona.id,\n targetId: chunk.id,\n targetKind: \"source_chunk\",\n text: chunk.text,\n },\n ],\n logger: input.logger,\n });\n }\n return source;\n}\n","import { and, eq, ne } from \"drizzle-orm\";\n\nimport type { PersonaDatabase as Database } from \"../db\";\nimport {\n personaAliases,\n personaEmotionalSalience,\n personaEpisodeMemories,\n personaExternalMemoryRefs,\n personaFacts,\n personaHabitPatterns,\n personaInteractionMemories,\n personaMemoryEmbeddings,\n personaMoodStates,\n personaProfiles,\n personaSemanticBeliefs,\n personaSourceChunks,\n personaSourceDocuments,\n personaStyleProfiles,\n personaWorkspaceStates,\n} from \"../schema\";\nimport type { PersonaProfile } from \"../schema\";\n\nexport type PersonaProfileDeleteCounts = {\n aliases: number;\n beliefs: number;\n embeddings: number;\n emotionalSalience: number;\n episodes: number;\n externalMemoryRefs: number;\n facts: number;\n habits: number;\n interactionMemories: number;\n moodStates: number;\n sourceChunks: number;\n sourceDocuments: number;\n styleProfiles: number;\n workspaceStates: number;\n};\n\nexport async function deletePersonaProfile(\n db: Database,\n input: {\n organizationId: string;\n personaKey: string;\n updatedByUserId?: string | null;\n }\n): Promise<{\n deletedCounts: PersonaProfileDeleteCounts;\n profile: PersonaProfile;\n}> {\n const personaKey = input.personaKey.trim();\n if (!/^[a-z][a-z0-9._-]{0,79}$/.test(personaKey)) {\n throw new Error(\n \"personaKey must start with a lowercase letter and only contain lowercase letters, numbers, dots, underscores, or dashes.\"\n );\n }\n\n return db.transaction(async (tx) => {\n const [persona] = await tx\n .select()\n .from(personaProfiles)\n .where(\n and(\n eq(personaProfiles.organizationId, input.organizationId),\n eq(personaProfiles.personaKey, personaKey),\n eq(personaProfiles.state, \"active\")\n )\n )\n .limit(1);\n if (!persona) {\n throw new Error(\n `Persona ${personaKey} is not configured for this organization.`\n );\n }\n\n const now = new Date();\n const updatedByUserId = input.updatedByUserId ?? null;\n const aliases = (\n await tx\n .update(personaAliases)\n .set({ state: \"deleted\", updatedAt: now, updatedByUserId })\n .where(\n and(\n eq(personaAliases.organizationId, input.organizationId),\n eq(personaAliases.personaId, persona.id),\n ne(personaAliases.state, \"deleted\")\n )\n )\n .returning({ id: personaAliases.id })\n ).length;\n const embeddings = (\n await tx\n .delete(personaMemoryEmbeddings)\n .where(eq(personaMemoryEmbeddings.personaId, persona.id))\n .returning({ id: personaMemoryEmbeddings.id })\n ).length;\n const emotionalSalience = (\n await tx\n .delete(personaEmotionalSalience)\n .where(eq(personaEmotionalSalience.personaId, persona.id))\n .returning({ id: personaEmotionalSalience.id })\n ).length;\n const interactionMemories = (\n await tx\n .delete(personaInteractionMemories)\n .where(eq(personaInteractionMemories.personaId, persona.id))\n .returning({ id: personaInteractionMemories.id })\n ).length;\n const moodStates = (\n await tx\n .delete(personaMoodStates)\n .where(eq(personaMoodStates.personaId, persona.id))\n .returning({ id: personaMoodStates.id })\n ).length;\n const workspaceStates = (\n await tx\n .delete(personaWorkspaceStates)\n .where(eq(personaWorkspaceStates.personaId, persona.id))\n .returning({ id: personaWorkspaceStates.id })\n ).length;\n const externalMemoryRefs = (\n await tx\n .update(personaExternalMemoryRefs)\n .set({ state: \"deleted\", updatedAt: now })\n .where(\n and(\n eq(personaExternalMemoryRefs.personaId, persona.id),\n ne(personaExternalMemoryRefs.state, \"deleted\")\n )\n )\n .returning({ id: personaExternalMemoryRefs.id })\n ).length;\n const episodes = (\n await tx\n .delete(personaEpisodeMemories)\n .where(eq(personaEpisodeMemories.personaId, persona.id))\n .returning({ id: personaEpisodeMemories.id })\n ).length;\n const beliefs = (\n await tx\n .delete(personaSemanticBeliefs)\n .where(eq(personaSemanticBeliefs.personaId, persona.id))\n .returning({ id: personaSemanticBeliefs.id })\n ).length;\n const facts = (\n await tx\n .delete(personaFacts)\n .where(eq(personaFacts.personaId, persona.id))\n .returning({ id: personaFacts.id })\n ).length;\n const habits = (\n await tx\n .delete(personaHabitPatterns)\n .where(eq(personaHabitPatterns.personaId, persona.id))\n .returning({ id: personaHabitPatterns.id })\n ).length;\n const styleProfiles = (\n await tx\n .delete(personaStyleProfiles)\n .where(eq(personaStyleProfiles.personaId, persona.id))\n .returning({ id: personaStyleProfiles.id })\n ).length;\n const sourceChunks = (\n await tx\n .delete(personaSourceChunks)\n .where(eq(personaSourceChunks.personaId, persona.id))\n .returning({ id: personaSourceChunks.id })\n ).length;\n const sourceDocuments = (\n await tx\n .delete(personaSourceDocuments)\n .where(eq(personaSourceDocuments.personaId, persona.id))\n .returning({ id: personaSourceDocuments.id })\n ).length;\n const [deletedProfile] = await tx\n .update(personaProfiles)\n .set({ state: \"deleted\", updatedAt: now, updatedByUserId })\n .where(eq(personaProfiles.id, persona.id))\n .returning();\n if (!deletedProfile) {\n throw new Error(`Failed to delete persona ${personaKey}.`);\n }\n\n return {\n deletedCounts: {\n aliases,\n beliefs,\n embeddings,\n emotionalSalience,\n episodes,\n externalMemoryRefs,\n facts,\n habits,\n interactionMemories,\n moodStates,\n sourceChunks,\n sourceDocuments,\n styleProfiles,\n workspaceStates,\n },\n profile: deletedProfile,\n };\n });\n}\n"],"mappings":"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","names":["and","asc","desc","eq","or","and","eq","z","z","and","eq","and","eq","inArray","isNull","sql","and","eq","sql","inArray","deleted","cloned","isNull","and","eq","inArray","sql","and","eq","sql","sql","eq","and","sql","and","eq","inArray","and","eq","ne","and","eq","ne","and","eq","asc","desc","next","or"]}