ava-langgraph-narrative-intelligence 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.
Files changed (58) hide show
  1. package/README.md +268 -0
  2. package/dist/graphs/index.cjs +1511 -0
  3. package/dist/graphs/index.cjs.map +1 -0
  4. package/dist/graphs/index.d.cts +2 -0
  5. package/dist/graphs/index.d.ts +2 -0
  6. package/dist/graphs/index.js +1468 -0
  7. package/dist/graphs/index.js.map +1 -0
  8. package/dist/index-Btxk3nQm.d.cts +430 -0
  9. package/dist/index-CgXXxuIH.d.ts +430 -0
  10. package/dist/index-CweT-D3c.d.cts +122 -0
  11. package/dist/index-D-zWH42e.d.cts +66 -0
  12. package/dist/index-D71kh3nE.d.cts +213 -0
  13. package/dist/index-DApls3w2.d.ts +66 -0
  14. package/dist/index-UamXITgg.d.ts +122 -0
  15. package/dist/index-v9AlRC0M.d.ts +213 -0
  16. package/dist/index.cjs +2753 -0
  17. package/dist/index.cjs.map +1 -0
  18. package/dist/index.d.cts +6 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.js +2654 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/integrations/index.cjs +654 -0
  23. package/dist/integrations/index.cjs.map +1 -0
  24. package/dist/integrations/index.d.cts +2 -0
  25. package/dist/integrations/index.d.ts +2 -0
  26. package/dist/integrations/index.js +614 -0
  27. package/dist/integrations/index.js.map +1 -0
  28. package/dist/ncp-tXS9Jr9e.d.cts +132 -0
  29. package/dist/ncp-tXS9Jr9e.d.ts +132 -0
  30. package/dist/nodes/index.cjs +226 -0
  31. package/dist/nodes/index.cjs.map +1 -0
  32. package/dist/nodes/index.d.cts +2 -0
  33. package/dist/nodes/index.d.ts +2 -0
  34. package/dist/nodes/index.js +196 -0
  35. package/dist/nodes/index.js.map +1 -0
  36. package/dist/schemas/index.cjs +550 -0
  37. package/dist/schemas/index.cjs.map +1 -0
  38. package/dist/schemas/index.d.cts +2 -0
  39. package/dist/schemas/index.d.ts +2 -0
  40. package/dist/schemas/index.js +484 -0
  41. package/dist/schemas/index.js.map +1 -0
  42. package/dist/unified_state_bridge-CIDm1kuf.d.cts +266 -0
  43. package/dist/unified_state_bridge-CIDm1kuf.d.ts +266 -0
  44. package/package.json +91 -0
  45. package/src/graphs/coherence_engine.ts +1027 -0
  46. package/src/graphs/index.ts +47 -0
  47. package/src/graphs/three_universe_processor.ts +1136 -0
  48. package/src/index.ts +181 -0
  49. package/src/integrations/index.ts +17 -0
  50. package/src/integrations/redis_state.ts +691 -0
  51. package/src/nodes/emotional_classifier.ts +289 -0
  52. package/src/nodes/index.ts +17 -0
  53. package/src/schemas/index.ts +75 -0
  54. package/src/schemas/ncp.ts +312 -0
  55. package/src/schemas/unified_state_bridge.ts +681 -0
  56. package/src/tests/coherence_engine.test.ts +273 -0
  57. package/src/tests/three_universe_processor.test.ts +309 -0
  58. package/src/tests/unified_state_bridge.test.ts +360 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/unified_state_bridge.ts","../src/schemas/ncp.ts","../src/graphs/three_universe_processor.ts","../src/graphs/coherence_engine.ts","../src/nodes/emotional_classifier.ts","../src/integrations/redis_state.ts","../src/schemas/index.ts","../src/graphs/index.ts","../src/nodes/index.ts","../src/integrations/index.ts"],"sourcesContent":["/**\n * @ava/narrative-intelligence\n *\n * Narrative Intelligence Toolkit for JavaScript/TypeScript\n *\n * This package provides the core narrative intelligence components:\n * - Three-Universe Processing (Engineer/Ceremony/Story Engine perspectives)\n * - Narrative Coherence Analysis\n * - Story Beat Classification\n * - State Management with Redis\n *\n * Port of the Python narrative-intelligence package with full feature parity.\n *\n * @example\n * import {\n * ThreeUniverseProcessor,\n * NarrativeCoherenceEngine,\n * createUnifiedNarrativeState,\n * } from \"@ava/narrative-intelligence\";\n *\n * // Process an event through three universes\n * const processor = new ThreeUniverseProcessor();\n * const analysis = processor.process({ content: \"Add new feature\" }, \"github.push\");\n * console.log(`Lead universe: ${analysis.leadUniverse}`);\n *\n * // Analyze narrative coherence\n * const engine = new NarrativeCoherenceEngine();\n * const result = engine.analyze(beats, characters, themes);\n * console.log(`Overall coherence: ${result.coherenceScore.overall}`);\n */\n\n// ============================================================================\n// Schemas - Core Data Types\n// ============================================================================\n\nexport {\n // Enums\n Universe,\n NarrativePhase,\n NarrativeFunction,\n // Interfaces\n UniversePerspective,\n ThreeUniverseAnalysis,\n NarrativePosition,\n StoryBeat,\n CharacterState,\n ThematicThread,\n RoutingDecision,\n UnifiedNarrativeState,\n // Factory functions\n createUniversePerspective,\n createThreeUniverseAnalysis,\n getPerspective,\n createNarrativePosition,\n createStoryBeat,\n createCharacterState,\n createThematicThread,\n createRoutingDecision,\n createUnifiedNarrativeState,\n // State manipulation\n addBeat,\n addRoutingDecision,\n updateCharacterArc,\n updateThemeStrength,\n getLastNBeats,\n calculateCoherence,\n shouldCreateNewEpisode,\n startNewEpisode,\n // Defaults\n getDefaultCharacters,\n getDefaultThemes,\n // Utilities\n createBeatFromWebhook,\n RedisKeys,\n serializeState,\n deserializeState,\n} from \"./schemas/unified_state_bridge.js\";\n\nexport {\n // NCP types\n Moment,\n StoryPoint,\n NCPStoryBeat,\n Player,\n Perspective,\n NCPData,\n // Factory functions\n createMoment,\n createStoryPoint,\n createNCPStoryBeat,\n createPlayer,\n createPerspective,\n createNCPData,\n // Query functions\n getPlayer,\n getPerspectiveById,\n getStorybeat,\n getStorypoint,\n getPlayerStorybeats,\n getStorybeatsByEmotionalWeight,\n // Serialization\n parseNCPData,\n serializeNCPData,\n} from \"./schemas/ncp.js\";\n\n// ============================================================================\n// Graphs - Processing Pipelines\n// ============================================================================\n\nexport {\n // Three Universe Processor\n EventType,\n ProcessedEvent,\n ThreeUniverseState,\n AnalysisCallback,\n engineerIntentKeywords,\n ceremonyIntentKeywords,\n storyEngineIntentKeywords,\n analyzeEngineerPerspective,\n analyzeCeremonyPerspective,\n analyzeStoryEnginePerspective,\n synthesizePerspectives,\n ThreeUniverseProcessor,\n} from \"./graphs/three_universe_processor.js\";\n\nexport {\n // Coherence Engine\n GapType,\n GapSeverity,\n RoutingTarget,\n ComponentStatus,\n Gap,\n ComponentScore,\n CoherenceScore,\n TrinityAssessment,\n CoherenceEngineState,\n CoherenceResult,\n createGap,\n createComponentScore,\n createCoherenceScore,\n createTrinityAssessment,\n NarrativeCoherenceEngine,\n} from \"./graphs/coherence_engine.js\";\n\n// ============================================================================\n// Nodes - Individual Processing Steps\n// ============================================================================\n\nexport {\n // Emotional Classifier\n EmotionalTone,\n ClassificationResult,\n EmotionalClassificationState,\n TONE_KEYWORDS,\n EmotionalBeatClassifierNode,\n classifyEmotionalTone,\n} from \"./nodes/emotional_classifier.js\";\n\n// ============================================================================\n// Integrations - External System Connections\n// ============================================================================\n\nexport {\n // Redis State Manager\n RedisConfig,\n RedisClient,\n HealthCheckResult,\n createRedisConfig,\n NarrativeRedisManager,\n MockRedis,\n getNarrativeManager,\n} from \"./integrations/redis_state.js\";\n\n// ============================================================================\n// Namespace Exports for Organized Access\n// ============================================================================\n\nexport * as schemas from \"./schemas/index.js\";\nexport * as graphs from \"./graphs/index.js\";\nexport * as nodes from \"./nodes/index.js\";\nexport * as integrations from \"./integrations/index.js\";\n","/**\n * Unified Narrative State Bridge\n *\n * The shared contract between all six systems in the Narrative Intelligence Stack:\n * 1. LangGraph Narrative Intelligence Toolkit\n * 2. ava-langflow Universal Router\n * 3. ava-Flowise Agent Coordination\n * 4. LangChain/Langfuse Tracing\n * 5. Storytelling System\n * 6. Miadi-46 Event-Driven Platform\n */\n\n/**\n * The three interpretive universes from multiverse_3act\n */\nexport enum Universe {\n ENGINEER = \"engineer\", // Mia - The Builder\n CEREMONY = \"ceremony\", // Ava8 - The Keeper\n STORY_ENGINE = \"story_engine\", // Miette - The Weaver\n}\n\n/**\n * Single universe's interpretation of an event\n */\nexport interface UniversePerspective {\n universe: Universe;\n intent: string;\n confidence: number;\n suggestedFlows: string[];\n context: Record<string, unknown>;\n}\n\n/**\n * Create a UniversePerspective\n */\nexport function createUniversePerspective(\n universe: Universe,\n intent: string,\n confidence: number,\n options: Partial<UniversePerspective> = {}\n): UniversePerspective {\n return {\n universe,\n intent,\n confidence,\n suggestedFlows: options.suggestedFlows ?? [],\n context: options.context ?? {},\n };\n}\n\n/**\n * Complete three-universe analysis of an event\n */\nexport interface ThreeUniverseAnalysis {\n engineer: UniversePerspective;\n ceremony: UniversePerspective;\n storyEngine: UniversePerspective;\n leadUniverse: Universe;\n coherenceScore: number;\n timestamp: string;\n}\n\n/**\n * Create a ThreeUniverseAnalysis\n */\nexport function createThreeUniverseAnalysis(\n engineer: UniversePerspective,\n ceremony: UniversePerspective,\n storyEngine: UniversePerspective,\n leadUniverse: Universe,\n coherenceScore: number\n): ThreeUniverseAnalysis {\n return {\n engineer,\n ceremony,\n storyEngine,\n leadUniverse,\n coherenceScore,\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Get perspective for a specific universe\n */\nexport function getPerspective(\n analysis: ThreeUniverseAnalysis,\n universe: Universe\n): UniversePerspective {\n switch (universe) {\n case Universe.ENGINEER:\n return analysis.engineer;\n case Universe.CEREMONY:\n return analysis.ceremony;\n case Universe.STORY_ENGINE:\n return analysis.storyEngine;\n }\n}\n\n/**\n * Phases in the three-act structure\n */\nexport enum NarrativePhase {\n SETUP = \"setup\", // Act 1\n CONFRONTATION = \"confrontation\", // Act 2\n RESOLUTION = \"resolution\", // Act 3\n}\n\n/**\n * Narrative functions for story beats\n */\nexport enum NarrativeFunction {\n INCITING_INCIDENT = \"inciting_incident\",\n RISING_ACTION = \"rising_action\",\n TURNING_POINT = \"turning_point\",\n COMPLICATION = \"complication\",\n CRISIS = \"crisis\",\n CLIMAX = \"climax\",\n RESOLUTION = \"resolution\",\n DENOUEMENT = \"denouement\",\n BEAT = \"beat\", // Generic beat\n}\n\n/**\n * Current position in the narrative journey\n */\nexport interface NarrativePosition {\n act: number;\n phase: NarrativePhase;\n currentBeatId?: string;\n beatCount: number;\n characterArcStrength: number;\n thematicResonance: number;\n emotionalTone: string;\n leadUniverse: Universe;\n}\n\n/**\n * Create a NarrativePosition with defaults\n */\nexport function createNarrativePosition(\n options: Partial<NarrativePosition> = {}\n): NarrativePosition {\n return {\n act: options.act ?? 1,\n phase: options.phase ?? NarrativePhase.SETUP,\n currentBeatId: options.currentBeatId,\n beatCount: options.beatCount ?? 0,\n characterArcStrength: options.characterArcStrength ?? 0.5,\n thematicResonance: options.thematicResonance ?? 0.5,\n emotionalTone: options.emotionalTone ?? \"neutral\",\n leadUniverse: options.leadUniverse ?? Universe.STORY_ENGINE,\n };\n}\n\n/**\n * A single story beat with three-universe perspectives\n */\nexport interface StoryBeat {\n id: string;\n sequence: number;\n content: string;\n narrativeFunction: NarrativeFunction;\n act: number;\n\n // Three-universe analysis\n universeAnalysis?: ThreeUniverseAnalysis;\n leadUniverse: Universe;\n\n // Emotional/thematic data\n emotionalTone: string;\n thematicTags: string[];\n\n // Character data\n characterId?: string;\n characterArcImpact: number;\n\n // Metadata\n source: string;\n sourceEventId?: string;\n timestamp: string;\n\n // Enrichment tracking\n enrichmentsApplied: string[];\n qualityScore: number;\n}\n\n/**\n * Create a StoryBeat with defaults\n */\nexport function createStoryBeat(\n id: string,\n sequence: number,\n content: string,\n narrativeFunction: NarrativeFunction,\n act: number,\n options: Partial<StoryBeat> = {}\n): StoryBeat {\n return {\n id,\n sequence,\n content,\n narrativeFunction,\n act,\n universeAnalysis: options.universeAnalysis,\n leadUniverse: options.leadUniverse ?? Universe.STORY_ENGINE,\n emotionalTone: options.emotionalTone ?? \"neutral\",\n thematicTags: options.thematicTags ?? [],\n characterId: options.characterId,\n characterArcImpact: options.characterArcImpact ?? 0.0,\n source: options.source ?? \"generator\",\n sourceEventId: options.sourceEventId,\n timestamp: options.timestamp ?? new Date().toISOString(),\n enrichmentsApplied: options.enrichmentsApplied ?? [],\n qualityScore: options.qualityScore ?? 0.5,\n };\n}\n\n/**\n * Character state tracking for arc continuity\n */\nexport interface CharacterState {\n id: string;\n name: string;\n archetype: string;\n universe: Universe;\n\n // Arc tracking\n arcPosition: number;\n initialState: string;\n currentState: string;\n growthPoints: Array<{\n timestamp: string;\n impact: number;\n description: string;\n }>;\n\n // Relationships\n relationships: string[];\n}\n\n/**\n * Create a CharacterState with defaults\n */\nexport function createCharacterState(\n id: string,\n name: string,\n archetype: string,\n universe: Universe,\n options: Partial<CharacterState> = {}\n): CharacterState {\n return {\n id,\n name,\n archetype,\n universe,\n arcPosition: options.arcPosition ?? 0.0,\n initialState: options.initialState ?? \"\",\n currentState: options.currentState ?? \"\",\n growthPoints: options.growthPoints ?? [],\n relationships: options.relationships ?? [],\n };\n}\n\n/**\n * A thematic thread being tracked across the narrative\n */\nexport interface ThematicThread {\n id: string;\n name: string;\n description: string;\n\n // Tracking\n strength: number;\n tensionLevel: number;\n resolutionProgress: number;\n\n // Related beats\n beatIds: string[];\n}\n\n/**\n * Create a ThematicThread with defaults\n */\nexport function createThematicThread(\n id: string,\n name: string,\n description: string,\n options: Partial<ThematicThread> = {}\n): ThematicThread {\n return {\n id,\n name,\n description,\n strength: options.strength ?? 0.5,\n tensionLevel: options.tensionLevel ?? 0.5,\n resolutionProgress: options.resolutionProgress ?? 0.0,\n beatIds: options.beatIds ?? [],\n };\n}\n\n/**\n * Record of a routing decision for tracing\n */\nexport interface RoutingDecision {\n id: string;\n backend: string;\n flow: string;\n universeAnalysis: ThreeUniverseAnalysis;\n narrativePosition: NarrativePosition;\n\n // Decision factors\n score: number;\n method: string;\n\n // Results\n success: boolean;\n resultSummary: string;\n latencyMs: number;\n\n timestamp: string;\n}\n\n/**\n * Create a RoutingDecision\n */\nexport function createRoutingDecision(\n id: string,\n backend: string,\n flow: string,\n universeAnalysis: ThreeUniverseAnalysis,\n narrativePosition: NarrativePosition,\n score: number,\n options: Partial<RoutingDecision> = {}\n): RoutingDecision {\n return {\n id,\n backend,\n flow,\n universeAnalysis,\n narrativePosition,\n score,\n method: options.method ?? \"narrative\",\n success: options.success ?? true,\n resultSummary: options.resultSummary ?? \"\",\n latencyMs: options.latencyMs ?? 0.0,\n timestamp: options.timestamp ?? new Date().toISOString(),\n };\n}\n\n/**\n * The complete unified state shared across all systems.\n * This is THE contract that all six systems use to communicate.\n */\nexport interface UnifiedNarrativeState {\n // Identity\n storyId: string;\n sessionId: string;\n\n // Narrative position\n position: NarrativePosition;\n\n // Story content\n beats: StoryBeat[];\n\n // Character tracking\n characters: Record<string, CharacterState>;\n\n // Theme tracking\n themes: Record<string, ThematicThread>;\n\n // Routing history\n routingDecisions: RoutingDecision[];\n\n // Episode tracking\n currentEpisodeId?: string;\n episodeBeatsCount: number;\n\n // Timestamps\n createdAt: string;\n updatedAt: string;\n\n // Metrics\n overallCoherence: number;\n emotionalArcStrength: number;\n}\n\n/**\n * Create a new UnifiedNarrativeState\n */\nexport function createUnifiedNarrativeState(\n storyId: string,\n sessionId: string,\n options: {\n includeDefaultCharacters?: boolean;\n includeDefaultThemes?: boolean;\n } = {}\n): UnifiedNarrativeState {\n const state: UnifiedNarrativeState = {\n storyId,\n sessionId,\n position: createNarrativePosition(),\n beats: [],\n characters: {},\n themes: {},\n routingDecisions: [],\n episodeBeatsCount: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n overallCoherence: 0.5,\n emotionalArcStrength: 0.5,\n };\n\n if (options.includeDefaultCharacters !== false) {\n state.characters = getDefaultCharacters();\n }\n\n if (options.includeDefaultThemes !== false) {\n state.themes = getDefaultThemes();\n }\n\n return state;\n}\n\n/**\n * Add a beat to the state\n */\nexport function addBeat(state: UnifiedNarrativeState, beat: StoryBeat): void {\n state.beats.push(beat);\n state.position.beatCount = state.beats.length;\n state.position.currentBeatId = beat.id;\n state.position.leadUniverse = beat.leadUniverse;\n\n // Update act based on narrative function\n if (beat.narrativeFunction === NarrativeFunction.INCITING_INCIDENT) {\n state.position.act = 1;\n state.position.phase = NarrativePhase.SETUP;\n } else if (\n beat.narrativeFunction === NarrativeFunction.TURNING_POINT ||\n beat.narrativeFunction === NarrativeFunction.CRISIS\n ) {\n state.position.act = 2;\n state.position.phase = NarrativePhase.CONFRONTATION;\n } else if (\n beat.narrativeFunction === NarrativeFunction.CLIMAX ||\n beat.narrativeFunction === NarrativeFunction.RESOLUTION\n ) {\n state.position.act = 3;\n state.position.phase = NarrativePhase.RESOLUTION;\n }\n\n state.episodeBeatsCount += 1;\n state.updatedAt = new Date().toISOString();\n}\n\n/**\n * Add a routing decision to the state\n */\nexport function addRoutingDecision(\n state: UnifiedNarrativeState,\n decision: RoutingDecision\n): void {\n state.routingDecisions.push(decision);\n state.updatedAt = new Date().toISOString();\n}\n\n/**\n * Update character arc position\n */\nexport function updateCharacterArc(\n state: UnifiedNarrativeState,\n characterId: string,\n impact: number,\n description: string\n): void {\n const character = state.characters[characterId];\n if (character) {\n character.arcPosition = Math.min(1.0, character.arcPosition + impact);\n character.growthPoints.push({\n timestamp: new Date().toISOString(),\n impact,\n description,\n });\n state.updatedAt = new Date().toISOString();\n }\n}\n\n/**\n * Update theme strength\n */\nexport function updateThemeStrength(\n state: UnifiedNarrativeState,\n themeId: string,\n strengthDelta: number\n): void {\n const theme = state.themes[themeId];\n if (theme) {\n theme.strength = Math.max(0.0, Math.min(1.0, theme.strength + strengthDelta));\n state.updatedAt = new Date().toISOString();\n }\n}\n\n/**\n * Get the last n beats for context\n */\nexport function getLastNBeats(\n state: UnifiedNarrativeState,\n n: number = 5\n): StoryBeat[] {\n return state.beats.slice(-n);\n}\n\n/**\n * Calculate overall narrative coherence\n */\nexport function calculateCoherence(state: UnifiedNarrativeState): number {\n if (state.routingDecisions.length === 0) {\n return 0.5;\n }\n\n const recentDecisions = state.routingDecisions.slice(-20);\n const coherences = recentDecisions.map((rd) => rd.universeAnalysis.coherenceScore);\n state.overallCoherence =\n coherences.reduce((a, b) => a + b, 0) / coherences.length;\n\n return state.overallCoherence;\n}\n\n/**\n * Check if we should create a new episode\n */\nexport function shouldCreateNewEpisode(state: UnifiedNarrativeState): boolean {\n if (state.episodeBeatsCount >= 12) {\n return true;\n }\n if (\n state.beats.length > 0 &&\n state.beats[state.beats.length - 1].narrativeFunction ===\n NarrativeFunction.RESOLUTION\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Start a new episode\n */\nexport function startNewEpisode(\n state: UnifiedNarrativeState,\n episodeId: string\n): void {\n state.currentEpisodeId = episodeId;\n state.episodeBeatsCount = 0;\n state.updatedAt = new Date().toISOString();\n}\n\n/**\n * Get the three main archetypes from multiverse_3act\n */\nexport function getDefaultCharacters(): Record<string, CharacterState> {\n return {\n \"the-builder\": createCharacterState(\n \"the-builder\",\n \"Mia\",\n \"The Builder\",\n Universe.ENGINEER,\n {\n initialState: \"Analytical, focused on structural integrity\",\n currentState: \"Analytical, focused on structural integrity\",\n }\n ),\n \"the-keeper\": createCharacterState(\n \"the-keeper\",\n \"Ava8\",\n \"The Keeper\",\n Universe.CEREMONY,\n {\n initialState: \"Reverent, guardian of relational protocols\",\n currentState: \"Reverent, guardian of relational protocols\",\n }\n ),\n \"the-weaver\": createCharacterState(\n \"the-weaver\",\n \"Miette\",\n \"The Weaver\",\n Universe.STORY_ENGINE,\n {\n initialState: \"Playful, sees narrative patterns in chaos\",\n currentState: \"Playful, sees narrative patterns in chaos\",\n }\n ),\n };\n}\n\n/**\n * Get default thematic threads from multiverse_3act\n */\nexport function getDefaultThemes(): Record<string, ThematicThread> {\n return {\n integration: createThematicThread(\n \"integration\",\n \"Integration Without Extraction\",\n \"The tension between connecting systems and respecting their autonomy\"\n ),\n collaboration: createThematicThread(\n \"collaboration\",\n \"Cross-Universe Collaboration\",\n \"Three perspectives learning to work together while maintaining distinction\"\n ),\n coherence: createThematicThread(\n \"coherence\",\n \"Narrative Coherence\",\n \"The gap between disconnected events and meaningful story\"\n ),\n };\n}\n\n/**\n * Create a story beat from a webhook event\n */\nexport function createBeatFromWebhook(\n eventId: string,\n content: string,\n universeAnalysis: ThreeUniverseAnalysis,\n sequence: number\n): StoryBeat {\n const storyEngineContext = universeAnalysis.storyEngine.context;\n const act = (storyEngineContext.act as number) || 2;\n\n let narrativeFunction: NarrativeFunction;\n try {\n narrativeFunction =\n NarrativeFunction[\n universeAnalysis.storyEngine.intent.toUpperCase() as keyof typeof NarrativeFunction\n ] || NarrativeFunction.BEAT;\n } catch {\n narrativeFunction = NarrativeFunction.BEAT;\n }\n\n return createStoryBeat(\n `beat_${eventId}`,\n sequence,\n content,\n narrativeFunction,\n act,\n {\n universeAnalysis,\n leadUniverse: universeAnalysis.leadUniverse,\n source: \"webhook\",\n sourceEventId: eventId,\n }\n );\n}\n\n/**\n * Standard Redis key patterns for state storage\n */\nexport const RedisKeys = {\n state: (sessionId: string) => `ncp:state:${sessionId}`,\n currentState: () => \"ncp:state:current\",\n beats: (sessionId: string) => `ncp:beats:${sessionId}`,\n beat: (beatId: string) => `ncp:beat:${beatId}`,\n eventAnalysis: (eventId: string) => `ncp:event:${eventId}`,\n routingHistory: (sessionId: string) => `ncp:routing:${sessionId}`,\n episode: (episodeId: string) => `ncp:episode:${episodeId}`,\n};\n\n/**\n * Serialize state to JSON\n */\nexport function serializeState(state: UnifiedNarrativeState): string {\n return JSON.stringify(state);\n}\n\n/**\n * Deserialize state from JSON\n */\nexport function deserializeState(json: string): UnifiedNarrativeState {\n return JSON.parse(json) as UnifiedNarrativeState;\n}\n","/**\n * Narrative Context Protocol (NCP) Types\n *\n * These interfaces define the structure of narrative data following the NCP specification.\n */\n\n/**\n * A specific moment or event within a story beat.\n */\nexport interface Moment {\n momentId: string;\n description: string;\n timestamp?: string;\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create a Moment with defaults\n */\nexport function createMoment(\n momentId: string,\n description: string,\n options: Partial<Moment> = {}\n): Moment {\n return {\n momentId,\n description,\n timestamp: options.timestamp,\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * A key story point or plot point in the narrative.\n */\nexport interface StoryPoint {\n storypointId: string;\n title: string;\n description: string;\n type?: string; // e.g., 'inciting_incident', 'climax'\n relatedPlayers: string[];\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create a StoryPoint with defaults\n */\nexport function createStoryPoint(\n storypointId: string,\n title: string,\n description: string,\n options: Partial<StoryPoint> = {}\n): StoryPoint {\n return {\n storypointId,\n title,\n description,\n type: options.type,\n relatedPlayers: options.relatedPlayers ?? [],\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * A story beat representing a unit of narrative progression.\n */\nexport interface NCPStoryBeat {\n storybeatId: string;\n title: string;\n description: string;\n emotionalWeight?: string; // e.g., 'Devastating', 'Hopeful', 'Tense'\n moments: Moment[];\n relatedPlayers: string[];\n relatedStorypoints: string[];\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create an NCPStoryBeat with defaults\n */\nexport function createNCPStoryBeat(\n storybeatId: string,\n title: string,\n description: string,\n options: Partial<NCPStoryBeat> = {}\n): NCPStoryBeat {\n return {\n storybeatId,\n title,\n description,\n emotionalWeight: options.emotionalWeight,\n moments: options.moments ?? [],\n relatedPlayers: options.relatedPlayers ?? [],\n relatedStorypoints: options.relatedStorypoints ?? [],\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * A character or entity in the narrative.\n */\nexport interface Player {\n playerId: string;\n name: string;\n wound?: string; // The character's wound or trauma\n desire?: string; // The character's primary desire or goal\n arc?: string; // Description of the character's arc or transformation\n role?: string; // e.g., 'protagonist', 'antagonist'\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create a Player with defaults\n */\nexport function createPlayer(\n playerId: string,\n name: string,\n options: Partial<Player> = {}\n): Player {\n return {\n playerId,\n name,\n wound: options.wound,\n desire: options.desire,\n arc: options.arc,\n role: options.role,\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * A thematic perspective or lens through which to view the narrative.\n */\nexport interface Perspective {\n perspectiveId: string;\n name: string;\n description: string;\n thematicQuestion?: string; // The central question this perspective explores\n tension?: string; // e.g., 'Safety vs Vulnerability'\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create a Perspective with defaults\n */\nexport function createPerspective(\n perspectiveId: string,\n name: string,\n description: string,\n options: Partial<Perspective> = {}\n): Perspective {\n return {\n perspectiveId,\n name,\n description,\n thematicQuestion: options.thematicQuestion,\n tension: options.tension,\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * Complete Narrative Context Protocol data structure.\n */\nexport interface NCPData {\n title: string;\n author?: string;\n version: string;\n players: Player[];\n perspectives: Perspective[];\n storybeats: NCPStoryBeat[];\n storypoints: StoryPoint[];\n metadata: Record<string, unknown>;\n}\n\n/**\n * Create an NCPData structure with defaults\n */\nexport function createNCPData(\n title: string,\n options: Partial<NCPData> = {}\n): NCPData {\n return {\n title,\n author: options.author,\n version: options.version ?? \"1.0\",\n players: options.players ?? [],\n perspectives: options.perspectives ?? [],\n storybeats: options.storybeats ?? [],\n storypoints: options.storypoints ?? [],\n metadata: options.metadata ?? {},\n };\n}\n\n/**\n * Get a player by ID from NCP data\n */\nexport function getPlayer(data: NCPData, playerId: string): Player | undefined {\n return data.players.find((p) => p.playerId === playerId);\n}\n\n/**\n * Get a perspective by ID from NCP data\n */\nexport function getPerspectiveById(\n data: NCPData,\n perspectiveId: string\n): Perspective | undefined {\n return data.perspectives.find((p) => p.perspectiveId === perspectiveId);\n}\n\n/**\n * Get a story beat by ID from NCP data\n */\nexport function getStorybeat(\n data: NCPData,\n storybeatId: string\n): NCPStoryBeat | undefined {\n return data.storybeats.find((sb) => sb.storybeatId === storybeatId);\n}\n\n/**\n * Get a story point by ID from NCP data\n */\nexport function getStorypoint(\n data: NCPData,\n storypointId: string\n): StoryPoint | undefined {\n return data.storypoints.find((sp) => sp.storypointId === storypointId);\n}\n\n/**\n * Get all story beats involving a specific player\n */\nexport function getPlayerStorybeats(\n data: NCPData,\n playerId: string\n): NCPStoryBeat[] {\n return data.storybeats.filter((sb) => sb.relatedPlayers.includes(playerId));\n}\n\n/**\n * Get all story beats with a specific emotional weight\n */\nexport function getStorybeatsByEmotionalWeight(\n data: NCPData,\n emotionalWeight: string\n): NCPStoryBeat[] {\n return data.storybeats.filter((sb) => sb.emotionalWeight === emotionalWeight);\n}\n\n/**\n * Parse NCP data from JSON\n */\nexport function parseNCPData(json: string): NCPData {\n const raw = JSON.parse(json);\n\n // Convert snake_case from Python to camelCase\n return {\n title: raw.title,\n author: raw.author,\n version: raw.version ?? \"1.0\",\n players: (raw.players ?? []).map((p: Record<string, unknown>) => ({\n playerId: p.player_id ?? p.playerId,\n name: p.name,\n wound: p.wound,\n desire: p.desire,\n arc: p.arc,\n role: p.role,\n metadata: p.metadata ?? {},\n })),\n perspectives: (raw.perspectives ?? []).map((p: Record<string, unknown>) => ({\n perspectiveId: p.perspective_id ?? p.perspectiveId,\n name: p.name,\n description: p.description,\n thematicQuestion: p.thematic_question ?? p.thematicQuestion,\n tension: p.tension,\n metadata: p.metadata ?? {},\n })),\n storybeats: (raw.storybeats ?? []).map((sb: Record<string, unknown>) => ({\n storybeatId: sb.storybeat_id ?? sb.storybeatId,\n title: sb.title,\n description: sb.description,\n emotionalWeight: sb.emotional_weight ?? sb.emotionalWeight,\n moments: ((sb.moments ?? []) as Record<string, unknown>[]).map((m) => ({\n momentId: m.moment_id ?? m.momentId,\n description: m.description,\n timestamp: m.timestamp,\n metadata: m.metadata ?? {},\n })),\n relatedPlayers: sb.related_players ?? sb.relatedPlayers ?? [],\n relatedStorypoints: sb.related_storypoints ?? sb.relatedStorypoints ?? [],\n metadata: sb.metadata ?? {},\n })),\n storypoints: (raw.storypoints ?? []).map((sp: Record<string, unknown>) => ({\n storypointId: sp.storypoint_id ?? sp.storypointId,\n title: sp.title,\n description: sp.description,\n type: sp.type,\n relatedPlayers: sp.related_players ?? sp.relatedPlayers ?? [],\n metadata: sp.metadata ?? {},\n })),\n metadata: raw.metadata ?? {},\n };\n}\n\n/**\n * Serialize NCP data to JSON\n */\nexport function serializeNCPData(data: NCPData): string {\n return JSON.stringify(data);\n}\n","/**\n * Three-Universe Processor\n *\n * Processes events through all three universe lenses:\n * - Engineer World (Mia) - Technical precision\n * - Ceremony World (Ava8) - Relational protocols\n * - Story Engine World (Miette) - Narrative patterns\n *\n * This produces a ThreeUniverseAnalysis with:\n * - Individual perspectives from each universe\n * - Lead universe determination\n * - Coherence score\n */\n\nimport {\n Universe,\n UniversePerspective,\n ThreeUniverseAnalysis,\n NarrativeFunction,\n StoryBeat,\n createUniversePerspective,\n createThreeUniverseAnalysis,\n createStoryBeat,\n} from \"../schemas/unified_state_bridge.js\";\n\n/**\n * Types of events that can be processed.\n */\nexport enum EventType {\n GITHUB_PUSH = \"github.push\",\n GITHUB_ISSUE = \"github.issue\",\n GITHUB_PR = \"github.pull_request\",\n GITHUB_COMMENT = \"github.comment\",\n GITHUB_REVIEW = \"github.review\",\n USER_INPUT = \"user.input\",\n AGENT_ACTION = \"agent.action\",\n SYSTEM_EVENT = \"system.event\",\n}\n\n/**\n * An event ready for three-universe processing.\n */\nexport interface ProcessedEvent {\n eventId: string;\n eventType: EventType;\n content: string;\n metadata: Record<string, unknown>;\n timestamp: Date;\n source?: string;\n}\n\n/**\n * State for the three-universe processor.\n */\nexport interface ThreeUniverseState {\n // Input\n event: Record<string, unknown>;\n eventType: string;\n\n // Processing state\n engineerPerspective?: UniversePerspective;\n ceremonyPerspective?: UniversePerspective;\n storyEnginePerspective?: UniversePerspective;\n\n // Output\n analysis?: ThreeUniverseAnalysis;\n leadUniverse?: Universe;\n coherenceScore?: number;\n\n // Error handling\n error?: string;\n}\n\n/**\n * Protocol for callbacks that receive three-universe analysis results.\n */\nexport type AnalysisCallback = (\n eventId: string,\n eventContent: string,\n engineerResult: Record<string, unknown>,\n ceremonyResult: Record<string, unknown>,\n storyEngineResult: Record<string, unknown>,\n leadUniverse: string,\n coherenceScore: number\n) => void;\n\n// =============================================================================\n// Engineer World (Mia) - The Builder\n// =============================================================================\n\n/**\n * Keywords that indicate different engineering intents.\n */\nexport function engineerIntentKeywords(): Record<string, string[]> {\n return {\n feature_implementation: [\n \"feat:\",\n \"feature\",\n \"add\",\n \"implement\",\n \"create\",\n \"new\",\n ],\n bug_fix: [\"fix:\", \"bug\", \"hotfix\", \"patch\", \"resolve\", \"correct\"],\n refactor: [\"refactor\", \"refact:\", \"cleanup\", \"restructure\", \"reorganize\"],\n documentation: [\"docs:\", \"doc:\", \"documentation\", \"readme\", \"comment\"],\n testing: [\"test:\", \"tests:\", \"testing\", \"spec\", \"coverage\"],\n dependency: [\"deps:\", \"dependency\", \"upgrade\", \"update\", \"bump\"],\n configuration: [\"config:\", \"configure\", \"settings\", \"env\"],\n performance: [\"perf:\", \"performance\", \"optimize\", \"speed\", \"cache\"],\n security: [\"security\", \"sec:\", \"vulnerability\", \"auth\", \"permission\"],\n ci_cd: [\"ci:\", \"cd:\", \"pipeline\", \"workflow\", \"build\"],\n };\n}\n\n/**\n * Mia's perspective: The Builder (Engineer-world)\n *\n * Focuses on:\n * - What was built/changed\n * - Technical impact\n * - System architecture implications\n * - Flow routing for technical actions\n */\nexport function analyzeEngineerPerspective(\n state: ThreeUniverseState\n): ThreeUniverseState {\n const event = state.event;\n const eventType = state.eventType;\n\n // Extract relevant content\n let content = \"\";\n const payload = event.payload as Record<string, unknown> | undefined;\n\n if (payload) {\n const commits = payload.commits as Array<Record<string, string>> | undefined;\n if (commits) {\n content = commits.map((c) => c.message || \"\").join(\" \");\n } else if (payload.issue) {\n const issue = payload.issue as Record<string, string>;\n content = (issue.title || \"\") + \" \" + (issue.body || \"\");\n } else if (payload.pull_request) {\n const pr = payload.pull_request as Record<string, string>;\n content = (pr.title || \"\") + \" \" + (pr.body || \"\");\n }\n } else if (event.content) {\n content = event.content as string;\n }\n\n const contentLower = content.toLowerCase();\n\n // Analyze intent based on keywords\n const keywords = engineerIntentKeywords();\n const intentScores: Record<string, number> = {};\n\n for (const [intent, terms] of Object.entries(keywords)) {\n const score = terms.filter((term) =>\n contentLower.includes(term.toLowerCase())\n ).length;\n if (score > 0) {\n intentScores[intent] = score / terms.length;\n }\n }\n\n // Determine primary intent\n let intent: string;\n let confidence: number;\n\n if (Object.keys(intentScores).length > 0) {\n intent = Object.entries(intentScores).reduce((a, b) =>\n a[1] > b[1] ? a : b\n )[0];\n confidence = Math.min(0.95, 0.6 + intentScores[intent] * 0.4);\n } else {\n intent = \"maintenance\";\n confidence = 0.5;\n }\n\n // Map intents to suggested flows\n const flowMap: Record<string, string[]> = {\n feature_implementation: [\n \"code_review\",\n \"integration_test\",\n \"documentation_update\",\n ],\n bug_fix: [\"regression_test\", \"root_cause_analysis\", \"changelog_update\"],\n refactor: [\"architecture_review\", \"performance_test\", \"code_quality\"],\n documentation: [\"doc_review\", \"example_validation\"],\n testing: [\"coverage_analysis\", \"test_quality_review\"],\n dependency: [\"security_scan\", \"compatibility_test\"],\n configuration: [\"validation_test\", \"rollback_plan\"],\n performance: [\"benchmark\", \"profiling\", \"optimization_review\"],\n security: [\"security_audit\", \"penetration_test\", \"credential_scan\"],\n ci_cd: [\"pipeline_validation\", \"deployment_test\"],\n maintenance: [\"standard_ci\"],\n };\n\n const suggestedFlows = flowMap[intent] || [\"standard_ci\"];\n\n // Build context\n const context: Record<string, unknown> = {\n detectedKeywords: Object.entries(intentScores)\n .filter(([, v]) => v > 0)\n .map(([k]) => k),\n contentLength: content.length,\n eventType,\n technicalScope: determineTechnicalScope(content, event),\n estimatedComplexity: estimateComplexity(content, event),\n };\n\n const perspective = createUniversePerspective(\n Universe.ENGINEER,\n intent,\n confidence,\n { suggestedFlows, context }\n );\n\n return { ...state, engineerPerspective: perspective };\n}\n\nfunction determineTechnicalScope(\n content: string,\n _event: Record<string, unknown>\n): string {\n const contentLower = content.toLowerCase();\n\n if ([\"api\", \"endpoint\", \"route\"].some((kw) => contentLower.includes(kw))) {\n return \"api_layer\";\n }\n if (\n [\"database\", \"schema\", \"migration\"].some((kw) => contentLower.includes(kw))\n ) {\n return \"data_layer\";\n }\n if (\n [\"ui\", \"component\", \"frontend\"].some((kw) => contentLower.includes(kw))\n ) {\n return \"presentation_layer\";\n }\n if ([\"test\", \"spec\"].some((kw) => contentLower.includes(kw))) {\n return \"testing\";\n }\n if ([\"config\", \"env\", \"settings\"].some((kw) => contentLower.includes(kw))) {\n return \"configuration\";\n }\n\n return \"general\";\n}\n\nfunction estimateComplexity(\n content: string,\n event: Record<string, unknown>\n): string {\n const payload = event.payload as Record<string, unknown> | undefined;\n if (payload) {\n const commits = payload.commits as unknown[] | undefined;\n if (commits) {\n if (commits.length > 5) return \"high\";\n if (commits.length > 2) return \"medium\";\n }\n }\n\n if (content.length > 500) return \"high\";\n if (content.length > 100) return \"medium\";\n\n return \"low\";\n}\n\n// =============================================================================\n// Ceremony World (Ava8) - The Keeper\n// =============================================================================\n\n/**\n * Keywords that indicate different ceremonial intents.\n */\nexport function ceremonyIntentKeywords(): Record<string, string[]> {\n return {\n co_creation: [\"we\", \"together\", \"team\", \"pair\", \"collaborate\", \"co-author\"],\n gratitude_expression: [\n \"thanks\",\n \"thank you\",\n \"grateful\",\n \"appreciate\",\n \"credit\",\n ],\n witnessing: [\"witness\", \"observe\", \"acknowledge\", \"see\", \"recognize\"],\n sacred_pause: [\"pause\", \"reflect\", \"consider\", \"contemplate\", \"breathe\"],\n relationship_building: [\n \"connect\",\n \"relationship\",\n \"community\",\n \"support\",\n ],\n healing: [\"heal\", \"restore\", \"repair\", \"reconcile\", \"mend\"],\n celebration: [\n \"celebrate\",\n \"milestone\",\n \"achievement\",\n \"success\",\n \"complete\",\n ],\n offering: [\"offer\", \"gift\", \"contribute\", \"share\", \"give\"],\n };\n}\n\n/**\n * Ava8's perspective: The Keeper (Ceremony-world)\n *\n * Focuses on:\n * - Who contributed and their state\n * - Relational dynamics (K'é)\n * - Witnessing and acknowledgment\n * - Seven-generation awareness\n */\nexport function analyzeCeremonyPerspective(\n state: ThreeUniverseState\n): ThreeUniverseState {\n const event = state.event;\n\n // Extract contributor information\n const contributors = extractContributors(event);\n\n // Extract content for analysis\n const content = extractContent(event);\n const contentLower = content.toLowerCase();\n\n // Analyze relational intent\n const keywords = ceremonyIntentKeywords();\n const intentScores: Record<string, number> = {};\n\n for (const [intent, terms] of Object.entries(keywords)) {\n const score = terms.filter((term) => contentLower.includes(term)).length;\n if (score > 0) {\n intentScores[intent] = score / terms.length;\n }\n }\n\n // Special case: multiple contributors = co_creation\n if (contributors.length > 1) {\n intentScores.co_creation = (intentScores.co_creation || 0) + 0.5;\n }\n\n // Determine primary intent\n let intent: string;\n let confidence: number;\n\n if (Object.keys(intentScores).length > 0) {\n intent = Object.entries(intentScores).reduce((a, b) =>\n a[1] > b[1] ? a : b\n )[0];\n confidence = Math.min(0.95, 0.5 + intentScores[intent] * 0.4);\n } else {\n intent = \"individual_offering\";\n confidence = 0.6;\n }\n\n // Map intents to ceremonial flows\n const flowMap: Record<string, string[]> = {\n co_creation: [\"witness_collaboration\", \"honor_contributions\", \"amplify_voices\"],\n gratitude_expression: [\n \"amplify_acknowledgment\",\n \"record_connection\",\n \"reciprocity_check\",\n ],\n witnessing: [\"hold_space\", \"reflect_back\", \"presence\"],\n sacred_pause: [\"create_silence\", \"contemplation_prompt\", \"breathing_space\"],\n relationship_building: [\n \"map_connections\",\n \"strengthen_ties\",\n \"introduce_support\",\n ],\n healing: [\"compassion_response\", \"restoration_path\", \"forgiveness_space\"],\n celebration: [\"amplify_joy\", \"community_acknowledgment\", \"gratitude_circle\"],\n offering: [\"receive_gracefully\", \"honor_gift\", \"share_forward\"],\n individual_offering: [\n \"witness_work\",\n \"hold_space\",\n \"gentle_acknowledgment\",\n ],\n };\n\n const suggestedFlows = flowMap[intent] || [\"witness_work\", \"hold_space\"];\n\n // Build ceremonial context\n const context: Record<string, unknown> = {\n contributors,\n isCollaborative: contributors.length > 1,\n senderEnergy: assessEnergy(content),\n witnessingNeeded: needsWitnessing(content, event),\n relationshipDepth: assessRelationshipDepth(contributors, event),\n sevenGenerationRelevance: assessLongTermImpact(content, event),\n };\n\n const perspective = createUniversePerspective(\n Universe.CEREMONY,\n intent,\n confidence,\n { suggestedFlows, context }\n );\n\n return { ...state, ceremonyPerspective: perspective };\n}\n\nfunction extractContributors(event: Record<string, unknown>): string[] {\n const contributors: string[] = [];\n\n if (event.sender) {\n contributors.push(event.sender as string);\n }\n\n const payload = event.payload as Record<string, unknown> | undefined;\n if (payload) {\n // Git commits\n const commits = payload.commits as Array<Record<string, unknown>> | undefined;\n if (commits) {\n for (const commit of commits) {\n const author = (commit.author as Record<string, string> | undefined)?.name;\n if (author && !contributors.includes(author)) {\n contributors.push(author);\n }\n }\n }\n\n // Issue/PR author\n const issue = payload.issue as Record<string, unknown> | undefined;\n if (issue) {\n const user = issue.user as Record<string, string> | undefined;\n if (user?.login && !contributors.includes(user.login)) {\n contributors.push(user.login);\n }\n }\n\n const pr = payload.pull_request as Record<string, unknown> | undefined;\n if (pr) {\n const user = pr.user as Record<string, string> | undefined;\n if (user?.login && !contributors.includes(user.login)) {\n contributors.push(user.login);\n }\n }\n }\n\n return contributors.length > 0 ? contributors : [\"unknown\"];\n}\n\nfunction extractContent(event: Record<string, unknown>): string {\n if (event.content) {\n return event.content as string;\n }\n\n const payload = event.payload as Record<string, unknown> | undefined;\n if (payload) {\n const parts: string[] = [];\n\n const commits = payload.commits as Array<Record<string, string>> | undefined;\n if (commits) {\n parts.push(...commits.map((c) => c.message || \"\"));\n }\n\n const issue = payload.issue as Record<string, string> | undefined;\n if (issue) {\n parts.push(issue.title || \"\");\n parts.push(issue.body || \"\");\n }\n\n const pr = payload.pull_request as Record<string, string> | undefined;\n if (pr) {\n parts.push(pr.title || \"\");\n parts.push(pr.body || \"\");\n }\n\n const comment = payload.comment as Record<string, string> | undefined;\n if (comment) {\n parts.push(comment.body || \"\");\n }\n\n return parts.filter(Boolean).join(\" \");\n }\n\n return \"\";\n}\n\nfunction assessEnergy(content: string): string {\n const contentLower = content.toLowerCase();\n\n if ([\"urgent\", \"critical\", \"asap\", \"emergency\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"urgent_flow\";\n }\n if ([\"excited\", \"happy\", \"great\", \"awesome\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"joyful_flow\";\n }\n if ([\"stuck\", \"blocked\", \"help\", \"issue\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"seeking_support\";\n }\n if ([\"thoughtful\", \"consider\", \"reflect\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"contemplative_flow\";\n }\n\n return \"steady_flow\";\n}\n\nfunction needsWitnessing(\n content: string,\n _event: Record<string, unknown>\n): boolean {\n const contentLower = content.toLowerCase();\n\n // Vulnerable sharing needs witnessing\n if ([\"first\", \"new\", \"trying\", \"learning\", \"help\"].some((w) =>\n contentLower.includes(w)\n )) {\n return true;\n }\n\n // Significant achievements need witnessing\n if ([\"complete\", \"achieve\", \"milestone\", \"done\"].some((w) =>\n contentLower.includes(w)\n )) {\n return true;\n }\n\n return false;\n}\n\nfunction assessRelationshipDepth(\n contributors: string[],\n _event: Record<string, unknown>\n): string {\n if (contributors.length > 2) return \"community\";\n if (contributors.length > 1) return \"pair\";\n return \"individual\";\n}\n\nfunction assessLongTermImpact(\n content: string,\n _event: Record<string, unknown>\n): number {\n const contentLower = content.toLowerCase();\n let score = 0.3; // Base score\n\n // Infrastructure changes have long-term impact\n if ([\"architecture\", \"foundation\", \"core\", \"framework\"].some((w) =>\n contentLower.includes(w)\n )) {\n score += 0.3;\n }\n\n // Documentation affects future generations\n if ([\"document\", \"guide\", \"tutorial\", \"example\"].some((w) =>\n contentLower.includes(w)\n )) {\n score += 0.2;\n }\n\n // Breaking changes affect the future\n if ([\"breaking\", \"migration\", \"deprecate\"].some((w) =>\n contentLower.includes(w)\n )) {\n score += 0.2;\n }\n\n return Math.min(1.0, score);\n}\n\n// =============================================================================\n// Story Engine World (Miette) - The Weaver\n// =============================================================================\n\n/**\n * Keywords that indicate different narrative functions.\n */\nexport function storyEngineIntentKeywords(): Record<string, string[]> {\n return {\n inciting_incident: [\"init\", \"start\", \"begin\", \"new\", \"first\", \"introduce\"],\n rising_action: [\"add\", \"implement\", \"build\", \"develop\", \"progress\", \"continue\"],\n turning_point: [\"feat:\", \"major\", \"significant\", \"pivot\", \"change\", \"transform\"],\n complication: [\"issue\", \"problem\", \"bug\", \"error\", \"conflict\", \"challenge\"],\n crisis: [\"critical\", \"urgent\", \"breaking\", \"emergency\", \"blocker\"],\n climax: [\"complete\", \"finish\", \"final\", \"release\", \"launch\", \"deploy\"],\n resolution: [\"fix\", \"resolve\", \"close\", \"merge\", \"done\"],\n denouement: [\"cleanup\", \"refactor\", \"optimize\", \"polish\", \"improve\"],\n };\n}\n\n/**\n * Miette's perspective: The Weaver (Story-engine-world)\n *\n * Focuses on:\n * - Narrative position (which act/phase)\n * - Dramatic function\n * - Story arc progression\n * - Character development\n */\nexport function analyzeStoryEnginePerspective(\n state: ThreeUniverseState\n): ThreeUniverseState {\n const event = state.event;\n const content = extractContent(event);\n const contentLower = content.toLowerCase();\n\n // Analyze narrative function\n const keywords = storyEngineIntentKeywords();\n const intentScores: Record<string, number> = {};\n\n for (const [intent, terms] of Object.entries(keywords)) {\n const score = terms.filter((term) => contentLower.includes(term)).length;\n if (score > 0) {\n intentScores[intent] = score / terms.length;\n }\n }\n\n // Determine primary intent\n let intent: string;\n let confidence: number;\n\n if (Object.keys(intentScores).length > 0) {\n intent = Object.entries(intentScores).reduce((a, b) =>\n a[1] > b[1] ? a : b\n )[0];\n confidence = Math.min(0.95, 0.55 + intentScores[intent] * 0.4);\n } else {\n intent = \"rising_action\";\n confidence = 0.5;\n }\n\n // Map intent to act\n const actMap: Record<string, number> = {\n inciting_incident: 1,\n rising_action: 2,\n turning_point: 2,\n complication: 2,\n crisis: 2,\n climax: 3,\n resolution: 3,\n denouement: 3,\n };\n const act = actMap[intent] || 2;\n\n // Map intent to narrative function\n const functionMap: Record<string, string> = {\n inciting_incident: \"inciting_incident\",\n rising_action: \"rising_action\",\n turning_point: \"turning_point\",\n complication: \"complication\",\n crisis: \"crisis\",\n climax: \"climax\",\n resolution: \"resolution\",\n denouement: \"denouement\",\n };\n const narrativeFunction = functionMap[intent] || \"beat\";\n\n // Suggested flows for story engine\n const flowMap: Record<string, string[]> = {\n inciting_incident: [\"establish_stakes\", \"introduce_characters\", \"set_tone\"],\n rising_action: [\"advance_narrative\", \"develop_characters\", \"build_tension\"],\n turning_point: [\"mark_pivot\", \"shift_perspective\", \"update_arc\"],\n complication: [\"deepen_conflict\", \"raise_stakes\", \"add_obstacle\"],\n crisis: [\"peak_tension\", \"force_decision\", \"approach_climax\"],\n climax: [\"resolve_main_conflict\", \"character_transformation\", \"theme_revelation\"],\n resolution: [\"tie_loose_ends\", \"show_consequences\", \"new_equilibrium\"],\n denouement: [\"reflect_journey\", \"hint_future\", \"final_image\"],\n };\n\n const suggestedFlows = flowMap[intent] || [\n \"advance_narrative\",\n \"update_arc_position\",\n ];\n\n // Calculate dramatic tension\n const dramaticTension = calculateDramaticTension(intent, content);\n\n // Build story context\n const context: Record<string, unknown> = {\n act,\n narrativeFunction,\n dramaticTension,\n suggestedNextBeat: suggestNextBeat(intent),\n characterImpact: assessCharacterImpact(content),\n themeResonance: assessThemeResonance(content),\n pacingSuggestion: suggestPacing(intent, dramaticTension),\n };\n\n const perspective = createUniversePerspective(\n Universe.STORY_ENGINE,\n intent,\n confidence,\n { suggestedFlows, context }\n );\n\n return { ...state, storyEnginePerspective: perspective };\n}\n\nfunction calculateDramaticTension(intent: string, content: string): number {\n const baseTension: Record<string, number> = {\n inciting_incident: 0.4,\n rising_action: 0.5,\n turning_point: 0.7,\n complication: 0.6,\n crisis: 0.9,\n climax: 1.0,\n resolution: 0.4,\n denouement: 0.2,\n };\n\n let tension = baseTension[intent] || 0.5;\n const contentLower = content.toLowerCase();\n\n // Adjust based on content intensity\n if ([\"urgent\", \"critical\", \"breaking\"].some((w) => contentLower.includes(w))) {\n tension = Math.min(1.0, tension + 0.2);\n }\n if ([\"minor\", \"small\", \"trivial\"].some((w) => contentLower.includes(w))) {\n tension = Math.max(0.1, tension - 0.2);\n }\n\n return Math.round(tension * 100) / 100;\n}\n\nfunction suggestNextBeat(currentIntent: string): string {\n const nextBeatMap: Record<string, string> = {\n inciting_incident: \"rising_action\",\n rising_action: \"complication\",\n turning_point: \"rising_action\",\n complication: \"crisis\",\n crisis: \"climax\",\n climax: \"resolution\",\n resolution: \"denouement\",\n denouement: \"inciting_incident\", // New cycle\n };\n return nextBeatMap[currentIntent] || \"rising_action\";\n}\n\nfunction assessCharacterImpact(content: string): string {\n const contentLower = content.toLowerCase();\n\n if ([\"transform\", \"change\", \"grow\", \"learn\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"transformative\";\n }\n if ([\"challenge\", \"struggle\", \"overcome\"].some((w) =>\n contentLower.includes(w)\n )) {\n return \"character_testing\";\n }\n if ([\"connect\", \"relationship\", \"team\"].some((w) => contentLower.includes(w))) {\n return \"relational\";\n }\n\n return \"incremental\";\n}\n\nfunction assessThemeResonance(content: string): string {\n const contentLower = content.toLowerCase();\n const themes: string[] = [];\n\n if ([\"together\", \"team\", \"collaborate\"].some((w) => contentLower.includes(w))) {\n themes.push(\"collaboration\");\n }\n if ([\"integrate\", \"connect\", \"bridge\"].some((w) => contentLower.includes(w))) {\n themes.push(\"integration\");\n }\n if ([\"coherent\", \"consistent\", \"unified\"].some((w) =>\n contentLower.includes(w)\n )) {\n themes.push(\"coherence\");\n }\n if ([\"transform\", \"change\", \"evolve\"].some((w) => contentLower.includes(w))) {\n themes.push(\"transformation\");\n }\n\n return themes.length > 0 ? themes.join(\", \") : \"development\";\n}\n\nfunction suggestPacing(intent: string, tension: number): string {\n if (tension > 0.8) return \"accelerate\";\n if (tension < 0.3) return \"breathe\";\n if (intent === \"inciting_incident\" || intent === \"climax\") return \"emphasize\";\n return \"steady\";\n}\n\n// =============================================================================\n// Synthesis - Combining All Three Perspectives\n// =============================================================================\n\n/**\n * Combine all three universe perspectives into a unified analysis.\n */\nexport function synthesizePerspectives(\n state: ThreeUniverseState\n): ThreeUniverseState {\n const engineer = state.engineerPerspective;\n const ceremony = state.ceremonyPerspective;\n const storyEngine = state.storyEnginePerspective;\n\n if (!engineer || !ceremony || !storyEngine) {\n return {\n ...state,\n error: \"Missing one or more perspectives\",\n };\n }\n\n // Determine lead universe based on confidence and special conditions\n const lead = determineLeadUniverse(engineer, ceremony, storyEngine);\n\n // Calculate coherence\n const coherence = calculateCoherence(engineer, ceremony, storyEngine);\n\n // Build the analysis\n const analysis = createThreeUniverseAnalysis(\n engineer,\n ceremony,\n storyEngine,\n lead,\n coherence\n );\n\n return {\n ...state,\n analysis,\n leadUniverse: lead,\n coherenceScore: coherence,\n };\n}\n\n/**\n * Determine which universe should lead the response.\n *\n * Priority logic:\n * 1. CEREMONY leads if: new contributor, sacred pause needed, relational obligation\n * 2. STORY_ENGINE leads if: narrative coherence critical, character arc in focus\n * 3. ENGINEER leads if: technical precision critical, schema validation required\n * 4. Otherwise: highest confidence wins\n */\nfunction determineLeadUniverse(\n engineer: UniversePerspective,\n ceremony: UniversePerspective,\n storyEngine: UniversePerspective\n): Universe {\n const ceremonyContext = ceremony.context;\n\n // Check ceremony priority conditions\n if (ceremonyContext.witnessingNeeded) {\n return Universe.CEREMONY;\n }\n if (ceremonyContext.isCollaborative) {\n // Collaborative work honors the ceremony world\n return Universe.CEREMONY;\n }\n\n // Check story engine priority conditions\n const storyContext = storyEngine.context;\n if ((storyContext.dramaticTension as number) > 0.8) {\n // High drama moments are led by story engine\n return Universe.STORY_ENGINE;\n }\n if (\n storyContext.narrativeFunction === \"climax\" ||\n storyContext.narrativeFunction === \"turning_point\"\n ) {\n return Universe.STORY_ENGINE;\n }\n\n // Check engineer priority conditions\n const engineerContext = engineer.context;\n if (engineerContext.estimatedComplexity === \"high\") {\n return Universe.ENGINEER;\n }\n if (engineer.intent === \"security\" || engineer.intent === \"bug_fix\") {\n // Technical urgency\n return Universe.ENGINEER;\n }\n\n // Default: highest confidence\n const perspectives: [UniversePerspective, Universe][] = [\n [engineer, Universe.ENGINEER],\n [ceremony, Universe.CEREMONY],\n [storyEngine, Universe.STORY_ENGINE],\n ];\n\n return perspectives.reduce((a, b) =>\n a[0].confidence > b[0].confidence ? a : b\n )[1];\n}\n\n/**\n * Calculate how well the three perspectives align.\n *\n * Higher coherence means the perspectives are complementary.\n * Lower coherence might indicate conflicting interpretations.\n */\nfunction calculateCoherence(\n engineer: UniversePerspective,\n ceremony: UniversePerspective,\n storyEngine: UniversePerspective\n): number {\n // Base: average confidence\n const avgConfidence =\n (engineer.confidence + ceremony.confidence + storyEngine.confidence) / 3;\n\n // Bonus for alignment\n let bonus = 0.0;\n\n // If all suggest similar urgency\n const engineerUrgent = [\"security\", \"bug_fix\", \"performance\"].includes(\n engineer.intent\n );\n const ceremonyUrgent = ceremony.context.senderEnergy === \"urgent_flow\";\n const storyUrgent =\n (storyEngine.context.dramaticTension as number) > 0.7;\n\n if ([engineerUrgent, ceremonyUrgent, storyUrgent].filter(Boolean).length >= 2) {\n bonus += 0.1; // Aligned on urgency\n }\n\n // Penalty for very different confidences (might indicate conflict)\n const confidences = [\n engineer.confidence,\n ceremony.confidence,\n storyEngine.confidence,\n ];\n const confidenceSpread = Math.max(...confidences) - Math.min(...confidences);\n const penalty = confidenceSpread * 0.2;\n\n const coherence = avgConfidence + bonus - penalty;\n return Math.round(Math.max(0.0, Math.min(1.0, coherence)) * 100) / 100;\n}\n\n// =============================================================================\n// Main Processor Class\n// =============================================================================\n\n/**\n * High-level interface for three-universe event processing.\n *\n * @example\n * const processor = new ThreeUniverseProcessor();\n * const result = processor.process(event);\n * console.log(result.leadUniverse); // \"ceremony\"\n *\n * @example With tracing callback\n * const handler = new NarrativeTracingHandler({ storyId: \"story_123\" });\n * const bridge = new LangGraphBridge(handler);\n * const processor = new ThreeUniverseProcessor({\n * tracingCallback: bridge.createThreeUniverseCallback()\n * });\n * const result = processor.process(event); // Automatically traced to Langfuse\n */\nexport class ThreeUniverseProcessor {\n private tracingCallback?: AnalysisCallback;\n\n constructor(options: { tracingCallback?: AnalysisCallback } = {}) {\n this.tracingCallback = options.tracingCallback;\n }\n\n /**\n * Process an event through all three universes.\n *\n * @param event The event data (webhook payload, user input, etc.)\n * @param eventType Type of event (e.g., \"github.push\", \"user.input\")\n * @returns ThreeUniverseAnalysis with all perspectives and synthesis\n */\n process(\n event: Record<string, unknown>,\n eventType: string = \"unknown\"\n ): ThreeUniverseAnalysis {\n // Initialize state\n let state: ThreeUniverseState = {\n event,\n eventType,\n };\n\n // Process through each universe\n state = analyzeEngineerPerspective(state);\n state = analyzeCeremonyPerspective(state);\n state = analyzeStoryEnginePerspective(state);\n state = synthesizePerspectives(state);\n\n // Check for errors\n if (state.error) {\n throw new Error(`Processing error: ${state.error}`);\n }\n\n const analysis = state.analysis!;\n\n // Call tracing callback if configured\n if (this.tracingCallback && analysis) {\n const eventId =\n (event.eventId as string) ||\n (event.id as string) ||\n `${eventType}_${Date.now()}`;\n const eventContent = this.extractEventContent(event);\n\n this.tracingCallback(\n eventId,\n eventContent,\n perspectiveToRecord(analysis.engineer),\n perspectiveToRecord(analysis.ceremony),\n perspectiveToRecord(analysis.storyEngine),\n analysis.leadUniverse,\n analysis.coherenceScore\n );\n }\n\n return analysis;\n }\n\n private extractEventContent(event: Record<string, unknown>): string {\n // Try common content locations\n if (event.content) {\n return String(event.content).slice(0, 500);\n }\n\n const payload = event.payload as Record<string, unknown> | undefined;\n if (payload && typeof payload === \"object\") {\n const issue = payload.issue as Record<string, string> | undefined;\n if (issue?.title) return issue.title;\n\n const pr = payload.pull_request as Record<string, string> | undefined;\n if (pr?.title) return pr.title;\n\n const comment = payload.comment as Record<string, string> | undefined;\n if (comment?.body) return comment.body.slice(0, 500);\n }\n\n if (event.message) {\n return String(event.message).slice(0, 500);\n }\n\n return `Event: ${event.eventType || \"unknown\"}`;\n }\n\n /**\n * Convenience method for processing GitHub webhooks.\n */\n processWebhook(webhookPayload: Record<string, unknown>): ThreeUniverseAnalysis {\n // Determine event type from webhook\n let eventType = \"github.push\"; // Default\n\n const payload = webhookPayload.payload as Record<string, unknown> | undefined;\n if (payload) {\n if (payload.issue) {\n eventType = \"github.issue\";\n } else if (payload.pull_request) {\n eventType = \"github.pull_request\";\n } else if (payload.comment) {\n eventType = \"github.comment\";\n }\n }\n\n return this.process(webhookPayload, eventType);\n }\n\n /**\n * Create a story beat from event and analysis.\n */\n createBeatFromAnalysis(\n event: Record<string, unknown>,\n analysis: ThreeUniverseAnalysis,\n sequence: number\n ): StoryBeat {\n // Map story engine intent to NarrativeFunction\n const functionMap: Record<string, NarrativeFunction> = {\n inciting_incident: NarrativeFunction.INCITING_INCIDENT,\n rising_action: NarrativeFunction.RISING_ACTION,\n turning_point: NarrativeFunction.TURNING_POINT,\n complication: NarrativeFunction.COMPLICATION,\n crisis: NarrativeFunction.CRISIS,\n climax: NarrativeFunction.CLIMAX,\n resolution: NarrativeFunction.RESOLUTION,\n denouement: NarrativeFunction.DENOUEMENT,\n };\n\n const storyIntent = analysis.storyEngine.intent;\n const narrativeFunc =\n functionMap[storyIntent] || NarrativeFunction.BEAT;\n\n // Extract act\n const act = (analysis.storyEngine.context.act as number) || 2;\n\n // Build content\n let content = extractContent(event);\n if (!content) {\n content = String(event.eventType || \"event\");\n }\n\n // Generate beat ID\n const timestamp = new Date().toISOString();\n const beatId = `beat_${timestamp}`;\n\n // Source event ID\n let sourceEventId: string | undefined;\n const payload = event.payload as Record<string, unknown> | undefined;\n if (payload) {\n const headCommit = payload.head_commit as Record<string, string> | undefined;\n if (headCommit?.id) {\n sourceEventId = headCommit.id;\n } else if (payload.issue) {\n const issue = payload.issue as Record<string, unknown>;\n sourceEventId = String(issue.id);\n } else if (payload.pull_request) {\n const pr = payload.pull_request as Record<string, unknown>;\n sourceEventId = String(pr.id);\n }\n }\n\n return createStoryBeat(beatId, sequence, content.slice(0, 500), narrativeFunc, act, {\n universeAnalysis: analysis,\n leadUniverse: analysis.leadUniverse,\n source: \"processor\",\n sourceEventId,\n });\n }\n}\n\n/**\n * Convert a UniversePerspective to a plain record.\n */\nfunction perspectiveToRecord(\n perspective: UniversePerspective\n): Record<string, unknown> {\n return {\n universe: perspective.universe,\n intent: perspective.intent,\n confidence: perspective.confidence,\n suggestedFlows: perspective.suggestedFlows,\n context: perspective.context,\n };\n}\n","/**\n * Narrative Coherence Engine\n *\n * Analyzes narrative coherence and identifies gaps.\n * This is a core dependency for the Editor Anvil app.\n *\n * Features:\n * - Gap identification (structural, thematic, character, sensory, continuity)\n * - Coherence scoring across multiple dimensions\n * - Enrichment routing suggestions\n * - Trinity perspective integration (Mia/Miette/Ava8)\n */\n\nimport {\n StoryBeat,\n CharacterState,\n ThematicThread,\n} from \"../schemas/unified_state_bridge.js\";\n\n/**\n * Types of narrative gaps that can be identified.\n */\nexport enum GapType {\n STRUCTURAL = \"structural\", // Missing beats, incomplete arcs\n THEMATIC = \"thematic\", // Promised themes underdelivered\n CHARACTER = \"character\", // Traits mentioned but not demonstrated\n SENSORY = \"sensory\", // Scenes lacking grounding detail\n CONTINUITY = \"continuity\", // Timeline/detail inconsistencies\n}\n\n/**\n * Severity levels for identified gaps.\n */\nexport enum GapSeverity {\n CRITICAL = \"critical\", // Must fix before publication\n MODERATE = \"moderate\", // Should address in next pass\n MINOR = \"minor\", // Nice to have, low priority\n}\n\n/**\n * Where to route gaps for remediation.\n */\nexport enum RoutingTarget {\n STORYTELLER = \"storyteller\", // Needs prose refinement\n STRUCTURIST = \"structurist\", // Needs structural repair\n ARCHITECT = \"architect\", // Schema inconsistency\n AUTHOR = \"author\", // Human decision required\n}\n\n/**\n * Component score status.\n */\nexport type ComponentStatus = \"good\" | \"warning\" | \"critical\";\n\n/**\n * A narrative gap identified in the story.\n */\nexport interface Gap {\n id: string;\n gapType: GapType;\n severity: GapSeverity;\n description: string;\n location: Record<string, unknown>; // beat_id, chapter_id, position\n suggestedRoute: RoutingTarget;\n resolved: boolean;\n resolution?: string;\n}\n\n/**\n * Create a Gap with defaults\n */\nexport function createGap(\n id: string,\n gapType: GapType,\n severity: GapSeverity,\n description: string,\n suggestedRoute: RoutingTarget,\n options: Partial<Gap> = {}\n): Gap {\n return {\n id,\n gapType,\n severity,\n description,\n location: options.location ?? {},\n suggestedRoute,\n resolved: options.resolved ?? false,\n resolution: options.resolution,\n };\n}\n\n/**\n * Score for a single coherence component.\n */\nexport interface ComponentScore {\n score: number; // 0-100\n status: ComponentStatus;\n issues: string[];\n suggestions: string[];\n}\n\n/**\n * Create a ComponentScore with defaults\n */\nexport function createComponentScore(\n score: number,\n status: ComponentStatus,\n options: Partial<ComponentScore> = {}\n): ComponentScore {\n return {\n score,\n status,\n issues: options.issues ?? [],\n suggestions: options.suggestions ?? [],\n };\n}\n\n/**\n * Complete coherence score for a narrative.\n */\nexport interface CoherenceScore {\n overall: number;\n narrativeFlow: ComponentScore;\n characterConsistency: ComponentScore;\n pacing: ComponentScore;\n themeSaturation: ComponentScore;\n continuity: ComponentScore;\n analyzedAt: string;\n}\n\n/**\n * Create a CoherenceScore\n */\nexport function createCoherenceScore(\n overall: number,\n narrativeFlow: ComponentScore,\n characterConsistency: ComponentScore,\n pacing: ComponentScore,\n themeSaturation: ComponentScore,\n continuity: ComponentScore\n): CoherenceScore {\n return {\n overall,\n narrativeFlow,\n characterConsistency,\n pacing,\n themeSaturation,\n continuity,\n analyzedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Assessment from three narrative perspectives (Mia/Miette/Ava8).\n */\nexport interface TrinityAssessment {\n mia: string; // Structural quality (🧠 logical, analytical)\n miette: string; // Emotional effectiveness (🌸 feeling, resonance)\n ava8: string; // Atmospheric/sensory (🎨 visual, immersive)\n priorities: string[];\n}\n\n/**\n * Create a TrinityAssessment\n */\nexport function createTrinityAssessment(\n mia: string,\n miette: string,\n ava8: string,\n priorities: string[] = []\n): TrinityAssessment {\n return { mia, miette, ava8, priorities };\n}\n\n/**\n * Type alias for the coherence engine state.\n */\nexport interface CoherenceEngineState {\n beats: StoryBeat[];\n characters: CharacterState[];\n themes: ThematicThread[];\n\n // Component scores\n narrativeFlowScore?: ComponentScore;\n characterConsistencyScore?: ComponentScore;\n pacingScore?: ComponentScore;\n themeSaturationScore?: ComponentScore;\n continuityScore?: ComponentScore;\n\n // Overall\n overallScore?: number;\n gaps?: Gap[];\n trinityAssessment?: TrinityAssessment;\n coherenceScore?: CoherenceScore;\n}\n\n/**\n * Result of coherence analysis.\n */\nexport interface CoherenceResult {\n coherenceScore: CoherenceScore;\n gaps: Gap[];\n trinityAssessment: TrinityAssessment;\n}\n\n/**\n * Analyzes narrative coherence and identifies gaps.\n *\n * This is a core component for the Editor Anvil app, providing:\n * - Comprehensive coherence scoring across 5 dimensions\n * - Gap identification with severity and routing\n * - Trinity perspective assessment (Mia/Miette/Ava8)\n * - Actionable improvement suggestions\n *\n * @example\n * const engine = new NarrativeCoherenceEngine();\n * const result = engine.analyze(beats, characters, themes);\n *\n * // Access scores\n * console.log(`Overall coherence: ${result.coherenceScore.overall}`);\n *\n * // Access gaps\n * for (const gap of result.gaps) {\n * console.log(`Gap: ${gap.description} (${gap.severity})`);\n * }\n *\n * // Access Trinity assessment\n * console.log(`Mia says: ${result.trinityAssessment.mia}`);\n */\nexport class NarrativeCoherenceEngine {\n private strictMode: boolean;\n private gapCounter: number;\n\n constructor(options: { strictMode?: boolean } = {}) {\n this.strictMode = options.strictMode ?? false;\n this.gapCounter = 0;\n }\n\n private generateGapId(): string {\n this.gapCounter += 1;\n return `gap_${this.gapCounter}`;\n }\n\n /**\n * Analyze narrative flow - how smoothly the story progresses.\n *\n * Checks:\n * - Beat transitions (jarring vs smooth)\n * - Logical causality between beats\n * - Pacing consistency\n */\n private analyzeNarrativeFlow(state: CoherenceEngineState): CoherenceEngineState {\n const beats = state.beats;\n const issues: string[] = [];\n const suggestions: string[] = [];\n let score: number;\n let status: ComponentStatus;\n\n if (beats.length < 2) {\n score = 50.0;\n issues.push(\"Too few beats to assess flow\");\n suggestions.push(\"Add more story beats to establish narrative rhythm\");\n } else {\n // Check for logical function progression\n const functions = beats.map((b) => b.narrativeFunction);\n\n // Penalize if no setup before confrontation\n let hasProperStructure = false;\n for (let i = 0; i < functions.length; i++) {\n const func = functions[i];\n if ([\"setup\", \"introduction\", \"discovery\"].includes(func)) {\n hasProperStructure = true;\n break;\n } else if ([\"confrontation\", \"crisis\", \"climax\"].includes(func)) {\n if (!hasProperStructure) {\n issues.push(`Beat ${i + 1} escalates without proper setup`);\n hasProperStructure = true; // Only report once\n }\n }\n }\n\n // Check emotional continuity\n let prevTone: string | undefined;\n let jarringTransitions = 0;\n\n for (let i = 0; i < beats.length; i++) {\n const beat = beats[i];\n if (prevTone && beat.emotionalTone) {\n // Simple check: devastation followed by joy is jarring\n const jarringPairs: [string, string][] = [\n [\"devastating\", \"joyful\"],\n [\"fearful\", \"peaceful\"],\n [\"triumphant\", \"devastating\"],\n ];\n for (const [p1, p2] of jarringPairs) {\n if (\n (prevTone.toLowerCase().includes(p1) &&\n beat.emotionalTone.toLowerCase().includes(p2)) ||\n (prevTone.toLowerCase().includes(p2) &&\n beat.emotionalTone.toLowerCase().includes(p1))\n ) {\n jarringTransitions += 1;\n issues.push(`Jarring emotional transition at Beat ${i + 1}`);\n }\n }\n }\n prevTone = beat.emotionalTone;\n }\n\n // Calculate score\n let baseScore = 85.0;\n baseScore -= jarringTransitions * 10;\n baseScore -=\n issues.filter((i) => i.includes(\"without proper setup\")).length * 15;\n\n score = Math.max(0.0, Math.min(100.0, baseScore));\n\n if (jarringTransitions > 0) {\n suggestions.push(\"Add transitional beats to smooth emotional shifts\");\n }\n if (!hasProperStructure) {\n suggestions.push(\n \"Consider adding setup beats before major confrontations\"\n );\n }\n }\n\n // Determine status\n if (score >= 70) {\n status = \"good\";\n } else if (score >= 50) {\n status = \"warning\";\n } else {\n status = \"critical\";\n }\n\n state.narrativeFlowScore = createComponentScore(score, status, {\n issues,\n suggestions,\n });\n\n return state;\n }\n\n /**\n * Analyze character consistency across the narrative.\n *\n * Checks:\n * - Character voice consistency\n * - Arc progression logic\n * - Relationship evolution coherence\n */\n private analyzeCharacterConsistency(\n state: CoherenceEngineState\n ): CoherenceEngineState {\n const beats = state.beats;\n const characters = state.characters;\n const issues: string[] = [];\n const suggestions: string[] = [];\n let score: number;\n let status: ComponentStatus;\n\n if (characters.length === 0) {\n score = 50.0;\n issues.push(\"No character data provided\");\n suggestions.push(\"Define character states to enable consistency analysis\");\n } else {\n // Track character appearances across beats\n const characterBeats: Record<string, number[]> = {};\n for (const char of characters) {\n characterBeats[char.id] = [];\n }\n\n for (let i = 0; i < beats.length; i++) {\n const beat = beats[i];\n if (beat.characterId && characterBeats[beat.characterId]) {\n characterBeats[beat.characterId].push(i);\n }\n }\n\n // Check for characters with large gaps\n for (const [charId, appearances] of Object.entries(characterBeats)) {\n if (appearances.length >= 2) {\n for (let i = 1; i < appearances.length; i++) {\n const gap = appearances[i] - appearances[i - 1];\n if (gap > 5) {\n // More than 5 beats between appearances\n const char = characters.find((c) => c.id === charId);\n const name = char?.name || charId;\n issues.push(`Character '${name}' disappears for ${gap} beats`);\n suggestions.push(\n `Consider adding '${name}' to beats between ${appearances[i - 1] + 1} and ${appearances[i] + 1}`\n );\n }\n }\n }\n }\n\n // Check arc progression\n for (const char of characters) {\n if (char.arcPosition < 0.1 && beats.length > 5) {\n issues.push(`Character '${char.name}' has minimal arc progression`);\n }\n }\n\n // Calculate score based on issues\n let baseScore = 90.0;\n baseScore -= issues.filter((i) => i.includes(\"disappears\")).length * 8;\n baseScore -= issues.filter((i) => i.includes(\"minimal arc\")).length * 12;\n\n score = Math.max(0.0, Math.min(100.0, baseScore));\n }\n\n // Determine status\n if (score >= 70) {\n status = \"good\";\n } else if (score >= 50) {\n status = \"warning\";\n } else {\n status = \"critical\";\n }\n\n state.characterConsistencyScore = createComponentScore(score, status, {\n issues,\n suggestions,\n });\n\n return state;\n }\n\n /**\n * Analyze narrative pacing.\n *\n * Checks:\n * - Tension/relief distribution\n * - Beat density per section\n * - Climax positioning\n */\n private analyzePacing(state: CoherenceEngineState): CoherenceEngineState {\n const beats = state.beats;\n const issues: string[] = [];\n const suggestions: string[] = [];\n let score: number;\n let status: ComponentStatus;\n\n if (beats.length < 3) {\n score = 50.0;\n issues.push(\"Too few beats to assess pacing\");\n suggestions.push(\"Add more beats to establish proper pacing rhythm\");\n } else {\n // Analyze function distribution\n const functions = beats.map((b) => b.narrativeFunction.toLowerCase());\n\n // Check for climax positioning (should be in last third)\n const climaxPositions = functions\n .map((f, i) => (f.includes(\"climax\") ? i : -1))\n .filter((i) => i >= 0);\n\n if (climaxPositions.length === 0) {\n issues.push(\"No climax beat identified\");\n suggestions.push(\"Ensure at least one beat has a climax function\");\n } else {\n // Check if climax is too early\n const lastClimax = climaxPositions[climaxPositions.length - 1];\n const total = beats.length;\n if (lastClimax < total * 0.5) {\n issues.push(\"Climax occurs too early in the narrative\");\n suggestions.push(\n \"Move climax to later in the story or add post-climax resolution beats\"\n );\n }\n }\n\n // Check for consecutive high-tension beats\n const highTensionFuncs = [\n \"confrontation\",\n \"crisis\",\n \"climax\",\n \"revelation\",\n ];\n let consecutiveHigh = 0;\n let maxConsecutive = 0;\n\n for (const func of functions) {\n if (highTensionFuncs.some((ht) => func.includes(ht))) {\n consecutiveHigh += 1;\n maxConsecutive = Math.max(maxConsecutive, consecutiveHigh);\n } else {\n consecutiveHigh = 0;\n }\n }\n\n if (maxConsecutive > 3) {\n issues.push(\n `Found ${maxConsecutive} consecutive high-tension beats`\n );\n suggestions.push(\n \"Add breathing room with quieter beats between intense moments\"\n );\n }\n\n // Calculate score\n let baseScore = 85.0;\n if (climaxPositions.length === 0) {\n baseScore -= 20;\n } else if (climaxPositions[climaxPositions.length - 1] < beats.length * 0.5) {\n baseScore -= 15;\n }\n baseScore -= Math.min(20, maxConsecutive * 5);\n\n score = Math.max(0.0, Math.min(100.0, baseScore));\n }\n\n // Determine status\n if (score >= 70) {\n status = \"good\";\n } else if (score >= 50) {\n status = \"warning\";\n } else {\n status = \"critical\";\n }\n\n state.pacingScore = createComponentScore(score, status, {\n issues,\n suggestions,\n });\n\n return state;\n }\n\n /**\n * Analyze how well themes permeate the narrative.\n *\n * Checks:\n * - Theme presence across beats\n * - Theme introduction and payoff\n * - Theme strength consistency\n */\n private analyzeThemeSaturation(\n state: CoherenceEngineState\n ): CoherenceEngineState {\n const beats = state.beats;\n const themes = state.themes;\n const issues: string[] = [];\n const suggestions: string[] = [];\n let score: number;\n let status: ComponentStatus;\n\n if (themes.length === 0) {\n score = 50.0;\n issues.push(\"No themes defined\");\n suggestions.push(\n \"Define thematic threads to enable saturation analysis\"\n );\n } else {\n // Track theme presence\n const themeCoverage: Record<string, number> = {};\n\n for (const theme of themes) {\n // Calculate theme presence across beats\n let beatsWithTheme = 0;\n for (const beat of beats) {\n if (beat.thematicTags?.includes(theme.id)) {\n beatsWithTheme += 1;\n }\n }\n\n const coverage = beatsWithTheme / Math.max(beats.length, 1);\n themeCoverage[theme.name] = coverage;\n\n // Check for underdeveloped themes\n if (coverage < 0.2 && theme.strength > 0.5) {\n issues.push(\n `Theme '${theme.name}' is important but appears rarely`\n );\n suggestions.push(\n `Weave '${theme.name}' into more beats to fulfill its promise`\n );\n }\n\n // Check for theme that appears but never pays off\n if (coverage > 0.3 && theme.strength < 0.3) {\n issues.push(\n `Theme '${theme.name}' appears often but lacks impact`\n );\n suggestions.push(\n `Strengthen the thematic weight of '${theme.name}' in key beats`\n );\n }\n }\n\n // Calculate average coverage\n const coverageValues = Object.values(themeCoverage);\n const avgCoverage =\n coverageValues.reduce((a, b) => a + b, 0) /\n Math.max(coverageValues.length, 1);\n\n // Score based on coverage and issues\n let baseScore = Math.min(100.0, avgCoverage * 100 + 20); // Base on coverage + buffer\n baseScore -= issues.filter((i) => i.includes(\"rarely\")).length * 10;\n baseScore -= issues.filter((i) => i.includes(\"lacks impact\")).length * 8;\n\n score = Math.max(0.0, Math.min(100.0, baseScore));\n }\n\n // Determine status\n if (score >= 70) {\n status = \"good\";\n } else if (score >= 50) {\n status = \"warning\";\n } else {\n status = \"critical\";\n }\n\n state.themeSaturationScore = createComponentScore(score, status, {\n issues,\n suggestions,\n });\n\n return state;\n }\n\n /**\n * Analyze narrative continuity.\n *\n * Checks:\n * - Timeline consistency\n * - Detail consistency across beats\n * - Setting/location coherence\n */\n private analyzeContinuity(state: CoherenceEngineState): CoherenceEngineState {\n const beats = state.beats;\n const issues: string[] = [];\n const suggestions: string[] = [];\n let score: number;\n let status: ComponentStatus;\n\n if (beats.length < 2) {\n score = 70.0; // Default to passing if not enough to analyze\n issues.push(\"Too few beats for continuity analysis\");\n } else {\n // Check sequence ordering\n const sequences = beats.map((b) => b.sequence);\n const sortedSequences = [...sequences].sort((a, b) => a - b);\n\n if (JSON.stringify(sequences) !== JSON.stringify(sortedSequences)) {\n issues.push(\"Beat sequences are not in order\");\n suggestions.push(\"Reorder beats to ensure logical sequence progression\");\n }\n\n // Check for duplicate sequences\n if (sequences.length !== new Set(sequences).size) {\n issues.push(\"Duplicate beat sequence numbers found\");\n suggestions.push(\"Ensure each beat has a unique sequence number\");\n }\n\n // Check for gaps in sequence\n const maxSeq = Math.max(...sequences);\n const expected = new Set(\n Array.from({ length: maxSeq }, (_, i) => i + 1)\n );\n const actual = new Set(sequences);\n const missing = [...expected].filter((x) => !actual.has(x));\n\n if (missing.length > 0 && missing.length <= 3) {\n // Small gaps are issues\n issues.push(`Missing beat sequences: ${missing.sort().join(\", \")}`);\n suggestions.push(\"Fill in missing beat sequences or renumber\");\n }\n\n // Calculate score\n let baseScore = 90.0;\n baseScore -= issues.filter((i) => i.includes(\"not in order\")).length * 20;\n baseScore -= issues.filter((i) => i.includes(\"Duplicate\")).length * 15;\n baseScore -= issues.filter((i) => i.includes(\"Missing\")).length * 5;\n\n score = Math.max(0.0, Math.min(100.0, baseScore));\n }\n\n // Determine status\n if (score >= 70) {\n status = \"good\";\n } else if (score >= 50) {\n status = \"warning\";\n } else {\n status = \"critical\";\n }\n\n state.continuityScore = createComponentScore(score, status, {\n issues,\n suggestions,\n });\n\n return state;\n }\n\n /**\n * Calculate the overall coherence score from components.\n */\n private calculateOverallScore(\n state: CoherenceEngineState\n ): CoherenceEngineState {\n const components = [\n state.narrativeFlowScore,\n state.characterConsistencyScore,\n state.pacingScore,\n state.themeSaturationScore,\n state.continuityScore,\n ];\n\n const validScores = components\n .filter((c): c is ComponentScore => c !== undefined)\n .map((c) => c.score);\n\n if (validScores.length > 0) {\n // Weighted average (narrative flow and character consistency weighted higher)\n const weights = [1.2, 1.2, 1.0, 1.0, 0.8]; // Matches component order\n const weightedSum = validScores.reduce(\n (sum, s, i) => sum + s * weights[i],\n 0\n );\n const totalWeight = weights\n .slice(0, validScores.length)\n .reduce((a, b) => a + b, 0);\n state.overallScore = weightedSum / totalWeight;\n } else {\n state.overallScore = 50.0;\n }\n\n return state;\n }\n\n /**\n * Identify narrative gaps from component analyses.\n */\n private identifyGaps(state: CoherenceEngineState): CoherenceEngineState {\n const gaps: Gap[] = [];\n\n // Extract issues from each component\n const componentMappings: [keyof CoherenceEngineState, GapType][] = [\n [\"narrativeFlowScore\", GapType.STRUCTURAL],\n [\"characterConsistencyScore\", GapType.CHARACTER],\n [\"pacingScore\", GapType.STRUCTURAL],\n [\"themeSaturationScore\", GapType.THEMATIC],\n [\"continuityScore\", GapType.CONTINUITY],\n ];\n\n for (const [componentKey, gapType] of componentMappings) {\n const component = state[componentKey] as ComponentScore | undefined;\n if (component?.issues) {\n for (const issue of component.issues) {\n // Determine severity\n let severity: GapSeverity;\n if (component.status === \"critical\") {\n severity = GapSeverity.CRITICAL;\n } else if (issue.includes(\"rarely\") || issue.includes(\"disappears\")) {\n severity = GapSeverity.MODERATE;\n } else {\n severity = GapSeverity.MINOR;\n }\n\n // Determine routing\n let route: RoutingTarget;\n if (gapType === GapType.STRUCTURAL) {\n route = RoutingTarget.STRUCTURIST;\n } else if (gapType === GapType.CHARACTER) {\n route = RoutingTarget.STORYTELLER;\n } else if (gapType === GapType.THEMATIC) {\n route = RoutingTarget.STRUCTURIST;\n } else if (gapType === GapType.SENSORY) {\n route = RoutingTarget.STORYTELLER;\n } else {\n // CONTINUITY\n route = RoutingTarget.AUTHOR;\n }\n\n gaps.push(\n createGap(\n this.generateGapId(),\n gapType,\n severity,\n issue,\n route,\n { location: { component: componentKey } }\n )\n );\n }\n }\n }\n\n // Sort by severity (critical first)\n const severityOrder: Record<GapSeverity, number> = {\n [GapSeverity.CRITICAL]: 0,\n [GapSeverity.MODERATE]: 1,\n [GapSeverity.MINOR]: 2,\n };\n gaps.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n\n state.gaps = gaps;\n\n return state;\n }\n\n /**\n * Generate Trinity perspective assessment (Mia/Miette/Ava8).\n *\n * Each persona provides feedback aligned with their perspective:\n * - Mia 🧠: Structural/logical analysis\n * - Miette 🌸: Emotional/resonance analysis\n * - Ava8 🎨: Atmospheric/sensory analysis\n */\n private generateTrinityAssessment(\n state: CoherenceEngineState\n ): CoherenceEngineState {\n const gaps = state.gaps || [];\n\n // Component scores\n const flow = state.narrativeFlowScore;\n const character = state.characterConsistencyScore;\n const pacing = state.pacingScore;\n const theme = state.themeSaturationScore;\n const continuity = state.continuityScore;\n\n // Build Mia's assessment (structural)\n const miaParts: string[] = [];\n if (flow) {\n miaParts.push(`Structure is ${flow.score.toFixed(0)}% sound.`);\n if (flow.issues.length > 0) {\n miaParts.push(`Key structural gap: ${flow.issues[0]}`);\n }\n }\n if (pacing && pacing.score < 70) {\n miaParts.push(`Pacing needs attention (${pacing.score.toFixed(0)}%).`);\n if (pacing.suggestions.length > 0) {\n miaParts.push(pacing.suggestions[0]);\n }\n }\n if (continuity && continuity.score < 80) {\n miaParts.push(\n `Continuity has ${continuity.issues.length} issues to address.`\n );\n }\n\n const mia =\n miaParts.length > 0\n ? miaParts.join(\" \")\n : \"Structure analysis unavailable.\";\n\n // Build Miette's assessment (emotional)\n const mietteParts: string[] = [];\n if (character) {\n if (character.score >= 80) {\n mietteParts.push(\"Character arcs are resonating well.\");\n } else {\n mietteParts.push(\n `Character consistency is ${character.score.toFixed(0)}%.`\n );\n if (character.issues.length > 0) {\n mietteParts.push(`The emotional gap: ${character.issues[0]}`);\n }\n }\n }\n if (theme) {\n if (theme.score >= 70) {\n mietteParts.push(\"Themes are landing with emotional weight.\");\n } else {\n mietteParts.push(\"Themes need stronger emotional anchoring.\");\n }\n }\n if (flow?.issues) {\n const jarring = flow.issues.filter((i) => i.includes(\"Jarring\"));\n if (jarring.length > 0) {\n mietteParts.push(\"Emotional transitions feel abrupt in places.\");\n }\n }\n\n const miette =\n mietteParts.length > 0\n ? mietteParts.join(\" \")\n : \"Emotional analysis unavailable.\";\n\n // Build Ava8's assessment (atmospheric)\n const ava8Parts: string[] = [];\n const sensoryGaps = gaps.filter((g) => g.gapType === GapType.SENSORY);\n if (sensoryGaps.length > 0) {\n ava8Parts.push(`Found ${sensoryGaps.length} sensory gaps to address.`);\n }\n\n if (pacing && pacing.score >= 70) {\n ava8Parts.push(\"Atmospheric rhythm feels balanced.\");\n } else {\n ava8Parts.push(\"Atmosphere could use more grounding moments.\");\n }\n\n // Check for consecutive high-tension (affects atmosphere)\n if (\n pacing?.issues.some((i) => i.includes(\"consecutive high-tension\"))\n ) {\n ava8Parts.push(\n \"The dense tension sections may benefit from visual breathing room.\"\n );\n }\n\n const ava8 =\n ava8Parts.length > 0\n ? ava8Parts.join(\" \")\n : \"Atmospheric analysis unavailable.\";\n\n // Determine priorities\n const priorities: string[] = [];\n const criticalGaps = gaps.filter(\n (g) => g.severity === GapSeverity.CRITICAL\n );\n if (criticalGaps.length > 0) {\n priorities.push(...criticalGaps.slice(0, 3).map((g) => g.description));\n } else {\n const moderateGaps = gaps.filter(\n (g) => g.severity === GapSeverity.MODERATE\n );\n if (moderateGaps.length > 0) {\n priorities.push(\n ...moderateGaps.slice(0, 3).map((g) => g.description)\n );\n }\n }\n\n if (priorities.length === 0) {\n priorities.push(\"Minor polish items only - narrative is coherent\");\n }\n\n state.trinityAssessment = createTrinityAssessment(\n mia,\n miette,\n ava8,\n priorities\n );\n\n return state;\n }\n\n /**\n * Build the final coherence result object.\n */\n private buildCoherenceResult(\n state: CoherenceEngineState\n ): CoherenceEngineState {\n state.coherenceScore = createCoherenceScore(\n state.overallScore || 50.0,\n state.narrativeFlowScore ||\n createComponentScore(50, \"warning\"),\n state.characterConsistencyScore ||\n createComponentScore(50, \"warning\"),\n state.pacingScore || createComponentScore(50, \"warning\"),\n state.themeSaturationScore ||\n createComponentScore(50, \"warning\"),\n state.continuityScore ||\n createComponentScore(50, \"warning\")\n );\n\n return state;\n }\n\n /**\n * Analyze narrative coherence.\n *\n * @param beats List of story beats to analyze\n * @param characters Optional list of character states\n * @param themes Optional list of thematic threads\n * @param includeMetadata Whether to include full analysis state\n * @returns CoherenceResult with coherenceScore, gaps, and trinityAssessment\n */\n analyze(\n beats: StoryBeat[],\n characters: CharacterState[] = [],\n themes: ThematicThread[] = [],\n includeMetadata: boolean = false\n ): CoherenceResult | CoherenceEngineState {\n // Initialize state\n let state: CoherenceEngineState = {\n beats,\n characters,\n themes,\n };\n\n // Run analysis pipeline\n state = this.analyzeNarrativeFlow(state);\n state = this.analyzeCharacterConsistency(state);\n state = this.analyzePacing(state);\n state = this.analyzeThemeSaturation(state);\n state = this.analyzeContinuity(state);\n state = this.calculateOverallScore(state);\n state = this.identifyGaps(state);\n state = this.generateTrinityAssessment(state);\n state = this.buildCoherenceResult(state);\n\n if (includeMetadata) {\n return state;\n } else {\n return {\n coherenceScore: state.coherenceScore!,\n gaps: state.gaps || [],\n trinityAssessment: state.trinityAssessment!,\n };\n }\n }\n\n /**\n * Group gaps by their routing target.\n *\n * @param gaps List of identified gaps\n * @returns Dictionary mapping routing target to list of gaps\n */\n getRoutingSuggestions(gaps: Gap[]): Record<RoutingTarget, Gap[]> {\n const routing: Record<RoutingTarget, Gap[]> = {\n [RoutingTarget.STORYTELLER]: [],\n [RoutingTarget.STRUCTURIST]: [],\n [RoutingTarget.ARCHITECT]: [],\n [RoutingTarget.AUTHOR]: [],\n };\n\n for (const gap of gaps) {\n routing[gap.suggestedRoute].push(gap);\n }\n\n return routing;\n }\n}\n","/**\n * Emotional Beat Classifier Node\n *\n * A node that classifies the emotional tone of story beats.\n */\n\nimport type { NCPStoryBeat } from \"../schemas/ncp.js\";\n\n/**\n * Predefined emotional tone categories.\n */\nexport enum EmotionalTone {\n DEVASTATING = \"Devastating\",\n HOPEFUL = \"Hopeful\",\n TENSE = \"Tense\",\n JOYFUL = \"Joyful\",\n MELANCHOLIC = \"Melancholic\",\n TRIUMPHANT = \"Triumphant\",\n FEARFUL = \"Fearful\",\n PEACEFUL = \"Peaceful\",\n CONFLICTED = \"Conflicted\",\n RESIGNED = \"Resigned\",\n}\n\n/**\n * Classification result.\n */\nexport interface ClassificationResult {\n classification: string;\n confidence: number;\n method: string;\n prompt?: string;\n}\n\n/**\n * State for emotional classification.\n */\nexport interface EmotionalClassificationState {\n ncpData?: {\n storybeats: NCPStoryBeat[];\n getStorybeat?: (id: string) => NCPStoryBeat | undefined;\n };\n storybeatId?: string;\n emotionalClassification?: string;\n confidenceScore?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Keyword mappings for emotional tones.\n */\nexport const TONE_KEYWORDS: Record<EmotionalTone, string[]> = {\n [EmotionalTone.DEVASTATING]: [\"destroy\", \"loss\", \"death\", \"tragedy\", \"grief\", \"devastat\"],\n [EmotionalTone.HOPEFUL]: [\"hope\", \"bright\", \"promise\", \"future\", \"optimis\", \"dream\"],\n [EmotionalTone.TENSE]: [\"tense\", \"anxious\", \"nervous\", \"edge\", \"suspense\", \"uncertain\"],\n [EmotionalTone.JOYFUL]: [\"joy\", \"happy\", \"celebrate\", \"triumph\", \"delight\", \"elat\"],\n [EmotionalTone.MELANCHOLIC]: [\"sad\", \"melanchol\", \"wistful\", \"longing\", \"regret\", \"sorrow\"],\n [EmotionalTone.TRIUMPHANT]: [\"victory\", \"triumph\", \"succeed\", \"conquer\", \"win\", \"achieve\"],\n [EmotionalTone.FEARFUL]: [\"fear\", \"terror\", \"dread\", \"frighten\", \"horror\", \"panic\"],\n [EmotionalTone.PEACEFUL]: [\"peace\", \"calm\", \"serene\", \"tranquil\", \"quiet\", \"still\"],\n [EmotionalTone.CONFLICTED]: [\"conflict\", \"torn\", \"struggle\", \"dilemma\", \"uncertain\", \"doubt\"],\n [EmotionalTone.RESIGNED]: [\"resign\", \"accept\", \"inevitable\", \"surrender\", \"fate\", \"give up\"],\n};\n\n/**\n * Classifies the emotional tone of story beats.\n *\n * This node enriches the narrative graph with emotional metadata,\n * enabling new forms of analysis and visualization.\n *\n * @example\n * const classifier = new EmotionalBeatClassifierNode();\n * const result = classifier.classifyBeat({\n * storybeatId: \"beat_1\",\n * title: \"The Final Goodbye\",\n * description: \"She said goodbye for the last time, grief overwhelming her.\"\n * });\n * console.log(result.classification); // \"Devastating\"\n */\nexport class EmotionalBeatClassifierNode {\n private useLLM: boolean;\n private modelName?: string;\n private categories: string[];\n\n constructor(options: {\n useLLM?: boolean;\n modelName?: string;\n customCategories?: string[];\n } = {}) {\n this.useLLM = options.useLLM ?? true;\n this.modelName = options.modelName;\n this.categories = options.customCategories ?? Object.values(EmotionalTone);\n }\n\n /**\n * Classify the emotional tone of a story beat.\n *\n * @param storybeat The story beat to classify\n * @param context Optional additional context for classification\n * @returns Classification result with confidence score\n */\n classifyBeat(\n storybeat: NCPStoryBeat,\n context?: string\n ): ClassificationResult {\n // If beat already has emotional_weight, use it as baseline\n if (storybeat.emotionalWeight) {\n return {\n classification: storybeat.emotionalWeight,\n confidence: 1.0,\n method: \"existing\",\n };\n }\n\n if (this.useLLM) {\n return this.classifyWithLLM(storybeat, context);\n } else {\n return this.classifyRuleBased(storybeat);\n }\n }\n\n /**\n * Classify using an LLM (placeholder implementation).\n */\n private classifyWithLLM(\n storybeat: NCPStoryBeat,\n context?: string\n ): ClassificationResult {\n // Build prompt for future LLM integration\n const prompt = this.buildClassificationPrompt(storybeat, context);\n\n // For now, fall back to rule-based\n const ruleBasedResult = this.classifyRuleBased(storybeat);\n\n return {\n classification: ruleBasedResult.classification,\n confidence: 0.8,\n method: \"llm_placeholder\",\n prompt,\n };\n }\n\n /**\n * Build the LLM classification prompt.\n */\n private buildClassificationPrompt(\n storybeat: NCPStoryBeat,\n context?: string\n ): string {\n const categoriesStr = this.categories.join(\", \");\n\n let prompt = `Classify the emotional tone of this story beat.\n\nStory Beat: ${storybeat.title}\nDescription: ${storybeat.description}\n\nAvailable categories: ${categoriesStr}\n\nAnalyze the emotional weight and tone of this beat. Consider:\n1. The language and imagery used\n2. The actions and events described\n3. The overall mood conveyed\n\nRespond with:\n1. The most appropriate emotional category\n2. A confidence score (0.0-1.0)\n3. A brief explanation of your classification\n\nClassification:`;\n\n if (context) {\n prompt = `${prompt}\\n\\nAdditional Context:\\n${context}\\n`;\n }\n\n return prompt;\n }\n\n /**\n * Simple rule-based classification using keyword matching.\n */\n classifyRuleBased(storybeat: NCPStoryBeat): ClassificationResult {\n const text = `${storybeat.title} ${storybeat.description}`.toLowerCase();\n\n // Score each tone based on keyword matches\n const scores: Record<string, number> = {};\n\n for (const [tone, keywords] of Object.entries(TONE_KEYWORDS)) {\n const score = keywords.filter((keyword) => text.includes(keyword)).length;\n if (score > 0) {\n scores[tone] = score;\n }\n }\n\n if (Object.keys(scores).length > 0) {\n // Return the tone with highest score\n const [bestTone, bestScore] = Object.entries(scores).reduce((a, b) =>\n a[1] > b[1] ? a : b\n );\n const confidence = Math.min(bestScore / 3.0, 1.0); // Cap at 1.0\n\n return {\n classification: bestTone,\n confidence,\n method: \"rule_based\",\n };\n } else {\n // Default to neutral/peaceful if no keywords match\n return {\n classification: EmotionalTone.PEACEFUL,\n confidence: 0.3,\n method: \"rule_based_default\",\n };\n }\n }\n\n /**\n * Node callable for LangGraph-style state processing.\n */\n call(state: EmotionalClassificationState): EmotionalClassificationState {\n if (!state.ncpData) {\n return {\n ...state,\n error: \"No NCP data loaded. Run NCPLoaderNode first.\",\n };\n }\n\n const ncpData = state.ncpData;\n const storybeatId = state.storybeatId;\n\n if (!storybeatId) {\n return {\n ...state,\n error: \"No storybeatId provided for classification.\",\n };\n }\n\n try {\n const storybeat = ncpData.getStorybeat?.(storybeatId) ??\n ncpData.storybeats.find((sb) => sb.storybeatId === storybeatId);\n\n if (!storybeat) {\n return {\n ...state,\n error: `Story beat not found: ${storybeatId}`,\n };\n }\n\n // Get context from metadata if available\n const context = state.metadata?.classificationContext as string | undefined;\n\n // Perform classification\n const result = this.classifyBeat(storybeat, context);\n\n return {\n ...state,\n emotionalClassification: result.classification,\n confidenceScore: result.confidence,\n error: undefined,\n metadata: {\n ...state.metadata,\n classificationMethod: result.method,\n },\n };\n } catch (e) {\n return {\n ...state,\n error: `Classification error: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n}\n\n/**\n * Classify a single text snippet for emotional tone.\n * Convenience function for quick classification without NCP data.\n */\nexport function classifyEmotionalTone(text: string): ClassificationResult {\n const classifier = new EmotionalBeatClassifierNode({ useLLM: false });\n return classifier.classifyRuleBased({\n storybeatId: \"temp\",\n title: \"\",\n description: text,\n moments: [],\n relatedPlayers: [],\n relatedStorypoints: [],\n metadata: {},\n });\n}\n","/**\n * Redis State Manager for Narrative Intelligence\n *\n * Provides Redis-backed persistence for the UnifiedNarrativeState,\n * enabling cross-system state sharing and mid-story resumption.\n *\n * This integrates with:\n * - Miadi-46's Redis patterns (webhook event storage)\n * - ava-langflow's redis_state.py (session state)\n * - LangGraph checkpointing (for graph state persistence)\n */\n\nimport {\n UnifiedNarrativeState,\n StoryBeat,\n ThreeUniverseAnalysis,\n RoutingDecision,\n RedisKeys,\n createUnifiedNarrativeState,\n serializeState,\n deserializeState,\n addBeat,\n addRoutingDecision,\n startNewEpisode,\n} from \"../schemas/unified_state_bridge.js\";\n\n/**\n * Configuration for Redis connection.\n */\nexport interface RedisConfig {\n host: string;\n port: number;\n db: number;\n password?: string;\n url?: string; // Alternative: full redis URL\n\n // TTL settings\n stateTtlHours: number;\n beatTtlHours: number;\n eventCacheTtlHours: number;\n\n // Connection pool\n maxConnections: number;\n decodeResponses: boolean;\n}\n\n/**\n * Create a RedisConfig with defaults.\n */\nexport function createRedisConfig(\n options: Partial<RedisConfig> = {}\n): RedisConfig {\n return {\n host: options.host ?? \"localhost\",\n port: options.port ?? 6379,\n db: options.db ?? 0,\n password: options.password,\n url: options.url,\n stateTtlHours: options.stateTtlHours ?? 168, // 1 week\n beatTtlHours: options.beatTtlHours ?? 720, // 30 days\n eventCacheTtlHours: options.eventCacheTtlHours ?? 24, // 1 day\n maxConnections: options.maxConnections ?? 10,\n decodeResponses: options.decodeResponses ?? true,\n };\n}\n\n/**\n * Redis client interface for compatibility with various Redis clients.\n */\nexport interface RedisClient {\n ping(): Promise<string>;\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<unknown>;\n setex(key: string, ttl: number, value: string): Promise<unknown>;\n del(...keys: string[]): Promise<number>;\n keys(pattern: string): Promise<string[]>;\n rpush(key: string, value: string): Promise<number>;\n lrange(key: string, start: number, end: number): Promise<string[]>;\n ltrim(key: string, start: number, end: number): Promise<unknown>;\n expire(key: string, ttl: number): Promise<unknown>;\n quit(): Promise<unknown>;\n}\n\n/**\n * Health check result.\n */\nexport interface HealthCheckResult {\n status: \"healthy\" | \"unhealthy\";\n connected: boolean;\n latencyMs?: number;\n error?: string;\n timestamp: string;\n}\n\n/**\n * Redis-backed state management for narrative intelligence.\n *\n * Responsibilities:\n * - Store and retrieve UnifiedNarrativeState\n * - Manage story beat persistence\n * - Cache three-universe analysis results\n * - Track routing decision history\n * - Enable cross-system state sharing\n *\n * @example\n * const manager = new NarrativeRedisManager(createRedisConfig());\n * await manager.connect();\n *\n * // Get or create state\n * const state = await manager.getOrCreateState(\"story_123\", \"session_456\");\n *\n * // Add a beat\n * await manager.addBeat(\"session_456\", beat);\n *\n * // Get current state\n * const state = await manager.getState(\"session_456\");\n *\n * await manager.disconnect();\n */\nexport class NarrativeRedisManager {\n private config: RedisConfig;\n private redis: RedisClient | null = null;\n private connected = false;\n\n constructor(config?: RedisConfig) {\n this.config = config ?? createRedisConfig();\n }\n\n /**\n * Establish Redis connection.\n */\n async connect(client?: RedisClient): Promise<void> {\n if (client) {\n // Use provided client\n this.redis = client;\n await this.redis.ping();\n this.connected = true;\n return;\n }\n\n // Try to use ioredis if available\n try {\n // Dynamic import for optional Redis dependency\n const Redis = await import(\"ioredis\").then((m) => m.default).catch(() => null);\n\n if (Redis) {\n const redisUrl =\n this.config.url ??\n `redis://${this.config.password ? `:${this.config.password}@` : \"\"}${this.config.host}:${this.config.port}/${this.config.db}`;\n\n const redis = new Redis(redisUrl);\n await redis.ping();\n\n this.redis = {\n ping: () => redis.ping(),\n get: (key) => redis.get(key),\n set: (key, value) => redis.set(key, value),\n setex: (key, ttl, value) => redis.setex(key, ttl, value),\n del: (...keys) => redis.del(...keys),\n keys: (pattern) => redis.keys(pattern),\n rpush: (key, value) => redis.rpush(key, value),\n lrange: (key, start, end) => redis.lrange(key, start, end),\n ltrim: (key, start, end) => redis.ltrim(key, start, end),\n expire: (key, ttl) => redis.expire(key, ttl),\n quit: () => redis.quit(),\n };\n this.connected = true;\n console.log(\"Connected to Redis for narrative state management\");\n return;\n }\n } catch {\n // Redis not available, use mock\n }\n\n // Fall back to mock\n console.log(\"Redis not available, using mock mode\");\n this.redis = new MockRedis();\n this.connected = true;\n }\n\n /**\n * Close Redis connection.\n */\n async disconnect(): Promise<void> {\n if (this.redis) {\n await this.redis.quit();\n }\n this.connected = false;\n }\n\n // =========================================================================\n // State Management\n // =========================================================================\n\n /**\n * Retrieve narrative state for a session.\n */\n async getState(sessionId: string): Promise<UnifiedNarrativeState | null> {\n if (!this.redis) return null;\n\n const key = RedisKeys.state(sessionId);\n const data = await this.redis.get(key);\n\n if (data) {\n try {\n return deserializeState(data);\n } catch (e) {\n console.error(`Failed to deserialize state for ${sessionId}:`, e);\n return null;\n }\n }\n return null;\n }\n\n /**\n * Get existing state or create new one.\n */\n async getOrCreateState(\n storyId: string,\n sessionId: string,\n options: {\n includeDefaultCharacters?: boolean;\n includeDefaultThemes?: boolean;\n } = {}\n ): Promise<UnifiedNarrativeState> {\n const existing = await this.getState(sessionId);\n if (existing) {\n return existing;\n }\n\n // Create new state\n const state = createUnifiedNarrativeState(storyId, sessionId, options);\n\n // Save it\n await this.saveState(state);\n\n return state;\n }\n\n /**\n * Save narrative state to Redis.\n */\n async saveState(state: UnifiedNarrativeState): Promise<boolean> {\n if (!this.redis) return false;\n\n try {\n const key = RedisKeys.state(state.sessionId);\n state.updatedAt = new Date().toISOString();\n\n const ttlSeconds = this.config.stateTtlHours * 3600;\n await this.redis.setex(key, ttlSeconds, serializeState(state));\n\n // Also update \"current\" pointer if this is the active state\n await this.redis.set(RedisKeys.currentState(), state.sessionId);\n\n return true;\n } catch (e) {\n console.error(\"Failed to save state:\", e);\n return false;\n }\n }\n\n /**\n * Get the ID of the currently active session.\n */\n async getCurrentSessionId(): Promise<string | null> {\n if (!this.redis) return null;\n return this.redis.get(RedisKeys.currentState());\n }\n\n /**\n * Set the currently active session.\n */\n async setCurrentSession(sessionId: string): Promise<void> {\n if (this.redis) {\n await this.redis.set(RedisKeys.currentState(), sessionId);\n }\n }\n\n // =========================================================================\n // Beat Management\n // =========================================================================\n\n /**\n * Add a story beat to the session.\n */\n async addBeatToSession(\n sessionId: string,\n beat: StoryBeat\n ): Promise<boolean> {\n if (!this.redis) return false;\n\n try {\n // Store individual beat\n const beatKey = RedisKeys.beat(beat.id);\n const ttlSeconds = this.config.beatTtlHours * 3600;\n await this.redis.setex(beatKey, ttlSeconds, JSON.stringify(beat));\n\n // Add to session's beat list\n const beatsKey = RedisKeys.beats(sessionId);\n await this.redis.rpush(beatsKey, beat.id);\n await this.redis.expire(beatsKey, ttlSeconds);\n\n // Update state\n const state = await this.getState(sessionId);\n if (state) {\n addBeat(state, beat);\n await this.saveState(state);\n }\n\n return true;\n } catch (e) {\n console.error(\"Failed to add beat:\", e);\n return false;\n }\n }\n\n /**\n * Retrieve a specific beat by ID.\n */\n async getBeat(beatId: string): Promise<StoryBeat | null> {\n if (!this.redis) return null;\n\n const key = RedisKeys.beat(beatId);\n const data = await this.redis.get(key);\n\n if (data) {\n try {\n return JSON.parse(data) as StoryBeat;\n } catch (e) {\n console.error(`Failed to deserialize beat ${beatId}:`, e);\n return null;\n }\n }\n return null;\n }\n\n /**\n * Get the most recent beats for a session.\n */\n async getRecentBeats(\n sessionId: string,\n count: number = 10\n ): Promise<StoryBeat[]> {\n if (!this.redis) return [];\n\n const beatsKey = RedisKeys.beats(sessionId);\n const beatIds = await this.redis.lrange(beatsKey, -count, -1);\n\n const beats: StoryBeat[] = [];\n for (const beatId of beatIds.reverse()) {\n // Most recent first\n const beat = await this.getBeat(beatId);\n if (beat) {\n beats.push(beat);\n }\n }\n\n return beats;\n }\n\n // =========================================================================\n // Event Analysis Caching\n // =========================================================================\n\n /**\n * Cache three-universe analysis for a webhook event.\n */\n async cacheEventAnalysis(\n eventId: string,\n analysis: ThreeUniverseAnalysis\n ): Promise<boolean> {\n if (!this.redis) return false;\n\n try {\n const key = RedisKeys.eventAnalysis(eventId);\n const ttlSeconds = this.config.eventCacheTtlHours * 3600;\n await this.redis.setex(key, ttlSeconds, JSON.stringify(analysis));\n return true;\n } catch (e) {\n console.error(\"Failed to cache event analysis:\", e);\n return false;\n }\n }\n\n /**\n * Retrieve cached analysis for an event.\n */\n async getCachedAnalysis(\n eventId: string\n ): Promise<ThreeUniverseAnalysis | null> {\n if (!this.redis) return null;\n\n const key = RedisKeys.eventAnalysis(eventId);\n const data = await this.redis.get(key);\n\n if (data) {\n try {\n return JSON.parse(data) as ThreeUniverseAnalysis;\n } catch (e) {\n console.error(`Failed to deserialize analysis for ${eventId}:`, e);\n return null;\n }\n }\n return null;\n }\n\n // =========================================================================\n // Routing History\n // =========================================================================\n\n /**\n * Record a routing decision for learning and tracing.\n */\n async recordRoutingDecision(\n sessionId: string,\n decision: RoutingDecision\n ): Promise<boolean> {\n if (!this.redis) return false;\n\n try {\n const key = RedisKeys.routingHistory(sessionId);\n await this.redis.rpush(key, JSON.stringify(decision));\n\n // Keep only last 100 decisions per session\n await this.redis.ltrim(key, -100, -1);\n\n // Update state\n const state = await this.getState(sessionId);\n if (state) {\n addRoutingDecision(state, decision);\n await this.saveState(state);\n }\n\n return true;\n } catch (e) {\n console.error(\"Failed to record routing decision:\", e);\n return false;\n }\n }\n\n /**\n * Get recent routing decisions for a session.\n */\n async getRoutingHistory(\n sessionId: string,\n count: number = 50\n ): Promise<RoutingDecision[]> {\n if (!this.redis) return [];\n\n const key = RedisKeys.routingHistory(sessionId);\n const dataList = await this.redis.lrange(key, -count, -1);\n\n const decisions: RoutingDecision[] = [];\n for (const data of dataList) {\n try {\n decisions.push(JSON.parse(data) as RoutingDecision);\n } catch (e) {\n console.warn(\"Failed to deserialize routing decision:\", e);\n }\n }\n\n return decisions;\n }\n\n // =========================================================================\n // Episode Management\n // =========================================================================\n\n /**\n * Mark the start of a new episode.\n */\n async startNewEpisode(\n sessionId: string,\n episodeId: string\n ): Promise<boolean> {\n const state = await this.getState(sessionId);\n if (state) {\n startNewEpisode(state, episodeId);\n return this.saveState(state);\n }\n return false;\n }\n\n /**\n * Get all beats for an episode.\n */\n async getEpisodeBeats(episodeId: string): Promise<StoryBeat[]> {\n if (!this.redis) return [];\n\n const key = RedisKeys.episode(episodeId);\n const data = await this.redis.get(key);\n\n if (data) {\n try {\n const episodeData = JSON.parse(data);\n const beatIds = episodeData.beat_ids || [];\n const beats: StoryBeat[] = [];\n\n for (const beatId of beatIds) {\n const beat = await this.getBeat(beatId);\n if (beat) {\n beats.push(beat);\n }\n }\n return beats;\n } catch (e) {\n console.error(\"Failed to get episode beats:\", e);\n return [];\n }\n }\n return [];\n }\n\n // =========================================================================\n // Utility Methods\n // =========================================================================\n\n /**\n * List all session IDs matching pattern.\n */\n async listSessions(pattern: string = \"ncp:state:*\"): Promise<string[]> {\n if (!this.redis) return [];\n\n const keys = await this.redis.keys(pattern);\n return keys\n .filter((k) => k !== \"ncp:state:current\")\n .map((k) => k.replace(\"ncp:state:\", \"\"));\n }\n\n /**\n * Delete all data for a session.\n */\n async deleteSession(sessionId: string): Promise<boolean> {\n if (!this.redis) return false;\n\n try {\n // Get beat IDs first\n const beatsKey = RedisKeys.beats(sessionId);\n const beatIds = await this.redis.lrange(beatsKey, 0, -1);\n\n // Delete beats\n for (const beatId of beatIds) {\n await this.redis.del(RedisKeys.beat(beatId));\n }\n\n // Delete session keys\n await this.redis.del(\n RedisKeys.state(sessionId),\n RedisKeys.beats(sessionId),\n RedisKeys.routingHistory(sessionId)\n );\n\n console.log(`Deleted session ${sessionId}`);\n return true;\n } catch (e) {\n console.error(\"Failed to delete session:\", e);\n return false;\n }\n }\n\n /**\n * Check Redis connection health.\n */\n async healthCheck(): Promise<HealthCheckResult> {\n try {\n const start = Date.now();\n if (this.redis) {\n await this.redis.ping();\n }\n const latency = Date.now() - start;\n\n return {\n status: \"healthy\",\n connected: this.connected,\n latencyMs: latency,\n timestamp: new Date().toISOString(),\n };\n } catch (e) {\n return {\n status: \"unhealthy\",\n connected: this.connected,\n error: e instanceof Error ? e.message : String(e),\n timestamp: new Date().toISOString(),\n };\n }\n }\n}\n\n/**\n * Mock Redis for development/testing without real Redis.\n * Stores data in memory, mimics async Redis API.\n */\nexport class MockRedis implements RedisClient {\n private data: Map<string, string> = new Map();\n private lists: Map<string, string[]> = new Map();\n private expiry: Map<string, number> = new Map();\n\n async ping(): Promise<string> {\n return \"PONG\";\n }\n\n async get(key: string): Promise<string | null> {\n this.checkExpiry(key);\n return this.data.get(key) ?? null;\n }\n\n async set(key: string, value: string): Promise<string> {\n this.data.set(key, value);\n return \"OK\";\n }\n\n async setex(key: string, ttl: number, value: string): Promise<string> {\n this.data.set(key, value);\n this.expiry.set(key, Date.now() + ttl * 1000);\n return \"OK\";\n }\n\n async del(...keys: string[]): Promise<number> {\n let count = 0;\n for (const key of keys) {\n if (this.data.delete(key)) count++;\n if (this.lists.delete(key)) count++;\n }\n return count;\n }\n\n async keys(pattern: string): Promise<string[]> {\n const regex = new RegExp(\n \"^\" + pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\") + \"$\"\n );\n return [...this.data.keys(), ...this.lists.keys()].filter((k) =>\n regex.test(k)\n );\n }\n\n async rpush(key: string, value: string): Promise<number> {\n if (!this.lists.has(key)) {\n this.lists.set(key, []);\n }\n this.lists.get(key)!.push(value);\n return this.lists.get(key)!.length;\n }\n\n async lrange(key: string, start: number, end: number): Promise<string[]> {\n const list = this.lists.get(key) ?? [];\n const actualEnd = end === -1 ? list.length : end + 1;\n const actualStart = start < 0 ? Math.max(0, list.length + start) : start;\n return list.slice(actualStart, actualEnd);\n }\n\n async ltrim(key: string, start: number, end: number): Promise<string> {\n const list = this.lists.get(key);\n if (list) {\n const actualEnd = end === -1 ? list.length : end + 1;\n const actualStart = start < 0 ? Math.max(0, list.length + start) : start;\n this.lists.set(key, list.slice(actualStart, actualEnd));\n }\n return \"OK\";\n }\n\n async expire(key: string, ttl: number): Promise<number> {\n this.expiry.set(key, Date.now() + ttl * 1000);\n return 1;\n }\n\n async quit(): Promise<string> {\n return \"OK\";\n }\n\n private checkExpiry(key: string): void {\n const expiry = this.expiry.get(key);\n if (expiry && Date.now() > expiry) {\n this.data.delete(key);\n this.lists.delete(key);\n this.expiry.delete(key);\n }\n }\n}\n\n/**\n * Get a configured narrative Redis manager.\n */\nexport async function getNarrativeManager(\n redisUrl?: string\n): Promise<NarrativeRedisManager> {\n const config = createRedisConfig(redisUrl ? { url: redisUrl } : {});\n const manager = new NarrativeRedisManager(config);\n await manager.connect();\n return manager;\n}\n","/**\n * Schema exports for narrative-intelligence\n */\n\n// Unified State Bridge\nexport {\n // Enums\n Universe,\n NarrativePhase,\n NarrativeFunction,\n // Interfaces\n UniversePerspective,\n ThreeUniverseAnalysis,\n NarrativePosition,\n StoryBeat,\n CharacterState,\n ThematicThread,\n RoutingDecision,\n UnifiedNarrativeState,\n // Factory functions\n createUniversePerspective,\n createThreeUniverseAnalysis,\n getPerspective,\n createNarrativePosition,\n createStoryBeat,\n createCharacterState,\n createThematicThread,\n createRoutingDecision,\n createUnifiedNarrativeState,\n // State manipulation\n addBeat,\n addRoutingDecision,\n updateCharacterArc,\n updateThemeStrength,\n getLastNBeats,\n calculateCoherence,\n shouldCreateNewEpisode,\n startNewEpisode,\n // Defaults\n getDefaultCharacters,\n getDefaultThemes,\n // Utilities\n createBeatFromWebhook,\n RedisKeys,\n serializeState,\n deserializeState,\n} from \"./unified_state_bridge.js\";\n\n// NCP types\nexport {\n // Interfaces\n Moment,\n StoryPoint,\n NCPStoryBeat,\n Player,\n Perspective,\n NCPData,\n // Factory functions\n createMoment,\n createStoryPoint,\n createNCPStoryBeat,\n createPlayer,\n createPerspective,\n createNCPData,\n // Query functions\n getPlayer,\n getPerspectiveById,\n getStorybeat,\n getStorypoint,\n getPlayerStorybeats,\n getStorybeatsByEmotionalWeight,\n // Serialization\n parseNCPData,\n serializeNCPData,\n} from \"./ncp.js\";\n","/**\n * Graph exports for narrative-intelligence\n */\n\n// Three Universe Processor\nexport {\n // Enums\n EventType,\n // Interfaces\n ProcessedEvent,\n ThreeUniverseState,\n AnalysisCallback,\n // Functions\n engineerIntentKeywords,\n ceremonyIntentKeywords,\n storyEngineIntentKeywords,\n analyzeEngineerPerspective,\n analyzeCeremonyPerspective,\n analyzeStoryEnginePerspective,\n synthesizePerspectives,\n // Main class\n ThreeUniverseProcessor,\n} from \"./three_universe_processor.js\";\n\n// Coherence Engine\nexport {\n // Enums\n GapType,\n GapSeverity,\n RoutingTarget,\n // Types\n ComponentStatus,\n // Interfaces\n Gap,\n ComponentScore,\n CoherenceScore,\n TrinityAssessment,\n CoherenceEngineState,\n CoherenceResult,\n // Factory functions\n createGap,\n createComponentScore,\n createCoherenceScore,\n createTrinityAssessment,\n // Main class\n NarrativeCoherenceEngine,\n} from \"./coherence_engine.js\";\n","/**\n * Node exports for narrative-intelligence\n */\n\nexport {\n // Enums\n EmotionalTone,\n // Interfaces\n ClassificationResult,\n EmotionalClassificationState,\n // Constants\n TONE_KEYWORDS,\n // Classes\n EmotionalBeatClassifierNode,\n // Functions\n classifyEmotionalTone,\n} from \"./emotional_classifier.js\";\n","/**\n * Integration exports for narrative-intelligence\n */\n\nexport {\n // Interfaces\n RedisConfig,\n RedisClient,\n HealthCheckResult,\n // Factory functions\n createRedisConfig,\n // Classes\n NarrativeRedisManager,\n MockRedis,\n // Convenience functions\n getNarrativeManager,\n} from \"./redis_state.js\";\n"],"mappings":"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","names":["Universe","NarrativePhase","NarrativeFunction","EventType","intent","calculateCoherence","GapType","GapSeverity","RoutingTarget","EmotionalTone"]}
