cogmem 3.6.2
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.
- package/BENCHMARKS.md +62 -0
- package/CHANGELOG.md +215 -0
- package/CONCURRENT_ACCESS.md +27 -0
- package/CONTRIBUTING.md +32 -0
- package/LICENSE +21 -0
- package/MEMORY_ATLAS.md +101 -0
- package/MEMORY_MODEL.md +179 -0
- package/README.md +751 -0
- package/RECALL_EXPLAINABILITY.md +152 -0
- package/RELEASE_CHECKLIST.md +92 -0
- package/SECURITY.md +21 -0
- package/dist/adapters/MarkdownSourceLoader.d.ts +5 -0
- package/dist/adapters/MarkdownSourceLoader.js +19 -0
- package/dist/adapters/conversation/ConversationMarkdownAdapter.d.ts +9 -0
- package/dist/adapters/conversation/ConversationMarkdownAdapter.js +233 -0
- package/dist/adapters/hermes/HermesStateDbAdapter.d.ts +10 -0
- package/dist/adapters/hermes/HermesStateDbAdapter.js +268 -0
- package/dist/adapters/hermes/HermesWorkspaceProfile.d.ts +15 -0
- package/dist/adapters/hermes/HermesWorkspaceProfile.js +82 -0
- package/dist/adapters/index.d.ts +15 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/openclaw/OpenClawAdapterSupport.d.ts +14 -0
- package/dist/adapters/openclaw/OpenClawAdapterSupport.js +29 -0
- package/dist/adapters/openclaw/OpenClawDailyMemoryAdapter.d.ts +8 -0
- package/dist/adapters/openclaw/OpenClawDailyMemoryAdapter.js +35 -0
- package/dist/adapters/openclaw/OpenClawMemoryIndexAdapter.d.ts +8 -0
- package/dist/adapters/openclaw/OpenClawMemoryIndexAdapter.js +23 -0
- package/dist/adapters/openclaw/OpenClawPersonaAdapter.d.ts +8 -0
- package/dist/adapters/openclaw/OpenClawPersonaAdapter.js +24 -0
- package/dist/adapters/openclaw/OpenClawSessionAdapter.d.ts +8 -0
- package/dist/adapters/openclaw/OpenClawSessionAdapter.js +15 -0
- package/dist/adapters/openclaw/OpenClawUserProfileAdapter.d.ts +8 -0
- package/dist/adapters/openclaw/OpenClawUserProfileAdapter.js +24 -0
- package/dist/adapters/openclaw/OpenClawWorkspaceProfile.d.ts +38 -0
- package/dist/adapters/openclaw/OpenClawWorkspaceProfile.js +199 -0
- package/dist/adapters/soul/SoulMarkdownAdapter.d.ts +14 -0
- package/dist/adapters/soul/SoulMarkdownAdapter.js +255 -0
- package/dist/adapters/types.d.ts +97 -0
- package/dist/adapters/types.js +185 -0
- package/dist/agent/AgentMemoryBackend.d.ts +291 -0
- package/dist/agent/AgentMemoryBackend.js +1272 -0
- package/dist/agent/AgentRecallQueryCompiler.d.ts +20 -0
- package/dist/agent/AgentRecallQueryCompiler.js +289 -0
- package/dist/agent/ContextHygiene.d.ts +9 -0
- package/dist/agent/ContextHygiene.js +20 -0
- package/dist/agent/MemoryUsageReceipt.d.ts +35 -0
- package/dist/agent/MemoryUsageReceipt.js +136 -0
- package/dist/agent/SessionWorkingState.d.ts +20 -0
- package/dist/agent/SessionWorkingState.js +94 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.js +5 -0
- package/dist/algorithm/AlgorithmReviewBackend.d.ts +84 -0
- package/dist/algorithm/AlgorithmReviewBackend.js +261 -0
- package/dist/algorithm/AlgorithmReviewMetrics.d.ts +23 -0
- package/dist/algorithm/AlgorithmReviewMetrics.js +25 -0
- package/dist/algorithm/Phase2ModelAlgorithmReviewBackend.d.ts +38 -0
- package/dist/algorithm/Phase2ModelAlgorithmReviewBackend.js +372 -0
- package/dist/assets/FileAssetIngestionService.d.ts +32 -0
- package/dist/assets/FileAssetIngestionService.js +133 -0
- package/dist/assets/FileAssetStore.d.ts +36 -0
- package/dist/assets/FileAssetStore.js +152 -0
- package/dist/assets/FileBlockStore.d.ts +12 -0
- package/dist/assets/FileBlockStore.js +110 -0
- package/dist/assets/FileChunkStore.d.ts +23 -0
- package/dist/assets/FileChunkStore.js +179 -0
- package/dist/assets/FileChunker.d.ts +10 -0
- package/dist/assets/FileChunker.js +69 -0
- package/dist/assets/FileLoaderRegistry.d.ts +8 -0
- package/dist/assets/FileLoaderRegistry.js +21 -0
- package/dist/assets/FileLoaders.d.ts +37 -0
- package/dist/assets/FileLoaders.js +268 -0
- package/dist/assets/index.d.ts +10 -0
- package/dist/assets/index.js +7 -0
- package/dist/assets/providers/types.d.ts +47 -0
- package/dist/assets/providers/types.js +1 -0
- package/dist/assets/types.d.ts +159 -0
- package/dist/assets/types.js +1 -0
- package/dist/atlas/ActionFrameExtractor.d.ts +15 -0
- package/dist/atlas/ActionFrameExtractor.js +135 -0
- package/dist/atlas/MemoryAtlasIndexer.d.ts +32 -0
- package/dist/atlas/MemoryAtlasIndexer.js +74 -0
- package/dist/atlas/MemoryAtlasQueryCompiler.d.ts +23 -0
- package/dist/atlas/MemoryAtlasQueryCompiler.js +55 -0
- package/dist/atlas/MemoryAtlasService.d.ts +25 -0
- package/dist/atlas/MemoryAtlasService.js +216 -0
- package/dist/atlas/MemoryAtlasTypes.d.ts +107 -0
- package/dist/atlas/MemoryAtlasTypes.js +1 -0
- package/dist/atlas/index.d.ts +6 -0
- package/dist/atlas/index.js +5 -0
- package/dist/backend/SemanticBackend.d.ts +40 -0
- package/dist/backend/SemanticBackend.js +107 -0
- package/dist/batch/IngestionCursorStore.d.ts +52 -0
- package/dist/batch/IngestionCursorStore.js +153 -0
- package/dist/batch/InstalledBatchProcessor.d.ts +88 -0
- package/dist/batch/InstalledBatchProcessor.js +179 -0
- package/dist/batch/SourceOnboarding.d.ts +56 -0
- package/dist/batch/SourceOnboarding.js +366 -0
- package/dist/belief/BeliefGovernanceService.d.ts +59 -0
- package/dist/belief/BeliefGovernanceService.js +183 -0
- package/dist/belief/BeliefStore.d.ts +78 -0
- package/dist/belief/BeliefStore.js +898 -0
- package/dist/benchmark/BenchmarkRegistry.d.ts +16 -0
- package/dist/benchmark/BenchmarkRegistry.js +97 -0
- package/dist/benchmark/BenchmarkReport.d.ts +23 -0
- package/dist/benchmark/BenchmarkReport.js +62 -0
- package/dist/benchmark/BenchmarkRunner.d.ts +27 -0
- package/dist/benchmark/BenchmarkRunner.js +64 -0
- package/dist/benchmark/BrainEval.d.ts +134 -0
- package/dist/benchmark/BrainEval.js +252 -0
- package/dist/benchmark/ExternalBenchmarkRunner.d.ts +8 -0
- package/dist/benchmark/ExternalBenchmarkRunner.js +12 -0
- package/dist/benchmark/LongMemEvalAdapter.d.ts +46 -0
- package/dist/benchmark/LongMemEvalAdapter.js +88 -0
- package/dist/benchmark/LongMemEvalCli.d.ts +6 -0
- package/dist/benchmark/LongMemEvalCli.js +26 -0
- package/dist/bin/CliJson.d.ts +17 -0
- package/dist/bin/CliJson.js +20 -0
- package/dist/bin/brain-eval.d.ts +3 -0
- package/dist/bin/brain-eval.js +46 -0
- package/dist/bin/cogmem.d.ts +3 -0
- package/dist/bin/cogmem.js +95 -0
- package/dist/bin/compact.d.ts +3 -0
- package/dist/bin/compact.js +96 -0
- package/dist/bin/connect.d.ts +3 -0
- package/dist/bin/connect.js +398 -0
- package/dist/bin/doctor.d.ts +3 -0
- package/dist/bin/doctor.js +171 -0
- package/dist/bin/dream.d.ts +3 -0
- package/dist/bin/dream.js +65 -0
- package/dist/bin/episode.d.ts +3 -0
- package/dist/bin/episode.js +268 -0
- package/dist/bin/explain-recall.d.ts +3 -0
- package/dist/bin/explain-recall.js +139 -0
- package/dist/bin/import-hermes.d.ts +3 -0
- package/dist/bin/import-hermes.js +6 -0
- package/dist/bin/import-openclaw.d.ts +3 -0
- package/dist/bin/import-openclaw.js +6 -0
- package/dist/bin/import-support.d.ts +43 -0
- package/dist/bin/import-support.js +528 -0
- package/dist/bin/init.d.ts +30 -0
- package/dist/bin/init.js +761 -0
- package/dist/bin/mcp.d.ts +3 -0
- package/dist/bin/mcp.js +52 -0
- package/dist/bin/memory.d.ts +3 -0
- package/dist/bin/memory.js +803 -0
- package/dist/bin/migrate-vectors.d.ts +3 -0
- package/dist/bin/migrate-vectors.js +74 -0
- package/dist/bin/migrate.d.ts +3 -0
- package/dist/bin/migrate.js +95 -0
- package/dist/bin/normalize-transcript.d.ts +16 -0
- package/dist/bin/normalize-transcript.js +153 -0
- package/dist/bin/openclaw.d.ts +3 -0
- package/dist/bin/openclaw.js +78 -0
- package/dist/bin/prospective.d.ts +3 -0
- package/dist/bin/prospective.js +115 -0
- package/dist/bin/re-embed.d.ts +3 -0
- package/dist/bin/re-embed.js +46 -0
- package/dist/bin/repair.d.ts +3 -0
- package/dist/bin/repair.js +118 -0
- package/dist/bin/snapshot.d.ts +3 -0
- package/dist/bin/snapshot.js +100 -0
- package/dist/bin/strategy.d.ts +3 -0
- package/dist/bin/strategy.js +66 -0
- package/dist/bin/update-release.d.ts +15 -0
- package/dist/bin/update-release.js +62 -0
- package/dist/bin/update.d.ts +3 -0
- package/dist/bin/update.js +215 -0
- package/dist/binding/BindingClassifier.d.ts +19 -0
- package/dist/binding/BindingClassifier.js +270 -0
- package/dist/binding/BindingDecisionEngine.d.ts +11 -0
- package/dist/binding/BindingDecisionEngine.js +13 -0
- package/dist/binding/ClaimKeyGenerator.d.ts +4 -0
- package/dist/binding/ClaimKeyGenerator.js +21 -0
- package/dist/binding/MemoryBindingService.d.ts +28 -0
- package/dist/binding/MemoryBindingService.js +283 -0
- package/dist/binding/MemoryBindingTypes.d.ts +140 -0
- package/dist/binding/MemoryBindingTypes.js +1 -0
- package/dist/binding/TopicPathRegistry.d.ts +5 -0
- package/dist/binding/TopicPathRegistry.js +33 -0
- package/dist/binding/index.d.ts +12 -0
- package/dist/binding/index.js +6 -0
- package/dist/boards/ApprovalBoard.d.ts +14 -0
- package/dist/boards/ApprovalBoard.js +32 -0
- package/dist/boards/Board.d.ts +23 -0
- package/dist/boards/Board.js +1 -0
- package/dist/boards/BoardEventBuffer.d.ts +10 -0
- package/dist/boards/BoardEventBuffer.js +22 -0
- package/dist/boards/BoardEventBus.d.ts +15 -0
- package/dist/boards/BoardEventBus.js +38 -0
- package/dist/boards/BoardEventFilter.d.ts +5 -0
- package/dist/boards/BoardEventFilter.js +1 -0
- package/dist/boards/BoardRegistry.d.ts +11 -0
- package/dist/boards/BoardRegistry.js +15 -0
- package/dist/boards/ContextBoard.d.ts +15 -0
- package/dist/boards/ContextBoard.js +33 -0
- package/dist/boards/MemoryBoard.d.ts +13 -0
- package/dist/boards/MemoryBoard.js +30 -0
- package/dist/boards/ProcessBoard.d.ts +16 -0
- package/dist/boards/ProcessBoard.js +56 -0
- package/dist/boards/ProposalBoard.d.ts +13 -0
- package/dist/boards/ProposalBoard.js +37 -0
- package/dist/boards/ReasoningTraceBoard.d.ts +11 -0
- package/dist/boards/ReasoningTraceBoard.js +34 -0
- package/dist/boards/TaskBoard.d.ts +14 -0
- package/dist/boards/TaskBoard.js +37 -0
- package/dist/boards/index.d.ts +13 -0
- package/dist/boards/index.js +12 -0
- package/dist/config/CogmemConfig.d.ts +43 -0
- package/dist/config/CogmemConfig.js +247 -0
- package/dist/config/VectorDimension.d.ts +13 -0
- package/dist/config/VectorDimension.js +53 -0
- package/dist/context/ContextCortex.d.ts +71 -0
- package/dist/context/ContextCortex.js +156 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/core/ImportanceLevels.d.ts +4 -0
- package/dist/core/ImportanceLevels.js +6 -0
- package/dist/core/IntentParser.d.ts +12 -0
- package/dist/core/IntentParser.js +211 -0
- package/dist/core/MemoryGraph.d.ts +100 -0
- package/dist/core/MemoryGraph.js +860 -0
- package/dist/core/Metabolism.d.ts +43 -0
- package/dist/core/Metabolism.js +196 -0
- package/dist/core/Neuron.d.ts +20 -0
- package/dist/core/Neuron.js +51 -0
- package/dist/core/QueryClassifier.d.ts +36 -0
- package/dist/core/QueryClassifier.js +161 -0
- package/dist/core/Reflection.d.ts +42 -0
- package/dist/core/Reflection.js +183 -0
- package/dist/core/ResonanceCore.d.ts +26 -0
- package/dist/core/ResonanceCore.js +115 -0
- package/dist/core/Synapse.d.ts +10 -0
- package/dist/core/Synapse.js +27 -0
- package/dist/core/TwoStagePulseRanker.d.ts +16 -0
- package/dist/core/TwoStagePulseRanker.js +120 -0
- package/dist/dream/DreamScheduler.d.ts +47 -0
- package/dist/dream/DreamScheduler.js +156 -0
- package/dist/dream/index.d.ts +2 -0
- package/dist/dream/index.js +1 -0
- package/dist/embedding/EmbeddingProvider.d.ts +16 -0
- package/dist/embedding/EmbeddingProvider.js +12 -0
- package/dist/embedding/NeuronEmbeddingStore.d.ts +38 -0
- package/dist/embedding/NeuronEmbeddingStore.js +193 -0
- package/dist/embedding/OllamaEmbeddingProvider.d.ts +21 -0
- package/dist/embedding/OllamaEmbeddingProvider.js +65 -0
- package/dist/embedding/QwenAPIEmbeddingProvider.d.ts +26 -0
- package/dist/embedding/QwenAPIEmbeddingProvider.js +53 -0
- package/dist/embedding/ReEmbeddingPipeline.d.ts +30 -0
- package/dist/embedding/ReEmbeddingPipeline.js +119 -0
- package/dist/embedding/ReEmbeddingStatus.d.ts +10 -0
- package/dist/embedding/ReEmbeddingStatus.js +1 -0
- package/dist/embedding/index.d.ts +11 -0
- package/dist/embedding/index.js +5 -0
- package/dist/encryption/AesGcmEncryptionProvider.d.ts +9 -0
- package/dist/encryption/AesGcmEncryptionProvider.js +42 -0
- package/dist/encryption/EncryptionProvider.d.ts +6 -0
- package/dist/encryption/EncryptionProvider.js +3 -0
- package/dist/encryption/index.d.ts +4 -0
- package/dist/encryption/index.js +2 -0
- package/dist/engine/BeliefExtractor.d.ts +48 -0
- package/dist/engine/BeliefExtractor.js +1189 -0
- package/dist/engine/CognitiveGraphCompiler.d.ts +24 -0
- package/dist/engine/CognitiveGraphCompiler.js +243 -0
- package/dist/engine/ConsolidationPipeline.d.ts +66 -0
- package/dist/engine/ConsolidationPipeline.js +376 -0
- package/dist/engine/ConsolidationTrigger.d.ts +18 -0
- package/dist/engine/ConsolidationTrigger.js +41 -0
- package/dist/engine/CrossTopicSynthesizer.d.ts +28 -0
- package/dist/engine/CrossTopicSynthesizer.js +70 -0
- package/dist/engine/CrossTopicTrigger.d.ts +17 -0
- package/dist/engine/CrossTopicTrigger.js +29 -0
- package/dist/engine/DeepWriteConfig.d.ts +14 -0
- package/dist/engine/DeepWriteConfig.js +37 -0
- package/dist/engine/DeepWriteMemoryCompiler.d.ts +43 -0
- package/dist/engine/DeepWriteMemoryCompiler.js +42 -0
- package/dist/engine/DeepWriteMemoryOrchestrator.d.ts +60 -0
- package/dist/engine/DeepWriteMemoryOrchestrator.js +175 -0
- package/dist/engine/DeepWritePromotionPolicy.d.ts +48 -0
- package/dist/engine/DeepWritePromotionPolicy.js +514 -0
- package/dist/engine/DeepWriteRedactor.d.ts +14 -0
- package/dist/engine/DeepWriteRedactor.js +53 -0
- package/dist/engine/DreamCuratorSchedule.d.ts +18 -0
- package/dist/engine/DreamCuratorSchedule.js +95 -0
- package/dist/engine/DreamCuratorWorker.d.ts +67 -0
- package/dist/engine/DreamCuratorWorker.js +908 -0
- package/dist/engine/EntityResolutionEngine.d.ts +45 -0
- package/dist/engine/EntityResolutionEngine.js +105 -0
- package/dist/engine/EpisodicSemanticDistiller.d.ts +25 -0
- package/dist/engine/EpisodicSemanticDistiller.js +68 -0
- package/dist/engine/EvolutionVerifier.d.ts +39 -0
- package/dist/engine/EvolutionVerifier.js +104 -0
- package/dist/engine/FactCompiler.d.ts +41 -0
- package/dist/engine/FactCompiler.js +820 -0
- package/dist/engine/GraphCommunityEngine.d.ts +20 -0
- package/dist/engine/GraphCommunityEngine.js +91 -0
- package/dist/engine/ImportanceSignalDetector.d.ts +11 -0
- package/dist/engine/ImportanceSignalDetector.js +51 -0
- package/dist/engine/IngestionEngine.d.ts +44 -0
- package/dist/engine/IngestionEngine.js +182 -0
- package/dist/engine/InteractionBinder.d.ts +16 -0
- package/dist/engine/InteractionBinder.js +87 -0
- package/dist/engine/LocalSemanticCompiler.d.ts +40 -0
- package/dist/engine/LocalSemanticCompiler.js +111 -0
- package/dist/engine/MemoryConsolidationEngine.d.ts +11 -0
- package/dist/engine/MemoryConsolidationEngine.js +21 -0
- package/dist/engine/MemoryGate.d.ts +10 -0
- package/dist/engine/MemoryGate.js +34 -0
- package/dist/engine/OfflineConsolidationPipeline.d.ts +148 -0
- package/dist/engine/OfflineConsolidationPipeline.js +670 -0
- package/dist/engine/OrphanCleaner.d.ts +15 -0
- package/dist/engine/OrphanCleaner.js +27 -0
- package/dist/engine/PipelineMetrics.d.ts +32 -0
- package/dist/engine/PipelineMetrics.js +126 -0
- package/dist/engine/PrincipleDecayPolicy.d.ts +17 -0
- package/dist/engine/PrincipleDecayPolicy.js +64 -0
- package/dist/engine/TopologyCompiler.d.ts +25 -0
- package/dist/engine/TopologyCompiler.js +276 -0
- package/dist/engine/WorkingMemoryDelta.d.ts +23 -0
- package/dist/engine/WorkingMemoryDelta.js +63 -0
- package/dist/entity/EntityGovernanceService.d.ts +47 -0
- package/dist/entity/EntityGovernanceService.js +215 -0
- package/dist/entity/index.d.ts +3 -0
- package/dist/entity/index.js +1 -0
- package/dist/episode/CogmemBlockStripper.d.ts +11 -0
- package/dist/episode/CogmemBlockStripper.js +58 -0
- package/dist/episode/CorrectionResolver.d.ts +30 -0
- package/dist/episode/CorrectionResolver.js +17 -0
- package/dist/episode/EpisodeAssembler.d.ts +54 -0
- package/dist/episode/EpisodeAssembler.js +203 -0
- package/dist/episode/EpisodeImportIdentity.d.ts +7 -0
- package/dist/episode/EpisodeImportIdentity.js +17 -0
- package/dist/episode/EpisodeSemanticSummarizer.d.ts +4 -0
- package/dist/episode/EpisodeSemanticSummarizer.js +31 -0
- package/dist/episode/EpisodeStore.d.ts +189 -0
- package/dist/episode/EpisodeStore.js +680 -0
- package/dist/episode/EpisodeTypes.d.ts +96 -0
- package/dist/episode/EpisodeTypes.js +1 -0
- package/dist/episode/TurnRelationClassifier.d.ts +40 -0
- package/dist/episode/TurnRelationClassifier.js +205 -0
- package/dist/episode/index.d.ts +9 -0
- package/dist/episode/index.js +8 -0
- package/dist/eval/datasets/contradiction_injection.d.ts +3 -0
- package/dist/eval/datasets/contradiction_injection.js +56 -0
- package/dist/eval/datasets/noisy_tool_output_corpus.d.ts +16 -0
- package/dist/eval/datasets/noisy_tool_output_corpus.js +59 -0
- package/dist/eval/datasets/synthetic_long_conversation.d.ts +40 -0
- package/dist/eval/datasets/synthetic_long_conversation.js +136 -0
- package/dist/eval/runners/EvalRunner.d.ts +12 -0
- package/dist/eval/runners/EvalRunner.js +66 -0
- package/dist/eval/runners/ReportFormatter.d.ts +13 -0
- package/dist/eval/runners/ReportFormatter.js +59 -0
- package/dist/eval/strategy/ContextOutcomeStore.d.ts +12 -0
- package/dist/eval/strategy/ContextOutcomeStore.js +44 -0
- package/dist/eval/strategy/ContextPolicyScorer.d.ts +25 -0
- package/dist/eval/strategy/ContextPolicyScorer.js +58 -0
- package/dist/eval/strategy/MemoryUseJudge.d.ts +49 -0
- package/dist/eval/strategy/MemoryUseJudge.js +75 -0
- package/dist/eval/strategy/StrategyDiversitySelector.d.ts +8 -0
- package/dist/eval/strategy/StrategyDiversitySelector.js +44 -0
- package/dist/eval/strategy/StrategyRolloutEvaluator.d.ts +15 -0
- package/dist/eval/strategy/StrategyRolloutEvaluator.js +30 -0
- package/dist/eval/strategy/index.d.ts +6 -0
- package/dist/eval/strategy/index.js +5 -0
- package/dist/factory.d.ts +726 -0
- package/dist/factory.js +2118 -0
- package/dist/governance/CandidateReviewService.d.ts +33 -0
- package/dist/governance/CandidateReviewService.js +126 -0
- package/dist/governance/ContradictionResolver.d.ts +22 -0
- package/dist/governance/ContradictionResolver.js +54 -0
- package/dist/governance/CredibilityScorer.d.ts +10 -0
- package/dist/governance/CredibilityScorer.js +29 -0
- package/dist/governance/DecayPolicy.d.ts +18 -0
- package/dist/governance/DecayPolicy.js +28 -0
- package/dist/governance/MemoryExplain.d.ts +46 -0
- package/dist/governance/MemoryExplain.js +62 -0
- package/dist/governance/MemoryGovernanceExecutor.d.ts +18 -0
- package/dist/governance/MemoryGovernanceExecutor.js +37 -0
- package/dist/governance/MemoryGovernancePlan.d.ts +36 -0
- package/dist/governance/MemoryGovernancePlan.js +1 -0
- package/dist/governance/MemoryGovernanceValidator.d.ts +13 -0
- package/dist/governance/MemoryGovernanceValidator.js +53 -0
- package/dist/governance/ObservationHygieneRules.d.ts +17 -0
- package/dist/governance/ObservationHygieneRules.js +28 -0
- package/dist/governance/PiiRedactor.d.ts +20 -0
- package/dist/governance/PiiRedactor.js +37 -0
- package/dist/governance/SupersedeChain.d.ts +21 -0
- package/dist/governance/SupersedeChain.js +107 -0
- package/dist/governance/index.d.ts +14 -0
- package/dist/governance/index.js +6 -0
- package/dist/graph/BrainGraphView.d.ts +20 -0
- package/dist/graph/BrainGraphView.js +45 -0
- package/dist/host/openclaw/AutoMemoryPluginInstaller.d.ts +45 -0
- package/dist/host/openclaw/AutoMemoryPluginInstaller.js +1904 -0
- package/dist/internal.d.ts +148 -0
- package/dist/internal.js +144 -0
- package/dist/lexicon/coreMemoryLexicon.d.ts +96 -0
- package/dist/lexicon/coreMemoryLexicon.js +525 -0
- package/dist/lexicon/language-packs/en.d.ts +42 -0
- package/dist/lexicon/language-packs/en.js +41 -0
- package/dist/lexicon/language-packs/zh.d.ts +42 -0
- package/dist/lexicon/language-packs/zh.js +41 -0
- package/dist/lexicon/zh/entities.d.ts +2 -0
- package/dist/lexicon/zh/entities.js +17 -0
- package/dist/lexicon/zh/index.d.ts +5 -0
- package/dist/lexicon/zh/index.js +3 -0
- package/dist/lexicon/zh/stopwords.d.ts +2 -0
- package/dist/lexicon/zh/stopwords.js +22 -0
- package/dist/lexicon/zh/topics.d.ts +6 -0
- package/dist/lexicon/zh/topics.js +52 -0
- package/dist/mcp/CoreMcpTools.d.ts +33 -0
- package/dist/mcp/CoreMcpTools.js +832 -0
- package/dist/mcp/server.d.ts +5 -0
- package/dist/mcp/server.js +29 -0
- package/dist/meta/MetaObservationCollector.d.ts +37 -0
- package/dist/meta/MetaObservationCollector.js +348 -0
- package/dist/meta/PolicyProposalGenerator.d.ts +11 -0
- package/dist/meta/PolicyProposalGenerator.js +159 -0
- package/dist/meta/ProposalApplier.d.ts +18 -0
- package/dist/meta/ProposalApplier.js +91 -0
- package/dist/meta/ProposalConfigOverlay.d.ts +13 -0
- package/dist/meta/ProposalConfigOverlay.js +27 -0
- package/dist/meta/ProposalEvalRunner.d.ts +31 -0
- package/dist/meta/ProposalEvalRunner.js +62 -0
- package/dist/meta/ProposalLedger.d.ts +34 -0
- package/dist/meta/ProposalLedger.js +242 -0
- package/dist/meta/types.d.ts +63 -0
- package/dist/meta/types.js +1 -0
- package/dist/migrations/0001_init.d.ts +4 -0
- package/dist/migrations/0001_init.js +67 -0
- package/dist/migrations/0002_v06_platform.d.ts +10 -0
- package/dist/migrations/0002_v06_platform.js +103 -0
- package/dist/migrations/0003_v07_dialogues.d.ts +9 -0
- package/dist/migrations/0003_v07_dialogues.js +53 -0
- package/dist/migrations/0004_v09_self_improvement.d.ts +9 -0
- package/dist/migrations/0004_v09_self_improvement.js +100 -0
- package/dist/migrations/0005_dialogue_buffer.d.ts +8 -0
- package/dist/migrations/0005_dialogue_buffer.js +44 -0
- package/dist/migrations/0006_deep_write_memory.d.ts +3 -0
- package/dist/migrations/0006_deep_write_memory.js +54 -0
- package/dist/migrations/0007_deep_write_summaries.d.ts +3 -0
- package/dist/migrations/0007_deep_write_summaries.js +24 -0
- package/dist/migrations/0009_memory_importance.d.ts +3 -0
- package/dist/migrations/0009_memory_importance.js +18 -0
- package/dist/migrations/0010_skill_neurons.d.ts +3 -0
- package/dist/migrations/0010_skill_neurons.js +19 -0
- package/dist/migrations/0011_topic_path.d.ts +3 -0
- package/dist/migrations/0011_topic_path.js +19 -0
- package/dist/migrations/0012_governance_security.d.ts +3 -0
- package/dist/migrations/0012_governance_security.js +23 -0
- package/dist/migrations/0015_memory_governance.d.ts +3 -0
- package/dist/migrations/0015_memory_governance.js +74 -0
- package/dist/migrations/0016_entity_governance.d.ts +3 -0
- package/dist/migrations/0016_entity_governance.js +40 -0
- package/dist/migrations/0017_belief_graph.d.ts +3 -0
- package/dist/migrations/0017_belief_graph.js +41 -0
- package/dist/migrations/0018_temporal_memory.d.ts +3 -0
- package/dist/migrations/0018_temporal_memory.js +25 -0
- package/dist/migrations/0019_context_cortex.d.ts +3 -0
- package/dist/migrations/0019_context_cortex.js +19 -0
- package/dist/migrations/0020_prospective_memory.d.ts +3 -0
- package/dist/migrations/0020_prospective_memory.js +42 -0
- package/dist/migrations/0021_strategy_cortex.d.ts +3 -0
- package/dist/migrations/0021_strategy_cortex.js +23 -0
- package/dist/migrations/0022_episode_dream_engine.d.ts +3 -0
- package/dist/migrations/0022_episode_dream_engine.js +74 -0
- package/dist/migrations/0023_episode_dream_hardening.d.ts +3 -0
- package/dist/migrations/0023_episode_dream_hardening.js +65 -0
- package/dist/migrations/0024_episode_ontology_reliability.d.ts +3 -0
- package/dist/migrations/0024_episode_ontology_reliability.js +70 -0
- package/dist/migrations/0025_memory_atlas.d.ts +6 -0
- package/dist/migrations/0025_memory_atlas.js +268 -0
- package/dist/migrations/0026_runtime_governance_atlas_reliability.d.ts +3 -0
- package/dist/migrations/0026_runtime_governance_atlas_reliability.js +72 -0
- package/dist/migrations/0027_openclaw_upgrade_hotfix.d.ts +3 -0
- package/dist/migrations/0027_openclaw_upgrade_hotfix.js +21 -0
- package/dist/migrations/SchemaMigrationRunner.d.ts +21 -0
- package/dist/migrations/SchemaMigrationRunner.js +67 -0
- package/dist/migrations/index.d.ts +36 -0
- package/dist/migrations/index.js +57 -0
- package/dist/models/ModelCapabilityRouter.d.ts +17 -0
- package/dist/models/ModelCapabilityRouter.js +75 -0
- package/dist/models/ModelRegistry.d.ts +15 -0
- package/dist/models/ModelRegistry.js +132 -0
- package/dist/models/ModelRole.d.ts +19 -0
- package/dist/models/ModelRole.js +1 -0
- package/dist/models/UserInsight.d.ts +16 -0
- package/dist/models/UserInsight.js +9 -0
- package/dist/models/UserInsightExtractor.d.ts +19 -0
- package/dist/models/UserInsightExtractor.js +99 -0
- package/dist/models/UserModelManager.d.ts +21 -0
- package/dist/models/UserModelManager.js +41 -0
- package/dist/models/UserModelStore.d.ts +20 -0
- package/dist/models/UserModelStore.js +136 -0
- package/dist/models/WorkingMemoryReporter.d.ts +16 -0
- package/dist/models/WorkingMemoryReporter.js +38 -0
- package/dist/models/adapters/MemoryReviewAdapter.d.ts +12 -0
- package/dist/models/adapters/MemoryReviewAdapter.js +77 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.js +5 -0
- package/dist/models/providers/AnthropicClient.d.ts +17 -0
- package/dist/models/providers/AnthropicClient.js +40 -0
- package/dist/models/providers/OpenAICompatibleClient.d.ts +24 -0
- package/dist/models/providers/OpenAICompatibleClient.js +76 -0
- package/dist/observability/DecisionExplainer.d.ts +5 -0
- package/dist/observability/DecisionExplainer.js +62 -0
- package/dist/observability/TraceEvent.d.ts +11 -0
- package/dist/observability/TraceEvent.js +1 -0
- package/dist/observability/TraceQuery.d.ts +15 -0
- package/dist/observability/TraceQuery.js +28 -0
- package/dist/observability/TraceStore.d.ts +15 -0
- package/dist/observability/TraceStore.js +110 -0
- package/dist/observability/TraceWriter.d.ts +8 -0
- package/dist/observability/TraceWriter.js +14 -0
- package/dist/ontology/MemoryOntology.d.ts +4 -0
- package/dist/ontology/MemoryOntology.js +7 -0
- package/dist/prospective/ProspectiveMemoryService.d.ts +79 -0
- package/dist/prospective/ProspectiveMemoryService.js +258 -0
- package/dist/prospective/index.d.ts +2 -0
- package/dist/prospective/index.js +1 -0
- package/dist/public.d.ts +160 -0
- package/dist/public.js +115 -0
- package/dist/recall/BrainRecall.d.ts +96 -0
- package/dist/recall/BrainRecall.js +574 -0
- package/dist/recall/HierarchicalRecallRouter.d.ts +24 -0
- package/dist/recall/HierarchicalRecallRouter.js +62 -0
- package/dist/recall/RecallExplanation.d.ts +59 -0
- package/dist/recall/RecallExplanation.js +244 -0
- package/dist/recall/RecallGovernance.d.ts +10 -0
- package/dist/recall/RecallGovernance.js +83 -0
- package/dist/recall/RecallSufficiencyGate.d.ts +40 -0
- package/dist/recall/RecallSufficiencyGate.js +208 -0
- package/dist/recall/SourceContextMetadata.d.ts +49 -0
- package/dist/recall/SourceContextMetadata.js +134 -0
- package/dist/recall/TopicClassifier.d.ts +33 -0
- package/dist/recall/TopicClassifier.js +138 -0
- package/dist/recall/TopicDecayPolicy.d.ts +15 -0
- package/dist/recall/TopicDecayPolicy.js +46 -0
- package/dist/recall/TopicRegistry.d.ts +12 -0
- package/dist/recall/TopicRegistry.js +26 -0
- package/dist/recall/TopicSummaryBoard.d.ts +27 -0
- package/dist/recall/TopicSummaryBoard.js +139 -0
- package/dist/recall/VectorCandidateFilter.d.ts +50 -0
- package/dist/recall/VectorCandidateFilter.js +78 -0
- package/dist/retrieval/ConditionDslEvaluator.d.ts +33 -0
- package/dist/retrieval/ConditionDslEvaluator.js +160 -0
- package/dist/retrieval/EntityActivationIndex.d.ts +14 -0
- package/dist/retrieval/EntityActivationIndex.js +19 -0
- package/dist/retrieval/EvidenceFusionPolicy.d.ts +30 -0
- package/dist/retrieval/EvidenceFusionPolicy.js +112 -0
- package/dist/retrieval/EvidenceFusionRanker.d.ts +13 -0
- package/dist/retrieval/EvidenceFusionRanker.js +17 -0
- package/dist/retrieval/NarrativeRecallAssembler.d.ts +32 -0
- package/dist/retrieval/NarrativeRecallAssembler.js +27 -0
- package/dist/retrieval/NativeQueryParser.d.ts +23 -0
- package/dist/retrieval/NativeQueryParser.js +135 -0
- package/dist/retrieval/PlanDslExecutor.d.ts +67 -0
- package/dist/retrieval/PlanDslExecutor.js +194 -0
- package/dist/retrieval/PolicyRuntimeEvaluator.d.ts +48 -0
- package/dist/retrieval/PolicyRuntimeEvaluator.js +96 -0
- package/dist/retrieval/PolicySideEffectExecutor.d.ts +50 -0
- package/dist/retrieval/PolicySideEffectExecutor.js +202 -0
- package/dist/retrieval/PulseRetrievalEngine.d.ts +37 -0
- package/dist/retrieval/PulseRetrievalEngine.js +51 -0
- package/dist/retrieval/QueryCompiler.d.ts +18 -0
- package/dist/retrieval/QueryCompiler.js +97 -0
- package/dist/retrieval/QueryTimePendingEntityResolver.d.ts +67 -0
- package/dist/retrieval/QueryTimePendingEntityResolver.js +260 -0
- package/dist/retrieval/RetrievalPlanner.d.ts +42 -0
- package/dist/retrieval/RetrievalPlanner.js +209 -0
- package/dist/retrieval/TemporalBranchSearch.d.ts +38 -0
- package/dist/retrieval/TemporalBranchSearch.js +109 -0
- package/dist/retrieval/UniverseNavigator.d.ts +43 -0
- package/dist/retrieval/UniverseNavigator.js +75 -0
- package/dist/retrieval/UniverseTraversalExecutor.d.ts +21 -0
- package/dist/retrieval/UniverseTraversalExecutor.js +77 -0
- package/dist/routing/AnswerEvidenceTrace.d.ts +18 -0
- package/dist/routing/AnswerEvidenceTrace.js +1 -0
- package/dist/routing/BrainToolDispatcher.d.ts +37 -0
- package/dist/routing/BrainToolDispatcher.js +163 -0
- package/dist/routing/ConfidenceGate.d.ts +26 -0
- package/dist/routing/ConfidenceGate.js +40 -0
- package/dist/routing/ConfirmationPhraseMatcher.d.ts +9 -0
- package/dist/routing/ConfirmationPhraseMatcher.js +43 -0
- package/dist/routing/DirectReplyFormatter.d.ts +5 -0
- package/dist/routing/DirectReplyFormatter.js +55 -0
- package/dist/routing/EvidenceBudgetManager.d.ts +30 -0
- package/dist/routing/EvidenceBudgetManager.js +55 -0
- package/dist/routing/ExecutionLoop.d.ts +79 -0
- package/dist/routing/ExecutionLoop.js +234 -0
- package/dist/routing/IntentClassifier.d.ts +15 -0
- package/dist/routing/IntentClassifier.js +97 -0
- package/dist/routing/IntentPatternMatcher.d.ts +12 -0
- package/dist/routing/IntentPatternMatcher.js +206 -0
- package/dist/routing/IterativeLLMClarifier.d.ts +80 -0
- package/dist/routing/IterativeLLMClarifier.js +408 -0
- package/dist/routing/LLMToolSchema.d.ts +60 -0
- package/dist/routing/LLMToolSchema.js +143 -0
- package/dist/routing/MessageRouter.d.ts +20 -0
- package/dist/routing/MessageRouter.js +58 -0
- package/dist/routing/SessionContextSelector.d.ts +12 -0
- package/dist/routing/SessionContextSelector.js +86 -0
- package/dist/routing/SystemIntentClassifier.d.ts +15 -0
- package/dist/routing/SystemIntentClassifier.js +50 -0
- package/dist/routing/TaskPlan.d.ts +31 -0
- package/dist/routing/TaskPlan.js +1 -0
- package/dist/routing/TaskRouter.d.ts +13 -0
- package/dist/routing/TaskRouter.js +111 -0
- package/dist/routing/ToolCallParser.d.ts +16 -0
- package/dist/routing/ToolCallParser.js +123 -0
- package/dist/routing/ToolEvidenceNormalizer.d.ts +13 -0
- package/dist/routing/ToolEvidenceNormalizer.js +96 -0
- package/dist/routing/ToolEvidencePack.d.ts +36 -0
- package/dist/routing/ToolEvidencePack.js +84 -0
- package/dist/routing/ToolResultSanitizer.d.ts +19 -0
- package/dist/routing/ToolResultSanitizer.js +58 -0
- package/dist/routing/ToolUsePolicy.d.ts +78 -0
- package/dist/routing/ToolUsePolicy.js +163 -0
- package/dist/routing/index.d.ts +32 -0
- package/dist/routing/index.js +19 -0
- package/dist/routing/templates/ability_template.d.ts +2 -0
- package/dist/routing/templates/ability_template.js +34 -0
- package/dist/routing/templates/approvals_template.d.ts +2 -0
- package/dist/routing/templates/approvals_template.js +43 -0
- package/dist/routing/templates/context_template.d.ts +2 -0
- package/dist/routing/templates/context_template.js +25 -0
- package/dist/routing/templates/contradictions_template.d.ts +2 -0
- package/dist/routing/templates/contradictions_template.js +36 -0
- package/dist/routing/templates/importance_template.d.ts +2 -0
- package/dist/routing/templates/importance_template.js +23 -0
- package/dist/routing/templates/memory_template.d.ts +2 -0
- package/dist/routing/templates/memory_template.js +37 -0
- package/dist/routing/templates/self_manifest_template.d.ts +5 -0
- package/dist/routing/templates/self_manifest_template.js +64 -0
- package/dist/routing/templates/tasks_template.d.ts +2 -0
- package/dist/routing/templates/tasks_template.js +41 -0
- package/dist/routing/templates/trace_template.d.ts +2 -0
- package/dist/routing/templates/trace_template.js +37 -0
- package/dist/routing/tools/EntityExpandTool.d.ts +25 -0
- package/dist/routing/tools/EntityExpandTool.js +59 -0
- package/dist/routing/tools/NeuronContextTool.d.ts +32 -0
- package/dist/routing/tools/NeuronContextTool.js +66 -0
- package/dist/routing/tools/SecondaryRecallTool.d.ts +27 -0
- package/dist/routing/tools/SecondaryRecallTool.js +30 -0
- package/dist/routing/tools/SkillDiscoveryTool.d.ts +13 -0
- package/dist/routing/tools/SkillDiscoveryTool.js +11 -0
- package/dist/snapshot/SnapshotExporter.d.ts +13 -0
- package/dist/snapshot/SnapshotExporter.js +70 -0
- package/dist/snapshot/SnapshotHeader.d.ts +15 -0
- package/dist/snapshot/SnapshotHeader.js +1 -0
- package/dist/snapshot/SnapshotImporter.d.ts +20 -0
- package/dist/snapshot/SnapshotImporter.js +40 -0
- package/dist/snapshot/errors.d.ts +18 -0
- package/dist/snapshot/errors.js +34 -0
- package/dist/snapshot/index.d.ts +5 -0
- package/dist/snapshot/index.js +3 -0
- package/dist/storage/StorageCompactor.d.ts +30 -0
- package/dist/storage/StorageCompactor.js +95 -0
- package/dist/store/ActivationStore.d.ts +45 -0
- package/dist/store/ActivationStore.js +135 -0
- package/dist/store/BackgroundJobStore.d.ts +49 -0
- package/dist/store/BackgroundJobStore.js +156 -0
- package/dist/store/CandidateReviewStore.d.ts +33 -0
- package/dist/store/CandidateReviewStore.js +67 -0
- package/dist/store/CognitiveGraphStore.d.ts +42 -0
- package/dist/store/CognitiveGraphStore.js +193 -0
- package/dist/store/CompilerConfidenceStore.d.ts +20 -0
- package/dist/store/CompilerConfidenceStore.js +76 -0
- package/dist/store/DeepWriteCandidateStore.d.ts +94 -0
- package/dist/store/DeepWriteCandidateStore.js +290 -0
- package/dist/store/DeterministicEmbedder.d.ts +10 -0
- package/dist/store/DeterministicEmbedder.js +24 -0
- package/dist/store/DreamLedgerStore.d.ts +22 -0
- package/dist/store/DreamLedgerStore.js +84 -0
- package/dist/store/Embedder.d.ts +14 -0
- package/dist/store/Embedder.js +52 -0
- package/dist/store/EmbedderFactory.d.ts +12 -0
- package/dist/store/EmbedderFactory.js +51 -0
- package/dist/store/EntityStore.d.ts +195 -0
- package/dist/store/EntityStore.js +941 -0
- package/dist/store/EventStore.d.ts +118 -0
- package/dist/store/EventStore.js +699 -0
- package/dist/store/FactStore.d.ts +76 -0
- package/dist/store/FactStore.js +356 -0
- package/dist/store/HnswlibVectorStore.d.ts +2 -0
- package/dist/store/HnswlibVectorStore.js +1 -0
- package/dist/store/IVectorStore.d.ts +32 -0
- package/dist/store/IVectorStore.js +1 -0
- package/dist/store/InteractionUnitStore.d.ts +52 -0
- package/dist/store/InteractionUnitStore.js +167 -0
- package/dist/store/MemoryAtlasStore.d.ts +60 -0
- package/dist/store/MemoryAtlasStore.js +500 -0
- package/dist/store/MemoryBindingStore.d.ts +77 -0
- package/dist/store/MemoryBindingStore.js +608 -0
- package/dist/store/MemoryGovernanceStore.d.ts +23 -0
- package/dist/store/MemoryGovernanceStore.js +103 -0
- package/dist/store/MemoryInspectionStore.d.ts +61 -0
- package/dist/store/MemoryInspectionStore.js +215 -0
- package/dist/store/PlanRuntimeStore.d.ts +83 -0
- package/dist/store/PlanRuntimeStore.js +257 -0
- package/dist/store/PolicyExecutionProjector.d.ts +17 -0
- package/dist/store/PolicyExecutionProjector.js +115 -0
- package/dist/store/PolicyExecutionStore.d.ts +62 -0
- package/dist/store/PolicyExecutionStore.js +290 -0
- package/dist/store/PolicyProjectionStore.d.ts +18 -0
- package/dist/store/PolicyProjectionStore.js +61 -0
- package/dist/store/ProjectionObservabilityStore.d.ts +38 -0
- package/dist/store/ProjectionObservabilityStore.js +310 -0
- package/dist/store/ReasoningChainStore.d.ts +13 -0
- package/dist/store/ReasoningChainStore.js +74 -0
- package/dist/store/RuntimeProjectionStore.d.ts +18 -0
- package/dist/store/RuntimeProjectionStore.js +61 -0
- package/dist/store/RuntimeProjector.d.ts +17 -0
- package/dist/store/RuntimeProjector.js +119 -0
- package/dist/store/SqliteVecStore.d.ts +25 -0
- package/dist/store/SqliteVecStore.js +126 -0
- package/dist/store/SummaryStore.d.ts +56 -0
- package/dist/store/SummaryStore.js +225 -0
- package/dist/store/TemporalAdjacencyStore.d.ts +49 -0
- package/dist/store/TemporalAdjacencyStore.js +300 -0
- package/dist/store/TopologyStore.d.ts +89 -0
- package/dist/store/TopologyStore.js +657 -0
- package/dist/store/VectorProjector.d.ts +22 -0
- package/dist/store/VectorProjector.js +125 -0
- package/dist/store/VectorStore.d.ts +35 -0
- package/dist/store/VectorStore.js +201 -0
- package/dist/strategy/StrategyCapsule.d.ts +44 -0
- package/dist/strategy/StrategyCapsule.js +1 -0
- package/dist/strategy/StrategyConditionedCandidateBuilder.d.ts +9 -0
- package/dist/strategy/StrategyConditionedCandidateBuilder.js +11 -0
- package/dist/strategy/StrategyContextFormatter.d.ts +3 -0
- package/dist/strategy/StrategyContextFormatter.js +25 -0
- package/dist/strategy/StrategyCortex.d.ts +28 -0
- package/dist/strategy/StrategyCortex.js +78 -0
- package/dist/strategy/StrategyTemplateRegistry.d.ts +9 -0
- package/dist/strategy/StrategyTemplateRegistry.js +78 -0
- package/dist/strategy/index.d.ts +6 -0
- package/dist/strategy/index.js +5 -0
- package/dist/temporal/TemporalMemoryService.d.ts +62 -0
- package/dist/temporal/TemporalMemoryService.js +128 -0
- package/dist/temporal/index.d.ts +2 -0
- package/dist/temporal/index.js +1 -0
- package/dist/topic/TopicAliasRegistry.d.ts +21 -0
- package/dist/topic/TopicAliasRegistry.js +67 -0
- package/dist/topic/TopicGovernance.d.ts +21 -0
- package/dist/topic/TopicGovernance.js +173 -0
- package/dist/topic/TopicPathRegistry.d.ts +36 -0
- package/dist/topic/TopicPathRegistry.js +105 -0
- package/dist/topic/TopicRelationGraph.d.ts +23 -0
- package/dist/topic/TopicRelationGraph.js +55 -0
- package/dist/topic/TopicTypes.d.ts +73 -0
- package/dist/topic/TopicTypes.js +1 -0
- package/dist/topic/index.d.ts +6 -0
- package/dist/topic/index.js +5 -0
- package/dist/types/AsyncEnrichment.d.ts +62 -0
- package/dist/types/AsyncEnrichment.js +7 -0
- package/dist/types/BrainRecallResult.d.ts +66 -0
- package/dist/types/BrainRecallResult.js +1 -0
- package/dist/types/ExtensionPoints.d.ts +116 -0
- package/dist/types/ExtensionPoints.js +1 -0
- package/dist/types/Migration.d.ts +22 -0
- package/dist/types/Migration.js +1 -0
- package/dist/types/QueryTimePendingEntityResolution.d.ts +11 -0
- package/dist/types/QueryTimePendingEntityResolution.js +23 -0
- package/dist/types/index.d.ts +855 -0
- package/dist/types/index.js +24 -0
- package/dist/types/query-ir.d.ts +71 -0
- package/dist/types/query-ir.js +4 -0
- package/dist/types/reasoning.d.ts +16 -0
- package/dist/types/reasoning.js +4 -0
- package/dist/utils/AAAKGenerator.d.ts +57 -0
- package/dist/utils/AAAKGenerator.js +212 -0
- package/dist/utils/Config.d.ts +78 -0
- package/dist/utils/Config.js +91 -0
- package/dist/utils/ConversationMarkdownNormalization.d.ts +88 -0
- package/dist/utils/ConversationMarkdownNormalization.js +567 -0
- package/dist/utils/Logger.d.ts +22 -0
- package/dist/utils/Logger.js +77 -0
- package/dist/utils/hash.d.ts +33 -0
- package/dist/utils/hash.js +53 -0
- package/dist/utils/text.d.ts +2 -0
- package/dist/utils/text.js +19 -0
- package/dist/utils/vector.d.ts +26 -0
- package/dist/utils/vector.js +38 -0
- package/examples/hermes-backend/AGENTS.md +218 -0
- package/examples/hermes-backend/README.md +153 -0
- package/examples/hermes-backend/SKILL.md +365 -0
- package/examples/hermes-backend/references/operations.md +202 -0
- package/examples/openclaw-backend/AGENTS.md +195 -0
- package/examples/openclaw-backend/README.md +228 -0
- package/examples/openclaw-backend/SKILL.md +464 -0
- package/examples/openclaw-backend/references/operations.md +269 -0
- package/install.sh +84 -0
- package/package.json +90 -0
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { summarizeEpisode } from './EpisodeSemanticSummarizer.js';
|
|
3
|
+
export class EpisodeStore {
|
|
4
|
+
db;
|
|
5
|
+
resolveEvent;
|
|
6
|
+
constructor(db, resolveEvent, options = {}) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
this.resolveEvent = resolveEvent;
|
|
9
|
+
if (options.initializeSchemaForTests !== false)
|
|
10
|
+
this.initializeSchema();
|
|
11
|
+
}
|
|
12
|
+
createEpisode(input) {
|
|
13
|
+
const episodeId = `episode-${randomUUID()}`;
|
|
14
|
+
this.db.prepare(`
|
|
15
|
+
INSERT INTO memory_episodes (
|
|
16
|
+
episode_id, project_id, session_id, source_agent, conversation_thread_id, topic_path, episode_type, status,
|
|
17
|
+
importance, start_event_id, end_event_id, start_seq, end_seq, event_count,
|
|
18
|
+
started_at, updated_at, episode_tags_json, candidate_types_json, importance_signals_json,
|
|
19
|
+
importance_reason, linked_episode_id, dream_status
|
|
20
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 'open', ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, 'none')
|
|
21
|
+
`).run(episodeId, input.projectId, input.sessionId, input.sourceAgent || null, input.conversationThreadId || null, input.topicPath || null, input.episodeType, input.importance, input.eventId, input.eventId, input.globalSeq ?? null, input.globalSeq ?? null, input.occurredAt, input.occurredAt, JSON.stringify(input.episodeTags || []), JSON.stringify(input.candidateTypes || []), JSON.stringify(input.importanceSignals || []), input.importanceReason || null, input.linkedEpisodeId || null);
|
|
22
|
+
return this.getEpisode(episodeId);
|
|
23
|
+
}
|
|
24
|
+
findActiveEpisode(projectId, sessionId, sourceAgent, conversationThreadId) {
|
|
25
|
+
const exact = this.findActiveEpisodeRow(projectId, sessionId, sourceAgent, conversationThreadId);
|
|
26
|
+
if (exact)
|
|
27
|
+
return mapEpisode(exact);
|
|
28
|
+
// Episodes created before source/thread scoping have both fields unset. Reuse
|
|
29
|
+
// only that legacy shape so an upgrade does not split an in-flight episode or
|
|
30
|
+
// merge modern episodes that already carry explicit ownership metadata.
|
|
31
|
+
if (!sourceAgent && !conversationThreadId)
|
|
32
|
+
return undefined;
|
|
33
|
+
const legacy = this.db.prepare(`
|
|
34
|
+
SELECT * FROM memory_episodes
|
|
35
|
+
WHERE project_id = ? AND session_id = ? AND status IN ('open', 'soft_sealed')
|
|
36
|
+
AND source_agent IS NULL AND conversation_thread_id IS NULL
|
|
37
|
+
ORDER BY CASE status WHEN 'open' THEN 0 ELSE 1 END, updated_at DESC LIMIT 1
|
|
38
|
+
`).get(projectId, sessionId);
|
|
39
|
+
return legacy ? mapEpisode(legacy) : undefined;
|
|
40
|
+
}
|
|
41
|
+
findActiveEpisodeRow(projectId, sessionId, sourceAgent, conversationThreadId) {
|
|
42
|
+
const where = [`project_id = ?`, `session_id = ?`, `status IN ('open', 'soft_sealed')`];
|
|
43
|
+
const params = [projectId, sessionId];
|
|
44
|
+
if (sourceAgent) {
|
|
45
|
+
where.push('source_agent = ?');
|
|
46
|
+
params.push(sourceAgent);
|
|
47
|
+
}
|
|
48
|
+
if (conversationThreadId) {
|
|
49
|
+
where.push('conversation_thread_id = ?');
|
|
50
|
+
params.push(conversationThreadId);
|
|
51
|
+
}
|
|
52
|
+
return this.db.prepare(`
|
|
53
|
+
SELECT * FROM memory_episodes WHERE ${where.join(' AND ')}
|
|
54
|
+
ORDER BY CASE status WHEN 'open' THEN 0 ELSE 1 END, updated_at DESC LIMIT 1
|
|
55
|
+
`).get(...params);
|
|
56
|
+
}
|
|
57
|
+
claimLegacyEpisodeScope(episodeId, sourceAgent, conversationThreadId) {
|
|
58
|
+
if (!sourceAgent && !conversationThreadId)
|
|
59
|
+
return this.getEpisode(episodeId);
|
|
60
|
+
if (this.resolveEvent) {
|
|
61
|
+
const events = this.listEventLinks(episodeId).slice(-10)
|
|
62
|
+
.map((link) => this.resolveEvent(link.eventId)).filter((event) => Boolean(event));
|
|
63
|
+
const mismatch = events.some((event) => {
|
|
64
|
+
const metadata = event.payload?.metadata;
|
|
65
|
+
const eventSourceAgent = typeof metadata?.sourceAgent === 'string' ? metadata.sourceAgent : undefined;
|
|
66
|
+
return (sourceAgent && eventSourceAgent && eventSourceAgent !== sourceAgent)
|
|
67
|
+
|| (conversationThreadId && event.threadId && event.threadId !== conversationThreadId);
|
|
68
|
+
});
|
|
69
|
+
if (mismatch)
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
this.db.prepare(`
|
|
73
|
+
UPDATE memory_episodes SET source_agent = ?, conversation_thread_id = ?
|
|
74
|
+
WHERE episode_id = ? AND source_agent IS NULL AND conversation_thread_id IS NULL
|
|
75
|
+
`).run(sourceAgent || null, conversationThreadId || null, episodeId);
|
|
76
|
+
const episode = this.getEpisode(episodeId);
|
|
77
|
+
if (!episode)
|
|
78
|
+
return undefined;
|
|
79
|
+
if (sourceAgent && episode.sourceAgent !== sourceAgent)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (conversationThreadId && episode.conversationThreadId !== conversationThreadId)
|
|
82
|
+
return undefined;
|
|
83
|
+
return episode;
|
|
84
|
+
}
|
|
85
|
+
getEpisode(episodeId) {
|
|
86
|
+
const row = this.db.prepare(`SELECT * FROM memory_episodes WHERE episode_id = ?`).get(episodeId);
|
|
87
|
+
return row ? mapEpisode(row) : undefined;
|
|
88
|
+
}
|
|
89
|
+
listEpisodes(options = {}) {
|
|
90
|
+
const where = [];
|
|
91
|
+
const params = [];
|
|
92
|
+
if (options.projectId) {
|
|
93
|
+
where.push('project_id = ?');
|
|
94
|
+
params.push(options.projectId);
|
|
95
|
+
}
|
|
96
|
+
if (options.sessionId) {
|
|
97
|
+
where.push('session_id = ?');
|
|
98
|
+
params.push(options.sessionId);
|
|
99
|
+
}
|
|
100
|
+
if (options.statuses?.length) {
|
|
101
|
+
where.push(`status IN (${options.statuses.map(() => '?').join(', ')})`);
|
|
102
|
+
params.push(...options.statuses);
|
|
103
|
+
}
|
|
104
|
+
const rows = this.db.prepare(`
|
|
105
|
+
SELECT * FROM memory_episodes ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
|
|
106
|
+
ORDER BY updated_at DESC, episode_id DESC LIMIT ?
|
|
107
|
+
`).all(...params, Math.max(1, Math.min(Math.trunc(options.limit ?? 100), 1000)));
|
|
108
|
+
return rows.map(mapEpisode);
|
|
109
|
+
}
|
|
110
|
+
appendEvent(input) {
|
|
111
|
+
const existing = this.getEventLink(input.eventId);
|
|
112
|
+
if (existing)
|
|
113
|
+
return existing;
|
|
114
|
+
const episode = this.getEpisode(input.episodeId);
|
|
115
|
+
if (!episode || episode.status !== 'open')
|
|
116
|
+
throw new Error(`episode_not_open:${input.episodeId}`);
|
|
117
|
+
const position = episode.eventCount + 1;
|
|
118
|
+
this.db.transaction(() => {
|
|
119
|
+
this.db.prepare(`
|
|
120
|
+
INSERT INTO memory_episode_events (episode_id, event_id, position, relation, confidence, created_at)
|
|
121
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
122
|
+
`).run(input.episodeId, input.eventId, position, input.relation, input.confidence, input.occurredAt);
|
|
123
|
+
const candidateTypes = [...new Set([...episode.candidateTypes, ...(input.candidateTypes || [])])];
|
|
124
|
+
const importanceSignals = [...new Set([...episode.importanceSignals, ...(input.importanceSignals || [])])];
|
|
125
|
+
this.db.prepare(`
|
|
126
|
+
UPDATE memory_episodes SET
|
|
127
|
+
end_event_id = ?, end_seq = COALESCE(?, end_seq), event_count = ?, updated_at = ?,
|
|
128
|
+
episode_type = COALESCE(?, episode_type), importance = MAX(importance, ?),
|
|
129
|
+
summary = CASE WHEN ? IS NULL OR ? = '' THEN summary ELSE SUBSTR(COALESCE(summary || '\n', '') || ?, 1, 1600) END,
|
|
130
|
+
candidate_types_json = ?, importance_signals_json = ?, importance_reason = COALESCE(?, importance_reason)
|
|
131
|
+
WHERE episode_id = ?
|
|
132
|
+
`).run(input.eventId, input.globalSeq ?? null, position, input.occurredAt, input.episodeType || null, input.importance ?? episode.importance, input.summaryText || null, input.summaryText || '', input.summaryText || '', JSON.stringify(candidateTypes), JSON.stringify(importanceSignals), input.importanceReason || null, input.episodeId);
|
|
133
|
+
})();
|
|
134
|
+
return { episodeId: input.episodeId, eventId: input.eventId, position, relation: input.relation, confidence: input.confidence, createdAt: input.occurredAt };
|
|
135
|
+
}
|
|
136
|
+
getEventLink(eventId) {
|
|
137
|
+
const row = this.db.prepare(`SELECT * FROM memory_episode_events WHERE event_id = ?`).get(eventId);
|
|
138
|
+
return row ? mapEventLink(row) : undefined;
|
|
139
|
+
}
|
|
140
|
+
listEventLinks(episodeId) {
|
|
141
|
+
return this.db.prepare(`
|
|
142
|
+
SELECT * FROM memory_episode_events WHERE episode_id = ? ORDER BY position
|
|
143
|
+
`).all(episodeId).map(mapEventLink);
|
|
144
|
+
}
|
|
145
|
+
addCrossReference(input) {
|
|
146
|
+
const episode = this.getEpisode(input.episodeId);
|
|
147
|
+
if (!episode)
|
|
148
|
+
throw new Error(`episode_not_found:${input.episodeId}`);
|
|
149
|
+
if (episode.projectId !== input.projectId)
|
|
150
|
+
throw new Error(`episode_project_mismatch:${input.episodeId}`);
|
|
151
|
+
if (input.referencedEpisodeId) {
|
|
152
|
+
const referenced = this.getEpisode(input.referencedEpisodeId);
|
|
153
|
+
if (!referenced || referenced.projectId !== input.projectId)
|
|
154
|
+
throw new Error(`episode_cross_ref_project_mismatch:${input.referencedEpisodeId}`);
|
|
155
|
+
}
|
|
156
|
+
const id = `episode-cross-ref-${randomUUID()}`;
|
|
157
|
+
this.db.prepare(`
|
|
158
|
+
INSERT INTO episode_cross_refs (cross_ref_id, project_id, episode_id, referenced_episode_id, event_id,
|
|
159
|
+
relation, created_by, confidence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
160
|
+
`).run(id, input.projectId, input.episodeId, input.referencedEpisodeId || null, input.eventId || null, input.relation, input.createdBy, Math.max(0, Math.min(1, input.confidence ?? 1)), input.now ?? Date.now());
|
|
161
|
+
return id;
|
|
162
|
+
}
|
|
163
|
+
moveEventForRepair(eventId, targetEpisodeId, now = Date.now()) {
|
|
164
|
+
const link = this.getEventLink(eventId);
|
|
165
|
+
if (!link)
|
|
166
|
+
throw new Error(`episode_event_not_linked:${eventId}`);
|
|
167
|
+
const source = this.getEpisode(link.episodeId);
|
|
168
|
+
const target = this.getEpisode(targetEpisodeId);
|
|
169
|
+
if (!source || !target)
|
|
170
|
+
throw new Error('episode_not_found');
|
|
171
|
+
if (source.projectId !== target.projectId)
|
|
172
|
+
throw new Error('episode_project_mismatch');
|
|
173
|
+
this.db.transaction(() => {
|
|
174
|
+
const nextPosition = this.listEventLinks(targetEpisodeId).length + 1;
|
|
175
|
+
this.db.prepare(`UPDATE memory_episode_events SET episode_id = ?, position = ?, created_at = ? WHERE event_id = ?`)
|
|
176
|
+
.run(targetEpisodeId, nextPosition, now, eventId);
|
|
177
|
+
this.resequenceEpisode(source.episodeId, now);
|
|
178
|
+
this.resequenceEpisode(targetEpisodeId, now);
|
|
179
|
+
this.invalidateEpisodeDerivedState(source.episodeId, now);
|
|
180
|
+
this.invalidateEpisodeDerivedState(targetEpisodeId, now);
|
|
181
|
+
})();
|
|
182
|
+
return { sourceEpisodeId: source.episodeId, targetEpisodeId };
|
|
183
|
+
}
|
|
184
|
+
reclassifyForRepair(episodeId, input) {
|
|
185
|
+
const episode = this.getEpisode(episodeId);
|
|
186
|
+
if (!episode)
|
|
187
|
+
throw new Error(`episode_not_found:${episodeId}`);
|
|
188
|
+
this.db.prepare(`
|
|
189
|
+
UPDATE memory_episodes SET episode_type = ?, topic_path = ?, importance = ?, updated_at = ? WHERE episode_id = ?
|
|
190
|
+
`).run(input.episodeType || episode.episodeType, input.topicPath ?? episode.topicPath ?? null, input.importance === undefined ? episode.importance : Math.max(0, Math.min(1, input.importance)), input.now ?? Date.now(), episodeId);
|
|
191
|
+
this.invalidateEpisodeDerivedState(episodeId, input.now ?? Date.now());
|
|
192
|
+
return this.getEpisode(episodeId);
|
|
193
|
+
}
|
|
194
|
+
requeueDreamForRepair(episodeId, modeHint = 'normal', now = Date.now()) {
|
|
195
|
+
const episode = this.getEpisode(episodeId);
|
|
196
|
+
if (!episode)
|
|
197
|
+
throw new Error(`episode_not_found:${episodeId}`);
|
|
198
|
+
if (episode.eventCount === 0)
|
|
199
|
+
throw new Error(`episode_empty:${episodeId}`);
|
|
200
|
+
if (episode.status !== 'sealed')
|
|
201
|
+
throw new Error(`episode_not_sealed:${episodeId}`);
|
|
202
|
+
this.db.prepare(`
|
|
203
|
+
INSERT INTO episode_dream_jobs (episode_id, project_id, state, priority, mode_hint, attempts, candidate_ids_json, created_at, updated_at)
|
|
204
|
+
VALUES (?, ?, 'pending', ?, ?, 0, '[]', ?, ?)
|
|
205
|
+
ON CONFLICT(episode_id) DO UPDATE SET state = 'pending', mode_hint = excluded.mode_hint, attempts = 0,
|
|
206
|
+
lease_id = NULL, lease_until = NULL, last_error = NULL, retry_after = NULL, failure_category = NULL,
|
|
207
|
+
candidate_ids_json = '[]', updated_at = excluded.updated_at
|
|
208
|
+
`).run(episodeId, episode.projectId, Math.round(episode.importance * 100), modeHint, now, now);
|
|
209
|
+
this.db.prepare(`UPDATE memory_episodes SET dream_status = 'queued', dream_error = NULL, last_dream_run_id = NULL WHERE episode_id = ?`).run(episodeId);
|
|
210
|
+
}
|
|
211
|
+
recordRepairAudit(input) {
|
|
212
|
+
const repairId = `episode-repair-${randomUUID()}`;
|
|
213
|
+
this.db.prepare(`
|
|
214
|
+
INSERT INTO episode_repair_audit (repair_id, project_id, operation, payload_json, before_json, after_json, created_at)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
216
|
+
`).run(repairId, input.projectId, input.operation, JSON.stringify(input.payload), JSON.stringify(input.before), JSON.stringify(input.after), input.now ?? Date.now());
|
|
217
|
+
return repairId;
|
|
218
|
+
}
|
|
219
|
+
invalidateEpisodeDerivedState(episodeId, now) {
|
|
220
|
+
this.db.prepare(`DELETE FROM episode_dream_jobs WHERE episode_id = ?`).run(episodeId);
|
|
221
|
+
this.db.prepare(`
|
|
222
|
+
UPDATE memory_episodes SET dream_status = 'none', last_dream_run_id = NULL, last_dreamed_at = NULL,
|
|
223
|
+
dream_candidate_count = 0, dream_error = NULL, updated_at = ? WHERE episode_id = ?
|
|
224
|
+
`).run(now, episodeId);
|
|
225
|
+
}
|
|
226
|
+
resequenceEpisode(episodeId, now) {
|
|
227
|
+
const links = this.listEventLinks(episodeId);
|
|
228
|
+
for (const [index, link] of links.entries()) {
|
|
229
|
+
if (link.position !== index + 1)
|
|
230
|
+
this.db.prepare(`UPDATE memory_episode_events SET position = ? WHERE event_id = ?`).run(index + 1, link.eventId);
|
|
231
|
+
}
|
|
232
|
+
const events = links.map((link) => this.resolveEvent?.(link.eventId)).filter((event) => Boolean(event));
|
|
233
|
+
const first = events[0];
|
|
234
|
+
const last = events.at(-1);
|
|
235
|
+
this.db.prepare(`
|
|
236
|
+
UPDATE memory_episodes SET event_count = ?, start_event_id = COALESCE(?, start_event_id),
|
|
237
|
+
end_event_id = COALESCE(?, end_event_id), start_seq = ?, end_seq = ?, updated_at = ? WHERE episode_id = ?
|
|
238
|
+
`).run(links.length, first?.eventId || null, last?.eventId || null, first?.globalSeq ?? null, last?.globalSeq ?? null, now, episodeId);
|
|
239
|
+
}
|
|
240
|
+
reopenSoftEpisode(episodeId, now) {
|
|
241
|
+
const result = this.db.prepare(`
|
|
242
|
+
UPDATE memory_episodes SET status = 'open', sealed_at = NULL, updated_at = ?, dream_status = 'none', dream_error = NULL
|
|
243
|
+
WHERE episode_id = ? AND status = 'soft_sealed'
|
|
244
|
+
`).run(now, episodeId);
|
|
245
|
+
if (!result.changes)
|
|
246
|
+
throw new Error(`episode_not_soft_sealed:${episodeId}`);
|
|
247
|
+
this.db.prepare(`DELETE FROM episode_dream_jobs WHERE episode_id = ? AND state IN ('pending', 'failed_retryable', 'retry_scheduled')`).run(episodeId);
|
|
248
|
+
return this.getEpisode(episodeId);
|
|
249
|
+
}
|
|
250
|
+
sealEpisode(episodeId, input) {
|
|
251
|
+
const now = input.now ?? Date.now();
|
|
252
|
+
const episode = this.getEpisode(episodeId);
|
|
253
|
+
if (!episode)
|
|
254
|
+
throw new Error(`episode_not_found:${episodeId}`);
|
|
255
|
+
const status = input.mode === 'soft' ? 'soft_sealed' : 'sealed';
|
|
256
|
+
const auditReseal = input.mode === 'manual' || input.reasonCode === 'repair' || /repair|force|recompute/iu.test(input.reason);
|
|
257
|
+
if (episode.status === status && !auditReseal) {
|
|
258
|
+
const existing = this.listClosureReceipts({ episodeId, limit: 1 })[0];
|
|
259
|
+
if (existing)
|
|
260
|
+
return existing;
|
|
261
|
+
}
|
|
262
|
+
const links = this.listEventLinks(episodeId);
|
|
263
|
+
if (links.length === 0 && input.mode !== 'soft')
|
|
264
|
+
throw new Error(`episode_empty:${episodeId}`);
|
|
265
|
+
const requiresReview = input.requiresReview === true || links.length === 0;
|
|
266
|
+
const semanticSummary = input.semanticSummary || summarizeEpisode(episode, links.map((link) => this.resolveEvent?.(link.eventId)).filter((event) => Boolean(event)), links.map((link) => link.eventId));
|
|
267
|
+
const dreamMode = episode.eventCount >= 100
|
|
268
|
+
? 'deep'
|
|
269
|
+
: episode.importance >= 0.8 || ['decision', 'correction', 'preference', 'goal', 'prospective'].includes(episode.episodeType)
|
|
270
|
+
? 'micro' : 'normal';
|
|
271
|
+
const receipt = {
|
|
272
|
+
receiptId: `episode-closure-${randomUUID()}`,
|
|
273
|
+
episodeId,
|
|
274
|
+
projectId: episode.projectId,
|
|
275
|
+
closureMode: input.mode,
|
|
276
|
+
closureReason: input.reason,
|
|
277
|
+
closureReasonCode: input.reasonCode || normalizeClosureReasonCode(input.reason, input.mode),
|
|
278
|
+
closureReasonDetail: input.reasonDetail || input.reason,
|
|
279
|
+
sourceEventIds: links.map((link) => link.eventId),
|
|
280
|
+
startSeq: episode.startSeq,
|
|
281
|
+
endSeq: episode.endSeq,
|
|
282
|
+
topicPath: episode.topicPath,
|
|
283
|
+
episodeType: episode.episodeType,
|
|
284
|
+
importance: episode.importance,
|
|
285
|
+
dreamRecommended: links.length > 0 && !requiresReview,
|
|
286
|
+
dreamMode,
|
|
287
|
+
requiresReview,
|
|
288
|
+
ignoredNearbyEventIds: input.ignoredNearbyEventIds || [],
|
|
289
|
+
unassignedNearbyEventIds: input.unassignedNearbyEventIds || [],
|
|
290
|
+
createdAt: now,
|
|
291
|
+
};
|
|
292
|
+
this.db.transaction(() => {
|
|
293
|
+
this.db.prepare(`
|
|
294
|
+
UPDATE memory_episodes SET status = ?, sealed_at = ?, updated_at = ?,
|
|
295
|
+
semantic_summary_json = COALESCE(?, semantic_summary_json)
|
|
296
|
+
WHERE episode_id = ?
|
|
297
|
+
`).run(status, now, now, JSON.stringify(semanticSummary), episodeId);
|
|
298
|
+
this.db.prepare(`
|
|
299
|
+
INSERT INTO episode_closure_receipts (
|
|
300
|
+
receipt_id, episode_id, project_id, closure_mode, closure_reason, source_event_ids_json,
|
|
301
|
+
start_seq, end_seq, topic_path, episode_type, importance, dream_recommended, dream_mode, created_at,
|
|
302
|
+
closure_reason_code, closure_reason_detail, requires_review,
|
|
303
|
+
ignored_nearby_event_ids_json, unassigned_nearby_event_ids_json
|
|
304
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
305
|
+
`).run(receipt.receiptId, episodeId, episode.projectId, input.mode, input.reason, JSON.stringify(receipt.sourceEventIds), receipt.startSeq ?? null, receipt.endSeq ?? null, receipt.topicPath || null, receipt.episodeType, receipt.importance, receipt.dreamRecommended ? 1 : 0, receipt.dreamMode, now, receipt.closureReasonCode, receipt.closureReasonDetail || null, receipt.requiresReview ? 1 : 0, JSON.stringify(receipt.ignoredNearbyEventIds), JSON.stringify(receipt.unassignedNearbyEventIds));
|
|
306
|
+
if (status === 'sealed' && receipt.dreamRecommended && !receipt.requiresReview)
|
|
307
|
+
this.enqueueDreamJob(episode, dreamMode, now);
|
|
308
|
+
})();
|
|
309
|
+
return receipt;
|
|
310
|
+
}
|
|
311
|
+
listClosureReceipts(options = {}) {
|
|
312
|
+
const where = [];
|
|
313
|
+
const params = [];
|
|
314
|
+
if (options.episodeId) {
|
|
315
|
+
where.push('episode_id = ?');
|
|
316
|
+
params.push(options.episodeId);
|
|
317
|
+
}
|
|
318
|
+
if (options.projectId) {
|
|
319
|
+
where.push('project_id = ?');
|
|
320
|
+
params.push(options.projectId);
|
|
321
|
+
}
|
|
322
|
+
const rows = this.db.prepare(`
|
|
323
|
+
SELECT * FROM episode_closure_receipts ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
|
|
324
|
+
ORDER BY created_at DESC LIMIT ?
|
|
325
|
+
`).all(...params, Math.max(1, Math.min(Math.trunc(options.limit ?? 100), 1000)));
|
|
326
|
+
return rows.map(mapClosure);
|
|
327
|
+
}
|
|
328
|
+
sealIdleEpisodes(input) {
|
|
329
|
+
const episodes = this.listEpisodes({ projectId: input.projectId, statuses: ['open'], limit: 1000 })
|
|
330
|
+
.filter((episode) => episode.updatedAt <= input.idleBefore);
|
|
331
|
+
return episodes.map((episode) => this.sealEpisode(episode.episodeId, { mode: 'soft', reason: 'idle_timeout', now: input.now }));
|
|
332
|
+
}
|
|
333
|
+
finalizeMatureSoftSeals(input) {
|
|
334
|
+
const now = input.now ?? Date.now();
|
|
335
|
+
const episodes = this.listEpisodes({ projectId: input.projectId, statuses: ['soft_sealed'], limit: 1000 })
|
|
336
|
+
.filter((episode) => (episode.sealedAt || episode.updatedAt) <= input.sealedBefore);
|
|
337
|
+
for (const episode of episodes)
|
|
338
|
+
this.sealEpisode(episode.episodeId, { mode: 'hard', reason: 'soft_seal_stabilized', now });
|
|
339
|
+
return episodes.length;
|
|
340
|
+
}
|
|
341
|
+
claimDreamJobs(input) {
|
|
342
|
+
this.db.prepare(`
|
|
343
|
+
UPDATE episode_dream_jobs SET state = 'failed_terminal', lease_id = NULL, lease_until = NULL,
|
|
344
|
+
failure_category = 'lease_attempt_limit',
|
|
345
|
+
last_error = COALESCE(last_error, 'dream_lease_expired_at_attempt_limit'), updated_at = ?
|
|
346
|
+
WHERE state = 'processing' AND lease_until IS NOT NULL AND lease_until < ? AND attempts >= ?
|
|
347
|
+
`).run(input.now, input.now, input.maxAttempts);
|
|
348
|
+
this.db.prepare(`
|
|
349
|
+
UPDATE memory_episodes SET dream_status = 'failed', dream_error = 'dream_lease_expired_at_attempt_limit'
|
|
350
|
+
WHERE episode_id IN (
|
|
351
|
+
SELECT episode_id FROM episode_dream_jobs
|
|
352
|
+
WHERE state = 'failed_terminal' AND failure_category = 'lease_attempt_limit' AND updated_at = ?
|
|
353
|
+
)
|
|
354
|
+
`).run(input.now);
|
|
355
|
+
this.db.prepare(`
|
|
356
|
+
UPDATE episode_dream_jobs SET state = 'failed_retryable', retry_after = ?, lease_id = NULL, lease_until = NULL,
|
|
357
|
+
failure_category = 'lease_expired', last_error = COALESCE(last_error, 'dream_lease_expired'), updated_at = ?
|
|
358
|
+
WHERE state = 'processing' AND lease_until IS NOT NULL AND lease_until < ? AND attempts < ?
|
|
359
|
+
`).run(input.now + retryDelayMs(1), input.now, input.now, input.maxAttempts);
|
|
360
|
+
this.db.prepare(`
|
|
361
|
+
UPDATE memory_episodes SET dream_status = 'failed', dream_error = 'dream_lease_expired'
|
|
362
|
+
WHERE episode_id IN (
|
|
363
|
+
SELECT episode_id FROM episode_dream_jobs
|
|
364
|
+
WHERE state = 'failed_retryable' AND failure_category = 'lease_expired' AND updated_at = ?
|
|
365
|
+
)
|
|
366
|
+
`).run(input.now);
|
|
367
|
+
this.db.prepare(`
|
|
368
|
+
UPDATE episode_dream_jobs SET state = 'retry_scheduled', updated_at = ?
|
|
369
|
+
WHERE state = 'failed_retryable' AND retry_after IS NOT NULL AND retry_after <= ? AND attempts < ?
|
|
370
|
+
`).run(input.now, input.now, input.maxAttempts);
|
|
371
|
+
this.db.prepare(`
|
|
372
|
+
UPDATE memory_episodes SET dream_status = 'queued', dream_error = NULL
|
|
373
|
+
WHERE episode_id IN (SELECT episode_id FROM episode_dream_jobs WHERE state = 'retry_scheduled' AND updated_at = ?)
|
|
374
|
+
`).run(input.now);
|
|
375
|
+
const where = [`(state = 'pending' OR (state = 'retry_scheduled' AND attempts < ?))`];
|
|
376
|
+
const params = [input.maxAttempts];
|
|
377
|
+
if (input.projectId) {
|
|
378
|
+
where.push('project_id = ?');
|
|
379
|
+
params.push(input.projectId);
|
|
380
|
+
}
|
|
381
|
+
const rows = this.db.prepare(`
|
|
382
|
+
SELECT episode_id, project_id, mode_hint, attempts, created_at FROM episode_dream_jobs
|
|
383
|
+
WHERE ${where.join(' AND ')} ORDER BY priority DESC, created_at LIMIT ?
|
|
384
|
+
`).all(...params, Math.max(1, Math.min(Math.trunc(input.limit), 100)));
|
|
385
|
+
const claimed = [];
|
|
386
|
+
for (const row of rows) {
|
|
387
|
+
const leaseId = `dream-lease-${randomUUID()}`;
|
|
388
|
+
const result = this.db.prepare(`
|
|
389
|
+
UPDATE episode_dream_jobs SET state = 'processing', lease_id = ?, lease_until = ?, attempts = attempts + 1,
|
|
390
|
+
retry_after = NULL, updated_at = ?
|
|
391
|
+
WHERE episode_id = ? AND state IN ('pending', 'retry_scheduled')
|
|
392
|
+
`).run(leaseId, input.now + input.leaseMs, input.now, row.episode_id);
|
|
393
|
+
if (result.changes) {
|
|
394
|
+
this.db.prepare(`
|
|
395
|
+
UPDATE memory_episodes SET dream_status = 'processing', last_dream_run_id = ?, dream_error = NULL
|
|
396
|
+
WHERE episode_id = ?
|
|
397
|
+
`).run(input.runId || null, row.episode_id);
|
|
398
|
+
claimed.push({
|
|
399
|
+
episodeId: row.episode_id, projectId: row.project_id, leaseId, modeHint: row.mode_hint,
|
|
400
|
+
attempts: row.attempts + 1, createdAt: row.created_at,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return claimed;
|
|
405
|
+
}
|
|
406
|
+
completeDreamJob(episodeId, leaseId, candidateIds, now) {
|
|
407
|
+
const result = this.db.prepare(`
|
|
408
|
+
UPDATE episode_dream_jobs SET state = 'processed', candidate_ids_json = ?, lease_id = NULL,
|
|
409
|
+
lease_until = NULL, retry_after = NULL, failure_category = NULL, last_error = NULL, updated_at = ?
|
|
410
|
+
WHERE episode_id = ? AND state = 'processing' AND lease_id = ?
|
|
411
|
+
`).run(JSON.stringify(candidateIds), now, episodeId, leaseId);
|
|
412
|
+
if (!result.changes)
|
|
413
|
+
throw new Error(`episode_dream_lease_lost:${episodeId}`);
|
|
414
|
+
this.db.prepare(`
|
|
415
|
+
UPDATE memory_episodes SET dream_status = 'processed', last_dreamed_at = ?,
|
|
416
|
+
dream_candidate_count = ?, dream_error = NULL WHERE episode_id = ?
|
|
417
|
+
`).run(now, candidateIds.length, episodeId);
|
|
418
|
+
}
|
|
419
|
+
failDreamJob(episodeId, leaseId, error, input) {
|
|
420
|
+
const state = input.terminal ? 'failed_terminal' : 'failed_retryable';
|
|
421
|
+
const result = this.db.prepare(`
|
|
422
|
+
UPDATE episode_dream_jobs SET state = ?, last_error = ?, failure_category = ?, retry_after = ?,
|
|
423
|
+
lease_id = NULL, lease_until = NULL, updated_at = ?
|
|
424
|
+
WHERE episode_id = ? AND state = 'processing' AND lease_id = ?
|
|
425
|
+
`).run(state, error.slice(0, 2000), input.failureCategory, input.retryAfter ?? null, input.now, episodeId, leaseId);
|
|
426
|
+
if (!result.changes)
|
|
427
|
+
return;
|
|
428
|
+
this.db.prepare(`UPDATE memory_episodes SET dream_status = 'failed', dream_error = ? WHERE episode_id = ?`)
|
|
429
|
+
.run(error.slice(0, 2000), episodeId);
|
|
430
|
+
}
|
|
431
|
+
retryFailed(projectId) {
|
|
432
|
+
const result = projectId
|
|
433
|
+
? this.db.prepare(`UPDATE episode_dream_jobs SET state = 'pending', retry_after = NULL, lease_id = NULL, lease_until = NULL, updated_at = ? WHERE project_id = ? AND state = 'failed_retryable'`).run(Date.now(), projectId)
|
|
434
|
+
: this.db.prepare(`UPDATE episode_dream_jobs SET state = 'pending', retry_after = NULL, lease_id = NULL, lease_until = NULL, updated_at = ? WHERE state = 'failed_retryable'`).run(Date.now());
|
|
435
|
+
if (result.changes) {
|
|
436
|
+
const where = projectId
|
|
437
|
+
? `episode_id IN (SELECT episode_id FROM episode_dream_jobs WHERE project_id = ? AND state = 'pending')`
|
|
438
|
+
: `episode_id IN (SELECT episode_id FROM episode_dream_jobs WHERE state = 'pending')`;
|
|
439
|
+
const statement = this.db.prepare(`UPDATE memory_episodes SET dream_status = 'queued', dream_error = NULL WHERE ${where}`);
|
|
440
|
+
projectId ? statement.run(projectId) : statement.run();
|
|
441
|
+
}
|
|
442
|
+
return Number(result.changes || 0);
|
|
443
|
+
}
|
|
444
|
+
getDreamStatus(projectId) {
|
|
445
|
+
const rows = (projectId
|
|
446
|
+
? this.db.prepare(`SELECT state, COUNT(*) AS count FROM episode_dream_jobs WHERE project_id = ? GROUP BY state`).all(projectId)
|
|
447
|
+
: this.db.prepare(`SELECT state, COUNT(*) AS count FROM episode_dream_jobs GROUP BY state`).all());
|
|
448
|
+
const status = {
|
|
449
|
+
projectId, pending: 0, processing: 0, processed: 0, failed: 0,
|
|
450
|
+
failedRetryable: 0, failedTerminal: 0, retryScheduled: 0, skipped: 0,
|
|
451
|
+
};
|
|
452
|
+
for (const row of rows) {
|
|
453
|
+
if (row.state === 'failed_retryable')
|
|
454
|
+
status.failedRetryable = row.count;
|
|
455
|
+
else if (row.state === 'failed_terminal')
|
|
456
|
+
status.failedTerminal = row.count;
|
|
457
|
+
else if (row.state === 'retry_scheduled')
|
|
458
|
+
status.retryScheduled = row.count;
|
|
459
|
+
else if (row.state === 'pending')
|
|
460
|
+
status.pending = row.count;
|
|
461
|
+
else if (row.state === 'processing')
|
|
462
|
+
status.processing = row.count;
|
|
463
|
+
else if (row.state === 'processed')
|
|
464
|
+
status.processed = row.count;
|
|
465
|
+
else if (row.state === 'skipped')
|
|
466
|
+
status.skipped = row.count;
|
|
467
|
+
}
|
|
468
|
+
status.failed = status.failedRetryable + status.failedTerminal;
|
|
469
|
+
return status;
|
|
470
|
+
}
|
|
471
|
+
countUnassignedRawEvents(projectId) {
|
|
472
|
+
const row = projectId
|
|
473
|
+
? this.db.prepare(`
|
|
474
|
+
SELECT COUNT(*) AS count FROM memory_events e
|
|
475
|
+
LEFT JOIN memory_episode_events ee ON ee.event_id = e.event_id
|
|
476
|
+
LEFT JOIN episode_event_dispositions ed ON ed.event_id = e.event_id
|
|
477
|
+
WHERE e.event_type = 'RAW_EVENT_RECORDED' AND e.project_id = ? AND ee.event_id IS NULL AND ed.event_id IS NULL
|
|
478
|
+
`).get(projectId)
|
|
479
|
+
: this.db.prepare(`
|
|
480
|
+
SELECT COUNT(*) AS count FROM memory_events e
|
|
481
|
+
LEFT JOIN memory_episode_events ee ON ee.event_id = e.event_id
|
|
482
|
+
LEFT JOIN episode_event_dispositions ed ON ed.event_id = e.event_id
|
|
483
|
+
WHERE e.event_type = 'RAW_EVENT_RECORDED' AND ee.event_id IS NULL AND ed.event_id IS NULL
|
|
484
|
+
`).get();
|
|
485
|
+
return Number(row?.count || 0);
|
|
486
|
+
}
|
|
487
|
+
markEventDisposition(input) {
|
|
488
|
+
this.db.prepare(`
|
|
489
|
+
INSERT INTO episode_event_dispositions (event_id, project_id, disposition, reason, created_at)
|
|
490
|
+
VALUES (?, ?, ?, ?, ?)
|
|
491
|
+
ON CONFLICT(event_id) DO UPDATE SET disposition = excluded.disposition, reason = excluded.reason
|
|
492
|
+
`).run(input.eventId, input.projectId, input.disposition, input.reason, input.now ?? Date.now());
|
|
493
|
+
}
|
|
494
|
+
hasEventDisposition(eventId) {
|
|
495
|
+
return Boolean(this.db.prepare(`SELECT 1 FROM episode_event_dispositions WHERE event_id = ?`).get(eventId));
|
|
496
|
+
}
|
|
497
|
+
recordDreamRun(input) {
|
|
498
|
+
this.db.prepare(`
|
|
499
|
+
INSERT INTO episode_dream_runs (
|
|
500
|
+
run_id, project_id, requested_mode, selected_mode, reason, episode_ids_json,
|
|
501
|
+
candidate_ids_json, status, duration_ms, error, created_at, failed_episode_ids_json, failure_details_json
|
|
502
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
503
|
+
`).run(input.runId, input.projectId || null, input.requestedMode, input.selectedMode, input.reason, JSON.stringify(input.episodeIds), JSON.stringify(input.candidateIds), input.status, input.durationMs, input.error || null, input.createdAt, JSON.stringify((input.failedEpisodes || []).map((item) => item.episodeId)), JSON.stringify(input.failedEpisodes || []));
|
|
504
|
+
}
|
|
505
|
+
getIngestedEvent(projectId, sourceAgent, sourceSessionId, externalMessageId) {
|
|
506
|
+
const row = this.db.prepare(`
|
|
507
|
+
SELECT event_id FROM episode_ingest_keys
|
|
508
|
+
WHERE project_id = ? AND source_agent = ? AND source_session_id = ? AND external_message_id = ?
|
|
509
|
+
`).get(projectId, sourceAgent, sourceSessionId, externalMessageId);
|
|
510
|
+
return row?.event_id;
|
|
511
|
+
}
|
|
512
|
+
recordIngestKey(input) {
|
|
513
|
+
const now = input.now ?? Date.now();
|
|
514
|
+
this.db.prepare(`
|
|
515
|
+
INSERT OR IGNORE INTO episode_ingest_keys (
|
|
516
|
+
ingest_key, project_id, source_agent, source_session_id, external_message_id, event_id, state, created_at, updated_at
|
|
517
|
+
) VALUES (?, ?, ?, ?, ?, ?, 'reserved', ?, ?)
|
|
518
|
+
`).run(`${input.projectId}\u0000${input.sourceAgent}\u0000${input.sourceSessionId}\u0000${input.externalMessageId}`, input.projectId, input.sourceAgent, input.sourceSessionId, input.externalMessageId, input.eventId, now, now);
|
|
519
|
+
}
|
|
520
|
+
markIngestState(input) {
|
|
521
|
+
this.db.prepare(`
|
|
522
|
+
UPDATE episode_ingest_keys SET state = ?, last_error = ?, updated_at = ?
|
|
523
|
+
WHERE project_id = ? AND source_agent = ? AND source_session_id = ? AND external_message_id = ?
|
|
524
|
+
`).run(input.state, input.error?.slice(0, 2000) || null, input.now ?? Date.now(), input.projectId, input.sourceAgent, input.sourceSessionId, input.externalMessageId);
|
|
525
|
+
}
|
|
526
|
+
getIngestState(projectId, sourceAgent, sourceSessionId, externalMessageId) {
|
|
527
|
+
const row = this.db.prepare(`
|
|
528
|
+
SELECT event_id, state, last_error, updated_at FROM episode_ingest_keys
|
|
529
|
+
WHERE project_id = ? AND source_agent = ? AND source_session_id = ? AND external_message_id = ?
|
|
530
|
+
`).get(projectId, sourceAgent, sourceSessionId, externalMessageId);
|
|
531
|
+
return row ? { eventId: row.event_id, state: row.state, error: row.last_error || undefined, updatedAt: row.updated_at ?? undefined } : undefined;
|
|
532
|
+
}
|
|
533
|
+
deleteByProject(projectId) {
|
|
534
|
+
let count = 0;
|
|
535
|
+
const run = (sql) => { count += Number(this.db.prepare(sql).run(projectId).changes || 0); };
|
|
536
|
+
run(`DELETE FROM episode_dream_runs WHERE project_id = ?`);
|
|
537
|
+
run(`DELETE FROM episode_dream_jobs WHERE project_id = ?`);
|
|
538
|
+
run(`DELETE FROM episode_closure_receipts WHERE project_id = ?`);
|
|
539
|
+
run(`DELETE FROM episode_ingest_keys WHERE project_id = ?`);
|
|
540
|
+
run(`DELETE FROM episode_event_dispositions WHERE project_id = ?`);
|
|
541
|
+
const episodeIds = this.db.prepare(`SELECT episode_id FROM memory_episodes WHERE project_id = ?`).all(projectId).map((row) => row.episode_id);
|
|
542
|
+
if (episodeIds.length) {
|
|
543
|
+
const placeholders = episodeIds.map(() => '?').join(', ');
|
|
544
|
+
count += Number(this.db.prepare(`DELETE FROM memory_episode_events WHERE episode_id IN (${placeholders})`).run(...episodeIds).changes || 0);
|
|
545
|
+
}
|
|
546
|
+
run(`DELETE FROM memory_episodes WHERE project_id = ?`);
|
|
547
|
+
return count;
|
|
548
|
+
}
|
|
549
|
+
enqueueDreamJob(episode, modeHint, now) {
|
|
550
|
+
const priority = Math.round(episode.importance * 100) + (['correction', 'decision', 'prospective'].includes(episode.episodeType) ? 30 : 0);
|
|
551
|
+
this.db.prepare(`
|
|
552
|
+
INSERT INTO episode_dream_jobs (episode_id, project_id, state, priority, mode_hint, created_at, updated_at)
|
|
553
|
+
VALUES (?, ?, 'pending', ?, ?, ?, ?)
|
|
554
|
+
ON CONFLICT(episode_id) DO NOTHING
|
|
555
|
+
`).run(episode.episodeId, episode.projectId, priority, modeHint, now, now);
|
|
556
|
+
this.db.prepare(`UPDATE memory_episodes SET dream_status = 'queued', dream_error = NULL WHERE episode_id = ?`)
|
|
557
|
+
.run(episode.episodeId);
|
|
558
|
+
}
|
|
559
|
+
initializeSchema() {
|
|
560
|
+
// Migration 22 is authoritative. This keeps direct store construction compatible in tests and embeddings.
|
|
561
|
+
this.db.exec(`
|
|
562
|
+
CREATE TABLE IF NOT EXISTS memory_episodes (
|
|
563
|
+
episode_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, session_id TEXT NOT NULL, source_agent TEXT,
|
|
564
|
+
conversation_thread_id TEXT, topic_path TEXT, episode_type TEXT NOT NULL, status TEXT NOT NULL, importance REAL NOT NULL,
|
|
565
|
+
summary TEXT, start_event_id TEXT NOT NULL, end_event_id TEXT NOT NULL, start_seq INTEGER, end_seq INTEGER,
|
|
566
|
+
event_count INTEGER NOT NULL, started_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, sealed_at INTEGER,
|
|
567
|
+
semantic_summary_json TEXT, episode_tags_json TEXT NOT NULL DEFAULT '[]', candidate_types_json TEXT NOT NULL DEFAULT '[]',
|
|
568
|
+
importance_signals_json TEXT NOT NULL DEFAULT '[]', importance_reason TEXT, linked_episode_id TEXT,
|
|
569
|
+
dream_status TEXT NOT NULL DEFAULT 'none', last_dream_run_id TEXT, last_dreamed_at INTEGER,
|
|
570
|
+
dream_candidate_count INTEGER NOT NULL DEFAULT 0, dream_error TEXT
|
|
571
|
+
);
|
|
572
|
+
CREATE TABLE IF NOT EXISTS memory_episode_events (
|
|
573
|
+
episode_id TEXT NOT NULL, event_id TEXT NOT NULL UNIQUE, position INTEGER NOT NULL,
|
|
574
|
+
relation TEXT NOT NULL, confidence REAL NOT NULL, created_at INTEGER NOT NULL,
|
|
575
|
+
PRIMARY KEY (episode_id, event_id)
|
|
576
|
+
);
|
|
577
|
+
CREATE TABLE IF NOT EXISTS episode_closure_receipts (
|
|
578
|
+
receipt_id TEXT PRIMARY KEY, episode_id TEXT NOT NULL, project_id TEXT NOT NULL, closure_mode TEXT NOT NULL,
|
|
579
|
+
closure_reason TEXT NOT NULL, source_event_ids_json TEXT NOT NULL, start_seq INTEGER, end_seq INTEGER,
|
|
580
|
+
topic_path TEXT, episode_type TEXT NOT NULL, importance REAL NOT NULL, dream_recommended INTEGER NOT NULL,
|
|
581
|
+
dream_mode TEXT NOT NULL, created_at INTEGER NOT NULL, closure_reason_code TEXT NOT NULL DEFAULT 'manual',
|
|
582
|
+
closure_reason_detail TEXT, requires_review INTEGER NOT NULL DEFAULT 0,
|
|
583
|
+
ignored_nearby_event_ids_json TEXT NOT NULL DEFAULT '[]', unassigned_nearby_event_ids_json TEXT NOT NULL DEFAULT '[]'
|
|
584
|
+
);
|
|
585
|
+
CREATE TABLE IF NOT EXISTS episode_dream_jobs (
|
|
586
|
+
episode_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, state TEXT NOT NULL, priority INTEGER NOT NULL,
|
|
587
|
+
mode_hint TEXT NOT NULL, attempts INTEGER NOT NULL DEFAULT 0, lease_id TEXT, lease_until INTEGER,
|
|
588
|
+
last_error TEXT, retry_after INTEGER, failure_category TEXT,
|
|
589
|
+
candidate_ids_json TEXT NOT NULL DEFAULT '[]', created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL
|
|
590
|
+
);
|
|
591
|
+
CREATE TABLE IF NOT EXISTS episode_dream_runs (
|
|
592
|
+
run_id TEXT PRIMARY KEY, project_id TEXT, requested_mode TEXT NOT NULL, selected_mode TEXT NOT NULL,
|
|
593
|
+
reason TEXT NOT NULL, episode_ids_json TEXT NOT NULL, candidate_ids_json TEXT NOT NULL, status TEXT NOT NULL,
|
|
594
|
+
duration_ms INTEGER NOT NULL, error TEXT, created_at INTEGER NOT NULL,
|
|
595
|
+
failed_episode_ids_json TEXT NOT NULL DEFAULT '[]', failure_details_json TEXT NOT NULL DEFAULT '[]'
|
|
596
|
+
);
|
|
597
|
+
CREATE TABLE IF NOT EXISTS episode_ingest_keys (
|
|
598
|
+
ingest_key TEXT PRIMARY KEY, project_id TEXT NOT NULL, source_agent TEXT NOT NULL,
|
|
599
|
+
source_session_id TEXT NOT NULL, external_message_id TEXT NOT NULL,
|
|
600
|
+
event_id TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'committed', created_at INTEGER NOT NULL,
|
|
601
|
+
updated_at INTEGER, last_error TEXT
|
|
602
|
+
);
|
|
603
|
+
CREATE TABLE IF NOT EXISTS episode_event_dispositions (
|
|
604
|
+
event_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, disposition TEXT NOT NULL,
|
|
605
|
+
reason TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
606
|
+
);
|
|
607
|
+
CREATE TABLE IF NOT EXISTS episode_cross_refs (
|
|
608
|
+
cross_ref_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, episode_id TEXT NOT NULL, referenced_episode_id TEXT,
|
|
609
|
+
event_id TEXT, relation TEXT NOT NULL, created_by TEXT NOT NULL, confidence REAL NOT NULL, created_at INTEGER NOT NULL
|
|
610
|
+
);
|
|
611
|
+
CREATE TABLE IF NOT EXISTS episode_repair_audit (
|
|
612
|
+
repair_id TEXT PRIMARY KEY, project_id TEXT NOT NULL, operation TEXT NOT NULL, payload_json TEXT NOT NULL,
|
|
613
|
+
before_json TEXT NOT NULL, after_json TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
614
|
+
);
|
|
615
|
+
`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
function mapEpisode(row) {
|
|
619
|
+
return {
|
|
620
|
+
episodeId: row.episode_id, projectId: row.project_id, sessionId: row.session_id,
|
|
621
|
+
sourceAgent: row.source_agent || undefined, conversationThreadId: row.conversation_thread_id || undefined,
|
|
622
|
+
topicPath: row.topic_path || undefined,
|
|
623
|
+
episodeType: row.episode_type, status: row.status, importance: row.importance, summary: row.summary || undefined,
|
|
624
|
+
semanticSummary: parseJson(row.semantic_summary_json, undefined),
|
|
625
|
+
episodeTags: parseJson(row.episode_tags_json, []), candidateTypes: parseJson(row.candidate_types_json, []),
|
|
626
|
+
importanceSignals: parseJson(row.importance_signals_json, []), importanceReason: row.importance_reason || undefined,
|
|
627
|
+
linkedEpisodeId: row.linked_episode_id || undefined, dreamStatus: row.dream_status || 'none',
|
|
628
|
+
lastDreamRunId: row.last_dream_run_id || undefined, lastDreamedAt: row.last_dreamed_at ?? undefined,
|
|
629
|
+
dreamCandidateCount: row.dream_candidate_count || 0, dreamError: row.dream_error || undefined,
|
|
630
|
+
startEventId: row.start_event_id, endEventId: row.end_event_id,
|
|
631
|
+
startSeq: row.start_seq ?? undefined, endSeq: row.end_seq ?? undefined, eventCount: row.event_count,
|
|
632
|
+
startedAt: row.started_at, updatedAt: row.updated_at, sealedAt: row.sealed_at ?? undefined,
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
function mapEventLink(row) {
|
|
636
|
+
return { episodeId: row.episode_id, eventId: row.event_id, position: row.position, relation: row.relation, confidence: row.confidence, createdAt: row.created_at };
|
|
637
|
+
}
|
|
638
|
+
function mapClosure(row) {
|
|
639
|
+
return {
|
|
640
|
+
receiptId: row.receipt_id, episodeId: row.episode_id, projectId: row.project_id,
|
|
641
|
+
closureMode: row.closure_mode, closureReason: row.closure_reason,
|
|
642
|
+
closureReasonCode: row.closure_reason_code || normalizeClosureReasonCode(row.closure_reason, row.closure_mode),
|
|
643
|
+
closureReasonDetail: row.closure_reason_detail || undefined,
|
|
644
|
+
sourceEventIds: JSON.parse(row.source_event_ids_json), startSeq: row.start_seq ?? undefined,
|
|
645
|
+
endSeq: row.end_seq ?? undefined, topicPath: row.topic_path || undefined, episodeType: row.episode_type,
|
|
646
|
+
importance: row.importance, dreamRecommended: row.dream_recommended === 1, dreamMode: row.dream_mode,
|
|
647
|
+
requiresReview: row.requires_review === 1,
|
|
648
|
+
ignoredNearbyEventIds: parseJson(row.ignored_nearby_event_ids_json, []),
|
|
649
|
+
unassignedNearbyEventIds: parseJson(row.unassigned_nearby_event_ids_json, []),
|
|
650
|
+
createdAt: row.created_at,
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
function normalizeClosureReasonCode(reason, mode) {
|
|
654
|
+
if (reason.includes('topic_switch'))
|
|
655
|
+
return 'topic_switch';
|
|
656
|
+
if (reason.includes('batch'))
|
|
657
|
+
return 'batch_boundary';
|
|
658
|
+
if (reason.includes('idle'))
|
|
659
|
+
return 'idle_timeout';
|
|
660
|
+
if (reason.includes('soft_seal_stabilized'))
|
|
661
|
+
return 'soft_seal_stabilized';
|
|
662
|
+
if (reason.includes('repair'))
|
|
663
|
+
return 'repair';
|
|
664
|
+
if (reason.includes('explicit_user_closure'))
|
|
665
|
+
return 'explicit_user_closure';
|
|
666
|
+
return mode === 'manual' ? 'manual' : 'manual';
|
|
667
|
+
}
|
|
668
|
+
function parseJson(value, fallback) {
|
|
669
|
+
if (!value)
|
|
670
|
+
return fallback;
|
|
671
|
+
try {
|
|
672
|
+
return JSON.parse(value);
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
return fallback;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
function retryDelayMs(attempts) {
|
|
679
|
+
return Math.min(60 * 60_000, 30_000 * 2 ** Math.max(0, attempts - 1));
|
|
680
|
+
}
|