agentdb 3.0.0-alpha.10 → 3.0.0-alpha.12
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 +2821 -225
- package/dist/src/backends/VectorBackend.d.ts +31 -6
- package/dist/src/backends/VectorBackend.d.ts.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 +138 -108
- package/dist/src/backends/factory.js.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.js +29 -2
- package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts +198 -45
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.js +612 -277
- 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 +559 -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 +211 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js +389 -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 +140 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.js +630 -0
- package/dist/src/backends/rvf/NativeAccelerator.js.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts +194 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.js +607 -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 +569 -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 +77 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js +382 -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 +13 -0
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +803 -94
- package/dist/src/cli/agentdb-cli.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 +428 -0
- package/dist/src/cli/commands/hyperbolic.js.map +1 -0
- 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 +404 -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 +176 -8
- 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 +414 -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/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 +89 -13
- 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 +19 -2
- package/dist/src/controllers/CausalRecall.js.map +1 -1
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +28 -11
- 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 +17 -3
- 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 +82 -6
- package/dist/src/controllers/HNSWIndex.js.map +1 -1
- package/dist/src/controllers/LearningSystem.d.ts +1 -17
- package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
- package/dist/src/controllers/LearningSystem.js +18 -135
- package/dist/src/controllers/LearningSystem.js.map +1 -1
- package/dist/src/controllers/MemoryController.d.ts +161 -0
- package/dist/src/controllers/MemoryController.d.ts.map +1 -0
- package/dist/src/controllers/MemoryController.js +303 -0
- package/dist/src/controllers/MemoryController.js.map +1 -0
- 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 +17 -3
- 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 +190 -0
- package/dist/src/controllers/QUICClient.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 +47 -41
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +115 -6
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +541 -213
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +27 -3
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +187 -91
- 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 +115 -3
- 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 +146 -93
- 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 +14 -27
- package/dist/src/controllers/index.d.ts.map +1 -1
- package/dist/src/controllers/index.js +10 -18
- 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 +27 -19
- package/dist/src/core/AgentDB.d.ts.map +1 -1
- package/dist/src/core/AgentDB.js +76 -124
- 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 +10 -1
- package/dist/src/db-fallback.d.ts.map +1 -1
- package/dist/src/db-fallback.js +205 -28
- package/dist/src/db-fallback.js.map +1 -1
- package/dist/src/examples/quic-sync-example.js +2 -2
- package/dist/src/examples/quic-sync-example.js.map +1 -1
- package/dist/src/index.d.ts +15 -15
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +39 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/agentdb-mcp-server.js +47 -2
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/model/ModelCacheLoader.d.ts +24 -0
- package/dist/src/model/ModelCacheLoader.d.ts.map +1 -0
- package/dist/src/model/ModelCacheLoader.js +121 -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 +416 -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 +183 -31
- 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/search/HybridSearch.d.ts +311 -0
- package/dist/src/search/HybridSearch.d.ts.map +1 -0
- package/dist/src/search/HybridSearch.js +712 -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/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 +61 -7
- package/dist/src/services/LLMRouter.d.ts.map +1 -1
- package/dist/src/services/LLMRouter.js +286 -22
- 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 +1035 -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 +342 -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 +139 -0
- package/dist/src/wrappers/agentdb-fast.d.ts.map +1 -0
- package/dist/src/wrappers/agentdb-fast.js +307 -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 +77 -76
- 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/schemas/frontier-schema.sql +0 -378
- package/dist/schemas/schema.sql +0 -382
- 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 -173
- package/dist/src/services/GNNService.d.ts.map +0 -1
- package/dist/src/services/GNNService.js +0 -639
- 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,25 +7,39 @@
|
|
|
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';
|
|
10
11
|
import { NodeIdMapper } from '../utils/NodeIdMapper.js';
|
|
11
|
-
import {
|
|
12
|
+
import { QueryCache } from '../core/QueryCache.js';
|
|
12
13
|
export class ReflexionMemory {
|
|
13
14
|
db;
|
|
14
15
|
embedder;
|
|
15
16
|
vectorBackend;
|
|
16
17
|
learningBackend;
|
|
17
18
|
graphBackend;
|
|
18
|
-
|
|
19
|
+
queryCache;
|
|
20
|
+
constructor(db, embedder, vectorBackend, learningBackend, graphBackend, cacheConfig) {
|
|
19
21
|
this.db = db;
|
|
20
22
|
this.embedder = embedder;
|
|
21
23
|
this.vectorBackend = vectorBackend;
|
|
22
24
|
this.learningBackend = learningBackend;
|
|
23
25
|
this.graphBackend = graphBackend;
|
|
26
|
+
this.queryCache = new QueryCache(cacheConfig);
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Store a new episode with its critique and outcome
|
|
30
|
+
* Invalidates relevant cache entries
|
|
31
|
+
*
|
|
32
|
+
* Persistence guarantee (issue #128 fix):
|
|
33
|
+
* storeEpisode() always writes to the SQLite `episodes` and
|
|
34
|
+
* `episode_embeddings` tables when a SQL-capable connection is present,
|
|
35
|
+
* even when a graph or vector backend handles the primary index. This
|
|
36
|
+
* ensures data survives process restarts (graph/vector backends are
|
|
37
|
+
* often in-memory or rebuildable from SQL).
|
|
27
38
|
*/
|
|
28
39
|
async storeEpisode(episode) {
|
|
40
|
+
// Invalidate episode caches on write
|
|
41
|
+
this.queryCache.invalidateCategory('episodes');
|
|
42
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
29
43
|
// Use GraphDatabaseAdapter if available (AgentDB v2)
|
|
30
44
|
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
31
45
|
// GraphDatabaseAdapter has specialized storeEpisode method
|
|
@@ -44,12 +58,15 @@ export class ReflexionMemory {
|
|
|
44
58
|
critique: episode.critique,
|
|
45
59
|
createdAt: episode.ts ? episode.ts * 1000 : Date.now(),
|
|
46
60
|
tokensUsed: episode.tokensUsed,
|
|
47
|
-
latencyMs: episode.latencyMs
|
|
61
|
+
latencyMs: episode.latencyMs,
|
|
48
62
|
}, taskEmbedding);
|
|
49
63
|
// Return a numeric ID (parse from string ID)
|
|
50
64
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
51
65
|
// Register mapping for later use by CausalMemoryGraph
|
|
52
66
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
67
|
+
// #128: dual-write to SQL for restart-safe persistence. Graph adapter
|
|
68
|
+
// index is typically in-memory; SQL is the durable record.
|
|
69
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
53
70
|
return numericId;
|
|
54
71
|
}
|
|
55
72
|
// Use generic GraphBackend if available
|
|
@@ -69,22 +86,21 @@ export class ReflexionMemory {
|
|
|
69
86
|
tokensUsed: episode.tokensUsed || 0,
|
|
70
87
|
tags: episode.tags ? JSON.stringify(episode.tags) : '[]',
|
|
71
88
|
metadata: episode.metadata ? JSON.stringify(episode.metadata) : '{}',
|
|
72
|
-
createdAt: Date.now()
|
|
89
|
+
createdAt: Date.now(),
|
|
73
90
|
});
|
|
74
91
|
// Store embedding using vectorBackend if available
|
|
75
92
|
if (this.vectorBackend && taskEmbedding) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch { /* vectorBackend insert failed — graph node still created */ }
|
|
93
|
+
this.vectorBackend.insert(nodeId, taskEmbedding, {
|
|
94
|
+
type: 'episode',
|
|
95
|
+
sessionId: episode.sessionId,
|
|
96
|
+
});
|
|
83
97
|
}
|
|
84
98
|
// Return a numeric ID (parse from string ID)
|
|
85
99
|
const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
|
|
86
100
|
// Register mapping for later use by CausalMemoryGraph
|
|
87
101
|
NodeIdMapper.getInstance().register(numericId, nodeId);
|
|
102
|
+
// #128: dual-write to SQL for restart-safe persistence.
|
|
103
|
+
this.dualWriteEpisodeToSQL(episode, taskEmbedding);
|
|
88
104
|
return numericId;
|
|
89
105
|
}
|
|
90
106
|
// Fallback to SQLite (v1 compatibility)
|
|
@@ -97,16 +113,13 @@ export class ReflexionMemory {
|
|
|
97
113
|
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
98
114
|
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
99
115
|
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;
|
|
116
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
101
117
|
// Generate and store embedding
|
|
102
118
|
const text = this.buildEpisodeText(episode);
|
|
103
119
|
const embedding = await this.embedder.embed(text);
|
|
104
120
|
// Use vector backend if available (150x faster retrieval)
|
|
105
121
|
if (this.vectorBackend) {
|
|
106
|
-
|
|
107
|
-
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
108
|
-
}
|
|
109
|
-
catch { /* vectorBackend insert failed — SQL fallback used */ }
|
|
122
|
+
this.vectorBackend.insert(episodeId.toString(), embedding);
|
|
110
123
|
}
|
|
111
124
|
// Also store in SQL for fallback
|
|
112
125
|
this.storeEmbedding(episodeId, embedding);
|
|
@@ -124,155 +137,198 @@ export class ReflexionMemory {
|
|
|
124
137
|
task: episode.task,
|
|
125
138
|
sessionId: episode.sessionId,
|
|
126
139
|
latencyMs: episode.latencyMs,
|
|
127
|
-
tokensUsed: episode.tokensUsed
|
|
128
|
-
}
|
|
140
|
+
tokensUsed: episode.tokensUsed,
|
|
141
|
+
},
|
|
129
142
|
});
|
|
130
143
|
}
|
|
131
144
|
return episodeId;
|
|
132
145
|
}
|
|
133
146
|
/**
|
|
134
147
|
* Retrieve relevant past episodes for a new task attempt
|
|
148
|
+
* Results are cached for improved performance
|
|
135
149
|
*/
|
|
136
150
|
async retrieveRelevant(query) {
|
|
137
|
-
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays } = query;
|
|
138
|
-
//
|
|
151
|
+
const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays, } = query;
|
|
152
|
+
// Check cache first
|
|
153
|
+
const cacheKey = this.queryCache.generateKey('retrieveRelevant', [task, currentState, k, minReward, onlyFailures, onlySuccesses, timeWindowDays], 'episodes');
|
|
154
|
+
const cached = this.queryCache.get(cacheKey);
|
|
155
|
+
if (cached) {
|
|
156
|
+
return cached;
|
|
157
|
+
}
|
|
158
|
+
// Generate and enhance query embedding
|
|
159
|
+
const queryEmbedding = await this.prepareQueryEmbedding(task, currentState, k);
|
|
160
|
+
// Try different retrieval strategies in order of preference
|
|
161
|
+
let episodes = [];
|
|
162
|
+
if (this.graphBackend && 'searchSimilarEpisodes' in this.graphBackend) {
|
|
163
|
+
episodes = await this.retrieveFromGraphAdapter(queryEmbedding, query);
|
|
164
|
+
}
|
|
165
|
+
else if (this.graphBackend && 'execute' in this.graphBackend) {
|
|
166
|
+
episodes = await this.retrieveFromGenericGraph(query);
|
|
167
|
+
}
|
|
168
|
+
else if (this.vectorBackend) {
|
|
169
|
+
episodes = await this.retrieveFromVectorBackend(queryEmbedding, query);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
episodes = await this.retrieveFromSQLFallback(queryEmbedding, query);
|
|
173
|
+
}
|
|
174
|
+
// Cache and return results
|
|
175
|
+
this.queryCache.set(cacheKey, episodes);
|
|
176
|
+
return episodes;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Prepare and enhance query embedding for search
|
|
180
|
+
*/
|
|
181
|
+
async prepareQueryEmbedding(task, currentState, k) {
|
|
139
182
|
const queryText = currentState ? `${task}\n${currentState}` : task;
|
|
140
183
|
let queryEmbedding = await this.embedder.embed(queryText);
|
|
141
184
|
// Enhance query with GNN if learning backend available
|
|
142
185
|
if (this.learningBackend) {
|
|
143
186
|
queryEmbedding = await this.enhanceQueryWithGNN(queryEmbedding, k);
|
|
144
187
|
}
|
|
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
|
-
|
|
188
|
+
return queryEmbedding;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Retrieve episodes using GraphDatabaseAdapter (AgentDB v2)
|
|
192
|
+
*/
|
|
193
|
+
async retrieveFromGraphAdapter(queryEmbedding, query) {
|
|
194
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
195
|
+
const graphAdapter = this.graphBackend;
|
|
196
|
+
// Search using vector similarity
|
|
197
|
+
const results = await graphAdapter.searchSimilarEpisodes(queryEmbedding, k * 3);
|
|
198
|
+
// Apply filters
|
|
199
|
+
const filtered = this.applyEpisodeFilters(results, {
|
|
200
|
+
minReward,
|
|
201
|
+
onlyFailures,
|
|
202
|
+
onlySuccesses,
|
|
203
|
+
timeWindowDays,
|
|
204
|
+
});
|
|
205
|
+
// Convert to EpisodeWithEmbedding format
|
|
206
|
+
return filtered.slice(0, k).map((ep) => this.convertGraphEpisode(ep));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Retrieve episodes using generic GraphBackend
|
|
210
|
+
*/
|
|
211
|
+
async retrieveFromGenericGraph(query) {
|
|
212
|
+
const { k = 5 } = query;
|
|
213
|
+
const cypherQuery = this.buildCypherQuery(query);
|
|
214
|
+
const result = await this.graphBackend.execute(cypherQuery);
|
|
215
|
+
// Convert to EpisodeWithEmbedding format
|
|
216
|
+
const episodes = result.rows.map((row) => this.convertCypherEpisode(row.e));
|
|
217
|
+
return episodes.slice(0, k);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Retrieve episodes using VectorBackend (150x faster)
|
|
221
|
+
*/
|
|
222
|
+
async retrieveFromVectorBackend(queryEmbedding, query) {
|
|
223
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
224
|
+
// Get candidates from vector backend
|
|
225
|
+
const searchResults = this.vectorBackend.search(queryEmbedding, k * 3, {
|
|
226
|
+
threshold: 0.0,
|
|
227
|
+
});
|
|
228
|
+
// Fetch full episode data from DB
|
|
229
|
+
const episodeIds = searchResults.map((r) => parseInt(r.id));
|
|
230
|
+
if (episodeIds.length === 0) {
|
|
231
|
+
return [];
|
|
177
232
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
cypherQuery += ` AND e.success = true`;
|
|
190
|
-
}
|
|
191
|
-
if (timeWindowDays) {
|
|
192
|
-
const cutoff = Date.now() - timeWindowDays * 86400000;
|
|
193
|
-
cypherQuery += ` AND e.createdAt >= ${cutoff}`;
|
|
233
|
+
const rows = this.fetchEpisodesByIds(episodeIds);
|
|
234
|
+
const episodeMap = new Map(rows.map((r) => [r.id.toString(), r]));
|
|
235
|
+
// Map results with similarity scores and apply filters
|
|
236
|
+
const episodes = [];
|
|
237
|
+
for (const result of searchResults) {
|
|
238
|
+
const row = episodeMap.get(result.id);
|
|
239
|
+
if (!row)
|
|
240
|
+
continue;
|
|
241
|
+
// Apply filters
|
|
242
|
+
if (!this.passesEpisodeFilters(row, { minReward, onlyFailures, onlySuccesses, timeWindowDays })) {
|
|
243
|
+
continue;
|
|
194
244
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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);
|
|
245
|
+
episodes.push(this.convertDatabaseEpisode(row, result.similarity));
|
|
246
|
+
if (episodes.length >= k)
|
|
247
|
+
break;
|
|
217
248
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
249
|
+
return episodes;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Retrieve episodes using SQL-based similarity search (fallback)
|
|
253
|
+
*/
|
|
254
|
+
async retrieveFromSQLFallback(queryEmbedding, query) {
|
|
255
|
+
const { k = 5 } = query;
|
|
256
|
+
const { whereClause, params } = this.buildSQLFilters(query);
|
|
257
|
+
const stmt = this.db.prepare(`
|
|
258
|
+
SELECT e.*, ee.embedding
|
|
259
|
+
FROM episodes e
|
|
260
|
+
JOIN episode_embeddings ee ON e.id = ee.episode_id
|
|
261
|
+
${whereClause}
|
|
262
|
+
ORDER BY e.reward DESC
|
|
263
|
+
`);
|
|
264
|
+
const rows = stmt.all(...params);
|
|
265
|
+
// Calculate similarities and convert
|
|
266
|
+
const episodes = rows.map((row) => {
|
|
267
|
+
const embedding = this.deserializeEmbedding(row.embedding);
|
|
268
|
+
const similarity = this.cosineSimilarity(queryEmbedding, embedding);
|
|
269
|
+
return this.convertDatabaseEpisode(row, similarity, embedding);
|
|
270
|
+
});
|
|
271
|
+
// Sort by similarity and return top-k
|
|
272
|
+
episodes.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
|
|
273
|
+
return episodes.slice(0, k);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Apply episode filters to search results
|
|
277
|
+
*/
|
|
278
|
+
applyEpisodeFilters(episodes, filters) {
|
|
279
|
+
return episodes.filter((ep) => {
|
|
280
|
+
if (filters.minReward !== undefined && ep.reward < filters.minReward)
|
|
281
|
+
return false;
|
|
282
|
+
if (filters.onlyFailures && ep.success)
|
|
283
|
+
return false;
|
|
284
|
+
if (filters.onlySuccesses && !ep.success)
|
|
285
|
+
return false;
|
|
286
|
+
if (filters.timeWindowDays && ep.createdAt < Date.now() - filters.timeWindowDays * 86400000)
|
|
287
|
+
return false;
|
|
288
|
+
return true;
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if database row passes episode filters
|
|
293
|
+
*/
|
|
294
|
+
passesEpisodeFilters(row, filters) {
|
|
295
|
+
if (filters.minReward !== undefined && row.reward < filters.minReward)
|
|
296
|
+
return false;
|
|
297
|
+
if (filters.onlyFailures && row.success === 1)
|
|
298
|
+
return false;
|
|
299
|
+
if (filters.onlySuccesses && row.success === 0)
|
|
300
|
+
return false;
|
|
301
|
+
if (filters.timeWindowDays && row.ts < Date.now() / 1000 - filters.timeWindowDays * 86400)
|
|
302
|
+
return false;
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Build Cypher query with filters
|
|
307
|
+
*/
|
|
308
|
+
buildCypherQuery(query) {
|
|
309
|
+
const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
310
|
+
let cypherQuery = 'MATCH (e:Episode) WHERE 1=1';
|
|
311
|
+
if (minReward !== undefined) {
|
|
312
|
+
cypherQuery += ` AND e.reward >= ${minReward}`;
|
|
313
|
+
}
|
|
314
|
+
if (onlyFailures) {
|
|
315
|
+
cypherQuery += ` AND e.success = false`;
|
|
316
|
+
}
|
|
317
|
+
if (onlySuccesses) {
|
|
318
|
+
cypherQuery += ` AND e.success = true`;
|
|
274
319
|
}
|
|
275
|
-
|
|
320
|
+
if (timeWindowDays) {
|
|
321
|
+
const cutoff = Date.now() - timeWindowDays * 86400000;
|
|
322
|
+
cypherQuery += ` AND e.createdAt >= ${cutoff}`;
|
|
323
|
+
}
|
|
324
|
+
cypherQuery += ` RETURN e LIMIT ${k * 3}`;
|
|
325
|
+
return cypherQuery;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Build SQL WHERE clause and parameters for filters
|
|
329
|
+
*/
|
|
330
|
+
buildSQLFilters(query) {
|
|
331
|
+
const { minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
|
|
276
332
|
const filters = [];
|
|
277
333
|
const params = [];
|
|
278
334
|
if (minReward !== undefined) {
|
|
@@ -290,46 +346,93 @@ export class ReflexionMemory {
|
|
|
290
346
|
params.push(timeWindowDays * 86400);
|
|
291
347
|
}
|
|
292
348
|
const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
|
|
349
|
+
return { whereClause, params };
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Fetch episodes by IDs from database
|
|
353
|
+
*/
|
|
354
|
+
fetchEpisodesByIds(episodeIds) {
|
|
355
|
+
const placeholders = episodeIds.map(() => '?').join(',');
|
|
293
356
|
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
|
|
357
|
+
SELECT * FROM episodes
|
|
358
|
+
WHERE id IN (${placeholders})
|
|
301
359
|
`);
|
|
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
|
-
|
|
360
|
+
return stmt.all(...episodeIds);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Convert GraphDatabaseAdapter episode to EpisodeWithEmbedding
|
|
364
|
+
*/
|
|
365
|
+
convertGraphEpisode(ep) {
|
|
366
|
+
return {
|
|
367
|
+
id: parseInt(ep.id.split('-').pop() || '0', 36),
|
|
368
|
+
sessionId: ep.sessionId,
|
|
369
|
+
task: ep.task,
|
|
370
|
+
input: ep.input,
|
|
371
|
+
output: ep.output,
|
|
372
|
+
critique: ep.critique,
|
|
373
|
+
reward: ep.reward,
|
|
374
|
+
success: ep.success,
|
|
375
|
+
latencyMs: ep.latencyMs,
|
|
376
|
+
tokensUsed: ep.tokensUsed,
|
|
377
|
+
ts: Math.floor(ep.createdAt / 1000),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Convert Cypher query result to EpisodeWithEmbedding
|
|
382
|
+
*/
|
|
383
|
+
convertCypherEpisode(node) {
|
|
384
|
+
return {
|
|
385
|
+
id: parseInt(node.id.split('-').pop() || '0', 36),
|
|
386
|
+
sessionId: node.properties.sessionId,
|
|
387
|
+
task: node.properties.task,
|
|
388
|
+
input: node.properties.input,
|
|
389
|
+
output: node.properties.output,
|
|
390
|
+
critique: node.properties.critique,
|
|
391
|
+
reward: typeof node.properties.reward === 'string'
|
|
392
|
+
? parseFloat(node.properties.reward)
|
|
393
|
+
: node.properties.reward,
|
|
394
|
+
success: typeof node.properties.success === 'string'
|
|
395
|
+
? node.properties.success === 'true'
|
|
396
|
+
: node.properties.success,
|
|
397
|
+
latencyMs: node.properties.latencyMs,
|
|
398
|
+
tokensUsed: node.properties.tokensUsed,
|
|
399
|
+
tags: node.properties.tags ? JSON.parse(node.properties.tags) : [],
|
|
400
|
+
metadata: node.properties.metadata ? JSON.parse(node.properties.metadata) : {},
|
|
401
|
+
ts: Math.floor(node.properties.createdAt / 1000),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Convert database row to EpisodeWithEmbedding
|
|
406
|
+
*/
|
|
407
|
+
convertDatabaseEpisode(row, similarity, embedding) {
|
|
408
|
+
return {
|
|
409
|
+
id: row.id,
|
|
410
|
+
ts: row.ts,
|
|
411
|
+
sessionId: row.session_id,
|
|
412
|
+
task: row.task,
|
|
413
|
+
input: row.input ?? undefined,
|
|
414
|
+
output: row.output ?? undefined,
|
|
415
|
+
critique: row.critique ?? undefined,
|
|
416
|
+
reward: row.reward,
|
|
417
|
+
success: row.success === 1,
|
|
418
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
419
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
420
|
+
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
421
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
422
|
+
embedding,
|
|
423
|
+
similarity,
|
|
424
|
+
};
|
|
328
425
|
}
|
|
329
426
|
/**
|
|
330
|
-
* Get statistics for a task
|
|
427
|
+
* Get statistics for a task (cached)
|
|
331
428
|
*/
|
|
332
429
|
getTaskStats(task, timeWindowDays) {
|
|
430
|
+
// Check cache first
|
|
431
|
+
const cacheKey = this.queryCache.generateKey('getTaskStats', [task, timeWindowDays], 'task-stats');
|
|
432
|
+
const cached = this.queryCache.get(cacheKey);
|
|
433
|
+
if (cached) {
|
|
434
|
+
return cached;
|
|
435
|
+
}
|
|
333
436
|
const windowFilter = timeWindowDays
|
|
334
437
|
? `AND ts > strftime('%s', 'now') - ${timeWindowDays * 86400}`
|
|
335
438
|
: '';
|
|
@@ -359,41 +462,59 @@ export class ReflexionMemory {
|
|
|
359
462
|
const improvementTrend = trend.recent_reward && trend.older_reward
|
|
360
463
|
? (trend.recent_reward - trend.older_reward) / trend.older_reward
|
|
361
464
|
: 0;
|
|
362
|
-
|
|
363
|
-
totalAttempts: stats
|
|
364
|
-
successRate: stats
|
|
365
|
-
avgReward: stats
|
|
366
|
-
avgLatency: stats
|
|
367
|
-
improvementTrend
|
|
465
|
+
const results = {
|
|
466
|
+
totalAttempts: stats?.total ?? 0,
|
|
467
|
+
successRate: stats?.success_rate ?? 0,
|
|
468
|
+
avgReward: stats?.avg_reward ?? 0,
|
|
469
|
+
avgLatency: stats?.avg_latency ?? 0,
|
|
470
|
+
improvementTrend,
|
|
368
471
|
};
|
|
472
|
+
// Cache the results
|
|
473
|
+
this.queryCache.set(cacheKey, results);
|
|
474
|
+
return results;
|
|
369
475
|
}
|
|
370
476
|
/**
|
|
371
|
-
* Build critique summary from similar failed episodes
|
|
477
|
+
* Build critique summary from similar failed episodes (cached)
|
|
372
478
|
*/
|
|
373
479
|
async getCritiqueSummary(query) {
|
|
480
|
+
// Check cache first
|
|
481
|
+
const cacheKey = this.queryCache.generateKey('getCritiqueSummary', [query.task, query.k], 'episodes');
|
|
482
|
+
const cached = this.queryCache.get(cacheKey);
|
|
483
|
+
if (cached) {
|
|
484
|
+
return cached;
|
|
485
|
+
}
|
|
374
486
|
const failures = await this.retrieveRelevant({
|
|
375
487
|
...query,
|
|
376
488
|
onlyFailures: true,
|
|
377
|
-
k: 3
|
|
489
|
+
k: 3,
|
|
378
490
|
});
|
|
379
491
|
if (failures.length === 0) {
|
|
380
492
|
return 'No prior failures found for this task.';
|
|
381
493
|
}
|
|
382
494
|
const critiques = failures
|
|
383
|
-
.filter(ep => ep.critique)
|
|
495
|
+
.filter((ep) => ep.critique)
|
|
384
496
|
.map((ep, i) => `${i + 1}. ${ep.critique} (reward: ${ep.reward.toFixed(2)})`)
|
|
385
497
|
.join('\n');
|
|
386
|
-
|
|
498
|
+
const result = `Prior failures and lessons learned:\n${critiques}`;
|
|
499
|
+
// Cache the result
|
|
500
|
+
this.queryCache.set(cacheKey, result);
|
|
501
|
+
return result;
|
|
387
502
|
}
|
|
388
503
|
/**
|
|
389
|
-
* Get successful strategies for a task
|
|
504
|
+
* Get successful strategies for a task (cached)
|
|
390
505
|
*/
|
|
391
506
|
async getSuccessStrategies(query) {
|
|
507
|
+
// Check cache first
|
|
508
|
+
const cacheKey = this.queryCache.generateKey('getSuccessStrategies', [query.task, query.k], 'episodes');
|
|
509
|
+
const cached = this.queryCache.get(cacheKey);
|
|
510
|
+
if (cached) {
|
|
511
|
+
return cached;
|
|
512
|
+
}
|
|
392
513
|
const successes = await this.retrieveRelevant({
|
|
393
514
|
...query,
|
|
394
515
|
onlySuccesses: true,
|
|
395
516
|
minReward: 0.7,
|
|
396
|
-
k: 3
|
|
517
|
+
k: 3,
|
|
397
518
|
});
|
|
398
519
|
if (successes.length === 0) {
|
|
399
520
|
return 'No successful strategies found for this task.';
|
|
@@ -404,7 +525,10 @@ export class ReflexionMemory {
|
|
|
404
525
|
return `${i + 1}. Approach (reward ${ep.reward.toFixed(2)}): ${approach}...`;
|
|
405
526
|
})
|
|
406
527
|
.join('\n');
|
|
407
|
-
|
|
528
|
+
const result = `Successful strategies:\n${strategies}`;
|
|
529
|
+
// Cache the result
|
|
530
|
+
this.queryCache.set(cacheKey, result);
|
|
531
|
+
return result;
|
|
408
532
|
}
|
|
409
533
|
/**
|
|
410
534
|
* Get recent episodes for a session
|
|
@@ -417,24 +541,25 @@ export class ReflexionMemory {
|
|
|
417
541
|
LIMIT ?
|
|
418
542
|
`);
|
|
419
543
|
const rows = stmt.all(sessionId, limit);
|
|
420
|
-
return rows.map(row => ({
|
|
544
|
+
return rows.map((row) => ({
|
|
421
545
|
id: row.id,
|
|
422
546
|
ts: row.ts,
|
|
423
547
|
sessionId: row.session_id,
|
|
424
548
|
task: row.task,
|
|
425
|
-
input: row.input,
|
|
426
|
-
output: row.output,
|
|
427
|
-
critique: row.critique,
|
|
549
|
+
input: row.input ?? undefined,
|
|
550
|
+
output: row.output ?? undefined,
|
|
551
|
+
critique: row.critique ?? undefined,
|
|
428
552
|
reward: row.reward,
|
|
429
553
|
success: row.success === 1,
|
|
430
|
-
latencyMs: row.latency_ms,
|
|
431
|
-
tokensUsed: row.tokens_used,
|
|
554
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
555
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
432
556
|
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
433
|
-
metadata: row.metadata ? JSON.parse(row.metadata) : undefined
|
|
557
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
434
558
|
}));
|
|
435
559
|
}
|
|
436
560
|
/**
|
|
437
561
|
* Prune low-quality episodes based on TTL and quality threshold
|
|
562
|
+
* Invalidates cache on completion
|
|
438
563
|
*/
|
|
439
564
|
pruneEpisodes(config) {
|
|
440
565
|
const { minReward = 0.3, maxAgeDays = 30, keepMinPerTask = 5 } = config;
|
|
@@ -455,6 +580,11 @@ export class ReflexionMemory {
|
|
|
455
580
|
)
|
|
456
581
|
`);
|
|
457
582
|
const result = stmt.run(minReward, maxAgeDays * 86400, keepMinPerTask);
|
|
583
|
+
// Invalidate caches after pruning
|
|
584
|
+
if (result.changes > 0) {
|
|
585
|
+
this.queryCache.invalidateCategory('episodes');
|
|
586
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
587
|
+
}
|
|
458
588
|
return result.changes;
|
|
459
589
|
}
|
|
460
590
|
// ========================================================================
|
|
@@ -485,6 +615,17 @@ export class ReflexionMemory {
|
|
|
485
615
|
deserializeEmbedding(buffer) {
|
|
486
616
|
return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.length / 4);
|
|
487
617
|
}
|
|
618
|
+
cosineSimilarity(a, b) {
|
|
619
|
+
let dotProduct = 0;
|
|
620
|
+
let normA = 0;
|
|
621
|
+
let normB = 0;
|
|
622
|
+
for (let i = 0; i < a.length; i++) {
|
|
623
|
+
dotProduct += a[i] * b[i];
|
|
624
|
+
normA += a[i] * a[i];
|
|
625
|
+
normB += b[i] * b[i];
|
|
626
|
+
}
|
|
627
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
628
|
+
}
|
|
488
629
|
// ========================================================================
|
|
489
630
|
// GNN and Graph Integration Methods
|
|
490
631
|
// ========================================================================
|
|
@@ -503,7 +644,7 @@ export class ReflexionMemory {
|
|
|
503
644
|
success: episode.success,
|
|
504
645
|
timestamp: episode.ts || Date.now(),
|
|
505
646
|
latencyMs: episode.latencyMs,
|
|
506
|
-
tokensUsed: episode.tokensUsed
|
|
647
|
+
tokensUsed: episode.tokensUsed,
|
|
507
648
|
});
|
|
508
649
|
// Find similar episodes using graph vector search
|
|
509
650
|
const similarEpisodes = await this.graphBackend.vectorSearch(embedding, 5, nodeId);
|
|
@@ -511,8 +652,8 @@ export class ReflexionMemory {
|
|
|
511
652
|
for (const similar of similarEpisodes) {
|
|
512
653
|
if (similar.id !== nodeId && similar.properties.episodeId !== episodeId) {
|
|
513
654
|
await this.graphBackend.createRelationship(nodeId, similar.id, 'SIMILAR_TO', {
|
|
514
|
-
similarity: cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
515
|
-
createdAt: Date.now()
|
|
655
|
+
similarity: this.cosineSimilarity(embedding, similar.embedding || new Float32Array()),
|
|
656
|
+
createdAt: Date.now(),
|
|
516
657
|
});
|
|
517
658
|
}
|
|
518
659
|
}
|
|
@@ -523,13 +664,15 @@ export class ReflexionMemory {
|
|
|
523
664
|
// Create session node if doesn't exist
|
|
524
665
|
sessionNodeId = await this.graphBackend.createNode(['Session'], {
|
|
525
666
|
sessionId: episode.sessionId,
|
|
526
|
-
startTime: episode.ts || Date.now()
|
|
667
|
+
startTime: episode.ts || Date.now(),
|
|
527
668
|
});
|
|
528
669
|
}
|
|
529
670
|
else {
|
|
530
671
|
sessionNodeId = sessionNodes.rows[0].s.id;
|
|
531
672
|
}
|
|
532
|
-
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
673
|
+
await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
|
|
674
|
+
timestamp: episode.ts || Date.now(),
|
|
675
|
+
});
|
|
533
676
|
// If episode has critique, create causal relationship to previous failures
|
|
534
677
|
if (episode.critique && !episode.success) {
|
|
535
678
|
const previousFailures = await this.graphBackend.execute(`MATCH (e:Episode:Failure {sessionId: $sessionId})
|
|
@@ -540,7 +683,7 @@ export class ReflexionMemory {
|
|
|
540
683
|
for (const prevFailure of previousFailures.rows) {
|
|
541
684
|
await this.graphBackend.createRelationship(nodeId, prevFailure.e.id, 'LEARNED_FROM', {
|
|
542
685
|
critique: episode.critique,
|
|
543
|
-
improvementAttempt: true
|
|
686
|
+
improvementAttempt: true,
|
|
544
687
|
});
|
|
545
688
|
}
|
|
546
689
|
}
|
|
@@ -555,7 +698,7 @@ export class ReflexionMemory {
|
|
|
555
698
|
try {
|
|
556
699
|
// Get initial neighbors
|
|
557
700
|
const initialResults = this.vectorBackend.search(queryEmbedding, k * 2, {
|
|
558
|
-
threshold: 0.0
|
|
701
|
+
threshold: 0.0,
|
|
559
702
|
});
|
|
560
703
|
if (initialResults.length === 0) {
|
|
561
704
|
return queryEmbedding;
|
|
@@ -563,14 +706,16 @@ export class ReflexionMemory {
|
|
|
563
706
|
// Fetch neighbor embeddings
|
|
564
707
|
const neighborEmbeddings = [];
|
|
565
708
|
const weights = [];
|
|
566
|
-
const episodeIds = initialResults.map(r => r.id);
|
|
709
|
+
const episodeIds = initialResults.map((r) => r.id);
|
|
567
710
|
const placeholders = episodeIds.map(() => '?').join(',');
|
|
568
|
-
const episodes = this.db
|
|
711
|
+
const episodes = this.db
|
|
712
|
+
.prepare(`
|
|
569
713
|
SELECT ee.embedding, e.reward
|
|
570
714
|
FROM episode_embeddings ee
|
|
571
715
|
JOIN episodes e ON e.id = ee.episode_id
|
|
572
716
|
WHERE ee.episode_id IN (${placeholders})
|
|
573
|
-
`)
|
|
717
|
+
`)
|
|
718
|
+
.all(...episodeIds);
|
|
574
719
|
for (const ep of episodes) {
|
|
575
720
|
const embedding = this.deserializeEmbedding(ep.embedding);
|
|
576
721
|
neighborEmbeddings.push(embedding);
|
|
@@ -607,7 +752,7 @@ export class ReflexionMemory {
|
|
|
607
752
|
return {
|
|
608
753
|
similar: (row.similar || []).filter((id) => id != null),
|
|
609
754
|
session: row.session || '',
|
|
610
|
-
learnedFrom: (row.learnedFrom || []).filter((id) => id != null)
|
|
755
|
+
learnedFrom: (row.learnedFrom || []).filter((id) => id != null),
|
|
611
756
|
};
|
|
612
757
|
}
|
|
613
758
|
/**
|
|
@@ -628,7 +773,7 @@ export class ReflexionMemory {
|
|
|
628
773
|
epochs: result.epochs,
|
|
629
774
|
finalLoss: result.finalLoss.toFixed(4),
|
|
630
775
|
improvement: `${(result.improvement * 100).toFixed(1)}%`,
|
|
631
|
-
duration: `${result.duration}ms
|
|
776
|
+
duration: `${result.duration}ms`,
|
|
632
777
|
});
|
|
633
778
|
}
|
|
634
779
|
/**
|
|
@@ -649,5 +794,188 @@ export class ReflexionMemory {
|
|
|
649
794
|
}
|
|
650
795
|
return this.graphBackend.getStats();
|
|
651
796
|
}
|
|
797
|
+
/**
|
|
798
|
+
* Get query cache statistics
|
|
799
|
+
*/
|
|
800
|
+
getCacheStats() {
|
|
801
|
+
return this.queryCache.getStatistics();
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Clear query cache
|
|
805
|
+
*/
|
|
806
|
+
clearCache() {
|
|
807
|
+
this.queryCache.clear();
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Prune expired cache entries
|
|
811
|
+
*/
|
|
812
|
+
pruneCache() {
|
|
813
|
+
return this.queryCache.pruneExpired();
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Warm cache with common queries
|
|
817
|
+
*/
|
|
818
|
+
async warmCache(sessionId) {
|
|
819
|
+
await this.queryCache.warm(async (cache) => {
|
|
820
|
+
// Warm cache with recent sessions if sessionId provided
|
|
821
|
+
if (sessionId) {
|
|
822
|
+
const recent = await this.getRecentEpisodes(sessionId, 10);
|
|
823
|
+
// Episodes are already loaded, cache will be populated on next access
|
|
824
|
+
}
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Dual-write helper for issue #128.
|
|
829
|
+
*
|
|
830
|
+
* Inserts the given episode into the SQLite `episodes` and
|
|
831
|
+
* `episode_embeddings` tables when the underlying connection supports it.
|
|
832
|
+
* Used when a graph or vector backend handles the primary index but the
|
|
833
|
+
* caller still wants restart-safe persistence.
|
|
834
|
+
*
|
|
835
|
+
* Errors are swallowed and logged — the primary write to the graph/vector
|
|
836
|
+
* backend has already succeeded, and we don't want to fail the caller if
|
|
837
|
+
* SQL persistence is unavailable (e.g. read-only DB, schema not present).
|
|
838
|
+
*/
|
|
839
|
+
dualWriteEpisodeToSQL(episode, embedding) {
|
|
840
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
841
|
+
return;
|
|
842
|
+
try {
|
|
843
|
+
const stmt = this.db.prepare(`
|
|
844
|
+
INSERT INTO episodes (
|
|
845
|
+
session_id, task, input, output, critique, reward, success,
|
|
846
|
+
latency_ms, tokens_used, tags, metadata
|
|
847
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
848
|
+
`);
|
|
849
|
+
const tags = episode.tags ? JSON.stringify(episode.tags) : null;
|
|
850
|
+
const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
|
|
851
|
+
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);
|
|
852
|
+
if (embedding) {
|
|
853
|
+
const episodeId = normalizeRowId(result.lastInsertRowid);
|
|
854
|
+
this.storeEmbedding(episodeId, embedding);
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
catch (err) {
|
|
858
|
+
// The expected failure here is "no such table: episodes" on databases
|
|
859
|
+
// that intentionally don't carry the v1 schema. Don't escalate — the
|
|
860
|
+
// primary backend already has the data.
|
|
861
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
862
|
+
if (!/no such table/i.test(msg)) {
|
|
863
|
+
// eslint-disable-next-line no-console
|
|
864
|
+
console.warn('[ReflexionMemory] dualWriteEpisodeToSQL failed:', msg);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
869
|
+
* Rebuild the in-memory vector index from the SQLite `episodes` /
|
|
870
|
+
* `episode_embeddings` tables, going through the proper backend channels
|
|
871
|
+
* so `retrieveRelevant()` sees the data afterwards.
|
|
872
|
+
*
|
|
873
|
+
* Fixes the user's recovery use-case from issue #129: rather than calling
|
|
874
|
+
* `vectorBackend.getInner().insert()` directly (which bypasses the
|
|
875
|
+
* GuardedBackend wrapper and confuses retrieveRelevant), call this method
|
|
876
|
+
* to re-hydrate the vector and graph indices from durable storage.
|
|
877
|
+
*
|
|
878
|
+
* Returns the number of episodes re-indexed. No-ops cleanly when the SQL
|
|
879
|
+
* tables are empty or absent.
|
|
880
|
+
*/
|
|
881
|
+
async rebuildIndex(options = {}) {
|
|
882
|
+
if (!this.db || typeof this.db.prepare !== 'function')
|
|
883
|
+
return 0;
|
|
884
|
+
const where = options.fromTimestamp !== undefined ? 'WHERE e.ts >= ?' : '';
|
|
885
|
+
const params = options.fromTimestamp !== undefined ? [options.fromTimestamp] : [];
|
|
886
|
+
let rows = [];
|
|
887
|
+
try {
|
|
888
|
+
const stmt = this.db.prepare(`
|
|
889
|
+
SELECT
|
|
890
|
+
e.id, e.ts, e.session_id, e.task, e.input, e.output, e.critique,
|
|
891
|
+
e.reward, e.success, e.latency_ms, e.tokens_used, e.tags, e.metadata,
|
|
892
|
+
ee.embedding
|
|
893
|
+
FROM episodes e
|
|
894
|
+
LEFT JOIN episode_embeddings ee ON ee.episode_id = e.id
|
|
895
|
+
${where}
|
|
896
|
+
ORDER BY e.id ASC
|
|
897
|
+
`);
|
|
898
|
+
rows = stmt.all(...params);
|
|
899
|
+
}
|
|
900
|
+
catch (err) {
|
|
901
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
902
|
+
if (/no such table/i.test(msg))
|
|
903
|
+
return 0;
|
|
904
|
+
throw err;
|
|
905
|
+
}
|
|
906
|
+
let reindexed = 0;
|
|
907
|
+
for (const row of rows) {
|
|
908
|
+
const episode = {
|
|
909
|
+
id: row.id,
|
|
910
|
+
ts: row.ts,
|
|
911
|
+
sessionId: row.session_id,
|
|
912
|
+
task: row.task,
|
|
913
|
+
input: row.input ?? undefined,
|
|
914
|
+
output: row.output ?? undefined,
|
|
915
|
+
critique: row.critique ?? undefined,
|
|
916
|
+
reward: row.reward,
|
|
917
|
+
success: row.success === 1,
|
|
918
|
+
latencyMs: row.latency_ms ?? undefined,
|
|
919
|
+
tokensUsed: row.tokens_used ?? undefined,
|
|
920
|
+
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
921
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
922
|
+
};
|
|
923
|
+
// Prefer the stored embedding; fall back to recomputing if missing.
|
|
924
|
+
let embedding;
|
|
925
|
+
if (row.embedding) {
|
|
926
|
+
const buf = row.embedding;
|
|
927
|
+
embedding = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
|
|
928
|
+
}
|
|
929
|
+
else {
|
|
930
|
+
embedding = await this.embedder.embed(this.buildEpisodeText(episode));
|
|
931
|
+
}
|
|
932
|
+
// Re-insert through the proper public APIs so the GuardedBackend
|
|
933
|
+
// wrapper, graph adapter, and HNSW all stay in sync.
|
|
934
|
+
if (this.vectorBackend) {
|
|
935
|
+
try {
|
|
936
|
+
this.vectorBackend.insert(String(row.id), embedding, {
|
|
937
|
+
type: 'episode',
|
|
938
|
+
sessionId: episode.sessionId,
|
|
939
|
+
reward: episode.reward,
|
|
940
|
+
success: episode.success,
|
|
941
|
+
});
|
|
942
|
+
}
|
|
943
|
+
catch (err) {
|
|
944
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
945
|
+
// eslint-disable-next-line no-console
|
|
946
|
+
console.warn(`[ReflexionMemory] rebuildIndex: vector insert failed for ${row.id}: ${msg}`);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
|
|
950
|
+
const adapter = this.graphBackend;
|
|
951
|
+
try {
|
|
952
|
+
await adapter.storeEpisode({
|
|
953
|
+
id: `episode-${row.id}`,
|
|
954
|
+
sessionId: episode.sessionId,
|
|
955
|
+
task: episode.task,
|
|
956
|
+
reward: episode.reward,
|
|
957
|
+
success: episode.success,
|
|
958
|
+
input: episode.input,
|
|
959
|
+
output: episode.output,
|
|
960
|
+
critique: episode.critique,
|
|
961
|
+
createdAt: (episode.ts ?? Date.now() / 1000) * 1000,
|
|
962
|
+
tokensUsed: episode.tokensUsed,
|
|
963
|
+
latencyMs: episode.latencyMs,
|
|
964
|
+
}, embedding);
|
|
965
|
+
}
|
|
966
|
+
catch (err) {
|
|
967
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
968
|
+
// eslint-disable-next-line no-console
|
|
969
|
+
console.warn(`[ReflexionMemory] rebuildIndex: graph store failed for ${row.id}: ${msg}`);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
reindexed++;
|
|
973
|
+
}
|
|
974
|
+
// Bust any stale read caches so the next retrieveRelevant sees the
|
|
975
|
+
// freshly-rebuilt index.
|
|
976
|
+
this.queryCache.invalidateCategory('episodes');
|
|
977
|
+
this.queryCache.invalidateCategory('task-stats');
|
|
978
|
+
return reindexed;
|
|
979
|
+
}
|
|
652
980
|
}
|
|
653
981
|
//# sourceMappingURL=ReflexionMemory.js.map
|