agentdb 3.0.0-alpha.8 → 3.0.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/VectorBackend.d.ts +48 -6
- package/dist/src/backends/VectorBackend.d.ts.map +1 -1
- package/dist/src/backends/VectorBackend.js +13 -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 +464 -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 +29 -0
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +154 -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 +6 -3
- package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
- package/dist/src/controllers/ReasoningBank.js +77 -56
- 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 +678 -220
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +32 -3
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +239 -104
- 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 +161 -102
- 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 +178 -15
- 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 +90 -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 +332 -0
- package/dist/src/simd/simd-vector-ops.d.ts.map +1 -0
- package/dist/src/simd/simd-vector-ops.js +945 -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/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,71 @@
|
|
|
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';
|
|
10
12
|
import { NodeIdMapper } from '../utils/NodeIdMapper.js';
|
|
11
|
-
import {
|
|
13
|
+
import { QueryCache } from '../core/QueryCache.js';
|
|
14
|
+
function finiteNumber(value, name) {
|
|
15
|
+
const n = Number(value);
|
|
16
|
+
if (!Number.isFinite(n))
|
|
17
|
+
throw new Error(`${name} must be a finite number`);
|
|
18
|
+
return n;
|
|
19
|
+
}
|
|
20
|
+
function positiveInt(value, name) {
|
|
21
|
+
const n = Math.floor(finiteNumber(value, name));
|
|
22
|
+
if (n < 1)
|
|
23
|
+
throw new Error(`${name} must be a positive integer`);
|
|
24
|
+
return n;
|
|
25
|
+
}
|
|
26
|
+
/** Vector ids this controller writes: the bare episode row id */
|
|
27
|
+
const EPISODE_VECTOR_ID = /^\d+$/;
|
|
28
|
+
/** Parse JSON from DB row values without throwing on malformed data. */
|
|
29
|
+
function safeJsonParse(value, fallback) {
|
|
30
|
+
if (!value)
|
|
31
|
+
return fallback;
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(value);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
12
39
|
export class ReflexionMemory {
|
|
13
40
|
db;
|
|
14
41
|
embedder;
|
|
15
42
|
vectorBackend;
|
|
16
43
|
learningBackend;
|
|
17
44
|
graphBackend;
|
|
18
|
-
|
|
45
|
+
queryCache;
|
|
46
|
+
constructor(db, embedder, vectorBackend, learningBackend, graphBackend, cacheConfig) {
|
|
19
47
|
this.db = db;
|
|
20
48
|
this.embedder = embedder;
|
|
21
49
|
this.vectorBackend = vectorBackend;
|
|
22
50
|
this.learningBackend = learningBackend;
|
|
23
51
|
this.graphBackend = graphBackend;
|
|
52
|
+
this.queryCache = new QueryCache(cacheConfig);
|
|
24
53
|
}
|
|
25
54
|
/**
|
|
26
55
|
* Store a new episode with its critique and outcome
|
|
56
|
+
* Invalidates relevant cache entries
|
|
57
|
+
*
|
|
58
|
+
* Persistence guarantee (issue #128 fix):
|
|
59
|
+
* storeEpisode() always writes to the SQLite `episodes` and
|
|
60
|
+
* `episode_embeddings` tables when a SQL-capable connection is present,
|
|
61
|
+
* even when a graph or vector backend handles the primary index. This
|
|
62
|
+
* ensures data survives process restarts (graph/vector backends are
|
|
63
|
+
* often in-memory or rebuildable from SQL).
|
|
27
64
|
*/
|
|
28
65
|
async storeEpisode(episode) {
|
|
66
|
+
// Invalidate episode caches on write
|
|
67
|
+
this.queryCache.invalidateCategory('episodes');
|
|
68
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
29
69
|
// Use GraphDatabaseAdapter if available (AgentDB v2)
|
|
30
70
|
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
31
71
|
// GraphDatabaseAdapter has specialized storeEpisode method
|
|
32
72
|
const graphAdapter = this.graphBackend;
|
|
33
73
|
// Generate embedding for the task
|
|
34
|
-
const taskEmbedding = await this.embedder.
|
|
74
|
+
const taskEmbedding = await this.embedder.embedPassage(episode.task);
|
|
35
75
|
// Create episode node using GraphDatabaseAdapter
|
|
36
76
|
const nodeId = await graphAdapter.storeEpisode({
|
|
37
77
|
id: episode.id ? `episode-${episode.id}` : `episode-${Date.now()}-${Math.random()}`,
|
|
@@ -44,18 +84,21 @@ export class ReflexionMemory {
|
|
|
44
84
|
critique: episode.critique,
|
|
45
85
|
createdAt: episode.ts ? episode.ts * 1000 : Date.now(),
|
|
46
86
|
tokensUsed: episode.tokensUsed,
|
|
47
|
-
latencyMs: episode.latencyMs
|
|
87
|
+
latencyMs: episode.latencyMs,
|
|
48
88
|
}, taskEmbedding);
|
|
49
89
|
// Return a numeric ID (parse from string ID)
|
|
50
90
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
51
91
|
// Register mapping for later use by CausalMemoryGraph
|
|
52
92
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
93
|
+
// #128: dual-write to SQL for restart-safe persistence. Graph adapter
|
|
94
|
+
// index is typically in-memory; SQL is the durable record.
|
|
95
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
53
96
|
return numericId;
|
|
54
97
|
}
|
|
55
98
|
// Use generic GraphBackend if available
|
|
56
99
|
if (this.graphBackend) {
|
|
57
100
|
// Generate embedding for the task
|
|
58
|
-
const taskEmbedding = await this.embedder.
|
|
101
|
+
const taskEmbedding = await this.embedder.embedPassage(episode.task);
|
|
59
102
|
// Create episode node ID
|
|
60
103
|
const nodeId = await this.graphBackend.createNode(['Episode'], {
|
|
61
104
|
sessionId: episode.sessionId,
|
|
@@ -69,22 +112,21 @@ export class ReflexionMemory {
|
|
|
69
112
|
tokensUsed: episode.tokensUsed || 0,
|
|
70
113
|
tags: episode.tags ? JSON.stringify(episode.tags) : '[]',
|
|
71
114
|
metadata: episode.metadata ? JSON.stringify(episode.metadata) : '{}',
|
|
72
|
-
createdAt: Date.now()
|
|
115
|
+
createdAt: Date.now(),
|
|
73
116
|
});
|
|
74
117
|
// Store embedding using vectorBackend if available
|
|
75
118
|
if (this.vectorBackend && taskEmbedding) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch { /* vectorBackend insert failed — graph node still created */ }
|
|
119
|
+
this.vectorBackend.insert(nodeId, taskEmbedding, {
|
|
120
|
+
type: 'episode',
|
|
121
|
+
sessionId: episode.sessionId,
|
|
122
|
+
});
|
|
83
123
|
}
|
|
84
124
|
// Return a numeric ID (parse from string ID)
|
|
85
125
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
86
126
|
// Register mapping for later use by CausalMemoryGraph
|
|
87
127
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
128
|
+
// #128: dual-write to SQL for restart-safe persistence.
|
|
129
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
88
130
|
return numericId;
|
|
89
131
|
}
|
|
90
132
|
// Fallback to SQLite (v1 compatibility)
|
|
@@ -97,16 +139,13 @@ export class ReflexionMemory {
|
|
|
97
139
|
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
98
140
|
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
99
141
|
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;
|
|
142
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
101
143
|
// Generate and store embedding
|
|
102
144
|
const text = this.buildEpisodeText(episode);
|
|
103
|
-
const embedding = await this.embedder.
|
|
145
|
+
const embedding = await this.embedder.embedPassage(text);
|
|
104
146
|
// Use vector backend if available (150x faster retrieval)
|
|
105
147
|
if (this.vectorBackend) {
|
|
106
|
-
|
|
107
|
-
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
108
|
-
}
|
|
109
|
-
catch { /* vectorBackend insert failed — SQL fallback used */ }
|
|
148
|
+
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
110
149
|
}
|
|
111
150
|
// Also store in SQL for fallback
|
|
112
151
|
this.storeEmbedding(episodeId, embedding);
|
|
@@ -124,155 +163,206 @@ export class ReflexionMemory {
|
|
|
124
163
|
task: episode.task,
|
|
125
164
|
sessionId: episode.sessionId,
|
|
126
165
|
latencyMs: episode.latencyMs,
|
|
127
|
-
tokensUsed: episode.tokensUsed
|
|
128
|
-
}
|
|
166
|
+
tokensUsed: episode.tokensUsed,
|
|
167
|
+
},
|
|
129
168
|
});
|
|
130
169
|
}
|
|
131
170
|
return episodeId;
|
|
132
171
|
}
|
|
133
172
|
/**
|
|
134
173
|
* Retrieve relevant past episodes for a new task attempt
|
|
174
|
+
* Results are cached for improved performance
|
|
135
175
|
*/
|
|
136
176
|
async retrieveRelevant(query) {
|
|
137
|
-
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays } = query;
|
|
138
|
-
//
|
|
177
|
+
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays, } = query;
|
|
178
|
+
// Check cache first
|
|
179
|
+
const cacheKey = this.queryCache.generateKey('retrieveRelevant', [task, currentState, k, minReward, onlyFailures, onlySuccesses, timeWindowDays], 'episodes');
|
|
180
|
+
const cached = this.queryCache.get(cacheKey);
|
|
181
|
+
if (cached) {
|
|
182
|
+
return cached;
|
|
183
|
+
}
|
|
184
|
+
// Generate and enhance query embedding
|
|
185
|
+
const queryEmbedding = await this.prepareQueryEmbedding(task, currentState, k);
|
|
186
|
+
// Try different retrieval strategies in order of preference
|
|
187
|
+
let episodes = [];
|
|
188
|
+
if (this.graphBackend && 'searchSimilarEpisodes' in this.graphBackend) {
|
|
189
|
+
episodes = await this.retrieveFromGraphAdapter(queryEmbedding, query);
|
|
190
|
+
}
|
|
191
|
+
else if (this.graphBackend && 'execute' in this.graphBackend) {
|
|
192
|
+
episodes = await this.retrieveFromGenericGraph(query);
|
|
193
|
+
}
|
|
194
|
+
else if (this.vectorBackend) {
|
|
195
|
+
episodes = await this.retrieveFromVectorBackend(queryEmbedding, query);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
episodes = await this.retrieveFromSQLFallback(queryEmbedding, query);
|
|
199
|
+
}
|
|
200
|
+
// Cache and return results
|
|
201
|
+
this.queryCache.set(cacheKey, episodes);
|
|
202
|
+
return episodes;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Prepare and enhance query embedding for search
|
|
206
|
+
*/
|
|
207
|
+
async prepareQueryEmbedding(task, currentState, k) {
|
|
139
208
|
const queryText = currentState ? `${task}\n${currentState}` : task;
|
|
140
|
-
let queryEmbedding = await this.embedder.
|
|
209
|
+
let queryEmbedding = await this.embedder.embedQuery(queryText);
|
|
141
210
|
// Enhance query with GNN if learning backend available
|
|
142
211
|
if (this.learningBackend) {
|
|
143
212
|
queryEmbedding = await this.enhanceQueryWithGNN(queryEmbedding, k);
|
|
144
213
|
}
|
|
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
|
-
|
|
214
|
+
return queryEmbedding;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Retrieve episodes using GraphDatabaseAdapter (AgentDB v2)
|
|
218
|
+
*/
|
|
219
|
+
async retrieveFromGraphAdapter(queryEmbedding, query) {
|
|
220
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
221
|
+
const graphAdapter = this.graphBackend;
|
|
222
|
+
// Search using vector similarity
|
|
223
|
+
const results = await graphAdapter.searchSimilarEpisodes(queryEmbedding, k * 3);
|
|
224
|
+
// Apply filters
|
|
225
|
+
const filtered = this.applyEpisodeFilters(results, {
|
|
226
|
+
minReward,
|
|
227
|
+
onlyFailures,
|
|
228
|
+
onlySuccesses,
|
|
229
|
+
timeWindowDays,
|
|
230
|
+
});
|
|
231
|
+
// Convert to EpisodeWithEmbedding format
|
|
232
|
+
return filtered.slice(0, k).map((ep) => this.convertGraphEpisode(ep));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Retrieve episodes using generic GraphBackend
|
|
236
|
+
*/
|
|
237
|
+
async retrieveFromGenericGraph(query) {
|
|
238
|
+
const { k = 5 } = query;
|
|
239
|
+
const cypherQuery = this.buildCypherQuery(query);
|
|
240
|
+
const result = await this.graphBackend.execute(cypherQuery);
|
|
241
|
+
// Convert to EpisodeWithEmbedding format
|
|
242
|
+
const episodes = result.rows.map((row) => this.convertCypherEpisode(row.e));
|
|
243
|
+
return episodes.slice(0, k);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Retrieve episodes using VectorBackend (150x faster)
|
|
247
|
+
*/
|
|
248
|
+
async retrieveFromVectorBackend(queryEmbedding, query) {
|
|
249
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
250
|
+
// Get candidates from vector backend
|
|
251
|
+
const searchResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 3, {
|
|
252
|
+
threshold: 0.0,
|
|
253
|
+
});
|
|
254
|
+
// The vector backend may be shared with other controllers ("skill:N",
|
|
255
|
+
// "causal-edge:N"); episode vectors use the bare numeric row id.
|
|
256
|
+
const episodeResults = searchResults.filter((r) => EPISODE_VECTOR_ID.test(r.id));
|
|
257
|
+
const episodeIds = episodeResults.map((r) => Number(r.id));
|
|
258
|
+
if (episodeIds.length === 0) {
|
|
259
|
+
// No usable hits although episodes exist (empty or crowded-out index):
|
|
260
|
+
// answer from the SQL embeddings instead of returning nothing.
|
|
261
|
+
if (this.db.prepare('SELECT 1 FROM episode_embeddings LIMIT 1').get()) {
|
|
262
|
+
return this.retrieveFromSQLFallback(queryEmbedding, query);
|
|
194
263
|
}
|
|
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);
|
|
264
|
+
return [];
|
|
217
265
|
}
|
|
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;
|
|
266
|
+
const rows = this.fetchEpisodesByIds(episodeIds);
|
|
267
|
+
const episodeMap = new Map(rows.map((r) => [r.id.toString(), r]));
|
|
268
|
+
// Map results with similarity scores and apply filters
|
|
269
|
+
const episodes = [];
|
|
270
|
+
for (const result of episodeResults) {
|
|
271
|
+
const row = episodeMap.get(result.id);
|
|
272
|
+
if (!row)
|
|
273
|
+
continue;
|
|
274
|
+
// Apply filters
|
|
275
|
+
if (!this.passesEpisodeFilters(row, { minReward, onlyFailures, onlySuccesses, timeWindowDays })) {
|
|
276
|
+
continue;
|
|
272
277
|
}
|
|
273
|
-
|
|
278
|
+
episodes.push(this.convertDatabaseEpisode(row, result.similarity));
|
|
279
|
+
if (episodes.length >= k)
|
|
280
|
+
break;
|
|
274
281
|
}
|
|
275
|
-
|
|
282
|
+
return episodes;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Retrieve episodes using SQL-based similarity search (fallback)
|
|
286
|
+
*/
|
|
287
|
+
async retrieveFromSQLFallback(queryEmbedding, query) {
|
|
288
|
+
const { k = 5 } = query;
|
|
289
|
+
const { whereClause, params } = this.buildSQLFilters(query);
|
|
290
|
+
const stmt = this.db.prepare(`
|
|
291
|
+
SELECT e.*, ee.embedding
|
|
292
|
+
FROM episodes e
|
|
293
|
+
JOIN episode_embeddings ee ON e.id = ee.episode_id
|
|
294
|
+
${whereClause}
|
|
295
|
+
ORDER BY e.reward DESC
|
|
296
|
+
`);
|
|
297
|
+
const rows = stmt.all(...params);
|
|
298
|
+
// Calculate similarities and convert
|
|
299
|
+
const episodes = rows.map((row) => {
|
|
300
|
+
const embedding = this.deserializeEmbedding(row.embedding);
|
|
301
|
+
const similarity = this.cosineSimilarity(queryEmbedding, embedding);
|
|
302
|
+
return this.convertDatabaseEpisode(row, similarity, embedding);
|
|
303
|
+
});
|
|
304
|
+
// Sort by similarity and return top-k
|
|
305
|
+
episodes.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
|
|
306
|
+
return episodes.slice(0, k);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Apply episode filters to search results
|
|
310
|
+
*/
|
|
311
|
+
applyEpisodeFilters(episodes, filters) {
|
|
312
|
+
return episodes.filter((ep) => {
|
|
313
|
+
if (filters.minReward !== undefined && ep.reward < filters.minReward)
|
|
314
|
+
return false;
|
|
315
|
+
if (filters.onlyFailures && ep.success)
|
|
316
|
+
return false;
|
|
317
|
+
if (filters.onlySuccesses && !ep.success)
|
|
318
|
+
return false;
|
|
319
|
+
if (filters.timeWindowDays && ep.createdAt < Date.now() - filters.timeWindowDays * 86400000)
|
|
320
|
+
return false;
|
|
321
|
+
return true;
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Check if database row passes episode filters
|
|
326
|
+
*/
|
|
327
|
+
passesEpisodeFilters(row, filters) {
|
|
328
|
+
if (filters.minReward !== undefined && row.reward < filters.minReward)
|
|
329
|
+
return false;
|
|
330
|
+
if (filters.onlyFailures && row.success === 1)
|
|
331
|
+
return false;
|
|
332
|
+
if (filters.onlySuccesses && row.success === 0)
|
|
333
|
+
return false;
|
|
334
|
+
if (filters.timeWindowDays && row.ts < Date.now() / 1000 - filters.timeWindowDays * 86400)
|
|
335
|
+
return false;
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Build Cypher query with filters
|
|
340
|
+
*/
|
|
341
|
+
buildCypherQuery(query) {
|
|
342
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
343
|
+
let cypherQuery = 'MATCH (e:Episode) WHERE 1=1';
|
|
344
|
+
// Values are spliced into Cypher text, so only finite numbers get through
|
|
345
|
+
if (minReward !== undefined) {
|
|
346
|
+
cypherQuery += ` AND e.reward >= ${finiteNumber(minReward, 'minReward')}`;
|
|
347
|
+
}
|
|
348
|
+
if (onlyFailures) {
|
|
349
|
+
cypherQuery += ` AND e.success = false`;
|
|
350
|
+
}
|
|
351
|
+
if (onlySuccesses) {
|
|
352
|
+
cypherQuery += ` AND e.success = true`;
|
|
353
|
+
}
|
|
354
|
+
if (timeWindowDays) {
|
|
355
|
+
const cutoff = Date.now() - finiteNumber(timeWindowDays, 'timeWindowDays') * 86400000;
|
|
356
|
+
cypherQuery += ` AND e.createdAt >= ${cutoff}`;
|
|
357
|
+
}
|
|
358
|
+
cypherQuery += ` RETURN e LIMIT ${positiveInt(k, 'k') * 3}`;
|
|
359
|
+
return cypherQuery;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Build SQL WHERE clause and parameters for filters
|
|
363
|
+
*/
|
|
364
|
+
buildSQLFilters(query) {
|
|
365
|
+
const { minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
276
366
|
const filters = [];
|
|
277
367
|
const params = [];
|
|
278
368
|
if (minReward !== undefined) {
|
|
@@ -290,46 +380,93 @@ export class ReflexionMemory {
|
|
|
290
380
|
params.push(timeWindowDays * 86400);
|
|
291
381
|
}
|
|
292
382
|
const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
383
|
+
return { whereClause, params };
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Fetch episodes by IDs from database
|
|
387
|
+
*/
|
|
388
|
+
fetchEpisodesByIds(episodeIds) {
|
|
389
|
+
const placeholders = episodeIds.map(() => '?').join(',');
|
|
293
390
|
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
|
|
391
|
+
SELECT * FROM episodes
|
|
392
|
+
WHERE id IN (${placeholders})
|
|
301
393
|
`);
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
394
|
+
return stmt.all(...episodeIds);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Convert GraphDatabaseAdapter episode to EpisodeWithEmbedding
|
|
398
|
+
*/
|
|
399
|
+
convertGraphEpisode(ep) {
|
|
400
|
+
return {
|
|
401
|
+
id: parseInt(ep.id.split('-').pop() || '0', 36),
|
|
402
|
+
sessionId: ep.sessionId,
|
|
403
|
+
task: ep.task,
|
|
404
|
+
input: ep.input,
|
|
405
|
+
output: ep.output,
|
|
406
|
+
critique: ep.critique,
|
|
407
|
+
reward: ep.reward,
|
|
408
|
+
success: ep.success,
|
|
409
|
+
latencyMs: ep.latencyMs,
|
|
410
|
+
tokensUsed: ep.tokensUsed,
|
|
411
|
+
ts: Math.floor(ep.createdAt / 1000),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Convert Cypher query result to EpisodeWithEmbedding
|
|
416
|
+
*/
|
|
417
|
+
convertCypherEpisode(node) {
|
|
418
|
+
return {
|
|
419
|
+
id: parseInt(node.id.split('-').pop() || '0', 36),
|
|
420
|
+
sessionId: node.properties.sessionId,
|
|
421
|
+
task: node.properties.task,
|
|
422
|
+
input: node.properties.input,
|
|
423
|
+
output: node.properties.output,
|
|
424
|
+
critique: node.properties.critique,
|
|
425
|
+
reward: typeof node.properties.reward === 'string'
|
|
426
|
+
? parseFloat(node.properties.reward)
|
|
427
|
+
: node.properties.reward,
|
|
428
|
+
success: typeof node.properties.success === 'string'
|
|
429
|
+
? node.properties.success === 'true'
|
|
430
|
+
: node.properties.success,
|
|
431
|
+
latencyMs: node.properties.latencyMs,
|
|
432
|
+
tokensUsed: node.properties.tokensUsed,
|
|
433
|
+
tags: safeJsonParse(node.properties.tags, []),
|
|
434
|
+
metadata: safeJsonParse(node.properties.metadata, {}),
|
|
435
|
+
ts: Math.floor(node.properties.createdAt / 1000),
|
|
436
|
+
};
|
|
328
437
|
}
|
|
329
438
|
/**
|
|
330
|
-
*
|
|
439
|
+
* Convert database row to EpisodeWithEmbedding
|
|
440
|
+
*/
|
|
441
|
+
convertDatabaseEpisode(row, similarity, embedding) {
|
|
442
|
+
return {
|
|
443
|
+
id: row.id,
|
|
444
|
+
ts: row.ts,
|
|
445
|
+
sessionId: row.session_id,
|
|
446
|
+
task: row.task,
|
|
447
|
+
input: row.input ?? undefined,
|
|
448
|
+
output: row.output ?? undefined,
|
|
449
|
+
critique: row.critique ?? undefined,
|
|
450
|
+
reward: row.reward,
|
|
451
|
+
success: row.success === 1,
|
|
452
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
453
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
454
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
455
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
456
|
+
embedding,
|
|
457
|
+
similarity,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Get statistics for a task (cached)
|
|
331
462
|
*/
|
|
332
463
|
getTaskStats(task, timeWindowDays) {
|
|
464
|
+
// Check cache first
|
|
465
|
+
const cacheKey = this.queryCache.generateKey('getTaskStats', [task, timeWindowDays], 'task-stats');
|
|
466
|
+
const cached = this.queryCache.get(cacheKey);
|
|
467
|
+
if (cached) {
|
|
468
|
+
return cached;
|
|
469
|
+
}
|
|
333
470
|
const windowFilter = timeWindowDays
|
|
334
471
|
? `AND ts > strftime('%s', 'now') - ${timeWindowDays * 86400}`
|
|
335
472
|
: '';
|
|
@@ -359,41 +496,59 @@ export class ReflexionMemory {
|
|
|
359
496
|
const improvementTrend = trend.recent_reward && trend.older_reward
|
|
360
497
|
? (trend.recent_reward - trend.older_reward) / trend.older_reward
|
|
361
498
|
: 0;
|
|
362
|
-
|
|
363
|
-
totalAttempts: stats
|
|
364
|
-
successRate: stats
|
|
365
|
-
avgReward: stats
|
|
366
|
-
avgLatency: stats
|
|
367
|
-
improvementTrend
|
|
499
|
+
const results = {
|
|
500
|
+
totalAttempts: stats?.total ?? 0,
|
|
501
|
+
successRate: stats?.success_rate ?? 0,
|
|
502
|
+
avgReward: stats?.avg_reward ?? 0,
|
|
503
|
+
avgLatency: stats?.avg_latency ?? 0,
|
|
504
|
+
improvementTrend,
|
|
368
505
|
};
|
|
506
|
+
// Cache the results
|
|
507
|
+
this.queryCache.set(cacheKey, results);
|
|
508
|
+
return results;
|
|
369
509
|
}
|
|
370
510
|
/**
|
|
371
|
-
* Build critique summary from similar failed episodes
|
|
511
|
+
* Build critique summary from similar failed episodes (cached)
|
|
372
512
|
*/
|
|
373
513
|
async getCritiqueSummary(query) {
|
|
514
|
+
// Check cache first
|
|
515
|
+
const cacheKey = this.queryCache.generateKey('getCritiqueSummary', [query.task, query.k], 'episodes');
|
|
516
|
+
const cached = this.queryCache.get(cacheKey);
|
|
517
|
+
if (cached) {
|
|
518
|
+
return cached;
|
|
519
|
+
}
|
|
374
520
|
const failures = await this.retrieveRelevant({
|
|
375
521
|
...query,
|
|
376
522
|
onlyFailures: true,
|
|
377
|
-
k: 3
|
|
523
|
+
k: 3,
|
|
378
524
|
});
|
|
379
525
|
if (failures.length === 0) {
|
|
380
526
|
return 'No prior failures found for this task.';
|
|
381
527
|
}
|
|
382
528
|
const critiques = failures
|
|
383
|
-
.filter(ep => ep.critique)
|
|
529
|
+
.filter((ep) => ep.critique)
|
|
384
530
|
.map((ep, i) => `${i + 1}. ${ep.critique} (reward: ${ep.reward.toFixed(2)})`)
|
|
385
531
|
.join('\n');
|
|
386
|
-
|
|
532
|
+
const result = `Prior failures and lessons learned:\n${critiques}`;
|
|
533
|
+
// Cache the result
|
|
534
|
+
this.queryCache.set(cacheKey, result);
|
|
535
|
+
return result;
|
|
387
536
|
}
|
|
388
537
|
/**
|
|
389
|
-
* Get successful strategies for a task
|
|
538
|
+
* Get successful strategies for a task (cached)
|
|
390
539
|
*/
|
|
391
540
|
async getSuccessStrategies(query) {
|
|
541
|
+
// Check cache first
|
|
542
|
+
const cacheKey = this.queryCache.generateKey('getSuccessStrategies', [query.task, query.k], 'episodes');
|
|
543
|
+
const cached = this.queryCache.get(cacheKey);
|
|
544
|
+
if (cached) {
|
|
545
|
+
return cached;
|
|
546
|
+
}
|
|
392
547
|
const successes = await this.retrieveRelevant({
|
|
393
548
|
...query,
|
|
394
549
|
onlySuccesses: true,
|
|
395
550
|
minReward: 0.7,
|
|
396
|
-
k: 3
|
|
551
|
+
k: 3,
|
|
397
552
|
});
|
|
398
553
|
if (successes.length === 0) {
|
|
399
554
|
return 'No successful strategies found for this task.';
|
|
@@ -404,7 +559,10 @@ export class ReflexionMemory {
|
|
|
404
559
|
return `${i + 1}. Approach (reward ${ep.reward.toFixed(2)}): ${approach}...`;
|
|
405
560
|
})
|
|
406
561
|
.join('\n');
|
|
407
|
-
|
|
562
|
+
const result = `Successful strategies:\n${strategies}`;
|
|
563
|
+
// Cache the result
|
|
564
|
+
this.queryCache.set(cacheKey, result);
|
|
565
|
+
return result;
|
|
408
566
|
}
|
|
409
567
|
/**
|
|
410
568
|
* Get recent episodes for a session
|
|
@@ -417,24 +575,25 @@ export class ReflexionMemory {
|
|
|
417
575
|
LIMIT ?
|
|
418
576
|
`);
|
|
419
577
|
const rows = stmt.all(sessionId, limit);
|
|
420
|
-
return rows.map(row => ({
|
|
578
|
+
return rows.map((row) => ({
|
|
421
579
|
id: row.id,
|
|
422
580
|
ts: row.ts,
|
|
423
581
|
sessionId: row.session_id,
|
|
424
582
|
task: row.task,
|
|
425
|
-
input: row.input,
|
|
426
|
-
output: row.output,
|
|
427
|
-
critique: row.critique,
|
|
583
|
+
input: row.input ?? undefined,
|
|
584
|
+
output: row.output ?? undefined,
|
|
585
|
+
critique: row.critique ?? undefined,
|
|
428
586
|
reward: row.reward,
|
|
429
587
|
success: row.success === 1,
|
|
430
|
-
latencyMs: row.latency_ms,
|
|
431
|
-
tokensUsed: row.tokens_used,
|
|
432
|
-
tags:
|
|
433
|
-
metadata:
|
|
588
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
589
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
590
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
591
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
434
592
|
}));
|
|
435
593
|
}
|
|
436
594
|
/**
|
|
437
595
|
* Prune low-quality episodes based on TTL and quality threshold
|
|
596
|
+
* Invalidates cache on completion
|
|
438
597
|
*/
|
|
439
598
|
pruneEpisodes(config) {
|
|
440
599
|
const { minReward = 0.3, maxAgeDays = 30, keepMinPerTask = 5 } = config;
|
|
@@ -455,6 +614,11 @@ export class ReflexionMemory {
|
|
|
455
614
|
)
|
|
456
615
|
`);
|
|
457
616
|
const result = stmt.run(minReward, maxAgeDays * 86400, keepMinPerTask);
|
|
617
|
+
// Invalidate caches after pruning
|
|
618
|
+
if (result.changes > 0) {
|
|
619
|
+
this.queryCache.invalidateCategory('episodes');
|
|
620
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
621
|
+
}
|
|
458
622
|
return result.changes;
|
|
459
623
|
}
|
|
460
624
|
// ========================================================================
|
|
@@ -485,6 +649,17 @@ export class ReflexionMemory {
|
|
|
485
649
|
deserializeEmbedding(buffer) {
|
|
486
650
|
return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.length / 4);
|
|
487
651
|
}
|
|
652
|
+
cosineSimilarity(a, b) {
|
|
653
|
+
let dotProduct = 0;
|
|
654
|
+
let normA = 0;
|
|
655
|
+
let normB = 0;
|
|
656
|
+
for (let i = 0; i < a.length; i++) {
|
|
657
|
+
dotProduct += a[i] * b[i];
|
|
658
|
+
normA += a[i] * a[i];
|
|
659
|
+
normB += b[i] * b[i];
|
|
660
|
+
}
|
|
661
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
662
|
+
}
|
|
488
663
|
// ========================================================================
|
|
489
664
|
// GNN and Graph Integration Methods
|
|
490
665
|
// ========================================================================
|
|
@@ -503,7 +678,7 @@ export class ReflexionMemory {
|
|
|
503
678
|
success: episode.success,
|
|
504
679
|
timestamp: episode.ts || Date.now(),
|
|
505
680
|
latencyMs: episode.latencyMs,
|
|
506
|
-
tokensUsed: episode.tokensUsed
|
|
681
|
+
tokensUsed: episode.tokensUsed,
|
|
507
682
|
});
|
|
508
683
|
// Find similar episodes using graph vector search
|
|
509
684
|
const similarEpisodes = await this.graphBackend.vectorSearch(embedding, 5, nodeId);
|
|
@@ -511,8 +686,8 @@ export class ReflexionMemory {
|
|
|
511
686
|
for (const similar of similarEpisodes) {
|
|
512
687
|
if (similar.id !== nodeId && similar.properties.episodeId !== episodeId) {
|
|
513
688
|
await this.graphBackend.createRelationship(nodeId, similar.id, 'SIMILAR_TO', {
|
|
514
|
-
similarity: cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
515
|
-
createdAt: Date.now()
|
|
689
|
+
similarity: this.cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
690
|
+
createdAt: Date.now(),
|
|
516
691
|
});
|
|
517
692
|
}
|
|
518
693
|
}
|
|
@@ -523,13 +698,15 @@ export class ReflexionMemory {
|
|
|
523
698
|
// Create session node if doesn't exist
|
|
524
699
|
sessionNodeId = await this.graphBackend.createNode(['Session'], {
|
|
525
700
|
sessionId: episode.sessionId,
|
|
526
|
-
startTime: episode.ts || Date.now()
|
|
701
|
+
startTime: episode.ts || Date.now(),
|
|
527
702
|
});
|
|
528
703
|
}
|
|
529
704
|
else {
|
|
530
705
|
sessionNodeId = sessionNodes.rows[0].s.id;
|
|
531
706
|
}
|
|
532
|
-
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
707
|
+
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
708
|
+
timestamp: episode.ts || Date.now(),
|
|
709
|
+
});
|
|
533
710
|
// If episode has critique, create causal relationship to previous failures
|
|
534
711
|
if (episode.critique && !episode.success) {
|
|
535
712
|
const previousFailures = await this.graphBackend.execute(`MATCH (e:Episode:Failure {sessionId: $sessionId})
|
|
@@ -540,7 +717,7 @@ export class ReflexionMemory {
|
|
|
540
717
|
for (const prevFailure of previousFailures.rows) {
|
|
541
718
|
await this.graphBackend.createRelationship(nodeId, prevFailure.e.id, 'LEARNED_FROM', {
|
|
542
719
|
critique: episode.critique,
|
|
543
|
-
improvementAttempt: true
|
|
720
|
+
improvementAttempt: true,
|
|
544
721
|
});
|
|
545
722
|
}
|
|
546
723
|
}
|
|
@@ -554,8 +731,8 @@ export class ReflexionMemory {
|
|
|
554
731
|
}
|
|
555
732
|
try {
|
|
556
733
|
// Get initial neighbors
|
|
557
|
-
const initialResults = this.vectorBackend
|
|
558
|
-
threshold: 0.0
|
|
734
|
+
const initialResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 2, {
|
|
735
|
+
threshold: 0.0,
|
|
559
736
|
});
|
|
560
737
|
if (initialResults.length === 0) {
|
|
561
738
|
return queryEmbedding;
|
|
@@ -563,14 +740,19 @@ export class ReflexionMemory {
|
|
|
563
740
|
// Fetch neighbor embeddings
|
|
564
741
|
const neighborEmbeddings = [];
|
|
565
742
|
const weights = [];
|
|
566
|
-
const episodeIds = initialResults.map(r => r.id);
|
|
743
|
+
const episodeIds = initialResults.map((r) => r.id).filter((id) => EPISODE_VECTOR_ID.test(id));
|
|
744
|
+
if (episodeIds.length === 0) {
|
|
745
|
+
return queryEmbedding;
|
|
746
|
+
}
|
|
567
747
|
const placeholders = episodeIds.map(() => '?').join(',');
|
|
568
|
-
const episodes = this.db
|
|
748
|
+
const episodes = this.db
|
|
749
|
+
.prepare(`
|
|
569
750
|
SELECT ee.embedding, e.reward
|
|
570
751
|
FROM episode_embeddings ee
|
|
571
752
|
JOIN episodes e ON e.id = ee.episode_id
|
|
572
753
|
WHERE ee.episode_id IN (${placeholders})
|
|
573
|
-
`)
|
|
754
|
+
`)
|
|
755
|
+
.all(...episodeIds);
|
|
574
756
|
for (const ep of episodes) {
|
|
575
757
|
const embedding = this.deserializeEmbedding(ep.embedding);
|
|
576
758
|
neighborEmbeddings.push(embedding);
|
|
@@ -607,7 +789,7 @@ export class ReflexionMemory {
|
|
|
607
789
|
return {
|
|
608
790
|
similar: (row.similar || []).filter((id) => id != null),
|
|
609
791
|
session: row.session || '',
|
|
610
|
-
learnedFrom: (row.learnedFrom || []).filter((id) => id != null)
|
|
792
|
+
learnedFrom: (row.learnedFrom || []).filter((id) => id != null),
|
|
611
793
|
};
|
|
612
794
|
}
|
|
613
795
|
/**
|
|
@@ -624,11 +806,11 @@ export class ReflexionMemory {
|
|
|
624
806
|
return;
|
|
625
807
|
}
|
|
626
808
|
const result = await this.learningBackend.train(options);
|
|
627
|
-
console.
|
|
809
|
+
console.error('[ReflexionMemory] GNN training complete:', {
|
|
628
810
|
epochs: result.epochs,
|
|
629
811
|
finalLoss: result.finalLoss.toFixed(4),
|
|
630
812
|
improvement: `${(result.improvement * 100).toFixed(1)}%`,
|
|
631
|
-
duration: `${result.duration}ms
|
|
813
|
+
duration: `${result.duration}ms`,
|
|
632
814
|
});
|
|
633
815
|
}
|
|
634
816
|
/**
|
|
@@ -649,5 +831,281 @@ export class ReflexionMemory {
|
|
|
649
831
|
}
|
|
650
832
|
return this.graphBackend.getStats();
|
|
651
833
|
}
|
|
834
|
+
/**
|
|
835
|
+
* Get query cache statistics
|
|
836
|
+
*/
|
|
837
|
+
getCacheStats() {
|
|
838
|
+
return this.queryCache.getStatistics();
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Clear query cache
|
|
842
|
+
*/
|
|
843
|
+
clearCache() {
|
|
844
|
+
this.queryCache.clear();
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* Prune expired cache entries
|
|
848
|
+
*/
|
|
849
|
+
pruneCache() {
|
|
850
|
+
return this.queryCache.pruneExpired();
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Warm cache with common queries
|
|
854
|
+
*/
|
|
855
|
+
async warmCache(sessionId) {
|
|
856
|
+
await this.queryCache.warm(async (cache) => {
|
|
857
|
+
// Warm cache with recent sessions if sessionId provided
|
|
858
|
+
if (sessionId) {
|
|
859
|
+
const recent = await this.getRecentEpisodes(sessionId, 10);
|
|
860
|
+
// Episodes are already loaded, cache will be populated on next access
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Delete an episode by id. Closes the gap from issue #150 (downstream:
|
|
866
|
+
* ruflo#1784, RuVector#427) — once an episode is written there was no
|
|
867
|
+
* first-class way to remove it through any backend.
|
|
868
|
+
*
|
|
869
|
+
* Strategy mirrors storeEpisode: when a graph backend is present we go
|
|
870
|
+
* through it (`graphAdapter.deleteNode` / `graphBackend.deleteNode` —
|
|
871
|
+
* both Cypher-backed under the hood), and we ALWAYS also purge the SQL
|
|
872
|
+
* `episodes` and `episode_embeddings` rows so durable storage stays in
|
|
873
|
+
* sync. Vector backend entries are removed too when present.
|
|
874
|
+
*
|
|
875
|
+
* @returns True if the episode existed in any backend and was removed.
|
|
876
|
+
*/
|
|
877
|
+
async deleteEpisode(id) {
|
|
878
|
+
const numericId = typeof id === 'number' ? id : parseInt(String(id), 10);
|
|
879
|
+
const stringId = String(id);
|
|
880
|
+
// Invalidate caches up front — failures below shouldn't leave stale reads.
|
|
881
|
+
this.queryCache.invalidateCategory('episodes');
|
|
882
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
883
|
+
let removed = false;
|
|
884
|
+
// 1. Graph adapter (AgentDB v2 fast path)
|
|
885
|
+
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
886
|
+
const adapter = this.graphBackend;
|
|
887
|
+
if (typeof adapter.deleteNode === 'function') {
|
|
888
|
+
try {
|
|
889
|
+
// Adapter accepts either the canonical "episode-<id>" key or a raw
|
|
890
|
+
// id; try the canonical form first since that's what storeEpisode
|
|
891
|
+
// emits.
|
|
892
|
+
const r = await adapter.deleteNode(`episode-${numericId}`, { cascade: true });
|
|
893
|
+
if (r?.deletedNode)
|
|
894
|
+
removed = true;
|
|
895
|
+
if (!removed) {
|
|
896
|
+
const r2 = await adapter.deleteNode(stringId, { cascade: true });
|
|
897
|
+
if (r2?.deletedNode)
|
|
898
|
+
removed = true;
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
catch (err) {
|
|
902
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
903
|
+
// eslint-disable-next-line no-console
|
|
904
|
+
console.warn(`[ReflexionMemory] deleteEpisode: graph adapter delete failed: ${msg}`);
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
// 2. Generic graph backend
|
|
909
|
+
else if (this.graphBackend && typeof this.graphBackend.deleteNode === 'function') {
|
|
910
|
+
try {
|
|
911
|
+
const r = await this.graphBackend.deleteNode(stringId);
|
|
912
|
+
if (r === true)
|
|
913
|
+
removed = true;
|
|
914
|
+
}
|
|
915
|
+
catch (err) {
|
|
916
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
917
|
+
// eslint-disable-next-line no-console
|
|
918
|
+
console.warn(`[ReflexionMemory] deleteEpisode: graph backend delete failed: ${msg}`);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
// 3. Vector backend (HNSW/RuVector); some implementations don't expose
|
|
922
|
+
// delete — guard with a feature check.
|
|
923
|
+
if (this.vectorBackend && typeof this.vectorBackend.delete === 'function') {
|
|
924
|
+
try {
|
|
925
|
+
const r = await this.vectorBackend.delete(String(numericId));
|
|
926
|
+
if (r === true)
|
|
927
|
+
removed = true;
|
|
928
|
+
}
|
|
929
|
+
catch (err) {
|
|
930
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
931
|
+
// eslint-disable-next-line no-console
|
|
932
|
+
console.warn(`[ReflexionMemory] deleteEpisode: vector backend delete failed: ${msg}`);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
// 4. SQL durable storage — always attempt so persistence stays clean
|
|
936
|
+
// even when the primary backend was a no-op.
|
|
937
|
+
if (this.db && typeof this.db.prepare === 'function' && Number.isFinite(numericId)) {
|
|
938
|
+
try {
|
|
939
|
+
const embStmt = this.db.prepare(`DELETE FROM episode_embeddings WHERE episode_id = ?`);
|
|
940
|
+
embStmt.run(numericId);
|
|
941
|
+
const stmt = this.db.prepare(`DELETE FROM episodes WHERE id = ?`);
|
|
942
|
+
const r = stmt.run(numericId);
|
|
943
|
+
const changes = r?.changes ?? 0;
|
|
944
|
+
if (changes > 0)
|
|
945
|
+
removed = true;
|
|
946
|
+
}
|
|
947
|
+
catch (err) {
|
|
948
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
949
|
+
if (!/no such table/i.test(msg)) {
|
|
950
|
+
// eslint-disable-next-line no-console
|
|
951
|
+
console.warn(`[ReflexionMemory] deleteEpisode: SQL delete failed: ${msg}`);
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
return removed;
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* Dual-write helper for issue #128.
|
|
959
|
+
*
|
|
960
|
+
* Inserts the given episode into the SQLite `episodes` and
|
|
961
|
+
* `episode_embeddings` tables when the underlying connection supports it.
|
|
962
|
+
* Used when a graph or vector backend handles the primary index but the
|
|
963
|
+
* caller still wants restart-safe persistence.
|
|
964
|
+
*
|
|
965
|
+
* Errors are swallowed and logged — the primary write to the graph/vector
|
|
966
|
+
* backend has already succeeded, and we don't want to fail the caller if
|
|
967
|
+
* SQL persistence is unavailable (e.g. read-only DB, schema not present).
|
|
968
|
+
*/
|
|
969
|
+
dualWriteEpisodeToSQL(episode, embedding) {
|
|
970
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
971
|
+
return;
|
|
972
|
+
try {
|
|
973
|
+
const stmt = this.db.prepare(`
|
|
974
|
+
INSERT INTO episodes (
|
|
975
|
+
session_id, task, input, output, critique, reward, success,
|
|
976
|
+
latency_ms, tokens_used, tags, metadata
|
|
977
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
978
|
+
`);
|
|
979
|
+
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
980
|
+
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
981
|
+
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);
|
|
982
|
+
if (embedding) {
|
|
983
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
984
|
+
this.storeEmbedding(episodeId, embedding);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
catch (err) {
|
|
988
|
+
// The expected failure here is "no such table: episodes" on databases
|
|
989
|
+
// that intentionally don't carry the v1 schema. Don't escalate — the
|
|
990
|
+
// primary backend already has the data.
|
|
991
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
992
|
+
if (!/no such table/i.test(msg)) {
|
|
993
|
+
// eslint-disable-next-line no-console
|
|
994
|
+
console.warn('[ReflexionMemory] dualWriteEpisodeToSQL failed:', msg);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Rebuild the in-memory vector index from the SQLite `episodes` /
|
|
1000
|
+
* `episode_embeddings` tables, going through the proper backend channels
|
|
1001
|
+
* so `retrieveRelevant()` sees the data afterwards.
|
|
1002
|
+
*
|
|
1003
|
+
* Fixes the user's recovery use-case from issue #129: rather than calling
|
|
1004
|
+
* `vectorBackend.getInner().insert()` directly (which bypasses the
|
|
1005
|
+
* GuardedBackend wrapper and confuses retrieveRelevant), call this method
|
|
1006
|
+
* to re-hydrate the vector and graph indices from durable storage.
|
|
1007
|
+
*
|
|
1008
|
+
* Returns the number of episodes re-indexed. No-ops cleanly when the SQL
|
|
1009
|
+
* tables are empty or absent.
|
|
1010
|
+
*/
|
|
1011
|
+
async rebuildIndex(options = {}) {
|
|
1012
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
1013
|
+
return 0;
|
|
1014
|
+
const where = options.fromTimestamp !== undefined ? 'WHERE e.ts >= ?' : '';
|
|
1015
|
+
const params = options.fromTimestamp !== undefined ? [options.fromTimestamp] : [];
|
|
1016
|
+
let rows = [];
|
|
1017
|
+
try {
|
|
1018
|
+
const stmt = this.db.prepare(`
|
|
1019
|
+
SELECT
|
|
1020
|
+
e.id, e.ts, e.session_id, e.task, e.input, e.output, e.critique,
|
|
1021
|
+
e.reward, e.success, e.latency_ms, e.tokens_used, e.tags, e.metadata,
|
|
1022
|
+
ee.embedding
|
|
1023
|
+
FROM episodes e
|
|
1024
|
+
LEFT JOIN episode_embeddings ee ON ee.episode_id = e.id
|
|
1025
|
+
${where}
|
|
1026
|
+
ORDER BY e.id ASC
|
|
1027
|
+
`);
|
|
1028
|
+
rows = stmt.all(...params);
|
|
1029
|
+
}
|
|
1030
|
+
catch (err) {
|
|
1031
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1032
|
+
if (/no such table/i.test(msg))
|
|
1033
|
+
return 0;
|
|
1034
|
+
throw err;
|
|
1035
|
+
}
|
|
1036
|
+
let reindexed = 0;
|
|
1037
|
+
for (const row of rows) {
|
|
1038
|
+
const episode = {
|
|
1039
|
+
id: row.id,
|
|
1040
|
+
ts: row.ts,
|
|
1041
|
+
sessionId: row.session_id,
|
|
1042
|
+
task: row.task,
|
|
1043
|
+
input: row.input ?? undefined,
|
|
1044
|
+
output: row.output ?? undefined,
|
|
1045
|
+
critique: row.critique ?? undefined,
|
|
1046
|
+
reward: row.reward,
|
|
1047
|
+
success: row.success === 1,
|
|
1048
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
1049
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
1050
|
+
tags: safeJsonParse(row.tags, undefined),
|
|
1051
|
+
metadata: safeJsonParse(row.metadata, undefined),
|
|
1052
|
+
};
|
|
1053
|
+
// Prefer the stored embedding; fall back to recomputing if missing.
|
|
1054
|
+
let embedding;
|
|
1055
|
+
if (row.embedding) {
|
|
1056
|
+
const buf = row.embedding;
|
|
1057
|
+
embedding = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
|
|
1058
|
+
}
|
|
1059
|
+
else {
|
|
1060
|
+
embedding = await this.embedder.embedPassage(this.buildEpisodeText(episode));
|
|
1061
|
+
}
|
|
1062
|
+
// Re-insert through the proper public APIs so the GuardedBackend
|
|
1063
|
+
// wrapper, graph adapter, and HNSW all stay in sync.
|
|
1064
|
+
if (this.vectorBackend) {
|
|
1065
|
+
try {
|
|
1066
|
+
this.vectorBackend.insert(String(row.id), embedding, {
|
|
1067
|
+
type: 'episode',
|
|
1068
|
+
sessionId: episode.sessionId,
|
|
1069
|
+
reward: episode.reward,
|
|
1070
|
+
success: episode.success,
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
catch (err) {
|
|
1074
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1075
|
+
// eslint-disable-next-line no-console
|
|
1076
|
+
console.warn(`[ReflexionMemory] rebuildIndex: vector insert failed for ${row.id}: ${msg}`);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
1080
|
+
const adapter = this.graphBackend;
|
|
1081
|
+
try {
|
|
1082
|
+
await adapter.storeEpisode({
|
|
1083
|
+
id: `episode-${row.id}`,
|
|
1084
|
+
sessionId: episode.sessionId,
|
|
1085
|
+
task: episode.task,
|
|
1086
|
+
reward: episode.reward,
|
|
1087
|
+
success: episode.success,
|
|
1088
|
+
input: episode.input,
|
|
1089
|
+
output: episode.output,
|
|
1090
|
+
critique: episode.critique,
|
|
1091
|
+
createdAt: (episode.ts ?? Date.now() / 1000) * 1000,
|
|
1092
|
+
tokensUsed: episode.tokensUsed,
|
|
1093
|
+
latencyMs: episode.latencyMs,
|
|
1094
|
+
}, embedding);
|
|
1095
|
+
}
|
|
1096
|
+
catch (err) {
|
|
1097
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1098
|
+
// eslint-disable-next-line no-console
|
|
1099
|
+
console.warn(`[ReflexionMemory] rebuildIndex: graph store failed for ${row.id}: ${msg}`);
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
reindexed++;
|
|
1103
|
+
}
|
|
1104
|
+
// Bust any stale read caches so the next retrieveRelevant sees the
|
|
1105
|
+
// freshly-rebuilt index.
|
|
1106
|
+
this.queryCache.invalidateCategory('episodes');
|
|
1107
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
1108
|
+
return reindexed;
|
|
1109
|
+
}
|
|
652
1110
|
}
|
|
653
1111
|
//# sourceMappingURL=ReflexionMemory.js.map
|