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,941 @@
|
|
|
1
|
+
import Database from 'bun:sqlite';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { extractDeviceCandidate, extractProjectCandidate, extractRelativeReferences, inferReferenceType, isLatestReference, isPreviousReference, normalizeLexiconText } from '../lexicon/coreMemoryLexicon.js';
|
|
4
|
+
export class EntityStore {
|
|
5
|
+
db;
|
|
6
|
+
ownsDb;
|
|
7
|
+
constructor(dbOrPath = ':memory:') {
|
|
8
|
+
if (typeof dbOrPath === 'string') {
|
|
9
|
+
this.db = new Database(dbOrPath);
|
|
10
|
+
this.ownsDb = true;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
this.db = dbOrPath;
|
|
14
|
+
this.ownsDb = false;
|
|
15
|
+
}
|
|
16
|
+
this.initializeSchema();
|
|
17
|
+
}
|
|
18
|
+
getDatabase() {
|
|
19
|
+
return this.db;
|
|
20
|
+
}
|
|
21
|
+
initializeSchema() {
|
|
22
|
+
this.db.exec(`
|
|
23
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
24
|
+
entity_id TEXT PRIMARY KEY,
|
|
25
|
+
canonical_name TEXT NOT NULL,
|
|
26
|
+
type TEXT NOT NULL,
|
|
27
|
+
aliases_json TEXT NOT NULL,
|
|
28
|
+
status TEXT NOT NULL,
|
|
29
|
+
created_from TEXT,
|
|
30
|
+
metadata_json TEXT,
|
|
31
|
+
created_at INTEGER NOT NULL,
|
|
32
|
+
updated_at INTEGER NOT NULL
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_entities_name_type
|
|
36
|
+
ON entities(canonical_name, type, updated_at DESC);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS entity_instances (
|
|
39
|
+
instance_id TEXT PRIMARY KEY,
|
|
40
|
+
canonical_entity_id TEXT NOT NULL,
|
|
41
|
+
canonical_name TEXT NOT NULL,
|
|
42
|
+
type TEXT NOT NULL,
|
|
43
|
+
aliases_json TEXT NOT NULL,
|
|
44
|
+
status TEXT NOT NULL,
|
|
45
|
+
created_from TEXT,
|
|
46
|
+
metadata_json TEXT,
|
|
47
|
+
created_at INTEGER NOT NULL,
|
|
48
|
+
updated_at INTEGER NOT NULL
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_entity_instances_name_type
|
|
52
|
+
ON entity_instances(canonical_name, type, updated_at DESC);
|
|
53
|
+
|
|
54
|
+
CREATE TABLE IF NOT EXISTS entity_aliases (
|
|
55
|
+
alias_id TEXT PRIMARY KEY,
|
|
56
|
+
entity_id TEXT NOT NULL,
|
|
57
|
+
alias_text TEXT NOT NULL,
|
|
58
|
+
normalized_alias TEXT NOT NULL,
|
|
59
|
+
created_at INTEGER NOT NULL,
|
|
60
|
+
updated_at INTEGER NOT NULL,
|
|
61
|
+
UNIQUE(entity_id, normalized_alias)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_entity_aliases_lookup
|
|
65
|
+
ON entity_aliases(normalized_alias, updated_at DESC);
|
|
66
|
+
|
|
67
|
+
CREATE TABLE IF NOT EXISTS entity_attributes (
|
|
68
|
+
attribute_id TEXT PRIMARY KEY,
|
|
69
|
+
entity_id TEXT NOT NULL,
|
|
70
|
+
attribute_key TEXT NOT NULL,
|
|
71
|
+
attribute_value TEXT NOT NULL,
|
|
72
|
+
normalized_value TEXT NOT NULL,
|
|
73
|
+
source_neuron_id TEXT,
|
|
74
|
+
created_at INTEGER NOT NULL,
|
|
75
|
+
updated_at INTEGER NOT NULL
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_entity_attributes_lookup
|
|
79
|
+
ON entity_attributes(entity_id, attribute_key, updated_at DESC);
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS entity_relations (
|
|
82
|
+
relation_id TEXT PRIMARY KEY,
|
|
83
|
+
source_entity_id TEXT NOT NULL,
|
|
84
|
+
target_entity_id TEXT NOT NULL,
|
|
85
|
+
relation_type TEXT NOT NULL,
|
|
86
|
+
source_neuron_id TEXT,
|
|
87
|
+
created_at INTEGER NOT NULL,
|
|
88
|
+
UNIQUE(source_entity_id, target_entity_id, relation_type)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE TABLE IF NOT EXISTS pending_entity_resolution (
|
|
92
|
+
pending_id TEXT PRIMARY KEY,
|
|
93
|
+
reference_text TEXT NOT NULL,
|
|
94
|
+
entity_type TEXT,
|
|
95
|
+
context_neuron_id TEXT,
|
|
96
|
+
resolved_entity_id TEXT,
|
|
97
|
+
status TEXT NOT NULL,
|
|
98
|
+
created_at INTEGER NOT NULL,
|
|
99
|
+
updated_at INTEGER NOT NULL
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_pending_entity_resolution_status
|
|
103
|
+
ON pending_entity_resolution(status, updated_at DESC);
|
|
104
|
+
|
|
105
|
+
CREATE TABLE IF NOT EXISTS entity_mentions (
|
|
106
|
+
mention_id TEXT PRIMARY KEY,
|
|
107
|
+
entity_id TEXT NOT NULL,
|
|
108
|
+
neuron_id TEXT,
|
|
109
|
+
project_id TEXT,
|
|
110
|
+
mention_type TEXT NOT NULL,
|
|
111
|
+
created_at INTEGER NOT NULL
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_entity_mentions_entity
|
|
115
|
+
ON entity_mentions(entity_id, created_at DESC);
|
|
116
|
+
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_entity_mentions_project
|
|
118
|
+
ON entity_mentions(project_id, created_at DESC);
|
|
119
|
+
|
|
120
|
+
CREATE TABLE IF NOT EXISTS entity_alias_conflicts (
|
|
121
|
+
conflict_id TEXT PRIMARY KEY,
|
|
122
|
+
normalized_alias TEXT NOT NULL,
|
|
123
|
+
entity_type TEXT NOT NULL,
|
|
124
|
+
entity_ids_json TEXT NOT NULL,
|
|
125
|
+
policy TEXT NOT NULL,
|
|
126
|
+
status TEXT NOT NULL,
|
|
127
|
+
created_at INTEGER NOT NULL,
|
|
128
|
+
updated_at INTEGER NOT NULL,
|
|
129
|
+
UNIQUE(normalized_alias, entity_type)
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_entity_alias_conflicts_lookup
|
|
133
|
+
ON entity_alias_conflicts(normalized_alias, entity_type, status);
|
|
134
|
+
`);
|
|
135
|
+
}
|
|
136
|
+
upsertEntity(input) {
|
|
137
|
+
const now = input.createdAt ?? Date.now();
|
|
138
|
+
const rawMention = typeof input.metadata?.rawMention === 'string'
|
|
139
|
+
? String(input.metadata.rawMention)
|
|
140
|
+
: undefined;
|
|
141
|
+
const answerDisplayName = typeof input.metadata?.answerDisplayName === 'string'
|
|
142
|
+
? String(input.metadata.answerDisplayName)
|
|
143
|
+
: undefined;
|
|
144
|
+
const aliases = Array.from(new Set([
|
|
145
|
+
...(input.aliases || []),
|
|
146
|
+
answerDisplayName
|
|
147
|
+
].filter((value) => Boolean(value && value.trim()))));
|
|
148
|
+
const metadata = {
|
|
149
|
+
...(input.metadata || {}),
|
|
150
|
+
ens1CanonicalIdentityName: input.canonicalName,
|
|
151
|
+
ens1IdentityFields: ['canonicalName', 'type', 'canonicalEntityId', 'entityId'],
|
|
152
|
+
ens1DisplayFields: ['answerDisplayName'],
|
|
153
|
+
...(rawMention ? { ens1RawMention: rawMention } : {}),
|
|
154
|
+
...(rawMention ? { ens1RawMentions: [rawMention] } : {}),
|
|
155
|
+
...(answerDisplayName ? { ens1AnswerDisplayName: answerDisplayName } : {})
|
|
156
|
+
};
|
|
157
|
+
const canonicalEntityId = this.ensureCanonicalEntity({
|
|
158
|
+
canonicalName: input.canonicalName,
|
|
159
|
+
type: input.type,
|
|
160
|
+
aliases,
|
|
161
|
+
status: input.status,
|
|
162
|
+
createdFrom: input.createdFrom,
|
|
163
|
+
metadata,
|
|
164
|
+
createdAt: now
|
|
165
|
+
});
|
|
166
|
+
const existing = this.findExistingInstance(input);
|
|
167
|
+
if (existing) {
|
|
168
|
+
const mergedAliases = Array.from(new Set([...(existing.aliases || []), ...aliases]));
|
|
169
|
+
const existingRawMentions = Array.isArray(existing.metadata?.ens1RawMentions)
|
|
170
|
+
? existing.metadata.ens1RawMentions.filter((value) => typeof value === 'string')
|
|
171
|
+
: [];
|
|
172
|
+
const mergedMetadata = {
|
|
173
|
+
...(existing.metadata || {}),
|
|
174
|
+
...metadata,
|
|
175
|
+
ens1RawMentions: Array.from(new Set([
|
|
176
|
+
...existingRawMentions,
|
|
177
|
+
...(rawMention ? [rawMention] : [])
|
|
178
|
+
]))
|
|
179
|
+
};
|
|
180
|
+
this.db.prepare(`
|
|
181
|
+
UPDATE entity_instances
|
|
182
|
+
SET aliases_json = ?, status = ?, metadata_json = ?, updated_at = ?
|
|
183
|
+
WHERE instance_id = ?
|
|
184
|
+
`).run(JSON.stringify(mergedAliases), input.status || existing.status, JSON.stringify(mergedMetadata), now, existing.entityId);
|
|
185
|
+
this.upsertAliases(existing.entityId, input.type, mergedAliases, now);
|
|
186
|
+
return this.findByEntityId(existing.entityId);
|
|
187
|
+
}
|
|
188
|
+
const record = {
|
|
189
|
+
entityId: `entity-${randomUUID()}`,
|
|
190
|
+
canonicalEntityId,
|
|
191
|
+
canonicalName: input.canonicalName,
|
|
192
|
+
type: input.type,
|
|
193
|
+
aliases,
|
|
194
|
+
status: input.status || 'active',
|
|
195
|
+
createdFrom: input.createdFrom,
|
|
196
|
+
metadata,
|
|
197
|
+
createdAt: now,
|
|
198
|
+
updatedAt: now
|
|
199
|
+
};
|
|
200
|
+
this.db.prepare(`
|
|
201
|
+
INSERT INTO entity_instances (
|
|
202
|
+
instance_id, canonical_entity_id, canonical_name, type, aliases_json, status, created_from, metadata_json, created_at, updated_at
|
|
203
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
204
|
+
`).run(record.entityId, canonicalEntityId, record.canonicalName, record.type, JSON.stringify(record.aliases), record.status, record.createdFrom || null, record.metadata ? JSON.stringify(record.metadata) : null, record.createdAt, record.updatedAt);
|
|
205
|
+
this.upsertAliases(record.entityId, input.type, [record.canonicalName, ...(record.aliases || [])], now);
|
|
206
|
+
return record;
|
|
207
|
+
}
|
|
208
|
+
findByAlias(aliasText, type) {
|
|
209
|
+
const matches = this.listByAlias(aliasText, type);
|
|
210
|
+
return matches[0] || null;
|
|
211
|
+
}
|
|
212
|
+
listByAlias(aliasText, type) {
|
|
213
|
+
const normalizedAlias = this.normalizeAlias(aliasText);
|
|
214
|
+
const rows = type
|
|
215
|
+
? this.db.prepare(`
|
|
216
|
+
SELECT e.*
|
|
217
|
+
FROM entity_aliases ea
|
|
218
|
+
JOIN entity_instances e ON e.instance_id = ea.entity_id
|
|
219
|
+
WHERE ea.normalized_alias = ? AND e.type = ?
|
|
220
|
+
ORDER BY ea.updated_at DESC
|
|
221
|
+
LIMIT 12
|
|
222
|
+
`).all(normalizedAlias, type)
|
|
223
|
+
: this.db.prepare(`
|
|
224
|
+
SELECT e.*
|
|
225
|
+
FROM entity_aliases ea
|
|
226
|
+
JOIN entity_instances e ON e.instance_id = ea.entity_id
|
|
227
|
+
WHERE ea.normalized_alias = ?
|
|
228
|
+
ORDER BY ea.updated_at DESC
|
|
229
|
+
LIMIT 12
|
|
230
|
+
`).all(normalizedAlias);
|
|
231
|
+
return rows.map((row) => this.mapRow(row));
|
|
232
|
+
}
|
|
233
|
+
findByCanonicalName(canonicalName, type) {
|
|
234
|
+
const row = type
|
|
235
|
+
? this.db.prepare(`
|
|
236
|
+
SELECT * FROM entity_instances WHERE canonical_name = ? AND type = ? ORDER BY updated_at DESC LIMIT 1
|
|
237
|
+
`).get(canonicalName, type)
|
|
238
|
+
: this.db.prepare(`
|
|
239
|
+
SELECT * FROM entity_instances WHERE canonical_name = ? ORDER BY updated_at DESC LIMIT 1
|
|
240
|
+
`).get(canonicalName);
|
|
241
|
+
return row ? this.mapRow(row) : null;
|
|
242
|
+
}
|
|
243
|
+
findByEntityId(entityId) {
|
|
244
|
+
const row = this.db.prepare(`
|
|
245
|
+
SELECT * FROM entity_instances WHERE instance_id = ?
|
|
246
|
+
`).get(entityId);
|
|
247
|
+
return row ? this.mapRow(row) : null;
|
|
248
|
+
}
|
|
249
|
+
findLatestByType(type) {
|
|
250
|
+
const row = this.db.prepare(`
|
|
251
|
+
SELECT * FROM entity_instances WHERE type = ? ORDER BY updated_at DESC, created_at DESC LIMIT 1
|
|
252
|
+
`).get(type);
|
|
253
|
+
return row ? this.mapRow(row) : null;
|
|
254
|
+
}
|
|
255
|
+
listRecentByType(type, limit = 8) {
|
|
256
|
+
const rows = this.db.prepare(`
|
|
257
|
+
SELECT * FROM entity_instances
|
|
258
|
+
WHERE type = ?
|
|
259
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
260
|
+
LIMIT ?
|
|
261
|
+
`).all(type, limit);
|
|
262
|
+
return rows.map((row) => this.mapRow(row));
|
|
263
|
+
}
|
|
264
|
+
listByCreationOrder(type, limit = 8) {
|
|
265
|
+
const rows = this.db.prepare(`
|
|
266
|
+
SELECT * FROM entity_instances
|
|
267
|
+
WHERE type = ?
|
|
268
|
+
ORDER BY created_at DESC, updated_at DESC
|
|
269
|
+
LIMIT ?
|
|
270
|
+
`).all(type, limit);
|
|
271
|
+
return rows.map((row) => this.mapRow(row));
|
|
272
|
+
}
|
|
273
|
+
listRelations(entityId, relationType) {
|
|
274
|
+
const rows = relationType
|
|
275
|
+
? this.db.prepare(`
|
|
276
|
+
SELECT * FROM entity_relations
|
|
277
|
+
WHERE (source_entity_id = ? OR target_entity_id = ?)
|
|
278
|
+
AND relation_type = ?
|
|
279
|
+
ORDER BY created_at DESC
|
|
280
|
+
`).all(entityId, entityId, relationType)
|
|
281
|
+
: this.db.prepare(`
|
|
282
|
+
SELECT * FROM entity_relations
|
|
283
|
+
WHERE source_entity_id = ? OR target_entity_id = ?
|
|
284
|
+
ORDER BY created_at DESC
|
|
285
|
+
`).all(entityId, entityId);
|
|
286
|
+
return rows.map((row) => ({
|
|
287
|
+
relationId: row.relation_id,
|
|
288
|
+
sourceEntityId: row.source_entity_id,
|
|
289
|
+
targetEntityId: row.target_entity_id,
|
|
290
|
+
relationType: row.relation_type,
|
|
291
|
+
sourceNeuronId: row.source_neuron_id || undefined,
|
|
292
|
+
createdAt: row.created_at
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
resolveReference(referenceText, typeHint, options) {
|
|
296
|
+
const disambiguation = this.listDisambiguationCandidates(referenceText, typeHint, options);
|
|
297
|
+
if (disambiguation.length > 0)
|
|
298
|
+
return disambiguation[0].entity;
|
|
299
|
+
const directMatches = [
|
|
300
|
+
...this.listByAlias(referenceText, typeHint),
|
|
301
|
+
...(typeHint
|
|
302
|
+
? (() => {
|
|
303
|
+
const exact = this.findByCanonicalName(referenceText, typeHint);
|
|
304
|
+
return exact ? [exact] : [];
|
|
305
|
+
})()
|
|
306
|
+
: [])
|
|
307
|
+
];
|
|
308
|
+
const direct = this.pickBestEntity(directMatches, options);
|
|
309
|
+
if (direct)
|
|
310
|
+
return direct;
|
|
311
|
+
const normalized = this.normalizeAlias(referenceText);
|
|
312
|
+
if (normalized === '之前那个') {
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
const relativeReference = extractRelativeReferences(normalized)[0];
|
|
316
|
+
if (relativeReference) {
|
|
317
|
+
return this.resolveRelativeReference(relativeReference, typeHint || inferReferenceType(relativeReference, referenceText) || 'device', options);
|
|
318
|
+
}
|
|
319
|
+
if (typeHint) {
|
|
320
|
+
return this.resolveRelativeReference('最新', typeHint, options);
|
|
321
|
+
}
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
listDisambiguationCandidates(referenceText, typeHint, options) {
|
|
325
|
+
const directMatches = [
|
|
326
|
+
...this.listByAlias(referenceText, typeHint),
|
|
327
|
+
...(typeHint
|
|
328
|
+
? (() => {
|
|
329
|
+
const exact = this.findByCanonicalName(referenceText, typeHint);
|
|
330
|
+
return exact ? [exact] : [];
|
|
331
|
+
})()
|
|
332
|
+
: [])
|
|
333
|
+
];
|
|
334
|
+
const uniqueCandidates = Array.from(new Map(directMatches.map((entity) => [entity.entityId, entity])).values());
|
|
335
|
+
if (uniqueCandidates.length === 0)
|
|
336
|
+
return [];
|
|
337
|
+
const normalizedAlias = this.normalizeAlias(referenceText);
|
|
338
|
+
const conflicts = typeHint
|
|
339
|
+
? this.listAliasConflicts(typeHint).filter((conflict) => conflict.normalizedAlias === normalizedAlias)
|
|
340
|
+
: this.listAliasConflicts().filter((conflict) => conflict.normalizedAlias === normalizedAlias);
|
|
341
|
+
const conflictPolicy = conflicts[0]?.policy;
|
|
342
|
+
const scored = uniqueCandidates.map((entity) => this.scoreDisambiguationCandidate(entity, normalizedAlias, conflictPolicy, options));
|
|
343
|
+
scored.sort((a, b) => b.score - a.score);
|
|
344
|
+
return scored;
|
|
345
|
+
}
|
|
346
|
+
listReferenceCandidatesWithRelativeSupport(referenceText, typeHint, options) {
|
|
347
|
+
const direct = this.listDisambiguationCandidates(referenceText, typeHint, options);
|
|
348
|
+
if (direct.length > 0)
|
|
349
|
+
return direct;
|
|
350
|
+
const normalized = this.normalizeAlias(referenceText);
|
|
351
|
+
const effectiveType = typeHint || inferReferenceType(normalized, referenceText) || 'device';
|
|
352
|
+
const explicitNameHint = this.extractRelativeNameHint(referenceText, effectiveType);
|
|
353
|
+
const recent = this.listByCreationOrder(effectiveType, 12)
|
|
354
|
+
.filter((entity) => this.matchesResolutionOptions(entity.entityId, options))
|
|
355
|
+
.filter((entity) => !this.isBareRelativeEntity(entity, effectiveType))
|
|
356
|
+
.filter((entity) => this.matchesExplicitRelativeHint(entity, explicitNameHint))
|
|
357
|
+
.slice(0, 4);
|
|
358
|
+
if (recent.length === 0)
|
|
359
|
+
return [];
|
|
360
|
+
const relativeReference = extractRelativeReferences(normalized)[0];
|
|
361
|
+
if (relativeReference && isPreviousReference(relativeReference)) {
|
|
362
|
+
return [recent[1], recent[0]]
|
|
363
|
+
.filter((entity) => Boolean(entity))
|
|
364
|
+
.map((entity, index) => ({
|
|
365
|
+
entity,
|
|
366
|
+
score: index === 0 ? 0.72 : 0.42,
|
|
367
|
+
reasons: ['relative_reference_previous'],
|
|
368
|
+
mentionCount: this.listTimeline({ entityId: entity.entityId, limit: 8 }).length,
|
|
369
|
+
latestMentionAt: this.listTimeline({ entityId: entity.entityId, limit: 1 })[0]?.createdAt
|
|
370
|
+
}));
|
|
371
|
+
}
|
|
372
|
+
if (relativeReference && isLatestReference(relativeReference) && !isWeakAmbiguousRelativeReference(relativeReference)) {
|
|
373
|
+
return recent
|
|
374
|
+
.slice(0, 2)
|
|
375
|
+
.map((entity, index) => ({
|
|
376
|
+
entity,
|
|
377
|
+
score: index === 0 ? 0.74 : 0.38,
|
|
378
|
+
reasons: ['relative_reference_latest'],
|
|
379
|
+
mentionCount: this.listTimeline({ entityId: entity.entityId, limit: 8 }).length,
|
|
380
|
+
latestMentionAt: this.listTimeline({ entityId: entity.entityId, limit: 1 })[0]?.createdAt
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
return recent
|
|
384
|
+
.slice(0, 2)
|
|
385
|
+
.map((entity, index, items) => ({
|
|
386
|
+
entity,
|
|
387
|
+
score: items.length === 1
|
|
388
|
+
? 0.71
|
|
389
|
+
: index === 0
|
|
390
|
+
? 0.58
|
|
391
|
+
: 0.52,
|
|
392
|
+
reasons: items.length === 1
|
|
393
|
+
? ['relative_reference_ambiguous_single_candidate']
|
|
394
|
+
: ['relative_reference_ambiguous_scope_only'],
|
|
395
|
+
mentionCount: this.listTimeline({ entityId: entity.entityId, limit: 8 }).length,
|
|
396
|
+
latestMentionAt: this.listTimeline({ entityId: entity.entityId, limit: 1 })[0]?.createdAt
|
|
397
|
+
}));
|
|
398
|
+
}
|
|
399
|
+
recordMention(input) {
|
|
400
|
+
const record = {
|
|
401
|
+
mentionId: `ement-${randomUUID()}`,
|
|
402
|
+
entityId: input.entityId,
|
|
403
|
+
neuronId: input.neuronId,
|
|
404
|
+
projectId: input.projectId,
|
|
405
|
+
mentionType: input.mentionType || 'referenced',
|
|
406
|
+
createdAt: input.createdAt ?? Date.now()
|
|
407
|
+
};
|
|
408
|
+
this.db.prepare(`
|
|
409
|
+
INSERT INTO entity_mentions (
|
|
410
|
+
mention_id, entity_id, neuron_id, project_id, mention_type, created_at
|
|
411
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
412
|
+
`).run(record.mentionId, record.entityId, record.neuronId || null, record.projectId || null, record.mentionType, record.createdAt);
|
|
413
|
+
this.touchEntity(record.entityId, record.createdAt);
|
|
414
|
+
const entity = this.findByEntityId(record.entityId);
|
|
415
|
+
if (entity) {
|
|
416
|
+
for (const alias of [entity.canonicalName, ...(entity.aliases || [])]) {
|
|
417
|
+
this.refreshAliasConflict(this.normalizeAlias(alias), entity.type, record.createdAt);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return record;
|
|
421
|
+
}
|
|
422
|
+
listTimeline(input) {
|
|
423
|
+
const limit = input.limit ?? 50;
|
|
424
|
+
let sql = `
|
|
425
|
+
SELECT em.*
|
|
426
|
+
FROM entity_mentions em
|
|
427
|
+
JOIN entity_instances e ON e.instance_id = em.entity_id
|
|
428
|
+
WHERE 1 = 1
|
|
429
|
+
`;
|
|
430
|
+
const params = [];
|
|
431
|
+
if (input.entityId) {
|
|
432
|
+
sql += ` AND em.entity_id = ?`;
|
|
433
|
+
params.push(input.entityId);
|
|
434
|
+
}
|
|
435
|
+
if (input.type) {
|
|
436
|
+
sql += ` AND e.type = ?`;
|
|
437
|
+
params.push(input.type);
|
|
438
|
+
}
|
|
439
|
+
if (input.projectId) {
|
|
440
|
+
sql += ` AND em.project_id = ?`;
|
|
441
|
+
params.push(input.projectId);
|
|
442
|
+
}
|
|
443
|
+
sql += ` ORDER BY em.created_at DESC LIMIT ?`;
|
|
444
|
+
params.push(limit);
|
|
445
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
446
|
+
return rows.map((row) => ({
|
|
447
|
+
mentionId: row.mention_id,
|
|
448
|
+
entityId: row.entity_id,
|
|
449
|
+
neuronId: row.neuron_id || undefined,
|
|
450
|
+
projectId: row.project_id || undefined,
|
|
451
|
+
mentionType: row.mention_type,
|
|
452
|
+
createdAt: row.created_at
|
|
453
|
+
}));
|
|
454
|
+
}
|
|
455
|
+
getEntityTimeline(input) {
|
|
456
|
+
const limit = input.limit ?? 50;
|
|
457
|
+
let sql = `
|
|
458
|
+
SELECT em.*, e.canonical_name, e.type
|
|
459
|
+
FROM entity_mentions em
|
|
460
|
+
JOIN entity_instances e ON e.instance_id = em.entity_id
|
|
461
|
+
WHERE 1 = 1
|
|
462
|
+
`;
|
|
463
|
+
const params = [];
|
|
464
|
+
if (input.type) {
|
|
465
|
+
sql += ` AND e.type = ?`;
|
|
466
|
+
params.push(input.type);
|
|
467
|
+
}
|
|
468
|
+
if (input.projectId) {
|
|
469
|
+
sql += ` AND em.project_id = ?`;
|
|
470
|
+
params.push(input.projectId);
|
|
471
|
+
}
|
|
472
|
+
if (input.entityIds?.length) {
|
|
473
|
+
sql += ` AND em.entity_id IN (${input.entityIds.map(() => '?').join(', ')})`;
|
|
474
|
+
params.push(...input.entityIds);
|
|
475
|
+
}
|
|
476
|
+
sql += ` ORDER BY em.created_at DESC LIMIT ?`;
|
|
477
|
+
params.push(limit);
|
|
478
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
479
|
+
return rows.map((row) => ({
|
|
480
|
+
entityId: row.entity_id,
|
|
481
|
+
canonicalName: row.canonical_name,
|
|
482
|
+
type: row.type,
|
|
483
|
+
mentionId: row.mention_id,
|
|
484
|
+
neuronId: row.neuron_id || undefined,
|
|
485
|
+
projectId: row.project_id || undefined,
|
|
486
|
+
mentionType: row.mention_type,
|
|
487
|
+
createdAt: row.created_at
|
|
488
|
+
}));
|
|
489
|
+
}
|
|
490
|
+
listEntitiesUpdatedInRange(startTime, endTime, type) {
|
|
491
|
+
const rows = type
|
|
492
|
+
? this.db.prepare(`
|
|
493
|
+
SELECT *
|
|
494
|
+
FROM entity_instances
|
|
495
|
+
WHERE updated_at >= ? AND updated_at < ? AND type = ?
|
|
496
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
497
|
+
`).all(startTime, endTime, type)
|
|
498
|
+
: this.db.prepare(`
|
|
499
|
+
SELECT *
|
|
500
|
+
FROM entity_instances
|
|
501
|
+
WHERE updated_at >= ? AND updated_at < ?
|
|
502
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
503
|
+
`).all(startTime, endTime);
|
|
504
|
+
return rows.map((row) => this.mapRow(row));
|
|
505
|
+
}
|
|
506
|
+
archiveEntity(entityId, updatedAt = Date.now()) {
|
|
507
|
+
this.db.prepare(`
|
|
508
|
+
UPDATE entity_instances
|
|
509
|
+
SET status = 'archived', updated_at = ?
|
|
510
|
+
WHERE instance_id = ?
|
|
511
|
+
`).run(updatedAt, entityId);
|
|
512
|
+
}
|
|
513
|
+
addAttribute(input) {
|
|
514
|
+
const now = input.createdAt ?? Date.now();
|
|
515
|
+
const record = {
|
|
516
|
+
attributeId: `eattr-${randomUUID()}`,
|
|
517
|
+
entityId: input.entityId,
|
|
518
|
+
attributeKey: input.attributeKey,
|
|
519
|
+
attributeValue: input.attributeValue,
|
|
520
|
+
normalizedValue: this.normalizeAlias(input.attributeValue),
|
|
521
|
+
sourceNeuronId: input.sourceNeuronId,
|
|
522
|
+
createdAt: now,
|
|
523
|
+
updatedAt: now
|
|
524
|
+
};
|
|
525
|
+
this.db.prepare(`
|
|
526
|
+
INSERT INTO entity_attributes (
|
|
527
|
+
attribute_id, entity_id, attribute_key, attribute_value, normalized_value, source_neuron_id, created_at, updated_at
|
|
528
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
529
|
+
`).run(record.attributeId, record.entityId, record.attributeKey, record.attributeValue, record.normalizedValue, record.sourceNeuronId || null, record.createdAt, record.updatedAt);
|
|
530
|
+
this.touchEntity(record.entityId, now);
|
|
531
|
+
return record;
|
|
532
|
+
}
|
|
533
|
+
listAttributes(entityId, attributeKey) {
|
|
534
|
+
const rows = attributeKey
|
|
535
|
+
? this.db.prepare(`
|
|
536
|
+
SELECT * FROM entity_attributes
|
|
537
|
+
WHERE entity_id = ? AND attribute_key = ?
|
|
538
|
+
ORDER BY updated_at DESC
|
|
539
|
+
`).all(entityId, attributeKey)
|
|
540
|
+
: this.db.prepare(`
|
|
541
|
+
SELECT * FROM entity_attributes
|
|
542
|
+
WHERE entity_id = ?
|
|
543
|
+
ORDER BY updated_at DESC
|
|
544
|
+
`).all(entityId);
|
|
545
|
+
return rows.map((row) => ({
|
|
546
|
+
attributeId: row.attribute_id,
|
|
547
|
+
entityId: row.entity_id,
|
|
548
|
+
attributeKey: row.attribute_key,
|
|
549
|
+
attributeValue: row.attribute_value,
|
|
550
|
+
normalizedValue: row.normalized_value,
|
|
551
|
+
sourceNeuronId: row.source_neuron_id || undefined,
|
|
552
|
+
createdAt: row.created_at,
|
|
553
|
+
updatedAt: row.updated_at
|
|
554
|
+
}));
|
|
555
|
+
}
|
|
556
|
+
addRelation(input) {
|
|
557
|
+
const createdAt = input.createdAt ?? Date.now();
|
|
558
|
+
const existing = this.db.prepare(`
|
|
559
|
+
SELECT relation_id, created_at
|
|
560
|
+
FROM entity_relations
|
|
561
|
+
WHERE source_entity_id = ? AND target_entity_id = ? AND relation_type = ?
|
|
562
|
+
`).get(input.sourceEntityId, input.targetEntityId, input.relationType);
|
|
563
|
+
const relationId = existing?.relation_id || `erel-${randomUUID()}`;
|
|
564
|
+
this.db.prepare(`
|
|
565
|
+
INSERT OR REPLACE INTO entity_relations (
|
|
566
|
+
relation_id, source_entity_id, target_entity_id, relation_type, source_neuron_id, created_at
|
|
567
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
568
|
+
`).run(relationId, input.sourceEntityId, input.targetEntityId, input.relationType, input.sourceNeuronId || null, existing?.created_at || createdAt);
|
|
569
|
+
return {
|
|
570
|
+
relationId,
|
|
571
|
+
sourceEntityId: input.sourceEntityId,
|
|
572
|
+
targetEntityId: input.targetEntityId,
|
|
573
|
+
relationType: input.relationType,
|
|
574
|
+
sourceNeuronId: input.sourceNeuronId,
|
|
575
|
+
createdAt: existing?.created_at || createdAt
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
registerPendingResolution(input) {
|
|
579
|
+
const now = input.createdAt ?? Date.now();
|
|
580
|
+
const record = {
|
|
581
|
+
pendingId: `eper-${randomUUID()}`,
|
|
582
|
+
referenceText: input.referenceText,
|
|
583
|
+
entityType: input.entityType,
|
|
584
|
+
contextNeuronId: input.contextNeuronId,
|
|
585
|
+
status: 'pending',
|
|
586
|
+
createdAt: now,
|
|
587
|
+
updatedAt: now
|
|
588
|
+
};
|
|
589
|
+
this.db.prepare(`
|
|
590
|
+
INSERT INTO pending_entity_resolution (
|
|
591
|
+
pending_id, reference_text, entity_type, context_neuron_id, resolved_entity_id, status, created_at, updated_at
|
|
592
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
593
|
+
`).run(record.pendingId, record.referenceText, record.entityType || null, record.contextNeuronId || null, null, record.status, record.createdAt, record.updatedAt);
|
|
594
|
+
return record;
|
|
595
|
+
}
|
|
596
|
+
resolvePendingReference(pendingId, entityId, resolvedAt = Date.now()) {
|
|
597
|
+
const row = this.db.prepare(`
|
|
598
|
+
SELECT * FROM pending_entity_resolution WHERE pending_id = ?
|
|
599
|
+
`).get(pendingId);
|
|
600
|
+
if (!row)
|
|
601
|
+
return null;
|
|
602
|
+
this.db.prepare(`
|
|
603
|
+
UPDATE pending_entity_resolution
|
|
604
|
+
SET resolved_entity_id = ?, status = 'resolved', updated_at = ?
|
|
605
|
+
WHERE pending_id = ?
|
|
606
|
+
`).run(entityId, resolvedAt, pendingId);
|
|
607
|
+
return {
|
|
608
|
+
pendingId,
|
|
609
|
+
referenceText: row.reference_text,
|
|
610
|
+
entityType: row.entity_type || undefined,
|
|
611
|
+
contextNeuronId: row.context_neuron_id || undefined,
|
|
612
|
+
resolvedEntityId: entityId,
|
|
613
|
+
status: 'resolved',
|
|
614
|
+
createdAt: row.created_at,
|
|
615
|
+
updatedAt: resolvedAt
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
listPendingResolutions(filter) {
|
|
619
|
+
const rows = this.db.prepare(`
|
|
620
|
+
SELECT *
|
|
621
|
+
FROM pending_entity_resolution
|
|
622
|
+
WHERE (? IS NULL OR status = ?)
|
|
623
|
+
AND (? IS NULL OR entity_type = ?)
|
|
624
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
625
|
+
`).all(filter?.status || null, filter?.status || null, filter?.entityType || null, filter?.entityType || null);
|
|
626
|
+
return rows.map((row) => ({
|
|
627
|
+
pendingId: row.pending_id,
|
|
628
|
+
referenceText: row.reference_text,
|
|
629
|
+
entityType: row.entity_type || undefined,
|
|
630
|
+
contextNeuronId: row.context_neuron_id || undefined,
|
|
631
|
+
resolvedEntityId: row.resolved_entity_id || undefined,
|
|
632
|
+
status: row.status,
|
|
633
|
+
createdAt: row.created_at,
|
|
634
|
+
updatedAt: row.updated_at
|
|
635
|
+
}));
|
|
636
|
+
}
|
|
637
|
+
listAliasConflicts(type) {
|
|
638
|
+
const rows = type
|
|
639
|
+
? this.db.prepare(`
|
|
640
|
+
SELECT * FROM entity_alias_conflicts
|
|
641
|
+
WHERE entity_type = ? AND status = 'active'
|
|
642
|
+
ORDER BY updated_at DESC
|
|
643
|
+
`).all(type)
|
|
644
|
+
: this.db.prepare(`
|
|
645
|
+
SELECT * FROM entity_alias_conflicts
|
|
646
|
+
WHERE status = 'active'
|
|
647
|
+
ORDER BY updated_at DESC
|
|
648
|
+
`).all();
|
|
649
|
+
return rows.map((row) => ({
|
|
650
|
+
conflictId: row.conflict_id,
|
|
651
|
+
normalizedAlias: row.normalized_alias,
|
|
652
|
+
entityType: row.entity_type,
|
|
653
|
+
entityIds: row.entity_ids_json ? JSON.parse(row.entity_ids_json) : [],
|
|
654
|
+
policy: row.policy,
|
|
655
|
+
status: row.status,
|
|
656
|
+
createdAt: row.created_at,
|
|
657
|
+
updatedAt: row.updated_at
|
|
658
|
+
}));
|
|
659
|
+
}
|
|
660
|
+
close() {
|
|
661
|
+
if (this.ownsDb)
|
|
662
|
+
this.db.close();
|
|
663
|
+
}
|
|
664
|
+
addAlias(entityId, alias, updatedAt = Date.now()) {
|
|
665
|
+
const entity = this.findByEntityId(entityId);
|
|
666
|
+
if (!entity || !alias.trim())
|
|
667
|
+
return;
|
|
668
|
+
const aliases = Array.from(new Set([...entity.aliases, alias.trim()]));
|
|
669
|
+
this.db.prepare(`UPDATE entity_instances SET aliases_json = ?, updated_at = ? WHERE instance_id = ?`)
|
|
670
|
+
.run(JSON.stringify(aliases), updatedAt, entityId);
|
|
671
|
+
this.upsertAliases(entityId, entity.type, [alias], updatedAt);
|
|
672
|
+
}
|
|
673
|
+
removeAlias(entityId, alias, updatedAt = Date.now()) {
|
|
674
|
+
const entity = this.findByEntityId(entityId);
|
|
675
|
+
if (!entity || entity.canonicalName === alias)
|
|
676
|
+
return;
|
|
677
|
+
const normalized = this.normalizeAlias(alias);
|
|
678
|
+
const aliases = entity.aliases.filter((item) => this.normalizeAlias(item) !== normalized);
|
|
679
|
+
this.db.prepare(`UPDATE entity_instances SET aliases_json = ?, updated_at = ? WHERE instance_id = ?`)
|
|
680
|
+
.run(JSON.stringify(aliases), updatedAt, entityId);
|
|
681
|
+
this.db.prepare(`DELETE FROM entity_aliases WHERE entity_id = ? AND normalized_alias = ?`).run(entityId, normalized);
|
|
682
|
+
this.refreshAliasConflict(normalized, entity.type, updatedAt);
|
|
683
|
+
}
|
|
684
|
+
redirectInstance(input) {
|
|
685
|
+
this.db.prepare(`
|
|
686
|
+
UPDATE entity_instances
|
|
687
|
+
SET canonical_entity_id = ?, status = ?, updated_at = ?
|
|
688
|
+
WHERE instance_id = ?
|
|
689
|
+
`).run(input.targetCanonicalEntityId, input.status || 'archived', input.updatedAt ?? Date.now(), input.sourceEntityId);
|
|
690
|
+
}
|
|
691
|
+
restoreInstance(input) {
|
|
692
|
+
this.db.prepare(`
|
|
693
|
+
UPDATE entity_instances
|
|
694
|
+
SET canonical_entity_id = ?, status = ?, updated_at = ?
|
|
695
|
+
WHERE instance_id = ?
|
|
696
|
+
`).run(input.canonicalEntityId, input.status, input.updatedAt ?? Date.now(), input.entityId);
|
|
697
|
+
}
|
|
698
|
+
upsertAliases(entityId, entityType, aliases, timestamp) {
|
|
699
|
+
const stmt = this.db.prepare(`
|
|
700
|
+
INSERT OR IGNORE INTO entity_aliases (
|
|
701
|
+
alias_id, entity_id, alias_text, normalized_alias, created_at, updated_at
|
|
702
|
+
) VALUES (?, ?, ?, ?, ?, ?)
|
|
703
|
+
`);
|
|
704
|
+
for (const alias of Array.from(new Set(aliases.map((item) => item.trim()).filter(Boolean)))) {
|
|
705
|
+
stmt.run(`ealias-${randomUUID()}`, entityId, alias, this.normalizeAlias(alias), timestamp, timestamp);
|
|
706
|
+
this.refreshAliasConflict(this.normalizeAlias(alias), entityType, timestamp);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
touchEntity(entityId, updatedAt) {
|
|
710
|
+
this.db.prepare(`
|
|
711
|
+
UPDATE entity_instances SET updated_at = ? WHERE instance_id = ?
|
|
712
|
+
`).run(updatedAt, entityId);
|
|
713
|
+
}
|
|
714
|
+
ensureCanonicalEntity(input) {
|
|
715
|
+
const existing = this.db.prepare(`
|
|
716
|
+
SELECT entity_id, aliases_json, metadata_json
|
|
717
|
+
FROM entities
|
|
718
|
+
WHERE canonical_name = ? AND type = ?
|
|
719
|
+
ORDER BY updated_at DESC
|
|
720
|
+
LIMIT 1
|
|
721
|
+
`).get(input.canonicalName, input.type);
|
|
722
|
+
if (existing) {
|
|
723
|
+
const existingAliases = existing.aliases_json ? JSON.parse(existing.aliases_json) : [];
|
|
724
|
+
const existingMetadata = existing.metadata_json ? JSON.parse(existing.metadata_json) : {};
|
|
725
|
+
this.db.prepare(`
|
|
726
|
+
UPDATE entities
|
|
727
|
+
SET aliases_json = ?, metadata_json = ?, updated_at = ?
|
|
728
|
+
WHERE entity_id = ?
|
|
729
|
+
`).run(JSON.stringify(Array.from(new Set([...existingAliases, ...(input.aliases || [])]))), JSON.stringify({ ...existingMetadata, ...(input.metadata || {}) }), input.createdAt, existing.entity_id);
|
|
730
|
+
return existing.entity_id;
|
|
731
|
+
}
|
|
732
|
+
const canonicalEntityId = `ecanon-${randomUUID()}`;
|
|
733
|
+
this.db.prepare(`
|
|
734
|
+
INSERT INTO entities (
|
|
735
|
+
entity_id, canonical_name, type, aliases_json, status, created_from, metadata_json, created_at, updated_at
|
|
736
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
737
|
+
`).run(canonicalEntityId, input.canonicalName, input.type, JSON.stringify(Array.from(new Set(input.aliases || []))), input.status || 'active', input.createdFrom || null, input.metadata ? JSON.stringify(input.metadata) : null, input.createdAt, input.createdAt);
|
|
738
|
+
return canonicalEntityId;
|
|
739
|
+
}
|
|
740
|
+
findExistingInstance(input) {
|
|
741
|
+
if (input.instanceMode === 'new_instance')
|
|
742
|
+
return null;
|
|
743
|
+
const projectId = typeof input.metadata?.projectId === 'string' ? String(input.metadata.projectId) : undefined;
|
|
744
|
+
const rows = this.db.prepare(`
|
|
745
|
+
SELECT *
|
|
746
|
+
FROM entity_instances
|
|
747
|
+
WHERE canonical_name = ? AND type = ?
|
|
748
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
749
|
+
LIMIT 12
|
|
750
|
+
`).all(input.canonicalName, input.type);
|
|
751
|
+
const candidates = rows.map((row) => this.mapRow(row));
|
|
752
|
+
if (input.instanceMode === 'canonical')
|
|
753
|
+
return candidates[0] || null;
|
|
754
|
+
if (input.createdFrom) {
|
|
755
|
+
const exact = candidates.find((candidate) => candidate.createdFrom === input.createdFrom);
|
|
756
|
+
if (exact)
|
|
757
|
+
return exact;
|
|
758
|
+
}
|
|
759
|
+
if (projectId) {
|
|
760
|
+
const inProject = candidates.find((candidate) => candidate.metadata?.projectId === projectId);
|
|
761
|
+
if (inProject)
|
|
762
|
+
return inProject;
|
|
763
|
+
return null;
|
|
764
|
+
}
|
|
765
|
+
return candidates[0] || null;
|
|
766
|
+
}
|
|
767
|
+
refreshAliasConflict(normalizedAlias, entityType, timestamp) {
|
|
768
|
+
const rows = this.db.prepare(`
|
|
769
|
+
SELECT DISTINCT ei.instance_id
|
|
770
|
+
FROM entity_aliases ea
|
|
771
|
+
JOIN entity_instances ei ON ei.instance_id = ea.entity_id
|
|
772
|
+
WHERE ea.normalized_alias = ?
|
|
773
|
+
AND ei.type = ?
|
|
774
|
+
AND ei.status = 'active'
|
|
775
|
+
ORDER BY ei.updated_at DESC
|
|
776
|
+
`).all(normalizedAlias, entityType);
|
|
777
|
+
const entityIds = rows.map((row) => row.instance_id);
|
|
778
|
+
if (entityIds.length <= 1) {
|
|
779
|
+
this.db.prepare(`
|
|
780
|
+
UPDATE entity_alias_conflicts
|
|
781
|
+
SET status = 'resolved', updated_at = ?
|
|
782
|
+
WHERE normalized_alias = ? AND entity_type = ?
|
|
783
|
+
`).run(timestamp, normalizedAlias, entityType);
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
const policy = this.inferAliasConflictPolicy(entityIds);
|
|
787
|
+
const existing = this.db.prepare(`
|
|
788
|
+
SELECT conflict_id, created_at
|
|
789
|
+
FROM entity_alias_conflicts
|
|
790
|
+
WHERE normalized_alias = ? AND entity_type = ?
|
|
791
|
+
`).get(normalizedAlias, entityType);
|
|
792
|
+
this.db.prepare(`
|
|
793
|
+
INSERT OR REPLACE INTO entity_alias_conflicts (
|
|
794
|
+
conflict_id, normalized_alias, entity_type, entity_ids_json, policy, status, created_at, updated_at
|
|
795
|
+
) VALUES (?, ?, ?, ?, ?, 'active', ?, ?)
|
|
796
|
+
`).run(existing?.conflict_id || `econf-${randomUUID()}`, normalizedAlias, entityType, JSON.stringify(entityIds), policy, existing?.created_at || timestamp, timestamp);
|
|
797
|
+
}
|
|
798
|
+
inferAliasConflictPolicy(entityIds) {
|
|
799
|
+
const projectIds = new Set();
|
|
800
|
+
for (const entityId of entityIds) {
|
|
801
|
+
const mentions = this.listTimeline({ entityId, limit: 8 });
|
|
802
|
+
for (const mention of mentions) {
|
|
803
|
+
if (mention.projectId)
|
|
804
|
+
projectIds.add(mention.projectId);
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
if (projectIds.size > 1)
|
|
808
|
+
return 'prefer_project_context';
|
|
809
|
+
if (entityIds.length > 2)
|
|
810
|
+
return 'require_explicit_disambiguation';
|
|
811
|
+
return 'prefer_recent_mention';
|
|
812
|
+
}
|
|
813
|
+
resolveRelativeReference(referenceText, type, options) {
|
|
814
|
+
const explicitNameHint = this.extractRelativeNameHint(referenceText, type);
|
|
815
|
+
const recent = this.listByCreationOrder(type, 12)
|
|
816
|
+
.filter((entity) => this.matchesResolutionOptions(entity.entityId, options))
|
|
817
|
+
.filter((entity) => this.matchesExplicitRelativeHint(entity, explicitNameHint))
|
|
818
|
+
.slice(0, 4);
|
|
819
|
+
if (recent.length === 0)
|
|
820
|
+
return null;
|
|
821
|
+
const normalizedReference = this.normalizeAlias(referenceText);
|
|
822
|
+
const relativeReference = extractRelativeReferences(normalizedReference)[0] || normalizedReference;
|
|
823
|
+
if (isLatestReference(relativeReference))
|
|
824
|
+
return recent[0] || null;
|
|
825
|
+
if (isPreviousReference(relativeReference))
|
|
826
|
+
return recent[1] || recent[0] || null;
|
|
827
|
+
return recent[0] || null;
|
|
828
|
+
}
|
|
829
|
+
pickBestEntity(candidates, options) {
|
|
830
|
+
if (candidates.length === 0)
|
|
831
|
+
return null;
|
|
832
|
+
const scored = candidates.map((entity) => this.scoreDisambiguationCandidate(entity, undefined, undefined, options));
|
|
833
|
+
scored.sort((a, b) => b.score - a.score);
|
|
834
|
+
return scored[0]?.entity || null;
|
|
835
|
+
}
|
|
836
|
+
matchesResolutionOptions(entityId, options) {
|
|
837
|
+
if (!options?.projectId && !options?.beforeTime)
|
|
838
|
+
return true;
|
|
839
|
+
const mentions = this.listTimeline({ entityId, limit: 12 });
|
|
840
|
+
if (options.projectId && !mentions.some((mention) => mention.projectId === options.projectId))
|
|
841
|
+
return false;
|
|
842
|
+
if (options.beforeTime && !mentions.some((mention) => mention.createdAt <= options.beforeTime))
|
|
843
|
+
return false;
|
|
844
|
+
return true;
|
|
845
|
+
}
|
|
846
|
+
normalizeAlias(value) {
|
|
847
|
+
return normalizeLexiconText(value).toLowerCase();
|
|
848
|
+
}
|
|
849
|
+
scoreDisambiguationCandidate(entity, normalizedAlias, conflictPolicy, options) {
|
|
850
|
+
const mentions = this.listTimeline({ entityId: entity.entityId, limit: 12 });
|
|
851
|
+
const attributes = this.listAttributes(entity.entityId);
|
|
852
|
+
const reasons = [];
|
|
853
|
+
let score = 0.2;
|
|
854
|
+
if (!normalizedAlias || this.normalizeAlias(entity.canonicalName) === normalizedAlias) {
|
|
855
|
+
score += 1.2;
|
|
856
|
+
reasons.push('canonical_name_match');
|
|
857
|
+
}
|
|
858
|
+
if (normalizedAlias && entity.aliases.some((alias) => this.normalizeAlias(alias) === normalizedAlias)) {
|
|
859
|
+
score += 1.1;
|
|
860
|
+
reasons.push('alias_match');
|
|
861
|
+
}
|
|
862
|
+
if (mentions.length > 0) {
|
|
863
|
+
score += Math.min(1.2, 0.2 + mentions.length * 0.12);
|
|
864
|
+
reasons.push('mention_history');
|
|
865
|
+
}
|
|
866
|
+
const latestMention = mentions[0];
|
|
867
|
+
if (latestMention) {
|
|
868
|
+
score += latestMention.createdAt / 1e13;
|
|
869
|
+
reasons.push('recent_mention');
|
|
870
|
+
}
|
|
871
|
+
if (options?.projectId && mentions.some((mention) => mention.projectId === options.projectId)) {
|
|
872
|
+
score += 2.1;
|
|
873
|
+
reasons.push('project_context_match');
|
|
874
|
+
}
|
|
875
|
+
if (options?.beforeTime && mentions.some((mention) => mention.createdAt <= options.beforeTime)) {
|
|
876
|
+
score += 0.9;
|
|
877
|
+
reasons.push('historical_match');
|
|
878
|
+
}
|
|
879
|
+
if (attributes.some((attribute) => /bluetooth|issue|device|topic/i.test(attribute.attributeKey) || /bluetooth|disconnect|断连/i.test(attribute.attributeValue))) {
|
|
880
|
+
score += 0.35;
|
|
881
|
+
reasons.push('attribute_support');
|
|
882
|
+
}
|
|
883
|
+
if (conflictPolicy === 'prefer_project_context' && options?.projectId && !mentions.some((mention) => mention.projectId === options.projectId)) {
|
|
884
|
+
score -= 0.6;
|
|
885
|
+
reasons.push('project_conflict_penalty');
|
|
886
|
+
}
|
|
887
|
+
if (conflictPolicy === 'require_explicit_disambiguation' && !options?.projectId && mentions.length > 1) {
|
|
888
|
+
score -= 0.25;
|
|
889
|
+
reasons.push('ambiguous_without_context');
|
|
890
|
+
}
|
|
891
|
+
return {
|
|
892
|
+
entity,
|
|
893
|
+
score,
|
|
894
|
+
reasons,
|
|
895
|
+
mentionCount: mentions.length,
|
|
896
|
+
latestMentionAt: latestMention?.createdAt
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
extractRelativeNameHint(referenceText, type) {
|
|
900
|
+
if (type === 'device')
|
|
901
|
+
return extractDeviceCandidate(referenceText);
|
|
902
|
+
if (type === 'project')
|
|
903
|
+
return extractProjectCandidate(referenceText);
|
|
904
|
+
return undefined;
|
|
905
|
+
}
|
|
906
|
+
matchesExplicitRelativeHint(entity, explicitNameHint) {
|
|
907
|
+
if (!explicitNameHint)
|
|
908
|
+
return true;
|
|
909
|
+
const normalizedHint = this.normalizeAlias(explicitNameHint);
|
|
910
|
+
return this.normalizeAlias(entity.canonicalName).includes(normalizedHint)
|
|
911
|
+
|| entity.aliases.some((alias) => this.normalizeAlias(alias).includes(normalizedHint));
|
|
912
|
+
}
|
|
913
|
+
isBareRelativeEntity(entity, type) {
|
|
914
|
+
const normalizedName = this.normalizeAlias(entity.canonicalName);
|
|
915
|
+
const relativeRefs = extractRelativeReferences(normalizedName).map((reference) => this.normalizeAlias(reference));
|
|
916
|
+
if (!relativeRefs.includes(normalizedName))
|
|
917
|
+
return false;
|
|
918
|
+
if (type === 'device')
|
|
919
|
+
return !extractDeviceCandidate(entity.canonicalName);
|
|
920
|
+
if (type === 'project')
|
|
921
|
+
return !extractProjectCandidate(entity.canonicalName);
|
|
922
|
+
return false;
|
|
923
|
+
}
|
|
924
|
+
mapRow(row) {
|
|
925
|
+
return {
|
|
926
|
+
entityId: row.entity_id || row.instance_id,
|
|
927
|
+
canonicalEntityId: row.canonical_entity_id || undefined,
|
|
928
|
+
canonicalName: row.canonical_name,
|
|
929
|
+
type: row.type,
|
|
930
|
+
aliases: row.aliases_json ? JSON.parse(row.aliases_json) : [],
|
|
931
|
+
status: row.status,
|
|
932
|
+
createdFrom: row.created_from || undefined,
|
|
933
|
+
metadata: row.metadata_json ? JSON.parse(row.metadata_json) : undefined,
|
|
934
|
+
createdAt: row.created_at,
|
|
935
|
+
updatedAt: row.updated_at
|
|
936
|
+
};
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
function isWeakAmbiguousRelativeReference(reference) {
|
|
940
|
+
return /^(that project|this project|that one|this one|那个项目|这个项目|那个耳机|这个耳机|那个设备|这个设备)$/i.test(normalizeLexiconText(reference).toLowerCase());
|
|
941
|
+
}
|