@@ -0,0 +1,6 @@
1
+ export { C as CharacterState, N as NarrativeFunction, a as NarrativePhase, b as NarrativePosition, R as RedisKeys, c as RoutingDecision, S as StoryBeat, T as ThematicThread, d as ThreeUniverseAnalysis, U as UnifiedNarrativeState, e as Universe, f as UniversePerspective, g as addBeat, h as addRoutingDecision, i as calculateCoherence, j as createBeatFromWebhook, k as createCharacterState, l as createNarrativePosition, m as createRoutingDecision, n as createStoryBeat, o as createThematicThread, p as createThreeUniverseAnalysis, q as createUnifiedNarrativeState, r as createUniversePerspective, s as deserializeState, t as getDefaultCharacters, u as getDefaultThemes, v as getLastNBeats, w as getPerspective, x as serializeState, y as shouldCreateNewEpisode, z as startNewEpisode, A as updateCharacterArc, B as updateThemeStrength } from './unified_state_bridge-CIDm1kuf.cjs';
2
+ export { M as Moment, N as NCPData, a as NCPStoryBeat, P as Perspective, b as Player, S as StoryPoint, c as createMoment, d as createNCPData, e as createNCPStoryBeat, f as createPerspective, g as createPlayer, h as createStoryPoint, i as getPerspectiveById, j as getPlayer, k as getPlayerStorybeats, l as getStorybeat, m as getStorybeatsByEmotionalWeight, n as getStorypoint, p as parseNCPData, s as serializeNCPData } from './ncp-tXS9Jr9e.cjs';
3
+ export { A as AnalysisCallback, C as CoherenceEngineState, a as CoherenceResult, b as CoherenceScore, c as ComponentScore, d as ComponentStatus, E as EventType, G as Gap, e as GapSeverity, f as GapType, N as NarrativeCoherenceEngine, P as ProcessedEvent, R as RoutingTarget, T as ThreeUniverseProcessor, g as ThreeUniverseState, h as TrinityAssessment, i as analyzeCeremonyPerspective, j as analyzeEngineerPerspective, k as analyzeStoryEnginePerspective, l as ceremonyIntentKeywords, m as createCoherenceScore, n as createComponentScore, o as createGap, p as createTrinityAssessment, q as engineerIntentKeywords, r as graphs, s as storyEngineIntentKeywords, t as synthesizePerspectives } from './index-Btxk3nQm.cjs';
4
+ export { C as ClassificationResult, E as EmotionalBeatClassifierNode, a as EmotionalClassificationState, b as EmotionalTone, T as TONE_KEYWORDS, c as classifyEmotionalTone, i as nodes } from './index-CweT-D3c.cjs';
5
+ export { H as HealthCheckResult, M as MockRedis, N as NarrativeRedisManager, R as RedisClient, a as RedisConfig, c as createRedisConfig, g as getNarrativeManager, i as integrations } from './index-D71kh3nE.cjs';
6
+ export { i as schemas } from './index-D-zWH42e.cjs';
@@ -0,0 +1,6 @@
1
+ export { C as CharacterState, N as NarrativeFunction, a as NarrativePhase, b as NarrativePosition, R as RedisKeys, c as RoutingDecision, S as StoryBeat, T as ThematicThread, d as ThreeUniverseAnalysis, U as UnifiedNarrativeState, e as Universe, f as UniversePerspective, g as addBeat, h as addRoutingDecision, i as calculateCoherence, j as createBeatFromWebhook, k as createCharacterState, l as createNarrativePosition, m as createRoutingDecision, n as createStoryBeat, o as createThematicThread, p as createThreeUniverseAnalysis, q as createUnifiedNarrativeState, r as createUniversePerspective, s as deserializeState, t as getDefaultCharacters, u as getDefaultThemes, v as getLastNBeats, w as getPerspective, x as serializeState, y as shouldCreateNewEpisode, z as startNewEpisode, A as updateCharacterArc, B as updateThemeStrength } from './unified_state_bridge-CIDm1kuf.js';
2
+ export { M as Moment, N as NCPData, a as NCPStoryBeat, P as Perspective, b as Player, S as StoryPoint, c as createMoment, d as createNCPData, e as createNCPStoryBeat, f as createPerspective, g as createPlayer, h as createStoryPoint, i as getPerspectiveById, j as getPlayer, k as getPlayerStorybeats, l as getStorybeat, m as getStorybeatsByEmotionalWeight, n as getStorypoint, p as parseNCPData, s as serializeNCPData } from './ncp-tXS9Jr9e.js';
3
+ export { A as AnalysisCallback, C as CoherenceEngineState, a as CoherenceResult, b as CoherenceScore, c as ComponentScore, d as ComponentStatus, E as EventType, G as Gap, e as GapSeverity, f as GapType, N as NarrativeCoherenceEngine, P as ProcessedEvent, R as RoutingTarget, T as ThreeUniverseProcessor, g as ThreeUniverseState, h as TrinityAssessment, i as analyzeCeremonyPerspective, j as analyzeEngineerPerspective, k as analyzeStoryEnginePerspective, l as ceremonyIntentKeywords, m as createCoherenceScore, n as createComponentScore, o as createGap, p as createTrinityAssessment, q as engineerIntentKeywords, r as graphs, s as storyEngineIntentKeywords, t as synthesizePerspectives } from './index-CgXXxuIH.js';
4
+ export { C as ClassificationResult, E as EmotionalBeatClassifierNode, a as EmotionalClassificationState, b as EmotionalTone, T as TONE_KEYWORDS, c as classifyEmotionalTone, i as nodes } from './index-UamXITgg.js';
5
+ export { H as HealthCheckResult, M as MockRedis, N as NarrativeRedisManager, R as RedisClient, a as RedisConfig, c as createRedisConfig, g as getNarrativeManager, i as integrations } from './index-v9AlRC0M.js';
6
+ export { i as schemas } from './index-DApls3w2.js';