agentdb 3.0.0-alpha.9 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +248 -269
- package/dist/schemas/frontier-schema.sql +7 -0
- package/dist/schemas/schema.sql +7 -0
- package/dist/src/backends/ExactSearch.d.ts +22 -0
- package/dist/src/backends/ExactSearch.d.ts.map +1 -0
- package/dist/src/backends/ExactSearch.js +36 -0
- package/dist/src/backends/ExactSearch.js.map +1 -0
- package/dist/src/backends/VectorBackend.d.ts +80 -6
- package/dist/src/backends/VectorBackend.d.ts.map +1 -1
- package/dist/src/backends/VectorBackend.js +67 -1
- package/dist/src/backends/VectorBackend.js.map +1 -1
- package/dist/src/backends/detector.js.map +1 -1
- package/dist/src/backends/factory.d.ts +16 -33
- package/dist/src/backends/factory.d.ts.map +1 -1
- package/dist/src/backends/factory.js +140 -110
- package/dist/src/backends/factory.js.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts +54 -6
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.js +143 -6
- package/dist/src/backends/graph/GraphDatabaseAdapter.js.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.js +35 -8
- package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
- package/dist/src/backends/index.d.ts +2 -1
- package/dist/src/backends/index.d.ts.map +1 -1
- package/dist/src/backends/index.js +2 -0
- package/dist/src/backends/index.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts +256 -45
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.js +764 -290
- package/dist/src/backends/ruvector/RuVectorBackend.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts +0 -4
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.js +0 -6
- package/dist/src/backends/ruvector/RuVectorLearning.js.map +1 -1
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts +175 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts.map +1 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js +567 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js.map +1 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts +148 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts.map +1 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.js +438 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.js.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts +212 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js +397 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js.map +1 -0
- package/dist/src/backends/rvf/FilterBuilder.d.ts +136 -0
- package/dist/src/backends/rvf/FilterBuilder.d.ts.map +1 -0
- package/dist/src/backends/rvf/FilterBuilder.js +157 -0
- package/dist/src/backends/rvf/FilterBuilder.js.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts +158 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.js +702 -0
- package/dist/src/backends/rvf/NativeAccelerator.js.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts +207 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.js +651 -0
- package/dist/src/backends/rvf/RvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/RvfSolver.d.ts +175 -0
- package/dist/src/backends/rvf/RvfSolver.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfSolver.js +176 -0
- package/dist/src/backends/rvf/RvfSolver.js.map +1 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts +143 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js +612 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts +128 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts.map +1 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.js +415 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.js.map +1 -0
- package/dist/src/backends/rvf/SimdFallbacks.d.ts +25 -0
- package/dist/src/backends/rvf/SimdFallbacks.d.ts.map +1 -0
- package/dist/src/backends/rvf/SimdFallbacks.js +287 -0
- package/dist/src/backends/rvf/SimdFallbacks.js.map +1 -0
- package/dist/src/backends/rvf/SolverBandit.d.ts +100 -0
- package/dist/src/backends/rvf/SolverBandit.d.ts.map +1 -0
- package/dist/src/backends/rvf/SolverBandit.js +216 -0
- package/dist/src/backends/rvf/SolverBandit.js.map +1 -0
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts +157 -0
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SonaLearningBackend.js +283 -0
- package/dist/src/backends/rvf/SonaLearningBackend.js.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts +104 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js +474 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts +27 -0
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts.map +1 -0
- package/dist/src/backends/rvf/WasmStoreBridge.js +87 -0
- package/dist/src/backends/rvf/WasmStoreBridge.js.map +1 -0
- package/dist/src/backends/rvf/validation.d.ts +20 -0
- package/dist/src/backends/rvf/validation.d.ts.map +1 -0
- package/dist/src/backends/rvf/validation.js +78 -0
- package/dist/src/backends/rvf/validation.js.map +1 -0
- package/dist/src/benchmark/BenchmarkSuite.d.ts +318 -0
- package/dist/src/benchmark/BenchmarkSuite.d.ts.map +1 -0
- package/dist/src/benchmark/BenchmarkSuite.js +984 -0
- package/dist/src/benchmark/BenchmarkSuite.js.map +1 -0
- package/dist/src/benchmark/index.d.ts +29 -0
- package/dist/src/benchmark/index.d.ts.map +1 -0
- package/dist/src/benchmark/index.js +39 -0
- package/dist/src/benchmark/index.js.map +1 -0
- package/dist/src/browser/AttentionBrowser.d.ts.map +1 -1
- package/dist/src/browser/AttentionBrowser.js +1 -0
- package/dist/src/browser/AttentionBrowser.js.map +1 -1
- package/dist/src/cli/agentdb-cli.d.ts +14 -0
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +839 -143
- package/dist/src/cli/agentdb-cli.js.map +1 -1
- package/dist/src/cli/commands/attention.js +12 -2
- package/dist/src/cli/commands/attention.js.map +1 -1
- package/dist/src/cli/commands/doctor.js +5 -5
- package/dist/src/cli/commands/doctor.js.map +1 -1
- package/dist/src/cli/commands/hyperbolic.d.ts +11 -0
- package/dist/src/cli/commands/hyperbolic.d.ts.map +1 -0
- package/dist/src/cli/commands/hyperbolic.js +440 -0
- package/dist/src/cli/commands/hyperbolic.js.map +1 -0
- package/dist/src/cli/commands/install-embeddings.d.ts +1 -1
- package/dist/src/cli/commands/install-embeddings.d.ts.map +1 -1
- package/dist/src/cli/commands/install-embeddings.js +17 -11
- package/dist/src/cli/commands/install-embeddings.js.map +1 -1
- package/dist/src/cli/commands/learn.d.ts +11 -0
- package/dist/src/cli/commands/learn.d.ts.map +1 -0
- package/dist/src/cli/commands/learn.js +410 -0
- package/dist/src/cli/commands/learn.js.map +1 -0
- package/dist/src/cli/commands/migrate.d.ts +15 -0
- package/dist/src/cli/commands/migrate.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate.js +190 -10
- package/dist/src/cli/commands/migrate.js.map +1 -1
- package/dist/src/cli/commands/route.d.ts +11 -0
- package/dist/src/cli/commands/route.d.ts.map +1 -0
- package/dist/src/cli/commands/route.js +419 -0
- package/dist/src/cli/commands/route.js.map +1 -0
- package/dist/src/cli/commands/rvf.d.ts +21 -0
- package/dist/src/cli/commands/rvf.d.ts.map +1 -0
- package/dist/src/cli/commands/rvf.js +448 -0
- package/dist/src/cli/commands/rvf.js.map +1 -0
- package/dist/src/cli/commands/simulate-report.js +14 -2
- package/dist/src/cli/commands/simulate-report.js.map +1 -1
- package/dist/src/cli/lib/report-store.d.ts +2 -1
- package/dist/src/cli/lib/report-store.d.ts.map +1 -1
- package/dist/src/cli/lib/report-store.js +85 -65
- package/dist/src/cli/lib/report-store.js.map +1 -1
- package/dist/src/cli/lib/simulation-runner.d.ts +40 -3
- package/dist/src/cli/lib/simulation-runner.d.ts.map +1 -1
- package/dist/src/cli/lib/simulation-runner.js +248 -6
- package/dist/src/cli/lib/simulation-runner.js.map +1 -1
- package/dist/src/compatibility/DeprecationWarnings.d.ts +54 -0
- package/dist/src/compatibility/DeprecationWarnings.d.ts.map +1 -0
- package/dist/src/compatibility/DeprecationWarnings.js +131 -0
- package/dist/src/compatibility/DeprecationWarnings.js.map +1 -0
- package/dist/src/compatibility/MigrationUtilities.d.ts +30 -0
- package/dist/src/compatibility/MigrationUtilities.d.ts.map +1 -0
- package/dist/src/compatibility/MigrationUtilities.js +184 -0
- package/dist/src/compatibility/MigrationUtilities.js.map +1 -0
- package/dist/src/compatibility/V1toV2Adapter.d.ts +76 -0
- package/dist/src/compatibility/V1toV2Adapter.d.ts.map +1 -0
- package/dist/src/compatibility/V1toV2Adapter.js +185 -0
- package/dist/src/compatibility/V1toV2Adapter.js.map +1 -0
- package/dist/src/compatibility/VersionDetector.d.ts +32 -0
- package/dist/src/compatibility/VersionDetector.d.ts.map +1 -0
- package/dist/src/compatibility/VersionDetector.js +144 -0
- package/dist/src/compatibility/VersionDetector.js.map +1 -0
- package/dist/src/compatibility/index.d.ts +14 -0
- package/dist/src/compatibility/index.d.ts.map +1 -0
- package/dist/src/compatibility/index.js +21 -0
- package/dist/src/compatibility/index.js.map +1 -0
- package/dist/src/compatibility/types.d.ts +103 -0
- package/dist/src/compatibility/types.d.ts.map +1 -0
- package/dist/src/compatibility/types.js +5 -0
- package/dist/src/compatibility/types.js.map +1 -0
- package/dist/src/controllers/AttentionService.d.ts +99 -202
- package/dist/src/controllers/AttentionService.d.ts.map +1 -1
- package/dist/src/controllers/AttentionService.js +450 -558
- package/dist/src/controllers/AttentionService.js.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.d.ts +30 -5
- package/dist/src/controllers/CausalMemoryGraph.d.ts.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.js +92 -15
- package/dist/src/controllers/CausalMemoryGraph.js.map +1 -1
- package/dist/src/controllers/CausalRecall.d.ts +4 -0
- package/dist/src/controllers/CausalRecall.d.ts.map +1 -1
- package/dist/src/controllers/CausalRecall.js +23 -5
- package/dist/src/controllers/CausalRecall.js.map +1 -1
- package/dist/src/controllers/EmbeddingService.d.ts +39 -0
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +166 -32
- package/dist/src/controllers/EmbeddingService.js.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts +4 -0
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.js +21 -7
- package/dist/src/controllers/EnhancedEmbeddingService.js.map +1 -1
- package/dist/src/controllers/ExplainableRecall.d.ts +1 -1
- package/dist/src/controllers/ExplainableRecall.d.ts.map +1 -1
- package/dist/src/controllers/ExplainableRecall.js +1 -1
- package/dist/src/controllers/ExplainableRecall.js.map +1 -1
- package/dist/src/controllers/HNSWIndex.d.ts +20 -2
- package/dist/src/controllers/HNSWIndex.d.ts.map +1 -1
- package/dist/src/controllers/HNSWIndex.js +114 -39
- package/dist/src/controllers/HNSWIndex.js.map +1 -1
- package/dist/src/controllers/LearningSystem.d.ts +6 -17
- package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
- package/dist/src/controllers/LearningSystem.js +66 -155
- package/dist/src/controllers/LearningSystem.js.map +1 -1
- package/dist/src/controllers/MemoryController.d.ts +174 -0
- package/dist/src/controllers/MemoryController.d.ts.map +1 -0
- package/dist/src/controllers/MemoryController.js +320 -0
- package/dist/src/controllers/MemoryController.js.map +1 -0
- package/dist/src/controllers/MetadataFilter.d.ts.map +1 -1
- package/dist/src/controllers/MetadataFilter.js +38 -26
- package/dist/src/controllers/MetadataFilter.js.map +1 -1
- package/dist/src/controllers/MincutService.d.ts +92 -0
- package/dist/src/controllers/MincutService.d.ts.map +1 -0
- package/dist/src/controllers/MincutService.js +336 -0
- package/dist/src/controllers/MincutService.js.map +1 -0
- package/dist/src/controllers/NightlyLearner.d.ts +5 -1
- package/dist/src/controllers/NightlyLearner.d.ts.map +1 -1
- package/dist/src/controllers/NightlyLearner.js +45 -31
- package/dist/src/controllers/NightlyLearner.js.map +1 -1
- package/dist/src/controllers/QUICClient.d.ts +45 -0
- package/dist/src/controllers/QUICClient.d.ts.map +1 -1
- package/dist/src/controllers/QUICClient.js +211 -21
- package/dist/src/controllers/QUICClient.js.map +1 -1
- package/dist/src/controllers/QUICServer.d.ts.map +1 -1
- package/dist/src/controllers/QUICServer.js +36 -27
- package/dist/src/controllers/QUICServer.js.map +1 -1
- package/dist/src/controllers/ReasoningBank.d.ts +44 -5
- package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
- package/dist/src/controllers/ReasoningBank.js +187 -99
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +129 -6
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +687 -220
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +41 -3
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +291 -116
- package/dist/src/controllers/SkillLibrary.js.map +1 -1
- package/dist/src/controllers/SparsificationService.d.ts +151 -0
- package/dist/src/controllers/SparsificationService.d.ts.map +1 -0
- package/dist/src/controllers/SparsificationService.js +375 -0
- package/dist/src/controllers/SparsificationService.js.map +1 -0
- package/dist/src/controllers/SyncCoordinator.d.ts.map +1 -1
- package/dist/src/controllers/SyncCoordinator.js +126 -12
- package/dist/src/controllers/SyncCoordinator.js.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.d.ts +12 -30
- package/dist/src/controllers/WASMVectorSearch.d.ts.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.js +209 -119
- package/dist/src/controllers/WASMVectorSearch.js.map +1 -1
- package/dist/src/controllers/attention/AttentionCache.d.ts +38 -0
- package/dist/src/controllers/attention/AttentionCache.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionCache.js +80 -0
- package/dist/src/controllers/attention/AttentionCache.js.map +1 -0
- package/dist/src/controllers/attention/AttentionConfig.d.ts +127 -0
- package/dist/src/controllers/attention/AttentionConfig.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionConfig.js +124 -0
- package/dist/src/controllers/attention/AttentionConfig.js.map +1 -0
- package/dist/src/controllers/attention/AttentionCore.d.ts +89 -0
- package/dist/src/controllers/attention/AttentionCore.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionCore.js +289 -0
- package/dist/src/controllers/attention/AttentionCore.js.map +1 -0
- package/dist/src/controllers/attention/AttentionHelpers.d.ts +55 -0
- package/dist/src/controllers/attention/AttentionHelpers.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionHelpers.js +148 -0
- package/dist/src/controllers/attention/AttentionHelpers.js.map +1 -0
- package/dist/src/controllers/attention/AttentionMetrics.d.ts +55 -0
- package/dist/src/controllers/attention/AttentionMetrics.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionMetrics.js +72 -0
- package/dist/src/controllers/attention/AttentionMetrics.js.map +1 -0
- package/dist/src/controllers/attention/AttentionWASM.d.ts +98 -0
- package/dist/src/controllers/attention/AttentionWASM.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionWASM.js +147 -0
- package/dist/src/controllers/attention/AttentionWASM.js.map +1 -0
- package/dist/src/controllers/attention/CrossAttentionController.d.ts +141 -0
- package/dist/src/controllers/attention/CrossAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/CrossAttentionController.js +325 -0
- package/dist/src/controllers/attention/CrossAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts +137 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.js +336 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/SelfAttentionController.d.ts +117 -0
- package/dist/src/controllers/attention/SelfAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/SelfAttentionController.js +205 -0
- package/dist/src/controllers/attention/SelfAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/index.d.ts +24 -0
- package/dist/src/controllers/attention/index.d.ts.map +1 -0
- package/dist/src/controllers/attention/index.js +20 -0
- package/dist/src/controllers/attention/index.js.map +1 -0
- package/dist/src/controllers/index.d.ts +15 -28
- package/dist/src/controllers/index.d.ts.map +1 -1
- package/dist/src/controllers/index.js +11 -19
- package/dist/src/controllers/index.js.map +1 -1
- package/dist/src/controllers/prerequisites.d.ts +76 -0
- package/dist/src/controllers/prerequisites.d.ts.map +1 -0
- package/dist/src/controllers/prerequisites.js +235 -0
- package/dist/src/controllers/prerequisites.js.map +1 -0
- package/dist/src/core/AgentDB.d.ts +33 -19
- package/dist/src/core/AgentDB.d.ts.map +1 -1
- package/dist/src/core/AgentDB.js +87 -127
- package/dist/src/core/AgentDB.js.map +1 -1
- package/dist/src/core/QueryCache.d.ts +138 -0
- package/dist/src/core/QueryCache.d.ts.map +1 -0
- package/dist/src/core/QueryCache.js +309 -0
- package/dist/src/core/QueryCache.js.map +1 -0
- package/dist/src/db-fallback.d.ts +52 -4
- package/dist/src/db-fallback.d.ts.map +1 -1
- package/dist/src/db-fallback.js +521 -71
- package/dist/src/db-fallback.js.map +1 -1
- package/dist/src/db-unified.d.ts.map +1 -1
- package/dist/src/db-unified.js +32 -30
- package/dist/src/db-unified.js.map +1 -1
- package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts +58 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts.map +1 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.js +137 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.js.map +1 -0
- package/dist/src/embedding/index.d.ts +3 -0
- package/dist/src/embedding/index.d.ts.map +1 -0
- package/dist/src/embedding/index.js +2 -0
- package/dist/src/embedding/index.js.map +1 -0
- package/dist/src/examples/quic-sync-example.js +2 -2
- package/dist/src/examples/quic-sync-example.js.map +1 -1
- package/dist/src/governance/MetaHarnessGateway.d.ts +55 -0
- package/dist/src/governance/MetaHarnessGateway.d.ts.map +1 -0
- package/dist/src/governance/MetaHarnessGateway.js +65 -0
- package/dist/src/governance/MetaHarnessGateway.js.map +1 -0
- package/dist/src/governance/RvfExperimentBranch.d.ts +65 -0
- package/dist/src/governance/RvfExperimentBranch.d.ts.map +1 -0
- package/dist/src/governance/RvfExperimentBranch.js +115 -0
- package/dist/src/governance/RvfExperimentBranch.js.map +1 -0
- package/dist/src/index.d.ts +20 -16
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +44 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/agentdb-mcp-server.js +318 -16
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/mcp/reset-database.d.ts +15 -0
- package/dist/src/mcp/reset-database.d.ts.map +1 -0
- package/dist/src/mcp/reset-database.js +45 -0
- package/dist/src/mcp/reset-database.js.map +1 -0
- package/dist/src/model/ModelCacheLoader.d.ts +31 -0
- package/dist/src/model/ModelCacheLoader.d.ts.map +1 -0
- package/dist/src/model/ModelCacheLoader.js +209 -0
- package/dist/src/model/ModelCacheLoader.js.map +1 -0
- package/dist/src/observability/index.d.ts +8 -0
- package/dist/src/observability/index.d.ts.map +1 -0
- package/dist/src/observability/index.js +8 -0
- package/dist/src/observability/index.js.map +1 -0
- package/dist/src/observability/integration.d.ts +32 -0
- package/dist/src/observability/integration.d.ts.map +1 -0
- package/dist/src/observability/integration.js +159 -0
- package/dist/src/observability/integration.js.map +1 -0
- package/dist/src/observability/telemetry.d.ts +137 -0
- package/dist/src/observability/telemetry.d.ts.map +1 -0
- package/dist/src/observability/telemetry.js +424 -0
- package/dist/src/observability/telemetry.js.map +1 -0
- package/dist/src/optimizations/BatchOperations.d.ts +47 -0
- package/dist/src/optimizations/BatchOperations.d.ts.map +1 -1
- package/dist/src/optimizations/BatchOperations.js +189 -35
- package/dist/src/optimizations/BatchOperations.js.map +1 -1
- package/dist/src/optimizations/Quantization.d.ts +330 -0
- package/dist/src/optimizations/Quantization.d.ts.map +1 -0
- package/dist/src/optimizations/Quantization.js +793 -0
- package/dist/src/optimizations/Quantization.js.map +1 -0
- package/dist/src/optimizations/index.d.ts +1 -3
- package/dist/src/optimizations/index.d.ts.map +1 -1
- package/dist/src/optimizations/index.js +0 -1
- package/dist/src/optimizations/index.js.map +1 -1
- package/dist/src/quantization/index.d.ts +7 -0
- package/dist/src/quantization/index.d.ts.map +1 -0
- package/dist/src/quantization/index.js +15 -0
- package/dist/src/quantization/index.js.map +1 -0
- package/dist/src/quantization/vector-quantization.d.ts +388 -0
- package/dist/src/quantization/vector-quantization.d.ts.map +1 -0
- package/dist/src/quantization/vector-quantization.js +1132 -0
- package/dist/src/quantization/vector-quantization.js.map +1 -0
- package/dist/src/schemas/inline.d.ts +3 -0
- package/dist/src/schemas/inline.d.ts.map +1 -0
- package/dist/src/schemas/inline.js +10 -0
- package/dist/src/schemas/inline.js.map +1 -0
- package/dist/src/search/HybridSearch.d.ts +311 -0
- package/dist/src/search/HybridSearch.d.ts.map +1 -0
- package/dist/src/search/HybridSearch.js +713 -0
- package/dist/src/search/HybridSearch.js.map +1 -0
- package/dist/src/search/index.d.ts +12 -0
- package/dist/src/search/index.d.ts.map +1 -0
- package/dist/src/search/index.js +16 -0
- package/dist/src/search/index.js.map +1 -0
- package/dist/src/security/input-validation.d.ts +30 -0
- package/dist/src/security/input-validation.d.ts.map +1 -1
- package/dist/src/security/input-validation.js +77 -3
- package/dist/src/security/input-validation.js.map +1 -1
- package/dist/src/security/limits.d.ts.map +1 -1
- package/dist/src/security/limits.js +12 -3
- package/dist/src/security/limits.js.map +1 -1
- package/dist/src/security/mcp-policy.d.ts +17 -0
- package/dist/src/security/mcp-policy.d.ts.map +1 -0
- package/dist/src/security/mcp-policy.js +94 -0
- package/dist/src/security/mcp-policy.js.map +1 -0
- package/dist/src/security/path-security.d.ts.map +1 -1
- package/dist/src/security/path-security.js +3 -1
- package/dist/src/security/path-security.js.map +1 -1
- package/dist/src/security/validation.js +3 -3
- package/dist/src/security/validation.js.map +1 -1
- package/dist/src/services/AttentionService.d.ts +303 -0
- package/dist/src/services/AttentionService.d.ts.map +1 -0
- package/dist/src/services/AttentionService.js +1165 -0
- package/dist/src/services/AttentionService.js.map +1 -0
- package/dist/src/services/LLMRouter.d.ts +70 -8
- package/dist/src/services/LLMRouter.d.ts.map +1 -1
- package/dist/src/services/LLMRouter.js +279 -28
- package/dist/src/services/LLMRouter.js.map +1 -1
- package/dist/src/services/audit-logger.service.d.ts +168 -0
- package/dist/src/services/audit-logger.service.d.ts.map +1 -0
- package/dist/src/services/audit-logger.service.js +331 -0
- package/dist/src/services/audit-logger.service.js.map +1 -0
- package/dist/src/services/enhanced-embeddings.d.ts +271 -0
- package/dist/src/services/enhanced-embeddings.d.ts.map +1 -0
- package/dist/src/services/enhanced-embeddings.js +1036 -0
- package/dist/src/services/enhanced-embeddings.js.map +1 -0
- package/dist/src/services/federated-learning.d.ts +172 -0
- package/dist/src/services/federated-learning.d.ts.map +1 -0
- package/dist/src/services/federated-learning.js +344 -0
- package/dist/src/services/federated-learning.js.map +1 -0
- package/dist/src/simd/index.d.ts +9 -0
- package/dist/src/simd/index.d.ts.map +1 -0
- package/dist/src/simd/index.js +27 -0
- package/dist/src/simd/index.js.map +1 -0
- package/dist/src/simd/simd-vector-ops.d.ts +343 -0
- package/dist/src/simd/simd-vector-ops.d.ts.map +1 -0
- package/dist/src/simd/simd-vector-ops.js +1012 -0
- package/dist/src/simd/simd-vector-ops.js.map +1 -0
- package/dist/src/types/database.types.d.ts +275 -0
- package/dist/src/types/database.types.d.ts.map +1 -0
- package/dist/src/types/database.types.js +55 -0
- package/dist/src/types/database.types.js.map +1 -0
- package/dist/src/types/graph.d.ts +29 -0
- package/dist/src/types/graph.d.ts.map +1 -0
- package/dist/src/types/graph.js +8 -0
- package/dist/src/types/graph.js.map +1 -0
- package/dist/src/utils/chalk-fallback.d.ts +3 -0
- package/dist/src/utils/chalk-fallback.d.ts.map +1 -0
- package/dist/src/utils/chalk-fallback.js +20 -0
- package/dist/src/utils/chalk-fallback.js.map +1 -0
- package/dist/src/utils/similarity.d.ts +11 -0
- package/dist/src/utils/similarity.d.ts.map +1 -0
- package/dist/src/utils/similarity.js +25 -0
- package/dist/src/utils/similarity.js.map +1 -0
- package/dist/src/utils/top-k.d.ts +44 -0
- package/dist/src/utils/top-k.d.ts.map +1 -0
- package/dist/src/utils/top-k.js +111 -0
- package/dist/src/utils/top-k.js.map +1 -0
- package/dist/src/wasm-loader.d.ts +66 -0
- package/dist/src/wasm-loader.d.ts.map +1 -0
- package/dist/src/wasm-loader.js +76 -0
- package/dist/src/wasm-loader.js.map +1 -0
- package/dist/src/wrappers/agentdb-fast.d.ts +140 -0
- package/dist/src/wrappers/agentdb-fast.d.ts.map +1 -0
- package/dist/src/wrappers/agentdb-fast.js +309 -0
- package/dist/src/wrappers/agentdb-fast.js.map +1 -0
- package/dist/src/wrappers/attention-fallbacks.d.ts +343 -0
- package/dist/src/wrappers/attention-fallbacks.d.ts.map +1 -0
- package/dist/src/wrappers/attention-fallbacks.js +1484 -0
- package/dist/src/wrappers/attention-fallbacks.js.map +1 -0
- package/dist/src/wrappers/attention-native.d.ts +111 -0
- package/dist/src/wrappers/attention-native.d.ts.map +1 -0
- package/dist/src/wrappers/attention-native.js +273 -0
- package/dist/src/wrappers/attention-native.js.map +1 -0
- package/dist/src/wrappers/embedding-service.d.ts +117 -0
- package/dist/src/wrappers/embedding-service.d.ts.map +1 -0
- package/dist/src/wrappers/embedding-service.js +370 -0
- package/dist/src/wrappers/embedding-service.js.map +1 -0
- package/dist/src/wrappers/gnn-wrapper.d.ts +71 -0
- package/dist/src/wrappers/gnn-wrapper.d.ts.map +1 -0
- package/dist/src/wrappers/gnn-wrapper.js +236 -0
- package/dist/src/wrappers/gnn-wrapper.js.map +1 -0
- package/dist/src/wrappers/index.d.ts +48 -0
- package/dist/src/wrappers/index.d.ts.map +1 -0
- package/dist/src/wrappers/index.js +83 -0
- package/dist/src/wrappers/index.js.map +1 -0
- package/package.json +130 -80
- package/scripts/postinstall.cjs +13 -144
- package/dist/agentdb.browser.js +0 -1685
- package/dist/agentdb.browser.js.map +0 -7
- package/dist/agentdb.browser.min.js +0 -3
- package/dist/agentdb.browser.min.js.map +0 -7
- package/dist/agentdb.wasm-loader.js +0 -207
- package/dist/backends/VectorBackend.d.ts +0 -120
- package/dist/backends/VectorBackend.js +0 -14
- package/dist/backends/VectorBackend.js.map +0 -1
- package/dist/optimizations/RVFOptimizer.d.ts +0 -225
- package/dist/optimizations/RVFOptimizer.js +0 -541
- package/dist/optimizations/RVFOptimizer.js.map +0 -1
- package/dist/simulation/cli.d.ts +0 -9
- package/dist/simulation/cli.d.ts.map +0 -1
- package/dist/simulation/cli.js +0 -68
- package/dist/simulation/cli.js.map +0 -1
- package/dist/simulation/runner.d.ts +0 -21
- package/dist/simulation/runner.d.ts.map +0 -1
- package/dist/simulation/runner.js +0 -241
- package/dist/simulation/runner.js.map +0 -1
- package/dist/simulation/scenarios/aidefence-integration.d.ts +0 -24
- package/dist/simulation/scenarios/aidefence-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/aidefence-integration.js +0 -124
- package/dist/simulation/scenarios/aidefence-integration.js.map +0 -1
- package/dist/simulation/scenarios/bmssp-integration.d.ts +0 -23
- package/dist/simulation/scenarios/bmssp-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/bmssp-integration.js +0 -104
- package/dist/simulation/scenarios/bmssp-integration.js.map +0 -1
- package/dist/simulation/scenarios/causal-reasoning.d.ts +0 -16
- package/dist/simulation/scenarios/causal-reasoning.d.ts.map +0 -1
- package/dist/simulation/scenarios/causal-reasoning.js +0 -108
- package/dist/simulation/scenarios/causal-reasoning.js.map +0 -1
- package/dist/simulation/scenarios/consciousness-explorer.d.ts +0 -25
- package/dist/simulation/scenarios/consciousness-explorer.d.ts.map +0 -1
- package/dist/simulation/scenarios/consciousness-explorer.js +0 -108
- package/dist/simulation/scenarios/consciousness-explorer.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts +0 -135
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js +0 -158
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/index.d.ts +0 -14
- package/dist/simulation/scenarios/domain-examples/index.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/index.js +0 -14
- package/dist/simulation/scenarios/domain-examples/index.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts +0 -178
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js +0 -218
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts +0 -122
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js +0 -129
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts +0 -166
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js +0 -161
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts +0 -151
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/scientific-research.js +0 -187
- package/dist/simulation/scenarios/domain-examples/scientific-research.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts +0 -102
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/trading-systems.js +0 -100
- package/dist/simulation/scenarios/domain-examples/trading-systems.js.map +0 -1
- package/dist/simulation/scenarios/goalie-integration.d.ts +0 -24
- package/dist/simulation/scenarios/goalie-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/goalie-integration.js +0 -121
- package/dist/simulation/scenarios/goalie-integration.js.map +0 -1
- package/dist/simulation/scenarios/graph-traversal.d.ts +0 -17
- package/dist/simulation/scenarios/graph-traversal.d.ts.map +0 -1
- package/dist/simulation/scenarios/graph-traversal.js +0 -101
- package/dist/simulation/scenarios/graph-traversal.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts +0 -45
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/attention-analysis.js +0 -435
- package/dist/simulation/scenarios/latent-space/attention-analysis.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts +0 -55
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js +0 -606
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts +0 -74
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js +0 -391
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts +0 -51
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js +0 -536
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/index.d.ts +0 -35
- package/dist/simulation/scenarios/latent-space/index.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/index.js +0 -35
- package/dist/simulation/scenarios/latent-space/index.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts +0 -52
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js +0 -472
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts +0 -53
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js +0 -391
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts +0 -52
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js +0 -514
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts +0 -53
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js +0 -595
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js.map +0 -1
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts +0 -18
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/lean-agentic-swarm.js +0 -132
- package/dist/simulation/scenarios/lean-agentic-swarm.js.map +0 -1
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts +0 -17
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/multi-agent-swarm.js +0 -111
- package/dist/simulation/scenarios/multi-agent-swarm.js.map +0 -1
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts +0 -23
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts.map +0 -1
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js +0 -98
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js.map +0 -1
- package/dist/simulation/scenarios/reflexion-learning.d.ts +0 -16
- package/dist/simulation/scenarios/reflexion-learning.d.ts.map +0 -1
- package/dist/simulation/scenarios/reflexion-learning.js +0 -98
- package/dist/simulation/scenarios/reflexion-learning.js.map +0 -1
- package/dist/simulation/scenarios/research-swarm.d.ts +0 -24
- package/dist/simulation/scenarios/research-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/research-swarm.js +0 -146
- package/dist/simulation/scenarios/research-swarm.js.map +0 -1
- package/dist/simulation/scenarios/skill-evolution.d.ts +0 -16
- package/dist/simulation/scenarios/skill-evolution.d.ts.map +0 -1
- package/dist/simulation/scenarios/skill-evolution.js +0 -109
- package/dist/simulation/scenarios/skill-evolution.js.map +0 -1
- package/dist/simulation/scenarios/stock-market-emergence.d.ts +0 -33
- package/dist/simulation/scenarios/stock-market-emergence.d.ts.map +0 -1
- package/dist/simulation/scenarios/stock-market-emergence.js +0 -246
- package/dist/simulation/scenarios/stock-market-emergence.js.map +0 -1
- package/dist/simulation/scenarios/strange-loops.d.ts +0 -18
- package/dist/simulation/scenarios/strange-loops.d.ts.map +0 -1
- package/dist/simulation/scenarios/strange-loops.js +0 -133
- package/dist/simulation/scenarios/strange-loops.js.map +0 -1
- package/dist/simulation/scenarios/sublinear-solver.d.ts +0 -22
- package/dist/simulation/scenarios/sublinear-solver.d.ts.map +0 -1
- package/dist/simulation/scenarios/sublinear-solver.js +0 -82
- package/dist/simulation/scenarios/sublinear-solver.js.map +0 -1
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts +0 -23
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts.map +0 -1
- package/dist/simulation/scenarios/temporal-lead-solver.js +0 -90
- package/dist/simulation/scenarios/temporal-lead-solver.js.map +0 -1
- package/dist/simulation/scenarios/voting-system-consensus.d.ts +0 -27
- package/dist/simulation/scenarios/voting-system-consensus.d.ts.map +0 -1
- package/dist/simulation/scenarios/voting-system-consensus.js +0 -175
- package/dist/simulation/scenarios/voting-system-consensus.js.map +0 -1
- package/dist/simulation/types.d.ts +0 -162
- package/dist/simulation/types.d.ts.map +0 -1
- package/dist/simulation/types.js +0 -5
- package/dist/simulation/types.js.map +0 -1
- package/dist/simulation/utils/PerformanceOptimizer.d.ts +0 -115
- package/dist/simulation/utils/PerformanceOptimizer.d.ts.map +0 -1
- package/dist/simulation/utils/PerformanceOptimizer.js +0 -223
- package/dist/simulation/utils/PerformanceOptimizer.js.map +0 -1
- package/dist/src/backends/index.cjs +0 -6
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts +0 -93
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts.map +0 -1
- package/dist/src/backends/ruvector/GuardedVectorBackend.js +0 -182
- package/dist/src/backends/ruvector/GuardedVectorBackend.js.map +0 -1
- package/dist/src/consensus/RaftConsensus.d.ts +0 -220
- package/dist/src/consensus/RaftConsensus.d.ts.map +0 -1
- package/dist/src/consensus/RaftConsensus.js +0 -762
- package/dist/src/consensus/RaftConsensus.js.map +0 -1
- package/dist/src/controllers/HierarchicalMemory.d.ts +0 -197
- package/dist/src/controllers/HierarchicalMemory.d.ts.map +0 -1
- package/dist/src/controllers/HierarchicalMemory.js +0 -519
- package/dist/src/controllers/HierarchicalMemory.js.map +0 -1
- package/dist/src/controllers/MemoryConsolidation.d.ts +0 -142
- package/dist/src/controllers/MemoryConsolidation.d.ts.map +0 -1
- package/dist/src/controllers/MemoryConsolidation.js +0 -479
- package/dist/src/controllers/MemoryConsolidation.js.map +0 -1
- package/dist/src/controllers/QUICConnection.d.ts +0 -122
- package/dist/src/controllers/QUICConnection.d.ts.map +0 -1
- package/dist/src/controllers/QUICConnection.js +0 -329
- package/dist/src/controllers/QUICConnection.js.map +0 -1
- package/dist/src/controllers/QUICConnectionPool.d.ts +0 -83
- package/dist/src/controllers/QUICConnectionPool.d.ts.map +0 -1
- package/dist/src/controllers/QUICConnectionPool.js +0 -256
- package/dist/src/controllers/QUICConnectionPool.js.map +0 -1
- package/dist/src/controllers/QUICStreamManager.d.ts +0 -114
- package/dist/src/controllers/QUICStreamManager.d.ts.map +0 -1
- package/dist/src/controllers/QUICStreamManager.js +0 -267
- package/dist/src/controllers/QUICStreamManager.js.map +0 -1
- package/dist/src/controllers/StreamingEmbeddingService.d.ts +0 -82
- package/dist/src/controllers/StreamingEmbeddingService.d.ts.map +0 -1
- package/dist/src/controllers/StreamingEmbeddingService.js +0 -243
- package/dist/src/controllers/StreamingEmbeddingService.js.map +0 -1
- package/dist/src/controllers/index.cjs +0 -6
- package/dist/src/coordination/MultiDatabaseCoordinator.d.ts +0 -348
- package/dist/src/coordination/MultiDatabaseCoordinator.d.ts.map +0 -1
- package/dist/src/coordination/MultiDatabaseCoordinator.js +0 -803
- package/dist/src/coordination/MultiDatabaseCoordinator.js.map +0 -1
- package/dist/src/coordination/index.d.ts +0 -10
- package/dist/src/coordination/index.d.ts.map +0 -1
- package/dist/src/coordination/index.js +0 -10
- package/dist/src/coordination/index.js.map +0 -1
- package/dist/src/index.cjs +0 -6
- package/dist/src/optimizations/RVFOptimizer.d.ts +0 -226
- package/dist/src/optimizations/RVFOptimizer.d.ts.map +0 -1
- package/dist/src/optimizations/RVFOptimizer.js +0 -541
- package/dist/src/optimizations/RVFOptimizer.js.map +0 -1
- package/dist/src/security/AttestationLog.d.ts +0 -70
- package/dist/src/security/AttestationLog.d.ts.map +0 -1
- package/dist/src/security/AttestationLog.js +0 -174
- package/dist/src/security/AttestationLog.js.map +0 -1
- package/dist/src/security/MutationGuard.d.ts +0 -83
- package/dist/src/security/MutationGuard.d.ts.map +0 -1
- package/dist/src/security/MutationGuard.js +0 -364
- package/dist/src/security/MutationGuard.js.map +0 -1
- package/dist/src/security/index.cjs +0 -6
- package/dist/src/security/index.d.ts +0 -15
- package/dist/src/security/index.d.ts.map +0 -1
- package/dist/src/security/index.js +0 -18
- package/dist/src/security/index.js.map +0 -1
- package/dist/src/services/GNNService.d.ts +0 -172
- package/dist/src/services/GNNService.d.ts.map +0 -1
- package/dist/src/services/GNNService.js +0 -612
- package/dist/src/services/GNNService.js.map +0 -1
- package/dist/src/services/GraphTransformerService.d.ts +0 -80
- package/dist/src/services/GraphTransformerService.d.ts.map +0 -1
- package/dist/src/services/GraphTransformerService.js +0 -369
- package/dist/src/services/GraphTransformerService.js.map +0 -1
- package/dist/src/services/SemanticRouter.d.ts +0 -83
- package/dist/src/services/SemanticRouter.d.ts.map +0 -1
- package/dist/src/services/SemanticRouter.js +0 -160
- package/dist/src/services/SemanticRouter.js.map +0 -1
- package/dist/src/services/SonaTrajectoryService.d.ts +0 -224
- package/dist/src/services/SonaTrajectoryService.d.ts.map +0 -1
- package/dist/src/services/SonaTrajectoryService.js +0 -539
- package/dist/src/services/SonaTrajectoryService.js.map +0 -1
- package/dist/src/utils/LegacyAttentionAdapter.d.ts +0 -93
- package/dist/src/utils/LegacyAttentionAdapter.d.ts.map +0 -1
- package/dist/src/utils/LegacyAttentionAdapter.js +0 -241
- package/dist/src/utils/LegacyAttentionAdapter.js.map +0 -1
- package/dist/src/utils/vector-math.d.ts +0 -29
- package/dist/src/utils/vector-math.d.ts.map +0 -1
- package/dist/src/utils/vector-math.js +0 -66
- package/dist/src/utils/vector-math.js.map +0 -1
|
@@ -7,31 +7,73 @@
|
|
|
7
7
|
* Based on: "Reflexion: Language Agents with Verbal Reinforcement Learning"
|
|
8
8
|
* https://arxiv.org/abs/2303.11366
|
|
9
9
|
*/
|
|
10
|
+
import { normalizeRowId } from '../types/database.types.js';
|
|
11
|
+
import { searchVectors } from '../backends/VectorBackend.js';
|
|
12
|
+
import { sqlExactSource } from '../backends/ExactSearch.js';
|
|
10
13
|
import { NodeIdMapper } from '../utils/NodeIdMapper.js';
|
|
11
|
-
import {
|
|
14
|
+
import { QueryCache } from '../core/QueryCache.js';
|
|
15
|
+
import { TopK, squaredNorm, cosineWithQueryNorm } from '../utils/top-k.js';
|
|
16
|
+
function finiteNumber(value, name) {
|
|
17
|
+
const n = Number(value);
|
|
18
|
+
if (!Number.isFinite(n))
|
|
19
|
+
throw new Error(`${name} must be a finite number`);
|
|
20
|
+
return n;
|
|
21
|
+
}
|
|
22
|
+
function positiveInt(value, name) {
|
|
23
|
+
const n = Math.floor(finiteNumber(value, name));
|
|
24
|
+
if (n < 1)
|
|
25
|
+
throw new Error(`${name} must be a positive integer`);
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
/** Vector ids this controller writes: the bare episode row id */
|
|
29
|
+
const EPISODE_VECTOR_ID = /^\d+$/;
|
|
30
|
+
/** Parse JSON from DB row values without throwing on malformed data. */
|
|
31
|
+
function safeJsonParse(value, fallback) {
|
|
32
|
+
if (!value)
|
|
33
|
+
return fallback;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return fallback;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
12
41
|
export class ReflexionMemory {
|
|
13
42
|
db;
|
|
14
43
|
embedder;
|
|
15
44
|
vectorBackend;
|
|
16
45
|
learningBackend;
|
|
17
46
|
graphBackend;
|
|
18
|
-
|
|
47
|
+
queryCache;
|
|
48
|
+
constructor(db, embedder, vectorBackend, learningBackend, graphBackend, cacheConfig) {
|
|
19
49
|
this.db = db;
|
|
20
50
|
this.embedder = embedder;
|
|
21
51
|
this.vectorBackend = vectorBackend;
|
|
22
52
|
this.learningBackend = learningBackend;
|
|
23
53
|
this.graphBackend = graphBackend;
|
|
54
|
+
this.queryCache = new QueryCache(cacheConfig);
|
|
24
55
|
}
|
|
25
56
|
/**
|
|
26
57
|
* Store a new episode with its critique and outcome
|
|
58
|
+
* Invalidates relevant cache entries
|
|
59
|
+
*
|
|
60
|
+
* Persistence guarantee (issue #128 fix):
|
|
61
|
+
* storeEpisode() always writes to the SQLite `episodes` and
|
|
62
|
+
* `episode_embeddings` tables when a SQL-capable connection is present,
|
|
63
|
+
* even when a graph or vector backend handles the primary index. This
|
|
64
|
+
* ensures data survives process restarts (graph/vector backends are
|
|
65
|
+
* often in-memory or rebuildable from SQL).
|
|
27
66
|
*/
|
|
28
67
|
async storeEpisode(episode) {
|
|
68
|
+
// Invalidate episode caches on write
|
|
69
|
+
this.queryCache.invalidateCategory('episodes');
|
|
70
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
29
71
|
// Use GraphDatabaseAdapter if available (AgentDB v2)
|
|
30
72
|
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
31
73
|
// GraphDatabaseAdapter has specialized storeEpisode method
|
|
32
74
|
const graphAdapter = this.graphBackend;
|
|
33
75
|
// Generate embedding for the task
|
|
34
|
-
const taskEmbedding = await this.embedder.
|
|
76
|
+
const taskEmbedding = await this.embedder.embedPassage(episode.task);
|
|
35
77
|
// Create episode node using GraphDatabaseAdapter
|
|
36
78
|
const nodeId = await graphAdapter.storeEpisode({
|
|
37
79
|
id: episode.id ? `episode-${episode.id}` : `episode-${Date.now()}-${Math.random()}`,
|
|
@@ -44,18 +86,21 @@ export class ReflexionMemory {
|
|
|
44
86
|
critique: episode.critique,
|
|
45
87
|
createdAt: episode.ts ? episode.ts * 1000 : Date.now(),
|
|
46
88
|
tokensUsed: episode.tokensUsed,
|
|
47
|
-
latencyMs: episode.latencyMs
|
|
89
|
+
latencyMs: episode.latencyMs,
|
|
48
90
|
}, taskEmbedding);
|
|
49
91
|
// Return a numeric ID (parse from string ID)
|
|
50
92
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
51
93
|
// Register mapping for later use by CausalMemoryGraph
|
|
52
94
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
95
|
+
// #128: dual-write to SQL for restart-safe persistence. Graph adapter
|
|
96
|
+
// index is typically in-memory; SQL is the durable record.
|
|
97
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
53
98
|
return numericId;
|
|
54
99
|
}
|
|
55
100
|
// Use generic GraphBackend if available
|
|
56
101
|
if (this.graphBackend) {
|
|
57
102
|
// Generate embedding for the task
|
|
58
|
-
const taskEmbedding = await this.embedder.
|
|
103
|
+
const taskEmbedding = await this.embedder.embedPassage(episode.task);
|
|
59
104
|
// Create episode node ID
|
|
60
105
|
const nodeId = await this.graphBackend.createNode(['Episode'], {
|
|
61
106
|
sessionId: episode.sessionId,
|
|
@@ -69,22 +114,21 @@ export class ReflexionMemory {
|
|
|
69
114
|
tokensUsed: episode.tokensUsed || 0,
|
|
70
115
|
tags: episode.tags ? JSON.stringify(episode.tags) : '[]',
|
|
71
116
|
metadata: episode.metadata ? JSON.stringify(episode.metadata) : '{}',
|
|
72
|
-
createdAt: Date.now()
|
|
117
|
+
createdAt: Date.now(),
|
|
73
118
|
});
|
|
74
119
|
// Store embedding using vectorBackend if available
|
|
75
120
|
if (this.vectorBackend && taskEmbedding) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch { /* vectorBackend insert failed — graph node still created */ }
|
|
121
|
+
this.vectorBackend.insert(nodeId, taskEmbedding, {
|
|
122
|
+
type: 'episode',
|
|
123
|
+
sessionId: episode.sessionId,
|
|
124
|
+
});
|
|
83
125
|
}
|
|
84
126
|
// Return a numeric ID (parse from string ID)
|
|
85
127
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
86
128
|
// Register mapping for later use by CausalMemoryGraph
|
|
87
129
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
130
|
+
// #128: dual-write to SQL for restart-safe persistence.
|
|
131
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
88
132
|
return numericId;
|
|
89
133
|
}
|
|
90
134
|
// Fallback to SQLite (v1 compatibility)
|
|
@@ -97,16 +141,13 @@ export class ReflexionMemory {
|
|
|
97
141
|
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
98
142
|
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
99
143
|
const result = stmt.run(episode.sessionId, episode.task, episode.input || null, episode.output || null, episode.critique || null, episode.reward, episode.success ? 1 : 0, episode.latencyMs || null, episode.tokensUsed || null, tags, metadata);
|
|
100
|
-
const episodeId = result.lastInsertRowid;
|
|
144
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
101
145
|
// Generate and store embedding
|
|
102
146
|
const text = this.buildEpisodeText(episode);
|
|
103
|
-
const embedding = await this.embedder.
|
|
147
|
+
const embedding = await this.embedder.embedPassage(text);
|
|
104
148
|
// Use vector backend if available (150x faster retrieval)
|
|
105
149
|
if (this.vectorBackend) {
|
|
106
|
-
|
|
107
|
-
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
108
|
-
}
|
|
109
|
-
catch { /* vectorBackend insert failed — SQL fallback used */ }
|
|
150
|
+
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
110
151
|
}
|
|
111
152
|
// Also store in SQL for fallback
|
|
112
153
|
this.storeEmbedding(episodeId, embedding);
|
|
@@ -124,155 +165,213 @@ export class ReflexionMemory {
|
|
|
124
165
|
task: episode.task,
|
|
125
166
|
sessionId: episode.sessionId,
|
|
126
167
|
latencyMs: episode.latencyMs,
|
|
127
|
-
tokensUsed: episode.tokensUsed
|
|
128
|
-
}
|
|
168
|
+
tokensUsed: episode.tokensUsed,
|
|
169
|
+
},
|
|
129
170
|
});
|
|
130
171
|
}
|
|
131
172
|
return episodeId;
|
|
132
173
|
}
|
|
133
174
|
/**
|
|
134
175
|
* Retrieve relevant past episodes for a new task attempt
|
|
176
|
+
* Results are cached for improved performance
|
|
135
177
|
*/
|
|
136
178
|
async retrieveRelevant(query) {
|
|
137
|
-
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays } = query;
|
|
138
|
-
//
|
|
179
|
+
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays, } = query;
|
|
180
|
+
// Check cache first
|
|
181
|
+
const cacheKey = this.queryCache.generateKey('retrieveRelevant', [task, currentState, k, minReward, onlyFailures, onlySuccesses, timeWindowDays], 'episodes');
|
|
182
|
+
const cached = this.queryCache.get(cacheKey);
|
|
183
|
+
if (cached) {
|
|
184
|
+
return cached;
|
|
185
|
+
}
|
|
186
|
+
// Generate and enhance query embedding
|
|
187
|
+
const queryEmbedding = await this.prepareQueryEmbedding(task, currentState, k);
|
|
188
|
+
// Try different retrieval strategies in order of preference
|
|
189
|
+
let episodes = [];
|
|
190
|
+
if (this.graphBackend && 'searchSimilarEpisodes' in this.graphBackend) {
|
|
191
|
+
episodes = await this.retrieveFromGraphAdapter(queryEmbedding, query);
|
|
192
|
+
}
|
|
193
|
+
else if (this.graphBackend && 'execute' in this.graphBackend) {
|
|
194
|
+
episodes = await this.retrieveFromGenericGraph(query);
|
|
195
|
+
}
|
|
196
|
+
else if (this.vectorBackend) {
|
|
197
|
+
episodes = await this.retrieveFromVectorBackend(queryEmbedding, query);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
episodes = await this.retrieveFromSQLFallback(queryEmbedding, query);
|
|
201
|
+
}
|
|
202
|
+
// Cache and return results
|
|
203
|
+
this.queryCache.set(cacheKey, episodes);
|
|
204
|
+
return episodes;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Prepare and enhance query embedding for search
|
|
208
|
+
*/
|
|
209
|
+
async prepareQueryEmbedding(task, currentState, k) {
|
|
139
210
|
const queryText = currentState ? `${task}\n${currentState}` : task;
|
|
140
|
-
let queryEmbedding = await this.embedder.
|
|
211
|
+
let queryEmbedding = await this.embedder.embedQuery(queryText);
|
|
141
212
|
// Enhance query with GNN if learning backend available
|
|
142
213
|
if (this.learningBackend) {
|
|
143
214
|
queryEmbedding = await this.enhanceQueryWithGNN(queryEmbedding, k);
|
|
144
215
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
216
|
+
return queryEmbedding;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Retrieve episodes using GraphDatabaseAdapter (AgentDB v2)
|
|
220
|
+
*/
|
|
221
|
+
async retrieveFromGraphAdapter(queryEmbedding, query) {
|
|
222
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
223
|
+
const graphAdapter = this.graphBackend;
|
|
224
|
+
// Search using vector similarity
|
|
225
|
+
const results = await graphAdapter.searchSimilarEpisodes(queryEmbedding, k * 3);
|
|
226
|
+
// Apply filters
|
|
227
|
+
const filtered = this.applyEpisodeFilters(results, {
|
|
228
|
+
minReward,
|
|
229
|
+
onlyFailures,
|
|
230
|
+
onlySuccesses,
|
|
231
|
+
timeWindowDays,
|
|
232
|
+
});
|
|
233
|
+
// Convert to EpisodeWithEmbedding format
|
|
234
|
+
return filtered.slice(0, k).map((ep) => this.convertGraphEpisode(ep));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Retrieve episodes using generic GraphBackend
|
|
238
|
+
*/
|
|
239
|
+
async retrieveFromGenericGraph(query) {
|
|
240
|
+
const { k = 5 } = query;
|
|
241
|
+
const cypherQuery = this.buildCypherQuery(query);
|
|
242
|
+
const result = await this.graphBackend.execute(cypherQuery);
|
|
243
|
+
// Convert to EpisodeWithEmbedding format
|
|
244
|
+
const episodes = result.rows.map((row) => this.convertCypherEpisode(row.e));
|
|
245
|
+
return episodes.slice(0, k);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Retrieve episodes using VectorBackend (150x faster)
|
|
249
|
+
*/
|
|
250
|
+
async retrieveFromVectorBackend(queryEmbedding, query) {
|
|
251
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
252
|
+
// Get candidates from vector backend; small or short answers are
|
|
253
|
+
// completed by exact cosine over episode_embeddings (ADR-015)
|
|
254
|
+
const searchResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 3, { threshold: 0.0 }, sqlExactSource(this.db, {
|
|
255
|
+
table: 'episode_embeddings',
|
|
256
|
+
idColumn: 'episode_id',
|
|
257
|
+
vectorId: (id) => String(id),
|
|
258
|
+
owns: (hit) => EPISODE_VECTOR_ID.test(hit.id),
|
|
259
|
+
}));
|
|
260
|
+
// The vector backend may be shared with other controllers ("skill:N",
|
|
261
|
+
// "causal-edge:N"); episode vectors use the bare numeric row id.
|
|
262
|
+
const episodeResults = searchResults.filter((r) => EPISODE_VECTOR_ID.test(r.id));
|
|
263
|
+
const episodeIds = episodeResults.map((r) => Number(r.id));
|
|
264
|
+
if (episodeIds.length === 0) {
|
|
265
|
+
// No usable hits although episodes exist (empty or crowded-out index):
|
|
266
|
+
// answer from the SQL embeddings instead of returning nothing.
|
|
267
|
+
if (this.db.prepare('SELECT 1 FROM episode_embeddings LIMIT 1').get()) {
|
|
268
|
+
return this.retrieveFromSQLFallback(queryEmbedding, query);
|
|
194
269
|
}
|
|
195
|
-
|
|
196
|
-
const result = await this.graphBackend.execute(cypherQuery);
|
|
197
|
-
// Convert to EpisodeWithEmbedding format
|
|
198
|
-
const episodes = result.rows.map((row) => {
|
|
199
|
-
const node = row.e;
|
|
200
|
-
return {
|
|
201
|
-
id: parseInt(node.id.split('-').pop() || '0', 36),
|
|
202
|
-
sessionId: node.properties.sessionId,
|
|
203
|
-
task: node.properties.task,
|
|
204
|
-
input: node.properties.input,
|
|
205
|
-
output: node.properties.output,
|
|
206
|
-
critique: node.properties.critique,
|
|
207
|
-
reward: typeof node.properties.reward === 'string' ? parseFloat(node.properties.reward) : node.properties.reward,
|
|
208
|
-
success: typeof node.properties.success === 'string' ? node.properties.success === 'true' : node.properties.success,
|
|
209
|
-
latencyMs: node.properties.latencyMs,
|
|
210
|
-
tokensUsed: node.properties.tokensUsed,
|
|
211
|
-
tags: node.properties.tags ? JSON.parse(node.properties.tags) : [],
|
|
212
|
-
metadata: node.properties.metadata ? JSON.parse(node.properties.metadata) : {},
|
|
213
|
-
ts: Math.floor(node.properties.createdAt / 1000)
|
|
214
|
-
};
|
|
215
|
-
});
|
|
216
|
-
return episodes.slice(0, k);
|
|
270
|
+
return [];
|
|
217
271
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
}
|
|
230
|
-
const placeholders = episodeIds.map(() => '?').join(',');
|
|
231
|
-
const stmt = this.db.prepare(`
|
|
232
|
-
SELECT * FROM episodes
|
|
233
|
-
WHERE id IN (${placeholders})
|
|
234
|
-
`);
|
|
235
|
-
const rows = stmt.all(...episodeIds);
|
|
236
|
-
const episodeMap = new Map(rows.map(r => [r.id.toString(), r]));
|
|
237
|
-
// Map results back with similarity scores and apply filters
|
|
238
|
-
const episodes = [];
|
|
239
|
-
for (const result of searchResults) {
|
|
240
|
-
const row = episodeMap.get(result.id);
|
|
241
|
-
if (!row)
|
|
242
|
-
continue;
|
|
243
|
-
// Apply additional filters
|
|
244
|
-
if (minReward !== undefined && row.reward < minReward)
|
|
245
|
-
continue;
|
|
246
|
-
if (onlyFailures && row.success === 1)
|
|
247
|
-
continue;
|
|
248
|
-
if (onlySuccesses && row.success === 0)
|
|
249
|
-
continue;
|
|
250
|
-
if (timeWindowDays && row.ts < (Date.now() / 1000 - timeWindowDays * 86400))
|
|
251
|
-
continue;
|
|
252
|
-
episodes.push({
|
|
253
|
-
id: row.id,
|
|
254
|
-
ts: row.ts,
|
|
255
|
-
sessionId: row.session_id,
|
|
256
|
-
task: row.task,
|
|
257
|
-
input: row.input,
|
|
258
|
-
output: row.output,
|
|
259
|
-
critique: row.critique,
|
|
260
|
-
reward: row.reward,
|
|
261
|
-
success: row.success === 1,
|
|
262
|
-
latencyMs: row.latency_ms,
|
|
263
|
-
tokensUsed: row.tokens_used,
|
|
264
|
-
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
265
|
-
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
266
|
-
similarity: result.similarity
|
|
267
|
-
});
|
|
268
|
-
if (episodes.length >= k)
|
|
269
|
-
break;
|
|
270
|
-
}
|
|
271
|
-
return episodes;
|
|
272
|
+
const rows = this.fetchEpisodesByIds(episodeIds);
|
|
273
|
+
const episodeMap = new Map(rows.map((r) => [r.id.toString(), r]));
|
|
274
|
+
// Map results with similarity scores and apply filters
|
|
275
|
+
const episodes = [];
|
|
276
|
+
for (const result of episodeResults) {
|
|
277
|
+
const row = episodeMap.get(result.id);
|
|
278
|
+
if (!row)
|
|
279
|
+
continue;
|
|
280
|
+
// Apply filters
|
|
281
|
+
if (!this.passesEpisodeFilters(row, { minReward, onlyFailures, onlySuccesses, timeWindowDays })) {
|
|
282
|
+
continue;
|
|
272
283
|
}
|
|
273
|
-
|
|
284
|
+
episodes.push(this.convertDatabaseEpisode(row, result.similarity));
|
|
285
|
+
if (episodes.length >= k)
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
return episodes;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Retrieve episodes using SQL-based similarity search (fallback)
|
|
292
|
+
*/
|
|
293
|
+
async retrieveFromSQLFallback(queryEmbedding, query) {
|
|
294
|
+
const { k = 5 } = query;
|
|
295
|
+
const { whereClause, params } = this.buildSQLFilters(query);
|
|
296
|
+
const stmt = this.db.prepare(`
|
|
297
|
+
SELECT e.*, ee.embedding
|
|
298
|
+
FROM episodes e
|
|
299
|
+
JOIN episode_embeddings ee ON e.id = ee.episode_id
|
|
300
|
+
${whereClause}
|
|
301
|
+
ORDER BY e.reward DESC
|
|
302
|
+
`);
|
|
303
|
+
const rows = stmt.all(...params);
|
|
304
|
+
// Bounded top-k over the scan; only the winners are converted. Ordering
|
|
305
|
+
// matches the old sort on (similarity || 0) with scan order on ties.
|
|
306
|
+
const queryNorm = Math.sqrt(squaredNorm(queryEmbedding));
|
|
307
|
+
const top = new TopK(k);
|
|
308
|
+
for (const row of rows) {
|
|
309
|
+
const embedding = this.deserializeEmbedding(row.embedding);
|
|
310
|
+
const similarity = cosineWithQueryNorm(queryEmbedding, queryNorm, embedding);
|
|
311
|
+
top.push(similarity || 0, { row, embedding, similarity });
|
|
312
|
+
}
|
|
313
|
+
return top
|
|
314
|
+
.sorted()
|
|
315
|
+
.map(({ item }) => this.convertDatabaseEpisode(item.row, item.similarity, item.embedding));
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Apply episode filters to search results
|
|
319
|
+
*/
|
|
320
|
+
applyEpisodeFilters(episodes, filters) {
|
|
321
|
+
return episodes.filter((ep) => {
|
|
322
|
+
if (filters.minReward !== undefined && ep.reward < filters.minReward)
|
|
323
|
+
return false;
|
|
324
|
+
if (filters.onlyFailures && ep.success)
|
|
325
|
+
return false;
|
|
326
|
+
if (filters.onlySuccesses && !ep.success)
|
|
327
|
+
return false;
|
|
328
|
+
if (filters.timeWindowDays && ep.createdAt < Date.now() - filters.timeWindowDays * 86400000)
|
|
329
|
+
return false;
|
|
330
|
+
return true;
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Check if database row passes episode filters
|
|
335
|
+
*/
|
|
336
|
+
passesEpisodeFilters(row, filters) {
|
|
337
|
+
if (filters.minReward !== undefined && row.reward < filters.minReward)
|
|
338
|
+
return false;
|
|
339
|
+
if (filters.onlyFailures && row.success === 1)
|
|
340
|
+
return false;
|
|
341
|
+
if (filters.onlySuccesses && row.success === 0)
|
|
342
|
+
return false;
|
|
343
|
+
if (filters.timeWindowDays && row.ts < Date.now() / 1000 - filters.timeWindowDays * 86400)
|
|
344
|
+
return false;
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Build Cypher query with filters
|
|
349
|
+
*/
|
|
350
|
+
buildCypherQuery(query) {
|
|
351
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
352
|
+
let cypherQuery = 'MATCH (e:Episode) WHERE 1=1';
|
|
353
|
+
// Values are spliced into Cypher text, so only finite numbers get through
|
|
354
|
+
if (minReward !== undefined) {
|
|
355
|
+
cypherQuery += ` AND e.reward >= ${finiteNumber(minReward, 'minReward')}`;
|
|
356
|
+
}
|
|
357
|
+
if (onlyFailures) {
|
|
358
|
+
cypherQuery += ` AND e.success = false`;
|
|
274
359
|
}
|
|
275
|
-
|
|
360
|
+
if (onlySuccesses) {
|
|
361
|
+
cypherQuery += ` AND e.success = true`;
|
|
362
|
+
}
|
|
363
|
+
if (timeWindowDays) {
|
|
364
|
+
const cutoff = Date.now() - finiteNumber(timeWindowDays, 'timeWindowDays') * 86400000;
|
|
365
|
+
cypherQuery += ` AND e.createdAt >= ${cutoff}`;
|
|
366
|
+
}
|
|
367
|
+
cypherQuery += ` RETURN e LIMIT ${positiveInt(k, 'k') * 3}`;
|
|
368
|
+
return cypherQuery;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Build SQL WHERE clause and parameters for filters
|
|
372
|
+
*/
|
|
373
|
+
buildSQLFilters(query) {
|
|
374
|
+
const { minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
276
375
|
const filters = [];
|
|
277
376
|
const params = [];
|
|
278
377
|
if (minReward !== undefined) {
|
|
@@ -290,46 +389,93 @@ export class ReflexionMemory {
|
|
|
290
389
|
params.push(timeWindowDays * 86400);
|
|
291
390
|
}
|
|
292
391
|
const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
392
|
+
return { whereClause, params };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Fetch episodes by IDs from database
|
|
396
|
+
*/
|
|
397
|
+
fetchEpisodesByIds(episodeIds) {
|
|
398
|
+
const placeholders = episodeIds.map(() => '?').join(',');
|
|
293
399
|
const stmt = this.db.prepare(`
|
|
294
|
-
SELECT
|
|
295
|
-
|
|
296
|
-
ee.embedding
|
|
297
|
-
FROM episodes e
|
|
298
|
-
JOIN episode_embeddings ee ON e.id = ee.episode_id
|
|
299
|
-
${whereClause}
|
|
300
|
-
ORDER BY e.reward DESC
|
|
400
|
+
SELECT * FROM episodes
|
|
401
|
+
WHERE id IN (${placeholders})
|
|
301
402
|
`);
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
embedding,
|
|
322
|
-
similarity
|
|
323
|
-
};
|
|
324
|
-
});
|
|
325
|
-
// Sort by similarity and return top-k
|
|
326
|
-
episodes.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
|
|
327
|
-
return episodes.slice(0, k);
|
|
403
|
+
return stmt.all(...episodeIds);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Convert GraphDatabaseAdapter episode to EpisodeWithEmbedding
|
|
407
|
+
*/
|
|
408
|
+
convertGraphEpisode(ep) {
|
|
409
|
+
return {
|
|
410
|
+
id: parseInt(ep.id.split('-').pop() || '0', 36),
|
|
411
|
+
sessionId: ep.sessionId,
|
|
412
|
+
task: ep.task,
|
|
413
|
+
input: ep.input,
|
|
414
|
+
output: ep.output,
|
|
415
|
+
critique: ep.critique,
|
|
416
|
+
reward: ep.reward,
|
|
417
|
+
success: ep.success,
|
|
418
|
+
latencyMs: ep.latencyMs,
|
|
419
|
+
tokensUsed: ep.tokensUsed,
|
|
420
|
+
ts: Math.floor(ep.createdAt / 1000),
|
|
421
|
+
};
|
|
328
422
|
}
|
|
329
423
|
/**
|
|
330
|
-
*
|
|
424
|
+
* Convert Cypher query result to EpisodeWithEmbedding
|
|
425
|
+
*/
|
|
426
|
+
convertCypherEpisode(node) {
|
|
427
|
+
return {
|
|
428
|
+
id: parseInt(node.id.split('-').pop() || '0', 36),
|
|
429
|
+
sessionId: node.properties.sessionId,
|
|
430
|
+
task: node.properties.task,
|
|
431
|
+
input: node.properties.input,
|
|
432
|
+
output: node.properties.output,
|
|
433
|
+
critique: node.properties.critique,
|
|
434
|
+
reward: typeof node.properties.reward === 'string'
|
|
435
|
+
? parseFloat(node.properties.reward)
|
|
436
|
+
: node.properties.reward,
|
|
437
|
+
success: typeof node.properties.success === 'string'
|
|
438
|
+
? node.properties.success === 'true'
|
|
439
|
+
: node.properties.success,
|
|
440
|
+
latencyMs: node.properties.latencyMs,
|
|
441
|
+
tokensUsed: node.properties.tokensUsed,
|
|
442
|
+
tags: safeJsonParse(node.properties.tags, []),
|
|
443
|
+
metadata: safeJsonParse(node.properties.metadata, {}),
|
|
444
|
+
ts: Math.floor(node.properties.createdAt / 1000),
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Convert database row to EpisodeWithEmbedding
|
|
449
|
+
*/
|
|
450
|
+
convertDatabaseEpisode(row, similarity, embedding) {
|
|
451
|
+
return {
|
|
452
|
+
id: row.id,
|
|
453
|
+
ts: row.ts,
|
|
454
|
+
sessionId: row.session_id,
|
|
455
|
+
task: row.task,
|
|
456
|
+
input: row.input ?? undefined,
|
|
457
|
+
output: row.output ?? undefined,
|
|
458
|
+
critique: row.critique ?? undefined,
|
|
459
|
+
reward: row.reward,
|
|
460
|
+
success: row.success === 1,
|
|
461
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
462
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
463
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
464
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
465
|
+
embedding,
|
|
466
|
+
similarity,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Get statistics for a task (cached)
|
|
331
471
|
*/
|
|
332
472
|
getTaskStats(task, timeWindowDays) {
|
|
473
|
+
// Check cache first
|
|
474
|
+
const cacheKey = this.queryCache.generateKey('getTaskStats', [task, timeWindowDays], 'task-stats');
|
|
475
|
+
const cached = this.queryCache.get(cacheKey);
|
|
476
|
+
if (cached) {
|
|
477
|
+
return cached;
|
|
478
|
+
}
|
|
333
479
|
const windowFilter = timeWindowDays
|
|
334
480
|
? `AND ts > strftime('%s', 'now') - ${timeWindowDays * 86400}`
|
|
335
481
|
: '';
|
|
@@ -359,41 +505,59 @@ export class ReflexionMemory {
|
|
|
359
505
|
const improvementTrend = trend.recent_reward && trend.older_reward
|
|
360
506
|
? (trend.recent_reward - trend.older_reward) / trend.older_reward
|
|
361
507
|
: 0;
|
|
362
|
-
|
|
363
|
-
totalAttempts: stats
|
|
364
|
-
successRate: stats
|
|
365
|
-
avgReward: stats
|
|
366
|
-
avgLatency: stats
|
|
367
|
-
improvementTrend
|
|
508
|
+
const results = {
|
|
509
|
+
totalAttempts: stats?.total ?? 0,
|
|
510
|
+
successRate: stats?.success_rate ?? 0,
|
|
511
|
+
avgReward: stats?.avg_reward ?? 0,
|
|
512
|
+
avgLatency: stats?.avg_latency ?? 0,
|
|
513
|
+
improvementTrend,
|
|
368
514
|
};
|
|
515
|
+
// Cache the results
|
|
516
|
+
this.queryCache.set(cacheKey, results);
|
|
517
|
+
return results;
|
|
369
518
|
}
|
|
370
519
|
/**
|
|
371
|
-
* Build critique summary from similar failed episodes
|
|
520
|
+
* Build critique summary from similar failed episodes (cached)
|
|
372
521
|
*/
|
|
373
522
|
async getCritiqueSummary(query) {
|
|
523
|
+
// Check cache first
|
|
524
|
+
const cacheKey = this.queryCache.generateKey('getCritiqueSummary', [query.task, query.k], 'episodes');
|
|
525
|
+
const cached = this.queryCache.get(cacheKey);
|
|
526
|
+
if (cached) {
|
|
527
|
+
return cached;
|
|
528
|
+
}
|
|
374
529
|
const failures = await this.retrieveRelevant({
|
|
375
530
|
...query,
|
|
376
531
|
onlyFailures: true,
|
|
377
|
-
k: 3
|
|
532
|
+
k: 3,
|
|
378
533
|
});
|
|
379
534
|
if (failures.length === 0) {
|
|
380
535
|
return 'No prior failures found for this task.';
|
|
381
536
|
}
|
|
382
537
|
const critiques = failures
|
|
383
|
-
.filter(ep => ep.critique)
|
|
538
|
+
.filter((ep) => ep.critique)
|
|
384
539
|
.map((ep, i) => `${i + 1}. ${ep.critique} (reward: ${ep.reward.toFixed(2)})`)
|
|
385
540
|
.join('\n');
|
|
386
|
-
|
|
541
|
+
const result = `Prior failures and lessons learned:\n${critiques}`;
|
|
542
|
+
// Cache the result
|
|
543
|
+
this.queryCache.set(cacheKey, result);
|
|
544
|
+
return result;
|
|
387
545
|
}
|
|
388
546
|
/**
|
|
389
|
-
* Get successful strategies for a task
|
|
547
|
+
* Get successful strategies for a task (cached)
|
|
390
548
|
*/
|
|
391
549
|
async getSuccessStrategies(query) {
|
|
550
|
+
// Check cache first
|
|
551
|
+
const cacheKey = this.queryCache.generateKey('getSuccessStrategies', [query.task, query.k], 'episodes');
|
|
552
|
+
const cached = this.queryCache.get(cacheKey);
|
|
553
|
+
if (cached) {
|
|
554
|
+
return cached;
|
|
555
|
+
}
|
|
392
556
|
const successes = await this.retrieveRelevant({
|
|
393
557
|
...query,
|
|
394
558
|
onlySuccesses: true,
|
|
395
559
|
minReward: 0.7,
|
|
396
|
-
k: 3
|
|
560
|
+
k: 3,
|
|
397
561
|
});
|
|
398
562
|
if (successes.length === 0) {
|
|
399
563
|
return 'No successful strategies found for this task.';
|
|
@@ -404,7 +568,10 @@ export class ReflexionMemory {
|
|
|
404
568
|
return `${i + 1}. Approach (reward ${ep.reward.toFixed(2)}): ${approach}...`;
|
|
405
569
|
})
|
|
406
570
|
.join('\n');
|
|
407
|
-
|
|
571
|
+
const result = `Successful strategies:\n${strategies}`;
|
|
572
|
+
// Cache the result
|
|
573
|
+
this.queryCache.set(cacheKey, result);
|
|
574
|
+
return result;
|
|
408
575
|
}
|
|
409
576
|
/**
|
|
410
577
|
* Get recent episodes for a session
|
|
@@ -417,24 +584,25 @@ export class ReflexionMemory {
|
|
|
417
584
|
LIMIT ?
|
|
418
585
|
`);
|
|
419
586
|
const rows = stmt.all(sessionId, limit);
|
|
420
|
-
return rows.map(row => ({
|
|
587
|
+
return rows.map((row) => ({
|
|
421
588
|
id: row.id,
|
|
422
589
|
ts: row.ts,
|
|
423
590
|
sessionId: row.session_id,
|
|
424
591
|
task: row.task,
|
|
425
|
-
input: row.input,
|
|
426
|
-
output: row.output,
|
|
427
|
-
critique: row.critique,
|
|
592
|
+
input: row.input ?? undefined,
|
|
593
|
+
output: row.output ?? undefined,
|
|
594
|
+
critique: row.critique ?? undefined,
|
|
428
595
|
reward: row.reward,
|
|
429
596
|
success: row.success === 1,
|
|
430
|
-
latencyMs: row.latency_ms,
|
|
431
|
-
tokensUsed: row.tokens_used,
|
|
432
|
-
tags:
|
|
433
|
-
metadata:
|
|
597
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
598
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
599
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
600
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
434
601
|
}));
|
|
435
602
|
}
|
|
436
603
|
/**
|
|
437
604
|
* Prune low-quality episodes based on TTL and quality threshold
|
|
605
|
+
* Invalidates cache on completion
|
|
438
606
|
*/
|
|
439
607
|
pruneEpisodes(config) {
|
|
440
608
|
const { minReward = 0.3, maxAgeDays = 30, keepMinPerTask = 5 } = config;
|
|
@@ -455,6 +623,11 @@ export class ReflexionMemory {
|
|
|
455
623
|
)
|
|
456
624
|
`);
|
|
457
625
|
const result = stmt.run(minReward, maxAgeDays * 86400, keepMinPerTask);
|
|
626
|
+
// Invalidate caches after pruning
|
|
627
|
+
if (result.changes > 0) {
|
|
628
|
+
this.queryCache.invalidateCategory('episodes');
|
|
629
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
630
|
+
}
|
|
458
631
|
return result.changes;
|
|
459
632
|
}
|
|
460
633
|
// ========================================================================
|
|
@@ -485,6 +658,17 @@ export class ReflexionMemory {
|
|
|
485
658
|
deserializeEmbedding(buffer) {
|
|
486
659
|
return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.length / 4);
|
|
487
660
|
}
|
|
661
|
+
cosineSimilarity(a, b) {
|
|
662
|
+
let dotProduct = 0;
|
|
663
|
+
let normA = 0;
|
|
664
|
+
let normB = 0;
|
|
665
|
+
for (let i = 0; i < a.length; i++) {
|
|
666
|
+
dotProduct += a[i] * b[i];
|
|
667
|
+
normA += a[i] * a[i];
|
|
668
|
+
normB += b[i] * b[i];
|
|
669
|
+
}
|
|
670
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
671
|
+
}
|
|
488
672
|
// ========================================================================
|
|
489
673
|
// GNN and Graph Integration Methods
|
|
490
674
|
// ========================================================================
|
|
@@ -503,7 +687,7 @@ export class ReflexionMemory {
|
|
|
503
687
|
success: episode.success,
|
|
504
688
|
timestamp: episode.ts || Date.now(),
|
|
505
689
|
latencyMs: episode.latencyMs,
|
|
506
|
-
tokensUsed: episode.tokensUsed
|
|
690
|
+
tokensUsed: episode.tokensUsed,
|
|
507
691
|
});
|
|
508
692
|
// Find similar episodes using graph vector search
|
|
509
693
|
const similarEpisodes = await this.graphBackend.vectorSearch(embedding, 5, nodeId);
|
|
@@ -511,8 +695,8 @@ export class ReflexionMemory {
|
|
|
511
695
|
for (const similar of similarEpisodes) {
|
|
512
696
|
if (similar.id !== nodeId && similar.properties.episodeId !== episodeId) {
|
|
513
697
|
await this.graphBackend.createRelationship(nodeId, similar.id, 'SIMILAR_TO', {
|
|
514
|
-
similarity: cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
515
|
-
createdAt: Date.now()
|
|
698
|
+
similarity: this.cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
699
|
+
createdAt: Date.now(),
|
|
516
700
|
});
|
|
517
701
|
}
|
|
518
702
|
}
|
|
@@ -523,13 +707,15 @@ export class ReflexionMemory {
|
|
|
523
707
|
// Create session node if doesn't exist
|
|
524
708
|
sessionNodeId = await this.graphBackend.createNode(['Session'], {
|
|
525
709
|
sessionId: episode.sessionId,
|
|
526
|
-
startTime: episode.ts || Date.now()
|
|
710
|
+
startTime: episode.ts || Date.now(),
|
|
527
711
|
});
|
|
528
712
|
}
|
|
529
713
|
else {
|
|
530
714
|
sessionNodeId = sessionNodes.rows[0].s.id;
|
|
531
715
|
}
|
|
532
|
-
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
716
|
+
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
717
|
+
timestamp: episode.ts || Date.now(),
|
|
718
|
+
});
|
|
533
719
|
// If episode has critique, create causal relationship to previous failures
|
|
534
720
|
if (episode.critique && !episode.success) {
|
|
535
721
|
const previousFailures = await this.graphBackend.execute(`MATCH (e:Episode:Failure {sessionId: $sessionId})
|
|
@@ -540,7 +726,7 @@ export class ReflexionMemory {
|
|
|
540
726
|
for (const prevFailure of previousFailures.rows) {
|
|
541
727
|
await this.graphBackend.createRelationship(nodeId, prevFailure.e.id, 'LEARNED_FROM', {
|
|
542
728
|
critique: episode.critique,
|
|
543
|
-
improvementAttempt: true
|
|
729
|
+
improvementAttempt: true,
|
|
544
730
|
});
|
|
545
731
|
}
|
|
546
732
|
}
|
|
@@ -554,8 +740,8 @@ export class ReflexionMemory {
|
|
|
554
740
|
}
|
|
555
741
|
try {
|
|
556
742
|
// Get initial neighbors
|
|
557
|
-
const initialResults = this.vectorBackend
|
|
558
|
-
threshold: 0.0
|
|
743
|
+
const initialResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 2, {
|
|
744
|
+
threshold: 0.0,
|
|
559
745
|
});
|
|
560
746
|
if (initialResults.length === 0) {
|
|
561
747
|
return queryEmbedding;
|
|
@@ -563,14 +749,19 @@ export class ReflexionMemory {
|
|
|
563
749
|
// Fetch neighbor embeddings
|
|
564
750
|
const neighborEmbeddings = [];
|
|
565
751
|
const weights = [];
|
|
566
|
-
const episodeIds = initialResults.map(r => r.id);
|
|
752
|
+
const episodeIds = initialResults.map((r) => r.id).filter((id) => EPISODE_VECTOR_ID.test(id));
|
|
753
|
+
if (episodeIds.length === 0) {
|
|
754
|
+
return queryEmbedding;
|
|
755
|
+
}
|
|
567
756
|
const placeholders = episodeIds.map(() => '?').join(',');
|
|
568
|
-
const episodes = this.db
|
|
757
|
+
const episodes = this.db
|
|
758
|
+
.prepare(`
|
|
569
759
|
SELECT ee.embedding, e.reward
|
|
570
760
|
FROM episode_embeddings ee
|
|
571
761
|
JOIN episodes e ON e.id = ee.episode_id
|
|
572
762
|
WHERE ee.episode_id IN (${placeholders})
|
|
573
|
-
`)
|
|
763
|
+
`)
|
|
764
|
+
.all(...episodeIds);
|
|
574
765
|
for (const ep of episodes) {
|
|
575
766
|
const embedding = this.deserializeEmbedding(ep.embedding);
|
|
576
767
|
neighborEmbeddings.push(embedding);
|
|
@@ -607,7 +798,7 @@ export class ReflexionMemory {
|
|
|
607
798
|
return {
|
|
608
799
|
similar: (row.similar || []).filter((id) => id != null),
|
|
609
800
|
session: row.session || '',
|
|
610
|
-
learnedFrom: (row.learnedFrom || []).filter((id) => id != null)
|
|
801
|
+
learnedFrom: (row.learnedFrom || []).filter((id) => id != null),
|
|
611
802
|
};
|
|
612
803
|
}
|
|
613
804
|
/**
|
|
@@ -624,11 +815,11 @@ export class ReflexionMemory {
|
|
|
624
815
|
return;
|
|
625
816
|
}
|
|
626
817
|
const result = await this.learningBackend.train(options);
|
|
627
|
-
console.
|
|
818
|
+
console.error('[ReflexionMemory] GNN training complete:', {
|
|
628
819
|
epochs: result.epochs,
|
|
629
820
|
finalLoss: result.finalLoss.toFixed(4),
|
|
630
821
|
improvement: `${(result.improvement * 100).toFixed(1)}%`,
|
|
631
|
-
duration: `${result.duration}ms
|
|
822
|
+
duration: `${result.duration}ms`,
|
|
632
823
|
});
|
|
633
824
|
}
|
|
634
825
|
/**
|
|
@@ -649,5 +840,281 @@ export class ReflexionMemory {
|
|
|
649
840
|
}
|
|
650
841
|
return this.graphBackend.getStats();
|
|
651
842
|
}
|
|
843
|
+
/**
|
|
844
|
+
* Get query cache statistics
|
|
845
|
+
*/
|
|
846
|
+
getCacheStats() {
|
|
847
|
+
return this.queryCache.getStatistics();
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Clear query cache
|
|
851
|
+
*/
|
|
852
|
+
clearCache() {
|
|
853
|
+
this.queryCache.clear();
|
|
854
|
+
}
|
|
855
|
+
/**
|
|
856
|
+
* Prune expired cache entries
|
|
857
|
+
*/
|
|
858
|
+
pruneCache() {
|
|
859
|
+
return this.queryCache.pruneExpired();
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* Warm cache with common queries
|
|
863
|
+
*/
|
|
864
|
+
async warmCache(sessionId) {
|
|
865
|
+
await this.queryCache.warm(async (cache) => {
|
|
866
|
+
// Warm cache with recent sessions if sessionId provided
|
|
867
|
+
if (sessionId) {
|
|
868
|
+
const recent = await this.getRecentEpisodes(sessionId, 10);
|
|
869
|
+
// Episodes are already loaded, cache will be populated on next access
|
|
870
|
+
}
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Delete an episode by id. Closes the gap from issue #150 (downstream:
|
|
875
|
+
* ruflo#1784, RuVector#427) — once an episode is written there was no
|
|
876
|
+
* first-class way to remove it through any backend.
|
|
877
|
+
*
|
|
878
|
+
* Strategy mirrors storeEpisode: when a graph backend is present we go
|
|
879
|
+
* through it (`graphAdapter.deleteNode` / `graphBackend.deleteNode` —
|
|
880
|
+
* both Cypher-backed under the hood), and we ALWAYS also purge the SQL
|
|
881
|
+
* `episodes` and `episode_embeddings` rows so durable storage stays in
|
|
882
|
+
* sync. Vector backend entries are removed too when present.
|
|
883
|
+
*
|
|
884
|
+
* @returns True if the episode existed in any backend and was removed.
|
|
885
|
+
*/
|
|
886
|
+
async deleteEpisode(id) {
|
|
887
|
+
const numericId = typeof id === 'number' ? id : parseInt(String(id), 10);
|
|
888
|
+
const stringId = String(id);
|
|
889
|
+
// Invalidate caches up front — failures below shouldn't leave stale reads.
|
|
890
|
+
this.queryCache.invalidateCategory('episodes');
|
|
891
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
892
|
+
let removed = false;
|
|
893
|
+
// 1. Graph adapter (AgentDB v2 fast path)
|
|
894
|
+
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
895
|
+
const adapter = this.graphBackend;
|
|
896
|
+
if (typeof adapter.deleteNode === 'function') {
|
|
897
|
+
try {
|
|
898
|
+
// Adapter accepts either the canonical "episode-<id>" key or a raw
|
|
899
|
+
// id; try the canonical form first since that's what storeEpisode
|
|
900
|
+
// emits.
|
|
901
|
+
const r = await adapter.deleteNode(`episode-${numericId}`, { cascade: true });
|
|
902
|
+
if (r?.deletedNode)
|
|
903
|
+
removed = true;
|
|
904
|
+
if (!removed) {
|
|
905
|
+
const r2 = await adapter.deleteNode(stringId, { cascade: true });
|
|
906
|
+
if (r2?.deletedNode)
|
|
907
|
+
removed = true;
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
catch (err) {
|
|
911
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
912
|
+
// eslint-disable-next-line no-console
|
|
913
|
+
console.warn(`[ReflexionMemory] deleteEpisode: graph adapter delete failed: ${msg}`);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
// 2. Generic graph backend
|
|
918
|
+
else if (this.graphBackend && typeof this.graphBackend.deleteNode === 'function') {
|
|
919
|
+
try {
|
|
920
|
+
const r = await this.graphBackend.deleteNode(stringId);
|
|
921
|
+
if (r === true)
|
|
922
|
+
removed = true;
|
|
923
|
+
}
|
|
924
|
+
catch (err) {
|
|
925
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
926
|
+
// eslint-disable-next-line no-console
|
|
927
|
+
console.warn(`[ReflexionMemory] deleteEpisode: graph backend delete failed: ${msg}`);
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
// 3. Vector backend (HNSW/RuVector); some implementations don't expose
|
|
931
|
+
// delete — guard with a feature check.
|
|
932
|
+
if (this.vectorBackend && typeof this.vectorBackend.delete === 'function') {
|
|
933
|
+
try {
|
|
934
|
+
const r = await this.vectorBackend.delete(String(numericId));
|
|
935
|
+
if (r === true)
|
|
936
|
+
removed = true;
|
|
937
|
+
}
|
|
938
|
+
catch (err) {
|
|
939
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
940
|
+
// eslint-disable-next-line no-console
|
|
941
|
+
console.warn(`[ReflexionMemory] deleteEpisode: vector backend delete failed: ${msg}`);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
// 4. SQL durable storage — always attempt so persistence stays clean
|
|
945
|
+
// even when the primary backend was a no-op.
|
|
946
|
+
if (this.db && typeof this.db.prepare === 'function' && Number.isFinite(numericId)) {
|
|
947
|
+
try {
|
|
948
|
+
const embStmt = this.db.prepare(`DELETE FROM episode_embeddings WHERE episode_id = ?`);
|
|
949
|
+
embStmt.run(numericId);
|
|
950
|
+
const stmt = this.db.prepare(`DELETE FROM episodes WHERE id = ?`);
|
|
951
|
+
const r = stmt.run(numericId);
|
|
952
|
+
const changes = r?.changes ?? 0;
|
|
953
|
+
if (changes > 0)
|
|
954
|
+
removed = true;
|
|
955
|
+
}
|
|
956
|
+
catch (err) {
|
|
957
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
958
|
+
if (!/no such table/i.test(msg)) {
|
|
959
|
+
// eslint-disable-next-line no-console
|
|
960
|
+
console.warn(`[ReflexionMemory] deleteEpisode: SQL delete failed: ${msg}`);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
return removed;
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Dual-write helper for issue #128.
|
|
968
|
+
*
|
|
969
|
+
* Inserts the given episode into the SQLite `episodes` and
|
|
970
|
+
* `episode_embeddings` tables when the underlying connection supports it.
|
|
971
|
+
* Used when a graph or vector backend handles the primary index but the
|
|
972
|
+
* caller still wants restart-safe persistence.
|
|
973
|
+
*
|
|
974
|
+
* Errors are swallowed and logged — the primary write to the graph/vector
|
|
975
|
+
* backend has already succeeded, and we don't want to fail the caller if
|
|
976
|
+
* SQL persistence is unavailable (e.g. read-only DB, schema not present).
|
|
977
|
+
*/
|
|
978
|
+
dualWriteEpisodeToSQL(episode, embedding) {
|
|
979
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
980
|
+
return;
|
|
981
|
+
try {
|
|
982
|
+
const stmt = this.db.prepare(`
|
|
983
|
+
INSERT INTO episodes (
|
|
984
|
+
session_id, task, input, output, critique, reward, success,
|
|
985
|
+
latency_ms, tokens_used, tags, metadata
|
|
986
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
987
|
+
`);
|
|
988
|
+
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
989
|
+
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
990
|
+
const result = stmt.run(episode.sessionId, episode.task, episode.input ?? null, episode.output ?? null, episode.critique ?? null, episode.reward, episode.success ? 1 : 0, episode.latencyMs ?? null, episode.tokensUsed ?? null, tags, metadata);
|
|
991
|
+
if (embedding) {
|
|
992
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
993
|
+
this.storeEmbedding(episodeId, embedding);
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
catch (err) {
|
|
997
|
+
// The expected failure here is "no such table: episodes" on databases
|
|
998
|
+
// that intentionally don't carry the v1 schema. Don't escalate — the
|
|
999
|
+
// primary backend already has the data.
|
|
1000
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1001
|
+
if (!/no such table/i.test(msg)) {
|
|
1002
|
+
// eslint-disable-next-line no-console
|
|
1003
|
+
console.warn('[ReflexionMemory] dualWriteEpisodeToSQL failed:', msg);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
/**
|
|
1008
|
+
* Rebuild the in-memory vector index from the SQLite `episodes` /
|
|
1009
|
+
* `episode_embeddings` tables, going through the proper backend channels
|
|
1010
|
+
* so `retrieveRelevant()` sees the data afterwards.
|
|
1011
|
+
*
|
|
1012
|
+
* Fixes the user's recovery use-case from issue #129: rather than calling
|
|
1013
|
+
* `vectorBackend.getInner().insert()` directly (which bypasses the
|
|
1014
|
+
* GuardedBackend wrapper and confuses retrieveRelevant), call this method
|
|
1015
|
+
* to re-hydrate the vector and graph indices from durable storage.
|
|
1016
|
+
*
|
|
1017
|
+
* Returns the number of episodes re-indexed. No-ops cleanly when the SQL
|
|
1018
|
+
* tables are empty or absent.
|
|
1019
|
+
*/
|
|
1020
|
+
async rebuildIndex(options = {}) {
|
|
1021
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
1022
|
+
return 0;
|
|
1023
|
+
const where = options.fromTimestamp !== undefined ? 'WHERE e.ts >= ?' : '';
|
|
1024
|
+
const params = options.fromTimestamp !== undefined ? [options.fromTimestamp] : [];
|
|
1025
|
+
let rows = [];
|
|
1026
|
+
try {
|
|
1027
|
+
const stmt = this.db.prepare(`
|
|
1028
|
+
SELECT
|
|
1029
|
+
e.id, e.ts, e.session_id, e.task, e.input, e.output, e.critique,
|
|
1030
|
+
e.reward, e.success, e.latency_ms, e.tokens_used, e.tags, e.metadata,
|
|
1031
|
+
ee.embedding
|
|
1032
|
+
FROM episodes e
|
|
1033
|
+
LEFT JOIN episode_embeddings ee ON ee.episode_id = e.id
|
|
1034
|
+
${where}
|
|
1035
|
+
ORDER BY e.id ASC
|
|
1036
|
+
`);
|
|
1037
|
+
rows = stmt.all(...params);
|
|
1038
|
+
}
|
|
1039
|
+
catch (err) {
|
|
1040
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1041
|
+
if (/no such table/i.test(msg))
|
|
1042
|
+
return 0;
|
|
1043
|
+
throw err;
|
|
1044
|
+
}
|
|
1045
|
+
let reindexed = 0;
|
|
1046
|
+
for (const row of rows) {
|
|
1047
|
+
const episode = {
|
|
1048
|
+
id: row.id,
|
|
1049
|
+
ts: row.ts,
|
|
1050
|
+
sessionId: row.session_id,
|
|
1051
|
+
task: row.task,
|
|
1052
|
+
input: row.input ?? undefined,
|
|
1053
|
+
output: row.output ?? undefined,
|
|
1054
|
+
critique: row.critique ?? undefined,
|
|
1055
|
+
reward: row.reward,
|
|
1056
|
+
success: row.success === 1,
|
|
1057
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
1058
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
1059
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
1060
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
1061
|
+
};
|
|
1062
|
+
// Prefer the stored embedding; fall back to recomputing if missing.
|
|
1063
|
+
let embedding;
|
|
1064
|
+
if (row.embedding) {
|
|
1065
|
+
const buf = row.embedding;
|
|
1066
|
+
embedding = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
|
|
1067
|
+
}
|
|
1068
|
+
else {
|
|
1069
|
+
embedding = await this.embedder.embedPassage(this.buildEpisodeText(episode));
|
|
1070
|
+
}
|
|
1071
|
+
// Re-insert through the proper public APIs so the GuardedBackend
|
|
1072
|
+
// wrapper, graph adapter, and HNSW all stay in sync.
|
|
1073
|
+
if (this.vectorBackend) {
|
|
1074
|
+
try {
|
|
1075
|
+
this.vectorBackend.insert(String(row.id), embedding, {
|
|
1076
|
+
type: 'episode',
|
|
1077
|
+
sessionId: episode.sessionId,
|
|
1078
|
+
reward: episode.reward,
|
|
1079
|
+
success: episode.success,
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
catch (err) {
|
|
1083
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1084
|
+
// eslint-disable-next-line no-console
|
|
1085
|
+
console.warn(`[ReflexionMemory] rebuildIndex: vector insert failed for ${row.id}: ${msg}`);
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
1089
|
+
const adapter = this.graphBackend;
|
|
1090
|
+
try {
|
|
1091
|
+
await adapter.storeEpisode({
|
|
1092
|
+
id: `episode-${row.id}`,
|
|
1093
|
+
sessionId: episode.sessionId,
|
|
1094
|
+
task: episode.task,
|
|
1095
|
+
reward: episode.reward,
|
|
1096
|
+
success: episode.success,
|
|
1097
|
+
input: episode.input,
|
|
1098
|
+
output: episode.output,
|
|
1099
|
+
critique: episode.critique,
|
|
1100
|
+
createdAt: (episode.ts ?? Date.now() / 1000) * 1000,
|
|
1101
|
+
tokensUsed: episode.tokensUsed,
|
|
1102
|
+
latencyMs: episode.latencyMs,
|
|
1103
|
+
}, embedding);
|
|
1104
|
+
}
|
|
1105
|
+
catch (err) {
|
|
1106
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1107
|
+
// eslint-disable-next-line no-console
|
|
1108
|
+
console.warn(`[ReflexionMemory] rebuildIndex: graph store failed for ${row.id}: ${msg}`);
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
reindexed++;
|
|
1112
|
+
}
|
|
1113
|
+
// Bust any stale read caches so the next retrieveRelevant sees the
|
|
1114
|
+
// freshly-rebuilt index.
|
|
1115
|
+
this.queryCache.invalidateCategory('episodes');
|
|
1116
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
1117
|
+
return reindexed;
|
|
1118
|
+
}
|
|
652
1119
|
}
|
|
653
1120
|
//# sourceMappingURL=ReflexionMemory.js.map
|