kynjal-cli 4.0.0 → 4.0.1
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/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +286 -525
- package/dist/src/appliance/gguf-engine.js.map +1 -1
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +203 -403
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -1
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +154 -208
- package/dist/src/appliance/rvfa-builder.js.map +1 -1
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +260 -423
- package/dist/src/appliance/rvfa-distribution.js.map +1 -1
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +128 -200
- package/dist/src/appliance/rvfa-format.js.map +1 -1
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +168 -304
- package/dist/src/appliance/rvfa-runner.js.map +1 -1
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +173 -295
- package/dist/src/appliance/rvfa-signing.js.map +1 -1
- package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/dist/src/benchmarks/pretrain/index.d.ts.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +331 -542
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.js +574 -697
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1218 -1548
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.js +158 -267
- package/dist/src/commands/appliance-advanced.js.map +1 -1
- package/dist/src/commands/appliance.js +318 -493
- package/dist/src/commands/appliance.js.map +1 -1
- package/dist/src/commands/benchmark.js +372 -523
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +274 -364
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.js +113 -157
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/completions.js +477 -118
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +237 -303
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.js +487 -596
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +194 -275
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.js +504 -686
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1293 -1543
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +449 -596
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +854 -938
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.js +3112 -3519
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +115 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +126 -308
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.js +788 -940
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +383 -558
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.js +493 -605
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.js +833 -1026
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +282 -347
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.js +1289 -1563
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +497 -643
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +668 -841
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +392 -447
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +162 -256
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +150 -220
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +520 -665
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +505 -651
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +349 -401
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +224 -266
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +37 -75
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +336 -359
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +335 -322
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +375 -431
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +703 -117
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +364 -419
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.js +485 -608
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.js +504 -626
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.js +267 -364
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.js +380 -486
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +408 -488
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.js +423 -538
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +322 -412
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +196 -291
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +386 -486
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.d.ts +15 -0
- package/dist/src/config-adapter.d.ts.map +1 -0
- package/dist/src/config-adapter.js +38 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.d.ts +77 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +309 -411
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +1 -0
- package/dist/src/infrastructure/in-memory-repositories.js +246 -507
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.d.ts +25 -0
- package/dist/src/init/claudemd-generator.d.ts.map +1 -0
- package/dist/src/init/claudemd-generator.js +368 -78
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts +41 -0
- package/dist/src/init/executor.d.ts.map +1 -0
- package/dist/src/init/executor.js +1307 -996
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts +60 -0
- package/dist/src/init/helpers-generator.d.ts.map +1 -0
- package/dist/src/init/helpers-generator.js +657 -12
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/index.d.ts +1 -1
- package/dist/src/init/index.d.ts.map +1 -1
- package/dist/src/init/index.js +1 -1
- package/dist/src/init/index.js.map +1 -1
- package/dist/src/init/mcp-generator.js +33 -37
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.js +76 -77
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.js +801 -3
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +76 -59
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts +92 -0
- package/dist/src/mcp-client.d.ts.map +1 -0
- package/dist/src/mcp-client.js +81 -125
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts +161 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +470 -757
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +391 -492
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.js +332 -533
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +172 -236
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/dist/src/mcp-tools/auto-install.d.ts.map +1 -0
- package/dist/src/mcp-tools/auto-install.js +80 -142
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +252 -375
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +473 -565
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +197 -272
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +500 -572
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +286 -364
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +582 -693
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +260 -311
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +573 -640
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2215 -2648
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +350 -505
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +315 -412
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +420 -480
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +204 -278
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.js +163 -279
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -1
- package/dist/src/mcp-tools/security-tools.js +297 -429
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +185 -234
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +207 -260
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +276 -325
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +270 -336
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +148 -196
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +186 -333
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/types.d.ts +31 -0
- package/dist/src/mcp-tools/types.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +133 -280
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +405 -450
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +295 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -0
- package/dist/src/memory/ewc-consolidation.js +190 -303
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts +338 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -0
- package/dist/src/memory/intelligence.js +569 -794
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +407 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge.js +1170 -1640
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +412 -0
- package/dist/src/memory/memory-initializer.d.ts.map +1 -0
- package/dist/src/memory/memory-initializer.js +1836 -1851
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +227 -0
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -0
- package/dist/src/memory/sona-optimizer.js +199 -329
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/output.d.ts +2 -2
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +242 -272
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.d.ts +51 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +140 -187
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.d.ts +133 -0
- package/dist/src/plugins/manager.d.ts.map +1 -0
- package/dist/src/plugins/manager.js +285 -521
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.d.ts +88 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -0
- package/dist/src/plugins/store/discovery.js +271 -358
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.d.ts.map +1 -0
- package/dist/src/plugins/store/index.js +48 -105
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.d.ts.map +1 -0
- package/dist/src/plugins/store/search.js +69 -107
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/store/types.d.ts +274 -0
- package/dist/src/plugins/store/types.d.ts.map +1 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +113 -160
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +172 -223
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +190 -228
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.d.ts +101 -0
- package/dist/src/production/circuit-breaker.d.ts.map +1 -0
- package/dist/src/production/circuit-breaker.js +62 -126
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.d.ts +92 -0
- package/dist/src/production/error-handler.d.ts.map +1 -0
- package/dist/src/production/error-handler.js +86 -156
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.d.ts +161 -0
- package/dist/src/production/monitoring.d.ts.map +1 -0
- package/dist/src/production/monitoring.js +139 -220
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.d.ts +80 -0
- package/dist/src/production/rate-limiter.d.ts.map +1 -0
- package/dist/src/production/rate-limiter.js +74 -93
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.d.ts +48 -0
- package/dist/src/production/retry.d.ts.map +1 -0
- package/dist/src/production/retry.js +75 -167
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.d.ts +44 -0
- package/dist/src/prompt.d.ts.map +1 -0
- package/dist/src/prompt.js +436 -560
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.d.ts +60 -0
- package/dist/src/runtime/headless.d.ts.map +1 -0
- package/dist/src/runtime/headless.js +197 -286
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +182 -0
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/agent-wasm.js +156 -351
- package/dist/src/ruvector/agent-wasm.js.map +1 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +145 -232
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
- package/dist/src/ruvector/coverage-router.js +287 -419
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +56 -101
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
- package/dist/src/ruvector/diff-classifier.js +324 -451
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -0
- package/dist/src/ruvector/enhanced-model-router.js +260 -336
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.d.ts +195 -0
- package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
- package/dist/src/ruvector/flash-attention.js +223 -254
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
- package/dist/src/ruvector/graph-analyzer.js +486 -680
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +40 -0
- package/dist/src/ruvector/index.d.ts.map +1 -0
- package/dist/src/ruvector/index.js +36 -106
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.d.ts +218 -0
- package/dist/src/ruvector/lora-adapter.d.ts.map +1 -0
- package/dist/src/ruvector/lora-adapter.js +155 -248
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.d.ts +220 -0
- package/dist/src/ruvector/model-router.d.ts.map +1 -0
- package/dist/src/ruvector/model-router.js +175 -248
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.d.ts +206 -0
- package/dist/src/ruvector/moe-router.d.ts.map +1 -0
- package/dist/src/ruvector/moe-router.js +228 -286
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.d.ts +211 -0
- package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
- package/dist/src/ruvector/q-learning-router.js +257 -338
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/ruvllm-wasm.js +270 -434
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.d.ts.map +1 -0
- package/dist/src/ruvector/semantic-router.js +60 -67
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.d.ts +69 -0
- package/dist/src/ruvector/vector-db.d.ts.map +1 -0
- package/dist/src/ruvector/vector-db.js +119 -205
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
- package/dist/src/services/agentic-flow-bridge.js +32 -105
- package/dist/src/services/agentic-flow-bridge.js.map +1 -1
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.d.ts.map +1 -0
- package/dist/src/services/claim-service.js +615 -940
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts +197 -0
- package/dist/src/services/container-worker-pool.d.ts.map +1 -0
- package/dist/src/services/container-worker-pool.js +398 -666
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.d.ts +304 -0
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
- package/dist/src/services/headless-worker-executor.js +441 -467
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +4 -4
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +4 -4
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/registry-api.d.ts +58 -0
- package/dist/src/services/registry-api.d.ts.map +1 -0
- package/dist/src/services/registry-api.js +92 -200
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.d.ts +222 -0
- package/dist/src/services/ruvector-training.d.ts.map +1 -0
- package/dist/src/services/ruvector-training.js +257 -337
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +228 -0
- package/dist/src/services/worker-daemon.d.ts.map +1 -0
- package/dist/src/services/worker-daemon.js +591 -849
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.d.ts.map +1 -0
- package/dist/src/services/worker-queue.js +331 -548
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.d.ts.map +1 -0
- package/dist/src/suggest.js +45 -55
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +29 -37
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.js +128 -155
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.d.ts.map +1 -0
- package/dist/src/transfer/export.js +84 -142
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/index.d.ts +1 -1
- package/dist/src/transfer/index.d.ts.map +1 -1
- package/dist/src/transfer/index.js +0 -2
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/client.js +187 -337
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -0
- package/dist/src/transfer/ipfs/upload.js +288 -434
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.d.ts.map +1 -0
- package/dist/src/transfer/models/seraphine.js +55 -55
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -0
- package/dist/src/transfer/serialization/cfp.js +30 -31
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -0
- package/dist/src/transfer/storage/gcs.js +165 -232
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.d.ts.map +1 -0
- package/dist/src/transfer/store/discovery.js +239 -349
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.d.ts.map +1 -0
- package/dist/src/transfer/store/download.js +243 -365
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.d.ts.map +1 -0
- package/dist/src/transfer/store/index.js +63 -130
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.d.ts.map +1 -0
- package/dist/src/transfer/store/publish.js +184 -258
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +50 -72
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.d.ts.map +1 -0
- package/dist/src/transfer/store/search.js +64 -96
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +174 -231
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +95 -130
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +194 -239
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/types.d.ts +198 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +26 -55
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.d.ts.map +1 -0
- package/dist/src/update/checker.js +106 -183
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts +32 -0
- package/dist/src/update/executor.d.ts.map +1 -0
- package/dist/src/update/executor.js +135 -198
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.d.ts.map +1 -0
- package/dist/src/update/index.js +38 -85
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.d.ts.map +1 -0
- package/dist/src/update/rate-limiter.js +19 -31
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.d.ts.map +1 -0
- package/dist/src/update/validator.js +38 -64
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -16,82 +16,26 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module v3/cli/memory-bridge
|
|
18
18
|
*/
|
|
19
|
-
var __assign = (this && this.__assign) || function () {
|
|
20
|
-
__assign = Object.assign || function(t) {
|
|
21
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
22
|
-
s = arguments[i];
|
|
23
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
24
|
-
t[p] = s[p];
|
|
25
|
-
}
|
|
26
|
-
return t;
|
|
27
|
-
};
|
|
28
|
-
return __assign.apply(this, arguments);
|
|
29
|
-
};
|
|
30
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
31
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
32
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
33
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
34
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
35
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
36
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
40
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
41
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
42
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
43
|
-
function step(op) {
|
|
44
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
45
|
-
while (_) try {
|
|
46
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
47
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
48
|
-
switch (op[0]) {
|
|
49
|
-
case 0: case 1: t = op; break;
|
|
50
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
51
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
52
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
53
|
-
default:
|
|
54
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
55
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
56
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
57
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
58
|
-
if (t[2]) _.ops.pop();
|
|
59
|
-
_.trys.pop(); continue;
|
|
60
|
-
}
|
|
61
|
-
op = body.call(thisArg, _);
|
|
62
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
63
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
67
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
68
|
-
if (ar || !(i in from)) {
|
|
69
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
70
|
-
ar[i] = from[i];
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
74
|
-
};
|
|
75
19
|
import * as path from 'path';
|
|
76
20
|
import * as crypto from 'crypto';
|
|
77
21
|
// ===== Lazy singleton =====
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
22
|
+
let registryPromise = null;
|
|
23
|
+
let registryInstance = null;
|
|
24
|
+
let bridgeAvailable = null;
|
|
81
25
|
/**
|
|
82
26
|
* Resolve database path with path traversal protection.
|
|
83
27
|
* Only allows paths within or below the project's .swarm directory,
|
|
84
28
|
* or the special ':memory:' path.
|
|
85
29
|
*/
|
|
86
30
|
function getDbPath(customPath) {
|
|
87
|
-
|
|
31
|
+
const swarmDir = path.resolve(process.cwd(), '.swarm');
|
|
88
32
|
if (!customPath)
|
|
89
33
|
return path.join(swarmDir, 'memory.db');
|
|
90
34
|
if (customPath === ':memory:')
|
|
91
35
|
return ':memory:';
|
|
92
|
-
|
|
36
|
+
const resolved = path.resolve(customPath);
|
|
93
37
|
// Ensure the path doesn't escape the working directory
|
|
94
|
-
|
|
38
|
+
const cwd = process.cwd();
|
|
95
39
|
if (!resolved.startsWith(cwd)) {
|
|
96
40
|
return path.join(swarmDir, 'memory.db'); // fallback to safe default
|
|
97
41
|
}
|
|
@@ -101,85 +45,63 @@ function getDbPath(customPath) {
|
|
|
101
45
|
* Generate a secure random ID for memory entries.
|
|
102
46
|
*/
|
|
103
47
|
function generateId(prefix) {
|
|
104
|
-
return prefix
|
|
48
|
+
return `${prefix}_${Date.now()}_${crypto.randomBytes(8).toString('hex')}`;
|
|
105
49
|
}
|
|
106
50
|
/**
|
|
107
51
|
* Lazily initialize the ControllerRegistry singleton.
|
|
108
52
|
* Returns null if @claude-flow/memory is not available.
|
|
109
53
|
*/
|
|
110
|
-
function getRegistry(dbPath) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
};
|
|
145
|
-
_b.label = 2;
|
|
146
|
-
case 2:
|
|
147
|
-
_b.trys.push([2, , 4, 5]);
|
|
148
|
-
return [4 /*yield*/, registry.initialize({
|
|
149
|
-
dbPath: dbPath || getDbPath(),
|
|
150
|
-
dimension: 384,
|
|
151
|
-
controllers: {
|
|
152
|
-
reasoningBank: true,
|
|
153
|
-
learningBridge: false,
|
|
154
|
-
tieredCache: true,
|
|
155
|
-
hierarchicalMemory: true,
|
|
156
|
-
memoryConsolidation: true,
|
|
157
|
-
memoryGraph: true
|
|
158
|
-
}
|
|
159
|
-
})];
|
|
160
|
-
case 3:
|
|
161
|
-
_b.sent();
|
|
162
|
-
return [3 /*break*/, 5];
|
|
163
|
-
case 4:
|
|
164
|
-
console.log = origLog_1;
|
|
165
|
-
return [7 /*endfinally*/];
|
|
166
|
-
case 5:
|
|
167
|
-
registryInstance = registry;
|
|
168
|
-
bridgeAvailable = true;
|
|
169
|
-
return [2 /*return*/, registry];
|
|
170
|
-
case 6:
|
|
171
|
-
_a = _b.sent();
|
|
172
|
-
bridgeAvailable = false;
|
|
173
|
-
registryPromise = null;
|
|
174
|
-
return [2 /*return*/, null];
|
|
175
|
-
case 7: return [2 /*return*/];
|
|
176
|
-
}
|
|
54
|
+
async function getRegistry(dbPath) {
|
|
55
|
+
if (bridgeAvailable === false)
|
|
56
|
+
return null;
|
|
57
|
+
if (registryInstance)
|
|
58
|
+
return registryInstance;
|
|
59
|
+
if (!registryPromise) {
|
|
60
|
+
registryPromise = (async () => {
|
|
61
|
+
try {
|
|
62
|
+
const { ControllerRegistry } = await import('@claude-flow/memory');
|
|
63
|
+
const registry = new ControllerRegistry();
|
|
64
|
+
// Suppress noisy console.log during init
|
|
65
|
+
const origLog = console.log;
|
|
66
|
+
console.log = (...args) => {
|
|
67
|
+
const msg = String(args[0] ?? '');
|
|
68
|
+
if (msg.includes('Transformers.js') ||
|
|
69
|
+
msg.includes('better-sqlite3') ||
|
|
70
|
+
msg.includes('[AgentDB]') ||
|
|
71
|
+
msg.includes('[HNSWLibBackend]') ||
|
|
72
|
+
msg.includes('RuVector graph'))
|
|
73
|
+
return;
|
|
74
|
+
origLog.apply(console, args);
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
await registry.initialize({
|
|
78
|
+
dbPath: dbPath || getDbPath(),
|
|
79
|
+
dimension: 384,
|
|
80
|
+
controllers: {
|
|
81
|
+
reasoningBank: true,
|
|
82
|
+
learningBridge: false,
|
|
83
|
+
tieredCache: true,
|
|
84
|
+
hierarchicalMemory: true,
|
|
85
|
+
memoryConsolidation: true,
|
|
86
|
+
memoryGraph: true, // issue #1214: enable MemoryGraph for graph-aware ranking
|
|
87
|
+
},
|
|
177
88
|
});
|
|
178
|
-
}
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
console.log = origLog;
|
|
92
|
+
}
|
|
93
|
+
registryInstance = registry;
|
|
94
|
+
bridgeAvailable = true;
|
|
95
|
+
return registry;
|
|
179
96
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
97
|
+
catch {
|
|
98
|
+
bridgeAvailable = false;
|
|
99
|
+
registryPromise = null;
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
}
|
|
104
|
+
return registryPromise;
|
|
183
105
|
}
|
|
184
106
|
// ===== Phase 2: BM25 hybrid scoring =====
|
|
185
107
|
/**
|
|
@@ -188,23 +110,19 @@ function getRegistry(dbPath) {
|
|
|
188
110
|
* Parameters tuned for short memory entries (k1=1.2, b=0.75).
|
|
189
111
|
*/
|
|
190
112
|
function bm25Score(queryTerms, docContent, avgDocLength, docCount, termDocFreqs) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
113
|
+
const k1 = 1.2;
|
|
114
|
+
const b = 0.75;
|
|
115
|
+
const docWords = docContent.toLowerCase().split(/\s+/);
|
|
116
|
+
const docLength = docWords.length;
|
|
117
|
+
let score = 0;
|
|
118
|
+
for (const term of queryTerms) {
|
|
119
|
+
const tf = docWords.filter(w => w === term || w.includes(term)).length;
|
|
198
120
|
if (tf === 0)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
121
|
+
continue;
|
|
122
|
+
const df = termDocFreqs.get(term) || 1;
|
|
123
|
+
const idf = Math.log((docCount - df + 0.5) / (df + 0.5) + 1);
|
|
124
|
+
const tfNorm = (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLength / Math.max(1, avgDocLength))));
|
|
203
125
|
score += idf * tfNorm;
|
|
204
|
-
};
|
|
205
|
-
for (var _i = 0, queryTerms_1 = queryTerms; _i < queryTerms_1.length; _i++) {
|
|
206
|
-
var term = queryTerms_1[_i];
|
|
207
|
-
_loop_1(term);
|
|
208
126
|
}
|
|
209
127
|
return score;
|
|
210
128
|
}
|
|
@@ -212,84 +130,63 @@ function bm25Score(queryTerms, docContent, avgDocLength, docCount, termDocFreqs)
|
|
|
212
130
|
* Compute BM25 term document frequencies for a set of rows.
|
|
213
131
|
*/
|
|
214
132
|
function computeTermDocFreqs(queryTerms, rows) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
for (
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
var words = content.split(/\s+/);
|
|
133
|
+
const termDocFreqs = new Map();
|
|
134
|
+
let totalLength = 0;
|
|
135
|
+
for (const row of rows) {
|
|
136
|
+
const content = (row.content || '').toLowerCase();
|
|
137
|
+
const words = content.split(/\s+/);
|
|
221
138
|
totalLength += words.length;
|
|
222
|
-
for (
|
|
223
|
-
var term = queryTerms_2[_a];
|
|
139
|
+
for (const term of queryTerms) {
|
|
224
140
|
if (content.includes(term)) {
|
|
225
141
|
termDocFreqs.set(term, (termDocFreqs.get(term) || 0) + 1);
|
|
226
142
|
}
|
|
227
143
|
}
|
|
228
144
|
}
|
|
229
|
-
return { termDocFreqs
|
|
145
|
+
return { termDocFreqs, avgDocLength: rows.length > 0 ? totalLength / rows.length : 1 };
|
|
230
146
|
}
|
|
231
147
|
// ===== Phase 2: TieredCache helpers =====
|
|
232
148
|
/**
|
|
233
149
|
* Try to read from TieredCache before hitting DB.
|
|
234
150
|
* Returns cached value or null if cache miss.
|
|
235
151
|
*/
|
|
236
|
-
function cacheGet(registry, cacheKey) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
catch (_c) {
|
|
248
|
-
return [2 /*return*/, null];
|
|
249
|
-
}
|
|
250
|
-
return [2 /*return*/];
|
|
251
|
-
});
|
|
252
|
-
});
|
|
152
|
+
async function cacheGet(registry, cacheKey) {
|
|
153
|
+
try {
|
|
154
|
+
const cache = registry.get('tieredCache');
|
|
155
|
+
if (!cache || typeof cache.get !== 'function')
|
|
156
|
+
return null;
|
|
157
|
+
return cache.get(cacheKey) ?? null;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
253
162
|
}
|
|
254
163
|
/**
|
|
255
164
|
* Write to TieredCache after DB write.
|
|
256
165
|
*/
|
|
257
|
-
function cacheSet(registry, cacheKey, value) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
catch (_b) {
|
|
268
|
-
// Non-fatal
|
|
269
|
-
}
|
|
270
|
-
return [2 /*return*/];
|
|
271
|
-
});
|
|
272
|
-
});
|
|
166
|
+
async function cacheSet(registry, cacheKey, value) {
|
|
167
|
+
try {
|
|
168
|
+
const cache = registry.get('tieredCache');
|
|
169
|
+
if (cache && typeof cache.set === 'function') {
|
|
170
|
+
cache.set(cacheKey, value);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Non-fatal
|
|
175
|
+
}
|
|
273
176
|
}
|
|
274
177
|
/**
|
|
275
178
|
* Invalidate a cache key after mutation.
|
|
276
179
|
*/
|
|
277
|
-
function cacheInvalidate(registry, cacheKey) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
catch (_b) {
|
|
288
|
-
// Non-fatal
|
|
289
|
-
}
|
|
290
|
-
return [2 /*return*/];
|
|
291
|
-
});
|
|
292
|
-
});
|
|
180
|
+
async function cacheInvalidate(registry, cacheKey) {
|
|
181
|
+
try {
|
|
182
|
+
const cache = registry.get('tieredCache');
|
|
183
|
+
if (cache && typeof cache.delete === 'function') {
|
|
184
|
+
cache.delete(cacheKey);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Non-fatal
|
|
189
|
+
}
|
|
293
190
|
}
|
|
294
191
|
// ===== Phase 2: MutationGuard helpers =====
|
|
295
192
|
/**
|
|
@@ -298,72 +195,79 @@ function cacheInvalidate(registry, cacheKey) {
|
|
|
298
195
|
* When guard is unavailable (not installed), mutations are allowed.
|
|
299
196
|
* When guard is present but throws, mutations are DENIED (fail-closed).
|
|
300
197
|
*/
|
|
301
|
-
function guardValidate(registry, operation, params) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
catch (_b) {
|
|
314
|
-
return [2 /*return*/, { allowed: false, reason: 'MutationGuard validation error' }]; // Fail-closed
|
|
315
|
-
}
|
|
316
|
-
return [2 /*return*/];
|
|
317
|
-
});
|
|
318
|
-
});
|
|
198
|
+
async function guardValidate(registry, operation, params) {
|
|
199
|
+
try {
|
|
200
|
+
const guard = registry.get('mutationGuard');
|
|
201
|
+
if (!guard || typeof guard.validate !== 'function') {
|
|
202
|
+
return { allowed: true }; // No guard installed = allow (degraded mode)
|
|
203
|
+
}
|
|
204
|
+
const result = guard.validate({ operation, params, timestamp: Date.now() });
|
|
205
|
+
return { allowed: result?.allowed === true, reason: result?.reason };
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return { allowed: false, reason: 'MutationGuard validation error' }; // Fail-closed
|
|
209
|
+
}
|
|
319
210
|
}
|
|
320
211
|
// ===== Phase 3: AttestationLog helpers =====
|
|
321
212
|
/**
|
|
322
213
|
* Log a write operation to AttestationLog/WitnessChain.
|
|
323
214
|
*/
|
|
324
|
-
function logAttestation(registry, operation, entryId, metadata) {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
catch (_b) {
|
|
340
|
-
// Non-fatal — attestation is observability, not correctness
|
|
341
|
-
}
|
|
342
|
-
return [2 /*return*/];
|
|
343
|
-
});
|
|
344
|
-
});
|
|
215
|
+
async function logAttestation(registry, operation, entryId, metadata) {
|
|
216
|
+
try {
|
|
217
|
+
const attestation = registry.get('attestationLog');
|
|
218
|
+
if (!attestation)
|
|
219
|
+
return;
|
|
220
|
+
if (typeof attestation.record === 'function') {
|
|
221
|
+
attestation.record({ operation, entryId, timestamp: Date.now(), ...metadata });
|
|
222
|
+
}
|
|
223
|
+
else if (typeof attestation.log === 'function') {
|
|
224
|
+
attestation.log(operation, entryId, metadata);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Non-fatal — attestation is observability, not correctness
|
|
229
|
+
}
|
|
345
230
|
}
|
|
346
231
|
/**
|
|
347
232
|
* Get the AgentDB database handle and ensure memory_entries table exists.
|
|
348
233
|
* Returns null if not available.
|
|
349
234
|
*/
|
|
350
235
|
function getDb(registry) {
|
|
351
|
-
|
|
352
|
-
if (!
|
|
236
|
+
const agentdb = registry.getAgentDB();
|
|
237
|
+
if (!agentdb?.database)
|
|
353
238
|
return null;
|
|
354
|
-
|
|
239
|
+
const db = agentdb.database;
|
|
355
240
|
// Ensure memory_entries table exists (idempotent)
|
|
356
241
|
try {
|
|
357
|
-
db.exec(
|
|
242
|
+
db.exec(`CREATE TABLE IF NOT EXISTS memory_entries (
|
|
243
|
+
id TEXT PRIMARY KEY,
|
|
244
|
+
key TEXT NOT NULL,
|
|
245
|
+
namespace TEXT DEFAULT 'default',
|
|
246
|
+
content TEXT NOT NULL,
|
|
247
|
+
type TEXT DEFAULT 'semantic',
|
|
248
|
+
embedding TEXT,
|
|
249
|
+
embedding_model TEXT DEFAULT 'local',
|
|
250
|
+
embedding_dimensions INTEGER,
|
|
251
|
+
tags TEXT,
|
|
252
|
+
metadata TEXT,
|
|
253
|
+
owner_id TEXT,
|
|
254
|
+
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
255
|
+
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
256
|
+
expires_at INTEGER,
|
|
257
|
+
last_accessed_at INTEGER,
|
|
258
|
+
access_count INTEGER DEFAULT 0,
|
|
259
|
+
status TEXT DEFAULT 'active',
|
|
260
|
+
UNIQUE(namespace, key)
|
|
261
|
+
)`);
|
|
358
262
|
// Ensure indexes
|
|
359
|
-
db.exec(
|
|
360
|
-
db.exec(
|
|
361
|
-
db.exec(
|
|
263
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_bridge_ns ON memory_entries(namespace)`);
|
|
264
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_bridge_key ON memory_entries(key)`);
|
|
265
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_bridge_status ON memory_entries(status)`);
|
|
362
266
|
}
|
|
363
|
-
catch
|
|
267
|
+
catch {
|
|
364
268
|
// Table already exists or db is read-only — that's fine
|
|
365
269
|
}
|
|
366
|
-
return { db
|
|
270
|
+
return { db, agentdb };
|
|
367
271
|
}
|
|
368
272
|
// ===== Bridge functions — match memory-initializer.ts signatures =====
|
|
369
273
|
/**
|
|
@@ -371,1276 +275,994 @@ function getDb(registry) {
|
|
|
371
275
|
* Phase 2-5: Routes through MutationGuard → TieredCache → DB → AttestationLog.
|
|
372
276
|
* Returns null to signal fallback to sql.js.
|
|
373
277
|
*/
|
|
374
|
-
export function bridgeStoreEntry(options) {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
return
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
embeddingJson = null;
|
|
400
|
-
dimensions = 0;
|
|
401
|
-
model = 'local';
|
|
402
|
-
if (!(options.generateEmbeddingFlag !== false && value.length > 0)) return [3 /*break*/, 8];
|
|
403
|
-
_e.label = 4;
|
|
404
|
-
case 4:
|
|
405
|
-
_e.trys.push([4, 7, , 8]);
|
|
406
|
-
embedder = ctx.agentdb.embedder;
|
|
407
|
-
if (!embedder) return [3 /*break*/, 6];
|
|
408
|
-
return [4 /*yield*/, embedder.embed(value)];
|
|
409
|
-
case 5:
|
|
410
|
-
emb = _e.sent();
|
|
278
|
+
export async function bridgeStoreEntry(options) {
|
|
279
|
+
const registry = await getRegistry(options.dbPath);
|
|
280
|
+
if (!registry)
|
|
281
|
+
return null;
|
|
282
|
+
const ctx = getDb(registry);
|
|
283
|
+
if (!ctx)
|
|
284
|
+
return null;
|
|
285
|
+
try {
|
|
286
|
+
const { key, value, namespace = 'default', tags = [], ttl } = options;
|
|
287
|
+
const id = generateId('entry');
|
|
288
|
+
const now = Date.now();
|
|
289
|
+
// Phase 5: MutationGuard validation before write
|
|
290
|
+
const guardResult = await guardValidate(registry, 'store', { key, namespace, size: value.length });
|
|
291
|
+
if (!guardResult.allowed) {
|
|
292
|
+
return { success: false, id, error: `MutationGuard rejected: ${guardResult.reason}` };
|
|
293
|
+
}
|
|
294
|
+
// Generate embedding via AgentDB's embedder
|
|
295
|
+
let embeddingJson = null;
|
|
296
|
+
let dimensions = 0;
|
|
297
|
+
let model = 'local';
|
|
298
|
+
if (options.generateEmbeddingFlag !== false && value.length > 0) {
|
|
299
|
+
try {
|
|
300
|
+
const embedder = ctx.agentdb.embedder;
|
|
301
|
+
if (embedder) {
|
|
302
|
+
const emb = await embedder.embed(value);
|
|
411
303
|
if (emb) {
|
|
412
304
|
embeddingJson = JSON.stringify(Array.from(emb));
|
|
413
305
|
dimensions = emb.length;
|
|
414
306
|
model = 'Xenova/all-MiniLM-L6-v2';
|
|
415
307
|
}
|
|
416
|
-
|
|
417
|
-
case 6: return [3 /*break*/, 8];
|
|
418
|
-
case 7:
|
|
419
|
-
_c = _e.sent();
|
|
420
|
-
return [3 /*break*/, 8];
|
|
421
|
-
case 8:
|
|
422
|
-
insertSql = options.upsert
|
|
423
|
-
? "INSERT OR REPLACE INTO memory_entries (\n id, key, namespace, content, type,\n embedding, embedding_dimensions, embedding_model,\n tags, metadata, created_at, updated_at, expires_at, status\n ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')"
|
|
424
|
-
: "INSERT INTO memory_entries (\n id, key, namespace, content, type,\n embedding, embedding_dimensions, embedding_model,\n tags, metadata, created_at, updated_at, expires_at, status\n ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')";
|
|
425
|
-
stmt = ctx.db.prepare(insertSql);
|
|
426
|
-
stmt.run(id, key, namespace, value, embeddingJson, dimensions || null, model, tags.length > 0 ? JSON.stringify(tags) : null, '{}', now, now, ttl ? now + (ttl * 1000) : null);
|
|
427
|
-
safeNs = String(namespace).replace(/:/g, '_');
|
|
428
|
-
safeKey = String(key).replace(/:/g, '_');
|
|
429
|
-
cacheKey = "entry:" + safeNs + ":" + safeKey;
|
|
430
|
-
return [4 /*yield*/, cacheSet(registry, cacheKey, { id: id, key: key, namespace: namespace, content: value, embedding: embeddingJson })];
|
|
431
|
-
case 9:
|
|
432
|
-
_e.sent();
|
|
433
|
-
// Phase 4: AttestationLog write audit
|
|
434
|
-
return [4 /*yield*/, logAttestation(registry, 'store', id, { key: key, namespace: namespace, hasEmbedding: !!embeddingJson })];
|
|
435
|
-
case 10:
|
|
436
|
-
// Phase 4: AttestationLog write audit
|
|
437
|
-
_e.sent();
|
|
438
|
-
return [2 /*return*/, {
|
|
439
|
-
success: true,
|
|
440
|
-
id: id,
|
|
441
|
-
embedding: embeddingJson ? { dimensions: dimensions, model: model } : undefined,
|
|
442
|
-
guarded: true,
|
|
443
|
-
cached: true,
|
|
444
|
-
attested: true
|
|
445
|
-
}];
|
|
446
|
-
case 11:
|
|
447
|
-
_d = _e.sent();
|
|
448
|
-
return [2 /*return*/, null];
|
|
449
|
-
case 12: return [2 /*return*/];
|
|
308
|
+
}
|
|
450
309
|
}
|
|
451
|
-
|
|
452
|
-
|
|
310
|
+
catch {
|
|
311
|
+
// Embedding failed — store without
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// better-sqlite3 uses synchronous .run() with positional params
|
|
315
|
+
const insertSql = options.upsert
|
|
316
|
+
? `INSERT OR REPLACE INTO memory_entries (
|
|
317
|
+
id, key, namespace, content, type,
|
|
318
|
+
embedding, embedding_dimensions, embedding_model,
|
|
319
|
+
tags, metadata, created_at, updated_at, expires_at, status
|
|
320
|
+
) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`
|
|
321
|
+
: `INSERT INTO memory_entries (
|
|
322
|
+
id, key, namespace, content, type,
|
|
323
|
+
embedding, embedding_dimensions, embedding_model,
|
|
324
|
+
tags, metadata, created_at, updated_at, expires_at, status
|
|
325
|
+
) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`;
|
|
326
|
+
const stmt = ctx.db.prepare(insertSql);
|
|
327
|
+
stmt.run(id, key, namespace, value, embeddingJson, dimensions || null, model, tags.length > 0 ? JSON.stringify(tags) : null, '{}', now, now, ttl ? now + (ttl * 1000) : null);
|
|
328
|
+
// Phase 2: Write-through to TieredCache
|
|
329
|
+
const safeNs = String(namespace).replace(/:/g, '_');
|
|
330
|
+
const safeKey = String(key).replace(/:/g, '_');
|
|
331
|
+
const cacheKey = `entry:${safeNs}:${safeKey}`;
|
|
332
|
+
await cacheSet(registry, cacheKey, { id, key, namespace, content: value, embedding: embeddingJson });
|
|
333
|
+
// Phase 4: AttestationLog write audit
|
|
334
|
+
await logAttestation(registry, 'store', id, { key, namespace, hasEmbedding: !!embeddingJson });
|
|
335
|
+
return {
|
|
336
|
+
success: true,
|
|
337
|
+
id,
|
|
338
|
+
embedding: embeddingJson ? { dimensions, model } : undefined,
|
|
339
|
+
guarded: true,
|
|
340
|
+
cached: true,
|
|
341
|
+
attested: true,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
453
347
|
}
|
|
454
348
|
/**
|
|
455
349
|
* Search entries via AgentDB v3.
|
|
456
350
|
* Phase 2: BM25 hybrid scoring replaces naive String.includes() keyword fallback.
|
|
457
351
|
* Combines cosine similarity (semantic) with BM25 (lexical) via reciprocal rank fusion.
|
|
458
352
|
*/
|
|
459
|
-
export function bridgeSearchEntries(options) {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
return
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
startTime = Date.now();
|
|
477
|
-
queryEmbedding = null;
|
|
478
|
-
_g.label = 3;
|
|
479
|
-
case 3:
|
|
480
|
-
_g.trys.push([3, 6, , 7]);
|
|
481
|
-
embedder = ctx.agentdb.embedder;
|
|
482
|
-
if (!embedder) return [3 /*break*/, 5];
|
|
483
|
-
return [4 /*yield*/, embedder.embed(queryStr)];
|
|
484
|
-
case 4:
|
|
485
|
-
emb = _g.sent();
|
|
486
|
-
queryEmbedding = Array.from(emb);
|
|
487
|
-
_g.label = 5;
|
|
488
|
-
case 5: return [3 /*break*/, 7];
|
|
489
|
-
case 6:
|
|
490
|
-
_d = _g.sent();
|
|
491
|
-
return [3 /*break*/, 7];
|
|
492
|
-
case 7:
|
|
493
|
-
nsFilter = namespace !== 'all'
|
|
494
|
-
? "AND namespace = ?"
|
|
495
|
-
: '';
|
|
496
|
-
rows = void 0;
|
|
497
|
-
try {
|
|
498
|
-
stmt = ctx.db.prepare("\n SELECT id, key, namespace, content, embedding\n FROM memory_entries\n WHERE status = 'active' " + nsFilter + "\n LIMIT 1000\n ");
|
|
499
|
-
rows = namespace !== 'all' ? stmt.all(namespace) : stmt.all();
|
|
500
|
-
}
|
|
501
|
-
catch (_h) {
|
|
502
|
-
return [2 /*return*/, null];
|
|
503
|
-
}
|
|
504
|
-
queryTerms = queryStr.toLowerCase().split(/\s+/).filter(function (t) { return t.length > 1; });
|
|
505
|
-
_e = computeTermDocFreqs(queryTerms, rows), termDocFreqs = _e.termDocFreqs, avgDocLength = _e.avgDocLength;
|
|
506
|
-
docCount = rows.length;
|
|
507
|
-
results = [];
|
|
508
|
-
for (_i = 0, rows_2 = rows; _i < rows_2.length; _i++) {
|
|
509
|
-
row = rows_2[_i];
|
|
510
|
-
semanticScore = 0;
|
|
511
|
-
bm25ScoreVal = 0;
|
|
512
|
-
// Semantic scoring via cosine similarity
|
|
513
|
-
if (queryEmbedding && row.embedding) {
|
|
514
|
-
try {
|
|
515
|
-
embedding = JSON.parse(row.embedding);
|
|
516
|
-
semanticScore = cosineSim(queryEmbedding, embedding);
|
|
517
|
-
}
|
|
518
|
-
catch (_j) {
|
|
519
|
-
// Invalid embedding
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
// Phase 2: BM25 keyword scoring (replaces String.includes fallback)
|
|
523
|
-
if (queryTerms.length > 0 && row.content) {
|
|
524
|
-
bm25ScoreVal = bm25Score(queryTerms, row.content, avgDocLength, docCount, termDocFreqs);
|
|
525
|
-
// Normalize BM25 to 0-1 range (cap at 10 for normalization)
|
|
526
|
-
bm25ScoreVal = Math.min(bm25ScoreVal / 10, 1.0);
|
|
527
|
-
}
|
|
528
|
-
score = queryEmbedding
|
|
529
|
-
? (0.7 * semanticScore + 0.3 * bm25ScoreVal)
|
|
530
|
-
: bm25ScoreVal;
|
|
531
|
-
if (score >= threshold) {
|
|
532
|
-
provenance = queryEmbedding
|
|
533
|
-
? "semantic:" + semanticScore.toFixed(3) + "+bm25:" + bm25ScoreVal.toFixed(3)
|
|
534
|
-
: "bm25:" + bm25ScoreVal.toFixed(3);
|
|
535
|
-
results.push({
|
|
536
|
-
id: String(row.id).substring(0, 12),
|
|
537
|
-
key: row.key || String(row.id).substring(0, 15),
|
|
538
|
-
content: (row.content || '').substring(0, 60) + ((row.content || '').length > 60 ? '...' : ''),
|
|
539
|
-
score: score,
|
|
540
|
-
namespace: row.namespace || 'default',
|
|
541
|
-
provenance: provenance
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
results.sort(function (a, b) { return b.score - a.score; });
|
|
546
|
-
return [2 /*return*/, {
|
|
547
|
-
success: true,
|
|
548
|
-
results: results.slice(0, limit),
|
|
549
|
-
searchTime: Date.now() - startTime,
|
|
550
|
-
searchMethod: queryEmbedding ? 'hybrid-bm25-semantic' : 'bm25-only'
|
|
551
|
-
}];
|
|
552
|
-
case 8:
|
|
553
|
-
_f = _g.sent();
|
|
554
|
-
return [2 /*return*/, null];
|
|
555
|
-
case 9: return [2 /*return*/];
|
|
353
|
+
export async function bridgeSearchEntries(options) {
|
|
354
|
+
const registry = await getRegistry(options.dbPath);
|
|
355
|
+
if (!registry)
|
|
356
|
+
return null;
|
|
357
|
+
const ctx = getDb(registry);
|
|
358
|
+
if (!ctx)
|
|
359
|
+
return null;
|
|
360
|
+
try {
|
|
361
|
+
const { query: queryStr, namespace = 'default', limit = 10, threshold = 0.3 } = options;
|
|
362
|
+
const startTime = Date.now();
|
|
363
|
+
// Generate query embedding
|
|
364
|
+
let queryEmbedding = null;
|
|
365
|
+
try {
|
|
366
|
+
const embedder = ctx.agentdb.embedder;
|
|
367
|
+
if (embedder) {
|
|
368
|
+
const emb = await embedder.embed(queryStr);
|
|
369
|
+
queryEmbedding = Array.from(emb);
|
|
556
370
|
}
|
|
557
|
-
}
|
|
558
|
-
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// Fall back to keyword search
|
|
374
|
+
}
|
|
375
|
+
// better-sqlite3: .prepare().all() returns array of objects
|
|
376
|
+
const nsFilter = namespace !== 'all'
|
|
377
|
+
? `AND namespace = ?`
|
|
378
|
+
: '';
|
|
379
|
+
let rows;
|
|
380
|
+
try {
|
|
381
|
+
const stmt = ctx.db.prepare(`
|
|
382
|
+
SELECT id, key, namespace, content, embedding
|
|
383
|
+
FROM memory_entries
|
|
384
|
+
WHERE status = 'active' ${nsFilter}
|
|
385
|
+
LIMIT 1000
|
|
386
|
+
`);
|
|
387
|
+
rows = namespace !== 'all' ? stmt.all(namespace) : stmt.all();
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
// Phase 2: Compute BM25 term stats for the corpus
|
|
393
|
+
const queryTerms = queryStr.toLowerCase().split(/\s+/).filter(t => t.length > 1);
|
|
394
|
+
const { termDocFreqs, avgDocLength } = computeTermDocFreqs(queryTerms, rows);
|
|
395
|
+
const docCount = rows.length;
|
|
396
|
+
const results = [];
|
|
397
|
+
for (const row of rows) {
|
|
398
|
+
let semanticScore = 0;
|
|
399
|
+
let bm25ScoreVal = 0;
|
|
400
|
+
// Semantic scoring via cosine similarity
|
|
401
|
+
if (queryEmbedding && row.embedding) {
|
|
402
|
+
try {
|
|
403
|
+
const embedding = JSON.parse(row.embedding);
|
|
404
|
+
semanticScore = cosineSim(queryEmbedding, embedding);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Invalid embedding
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// Phase 2: BM25 keyword scoring (replaces String.includes fallback)
|
|
411
|
+
if (queryTerms.length > 0 && row.content) {
|
|
412
|
+
bm25ScoreVal = bm25Score(queryTerms, row.content, avgDocLength, docCount, termDocFreqs);
|
|
413
|
+
// Normalize BM25 to 0-1 range (cap at 10 for normalization)
|
|
414
|
+
bm25ScoreVal = Math.min(bm25ScoreVal / 10, 1.0);
|
|
415
|
+
}
|
|
416
|
+
// Reciprocal rank fusion: combine semantic and BM25
|
|
417
|
+
// Weight: 0.7 semantic + 0.3 BM25 (semantic preferred when embeddings available)
|
|
418
|
+
const score = queryEmbedding
|
|
419
|
+
? (0.7 * semanticScore + 0.3 * bm25ScoreVal)
|
|
420
|
+
: bm25ScoreVal; // BM25-only when no embeddings
|
|
421
|
+
if (score >= threshold) {
|
|
422
|
+
// Phase 4: ExplainableRecall provenance
|
|
423
|
+
const provenance = queryEmbedding
|
|
424
|
+
? `semantic:${semanticScore.toFixed(3)}+bm25:${bm25ScoreVal.toFixed(3)}`
|
|
425
|
+
: `bm25:${bm25ScoreVal.toFixed(3)}`;
|
|
426
|
+
results.push({
|
|
427
|
+
id: String(row.id).substring(0, 12),
|
|
428
|
+
key: row.key || String(row.id).substring(0, 15),
|
|
429
|
+
content: (row.content || '').substring(0, 60) + ((row.content || '').length > 60 ? '...' : ''),
|
|
430
|
+
score,
|
|
431
|
+
namespace: row.namespace || 'default',
|
|
432
|
+
provenance,
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
results.sort((a, b) => b.score - a.score);
|
|
437
|
+
return {
|
|
438
|
+
success: true,
|
|
439
|
+
results: results.slice(0, limit),
|
|
440
|
+
searchTime: Date.now() - startTime,
|
|
441
|
+
searchMethod: queryEmbedding ? 'hybrid-bm25-semantic' : 'bm25-only',
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
559
447
|
}
|
|
560
448
|
/**
|
|
561
449
|
* List entries via AgentDB v3.
|
|
562
450
|
*/
|
|
563
|
-
export function bridgeListEntries(options) {
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
catch (_g) {
|
|
609
|
-
return [2 /*return*/, null];
|
|
610
|
-
}
|
|
611
|
-
return [2 /*return*/, { success: true, entries: entries, total: total }];
|
|
612
|
-
}
|
|
613
|
-
catch (_h) {
|
|
614
|
-
return [2 /*return*/, null];
|
|
615
|
-
}
|
|
616
|
-
return [2 /*return*/];
|
|
451
|
+
export async function bridgeListEntries(options) {
|
|
452
|
+
const registry = await getRegistry(options.dbPath);
|
|
453
|
+
if (!registry)
|
|
454
|
+
return null;
|
|
455
|
+
const ctx = getDb(registry);
|
|
456
|
+
if (!ctx)
|
|
457
|
+
return null;
|
|
458
|
+
try {
|
|
459
|
+
const { namespace, limit = 20, offset = 0 } = options;
|
|
460
|
+
const nsFilter = namespace ? `AND namespace = ?` : '';
|
|
461
|
+
const nsParams = namespace ? [namespace] : [];
|
|
462
|
+
// Count
|
|
463
|
+
let total = 0;
|
|
464
|
+
try {
|
|
465
|
+
const countStmt = ctx.db.prepare(`SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' ${nsFilter}`);
|
|
466
|
+
const countRow = countStmt.get(...nsParams);
|
|
467
|
+
total = countRow?.cnt ?? 0;
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
// List
|
|
473
|
+
const entries = [];
|
|
474
|
+
try {
|
|
475
|
+
const stmt = ctx.db.prepare(`
|
|
476
|
+
SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at
|
|
477
|
+
FROM memory_entries
|
|
478
|
+
WHERE status = 'active' ${nsFilter}
|
|
479
|
+
ORDER BY updated_at DESC
|
|
480
|
+
LIMIT ? OFFSET ?
|
|
481
|
+
`);
|
|
482
|
+
const rows = stmt.all(...nsParams, limit, offset);
|
|
483
|
+
for (const row of rows) {
|
|
484
|
+
entries.push({
|
|
485
|
+
id: String(row.id).substring(0, 20),
|
|
486
|
+
key: row.key || String(row.id).substring(0, 15),
|
|
487
|
+
namespace: row.namespace || 'default',
|
|
488
|
+
size: (row.content || '').length,
|
|
489
|
+
accessCount: row.access_count ?? 0,
|
|
490
|
+
createdAt: row.created_at || new Date().toISOString(),
|
|
491
|
+
updatedAt: row.updated_at || new Date().toISOString(),
|
|
492
|
+
hasEmbedding: !!(row.embedding && String(row.embedding).length > 10),
|
|
493
|
+
});
|
|
617
494
|
}
|
|
618
|
-
}
|
|
619
|
-
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
return null;
|
|
498
|
+
}
|
|
499
|
+
return { success: true, entries, total };
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
620
504
|
}
|
|
621
505
|
/**
|
|
622
506
|
* Get a specific entry via AgentDB v3.
|
|
623
507
|
* Phase 2: TieredCache consulted before DB hit.
|
|
624
508
|
*/
|
|
625
|
-
export function bridgeGetEntry(options) {
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
cached
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
}
|
|
685
|
-
tags = [];
|
|
686
|
-
if (row.tags) {
|
|
687
|
-
try {
|
|
688
|
-
tags = JSON.parse(row.tags);
|
|
689
|
-
}
|
|
690
|
-
catch ( /* invalid */_h) { /* invalid */ }
|
|
691
|
-
}
|
|
692
|
-
entry = {
|
|
693
|
-
id: String(row.id),
|
|
694
|
-
key: row.key || String(row.id),
|
|
695
|
-
namespace: row.namespace || 'default',
|
|
696
|
-
content: row.content || '',
|
|
697
|
-
accessCount: ((_b = row.access_count) !== null && _b !== void 0 ? _b : 0) + 1,
|
|
698
|
-
createdAt: row.created_at || new Date().toISOString(),
|
|
699
|
-
updatedAt: row.updated_at || new Date().toISOString(),
|
|
700
|
-
hasEmbedding: !!(row.embedding && String(row.embedding).length > 10),
|
|
701
|
-
tags: tags
|
|
702
|
-
};
|
|
703
|
-
// Phase 2: Populate cache for next read
|
|
704
|
-
return [4 /*yield*/, cacheSet(registry, cacheKey, entry)];
|
|
705
|
-
case 4:
|
|
706
|
-
// Phase 2: Populate cache for next read
|
|
707
|
-
_e.sent();
|
|
708
|
-
return [2 /*return*/, { success: true, found: true, cacheHit: false, entry: entry }];
|
|
709
|
-
case 5:
|
|
710
|
-
_d = _e.sent();
|
|
711
|
-
return [2 /*return*/, null];
|
|
712
|
-
case 6: return [2 /*return*/];
|
|
509
|
+
export async function bridgeGetEntry(options) {
|
|
510
|
+
const registry = await getRegistry(options.dbPath);
|
|
511
|
+
if (!registry)
|
|
512
|
+
return null;
|
|
513
|
+
const ctx = getDb(registry);
|
|
514
|
+
if (!ctx)
|
|
515
|
+
return null;
|
|
516
|
+
try {
|
|
517
|
+
const { key, namespace = 'default' } = options;
|
|
518
|
+
// Phase 2: Check TieredCache first
|
|
519
|
+
const safeNs = String(namespace).replace(/:/g, '_');
|
|
520
|
+
const safeKey = String(key).replace(/:/g, '_');
|
|
521
|
+
const cacheKey = `entry:${safeNs}:${safeKey}`;
|
|
522
|
+
const cached = await cacheGet(registry, cacheKey);
|
|
523
|
+
if (cached && cached.content) {
|
|
524
|
+
return {
|
|
525
|
+
success: true,
|
|
526
|
+
found: true,
|
|
527
|
+
cacheHit: true,
|
|
528
|
+
entry: {
|
|
529
|
+
id: String(cached.id || ''),
|
|
530
|
+
key: cached.key || key,
|
|
531
|
+
namespace: cached.namespace || namespace,
|
|
532
|
+
content: cached.content || '',
|
|
533
|
+
accessCount: cached.accessCount ?? 0,
|
|
534
|
+
createdAt: cached.createdAt || new Date().toISOString(),
|
|
535
|
+
updatedAt: cached.updatedAt || new Date().toISOString(),
|
|
536
|
+
hasEmbedding: !!cached.embedding,
|
|
537
|
+
tags: cached.tags || [],
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
let row;
|
|
542
|
+
try {
|
|
543
|
+
const stmt = ctx.db.prepare(`
|
|
544
|
+
SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at, tags
|
|
545
|
+
FROM memory_entries
|
|
546
|
+
WHERE status = 'active' AND key = ? AND namespace = ?
|
|
547
|
+
LIMIT 1
|
|
548
|
+
`);
|
|
549
|
+
row = stmt.get(key, namespace);
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
return null;
|
|
553
|
+
}
|
|
554
|
+
if (!row) {
|
|
555
|
+
return { success: true, found: false };
|
|
556
|
+
}
|
|
557
|
+
// Update access count
|
|
558
|
+
try {
|
|
559
|
+
ctx.db.prepare(`UPDATE memory_entries SET access_count = access_count + 1, last_accessed_at = ? WHERE id = ?`).run(Date.now(), row.id);
|
|
560
|
+
}
|
|
561
|
+
catch {
|
|
562
|
+
// Non-fatal
|
|
563
|
+
}
|
|
564
|
+
let tags = [];
|
|
565
|
+
if (row.tags) {
|
|
566
|
+
try {
|
|
567
|
+
tags = JSON.parse(row.tags);
|
|
713
568
|
}
|
|
714
|
-
|
|
715
|
-
|
|
569
|
+
catch { /* invalid */ }
|
|
570
|
+
}
|
|
571
|
+
const entry = {
|
|
572
|
+
id: String(row.id),
|
|
573
|
+
key: row.key || String(row.id),
|
|
574
|
+
namespace: row.namespace || 'default',
|
|
575
|
+
content: row.content || '',
|
|
576
|
+
accessCount: (row.access_count ?? 0) + 1,
|
|
577
|
+
createdAt: row.created_at || new Date().toISOString(),
|
|
578
|
+
updatedAt: row.updated_at || new Date().toISOString(),
|
|
579
|
+
hasEmbedding: !!(row.embedding && String(row.embedding).length > 10),
|
|
580
|
+
tags,
|
|
581
|
+
};
|
|
582
|
+
// Phase 2: Populate cache for next read
|
|
583
|
+
await cacheSet(registry, cacheKey, entry);
|
|
584
|
+
return { success: true, found: true, cacheHit: false, entry };
|
|
585
|
+
}
|
|
586
|
+
catch {
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
716
589
|
}
|
|
717
590
|
/**
|
|
718
591
|
* Delete an entry via AgentDB v3.
|
|
719
592
|
* Phase 5: MutationGuard validation, cache invalidation, attestation logging.
|
|
720
593
|
*/
|
|
721
|
-
export function bridgeDeleteEntry(options) {
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
namespace: namespace,
|
|
777
|
-
remainingEntries: remaining,
|
|
778
|
-
guarded: true
|
|
779
|
-
}];
|
|
780
|
-
case 7:
|
|
781
|
-
_d = _e.sent();
|
|
782
|
-
return [2 /*return*/, null];
|
|
783
|
-
case 8: return [2 /*return*/];
|
|
784
|
-
}
|
|
785
|
-
});
|
|
786
|
-
});
|
|
594
|
+
export async function bridgeDeleteEntry(options) {
|
|
595
|
+
const registry = await getRegistry(options.dbPath);
|
|
596
|
+
if (!registry)
|
|
597
|
+
return null;
|
|
598
|
+
const ctx = getDb(registry);
|
|
599
|
+
if (!ctx)
|
|
600
|
+
return null;
|
|
601
|
+
try {
|
|
602
|
+
const { key, namespace = 'default' } = options;
|
|
603
|
+
// Phase 5: MutationGuard validation before delete
|
|
604
|
+
const guardResult = await guardValidate(registry, 'delete', { key, namespace });
|
|
605
|
+
if (!guardResult.allowed) {
|
|
606
|
+
return { success: false, deleted: false, key, namespace, remainingEntries: 0, error: `MutationGuard rejected: ${guardResult.reason}` };
|
|
607
|
+
}
|
|
608
|
+
// Soft delete using parameterized query
|
|
609
|
+
let changes = 0;
|
|
610
|
+
try {
|
|
611
|
+
const result = ctx.db.prepare(`
|
|
612
|
+
UPDATE memory_entries
|
|
613
|
+
SET status = 'deleted', updated_at = ?
|
|
614
|
+
WHERE key = ? AND namespace = ? AND status = 'active'
|
|
615
|
+
`).run(Date.now(), key, namespace);
|
|
616
|
+
changes = result?.changes ?? 0;
|
|
617
|
+
}
|
|
618
|
+
catch {
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
// Phase 2: Invalidate cache
|
|
622
|
+
const safeNs = String(namespace).replace(/:/g, '_');
|
|
623
|
+
const safeKey = String(key).replace(/:/g, '_');
|
|
624
|
+
await cacheInvalidate(registry, `entry:${safeNs}:${safeKey}`);
|
|
625
|
+
// Phase 4: AttestationLog delete audit
|
|
626
|
+
if (changes > 0) {
|
|
627
|
+
await logAttestation(registry, 'delete', key, { namespace });
|
|
628
|
+
}
|
|
629
|
+
let remaining = 0;
|
|
630
|
+
try {
|
|
631
|
+
const row = ctx.db.prepare(`SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active'`).get();
|
|
632
|
+
remaining = row?.cnt ?? 0;
|
|
633
|
+
}
|
|
634
|
+
catch {
|
|
635
|
+
// Non-fatal
|
|
636
|
+
}
|
|
637
|
+
return {
|
|
638
|
+
success: true,
|
|
639
|
+
deleted: changes > 0,
|
|
640
|
+
key,
|
|
641
|
+
namespace,
|
|
642
|
+
remainingEntries: remaining,
|
|
643
|
+
guarded: true,
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
catch {
|
|
647
|
+
return null;
|
|
648
|
+
}
|
|
787
649
|
}
|
|
788
650
|
// ===== Phase 2: Embedding bridge =====
|
|
789
651
|
/**
|
|
790
652
|
* Generate embedding via AgentDB v3's embedder.
|
|
791
653
|
* Returns null if bridge unavailable — caller falls back to own ONNX/hash.
|
|
792
654
|
*/
|
|
793
|
-
export function bridgeGenerateEmbedding(text, dbPath) {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
return
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
return [2 /*return*/, null];
|
|
815
|
-
return [2 /*return*/, {
|
|
816
|
-
embedding: Array.from(emb),
|
|
817
|
-
dimensions: emb.length,
|
|
818
|
-
model: 'Xenova/all-MiniLM-L6-v2'
|
|
819
|
-
}];
|
|
820
|
-
case 4:
|
|
821
|
-
_a = _b.sent();
|
|
822
|
-
return [2 /*return*/, null];
|
|
823
|
-
case 5: return [2 /*return*/];
|
|
824
|
-
}
|
|
825
|
-
});
|
|
826
|
-
});
|
|
655
|
+
export async function bridgeGenerateEmbedding(text, dbPath) {
|
|
656
|
+
const registry = await getRegistry(dbPath);
|
|
657
|
+
if (!registry)
|
|
658
|
+
return null;
|
|
659
|
+
try {
|
|
660
|
+
const agentdb = registry.getAgentDB();
|
|
661
|
+
const embedder = agentdb?.embedder;
|
|
662
|
+
if (!embedder)
|
|
663
|
+
return null;
|
|
664
|
+
const emb = await embedder.embed(text);
|
|
665
|
+
if (!emb)
|
|
666
|
+
return null;
|
|
667
|
+
return {
|
|
668
|
+
embedding: Array.from(emb),
|
|
669
|
+
dimensions: emb.length,
|
|
670
|
+
model: 'Xenova/all-MiniLM-L6-v2',
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
catch {
|
|
674
|
+
return null;
|
|
675
|
+
}
|
|
827
676
|
}
|
|
828
677
|
/**
|
|
829
678
|
* Load embedding model via AgentDB v3 (it loads on init).
|
|
830
679
|
* Returns null if unavailable.
|
|
831
680
|
*/
|
|
832
|
-
export function bridgeLoadEmbeddingModel(dbPath) {
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
return [2 /*return*/, {
|
|
857
|
-
success: true,
|
|
858
|
-
dimensions: test.length,
|
|
859
|
-
modelName: 'Xenova/all-MiniLM-L6-v2',
|
|
860
|
-
loadTime: Date.now() - startTime
|
|
861
|
-
}];
|
|
862
|
-
case 4:
|
|
863
|
-
_a = _b.sent();
|
|
864
|
-
return [2 /*return*/, null];
|
|
865
|
-
case 5: return [2 /*return*/];
|
|
866
|
-
}
|
|
867
|
-
});
|
|
868
|
-
});
|
|
681
|
+
export async function bridgeLoadEmbeddingModel(dbPath) {
|
|
682
|
+
const startTime = Date.now();
|
|
683
|
+
const registry = await getRegistry(dbPath);
|
|
684
|
+
if (!registry)
|
|
685
|
+
return null;
|
|
686
|
+
try {
|
|
687
|
+
const agentdb = registry.getAgentDB();
|
|
688
|
+
const embedder = agentdb?.embedder;
|
|
689
|
+
if (!embedder)
|
|
690
|
+
return null;
|
|
691
|
+
// Verify embedder works by generating a test embedding
|
|
692
|
+
const test = await embedder.embed('test');
|
|
693
|
+
if (!test)
|
|
694
|
+
return null;
|
|
695
|
+
return {
|
|
696
|
+
success: true,
|
|
697
|
+
dimensions: test.length,
|
|
698
|
+
modelName: 'Xenova/all-MiniLM-L6-v2',
|
|
699
|
+
loadTime: Date.now() - startTime,
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
return null;
|
|
704
|
+
}
|
|
869
705
|
}
|
|
870
706
|
// ===== Phase 3: HNSW bridge =====
|
|
871
707
|
/**
|
|
872
708
|
* Get HNSW status from AgentDB v3's vector backend or HNSW index.
|
|
873
709
|
* Returns null if unavailable.
|
|
874
710
|
*/
|
|
875
|
-
export function bridgeGetHNSWStatus(dbPath) {
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
dimensions: 384
|
|
903
|
-
}];
|
|
904
|
-
}
|
|
905
|
-
catch (_d) {
|
|
906
|
-
return [2 /*return*/, null];
|
|
907
|
-
}
|
|
908
|
-
return [2 /*return*/];
|
|
909
|
-
}
|
|
910
|
-
});
|
|
911
|
-
});
|
|
711
|
+
export async function bridgeGetHNSWStatus(dbPath) {
|
|
712
|
+
const registry = await getRegistry(dbPath);
|
|
713
|
+
if (!registry)
|
|
714
|
+
return null;
|
|
715
|
+
try {
|
|
716
|
+
const ctx = getDb(registry);
|
|
717
|
+
if (!ctx)
|
|
718
|
+
return null;
|
|
719
|
+
// Count entries with embeddings
|
|
720
|
+
let entryCount = 0;
|
|
721
|
+
try {
|
|
722
|
+
const row = ctx.db.prepare(`SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' AND embedding IS NOT NULL`).get();
|
|
723
|
+
entryCount = row?.cnt ?? 0;
|
|
724
|
+
}
|
|
725
|
+
catch {
|
|
726
|
+
// Table might not exist
|
|
727
|
+
}
|
|
728
|
+
return {
|
|
729
|
+
available: true,
|
|
730
|
+
initialized: true,
|
|
731
|
+
entryCount,
|
|
732
|
+
dimensions: 384,
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
catch {
|
|
736
|
+
return null;
|
|
737
|
+
}
|
|
912
738
|
}
|
|
913
739
|
/**
|
|
914
740
|
* Search using AgentDB v3's embedder + SQLite entries.
|
|
915
741
|
* This is the HNSW-equivalent search through the bridge.
|
|
916
742
|
* Returns null if unavailable.
|
|
917
743
|
*/
|
|
918
|
-
export function bridgeSearchHNSW(queryEmbedding, options, dbPath) {
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
namespace: row.namespace || 'default'
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
catch (_e) {
|
|
968
|
-
// Skip invalid embeddings
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
results.sort(function (a, b) { return b.score - a.score; });
|
|
972
|
-
return [2 /*return*/, results.slice(0, k)];
|
|
973
|
-
}
|
|
974
|
-
catch (_f) {
|
|
975
|
-
return [2 /*return*/, null];
|
|
976
|
-
}
|
|
977
|
-
return [2 /*return*/];
|
|
744
|
+
export async function bridgeSearchHNSW(queryEmbedding, options, dbPath) {
|
|
745
|
+
const registry = await getRegistry(dbPath);
|
|
746
|
+
if (!registry)
|
|
747
|
+
return null;
|
|
748
|
+
const ctx = getDb(registry);
|
|
749
|
+
if (!ctx)
|
|
750
|
+
return null;
|
|
751
|
+
try {
|
|
752
|
+
const k = options?.k ?? 10;
|
|
753
|
+
const threshold = options?.threshold ?? 0.3;
|
|
754
|
+
const nsFilter = options?.namespace && options.namespace !== 'all'
|
|
755
|
+
? `AND namespace = ?`
|
|
756
|
+
: '';
|
|
757
|
+
let rows;
|
|
758
|
+
try {
|
|
759
|
+
const stmt = ctx.db.prepare(`
|
|
760
|
+
SELECT id, key, namespace, content, embedding
|
|
761
|
+
FROM memory_entries
|
|
762
|
+
WHERE status = 'active' AND embedding IS NOT NULL ${nsFilter}
|
|
763
|
+
LIMIT 10000
|
|
764
|
+
`);
|
|
765
|
+
rows = nsFilter
|
|
766
|
+
? stmt.all(options.namespace)
|
|
767
|
+
: stmt.all();
|
|
768
|
+
}
|
|
769
|
+
catch {
|
|
770
|
+
return null;
|
|
771
|
+
}
|
|
772
|
+
const results = [];
|
|
773
|
+
for (const row of rows) {
|
|
774
|
+
if (!row.embedding)
|
|
775
|
+
continue;
|
|
776
|
+
try {
|
|
777
|
+
const emb = JSON.parse(row.embedding);
|
|
778
|
+
const score = cosineSim(queryEmbedding, emb);
|
|
779
|
+
if (score >= threshold) {
|
|
780
|
+
results.push({
|
|
781
|
+
id: String(row.id).substring(0, 12),
|
|
782
|
+
key: row.key || String(row.id).substring(0, 15),
|
|
783
|
+
content: (row.content || '').substring(0, 60) +
|
|
784
|
+
((row.content || '').length > 60 ? '...' : ''),
|
|
785
|
+
score,
|
|
786
|
+
namespace: row.namespace || 'default',
|
|
787
|
+
});
|
|
788
|
+
}
|
|
978
789
|
}
|
|
979
|
-
|
|
980
|
-
|
|
790
|
+
catch {
|
|
791
|
+
// Skip invalid embeddings
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
results.sort((a, b) => b.score - a.score);
|
|
795
|
+
return results.slice(0, k);
|
|
796
|
+
}
|
|
797
|
+
catch {
|
|
798
|
+
return null;
|
|
799
|
+
}
|
|
981
800
|
}
|
|
982
801
|
/**
|
|
983
802
|
* Add entry to the bridge's database with embedding.
|
|
984
803
|
* Returns null if unavailable.
|
|
985
804
|
*/
|
|
986
|
-
export function bridgeAddToHNSW(id, embedding, entry, dbPath) {
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
return
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
return [2 /*return*/];
|
|
1009
|
-
}
|
|
1010
|
-
});
|
|
1011
|
-
});
|
|
805
|
+
export async function bridgeAddToHNSW(id, embedding, entry, dbPath) {
|
|
806
|
+
const registry = await getRegistry(dbPath);
|
|
807
|
+
if (!registry)
|
|
808
|
+
return null;
|
|
809
|
+
const ctx = getDb(registry);
|
|
810
|
+
if (!ctx)
|
|
811
|
+
return null;
|
|
812
|
+
try {
|
|
813
|
+
const now = Date.now();
|
|
814
|
+
const embeddingJson = JSON.stringify(embedding);
|
|
815
|
+
ctx.db.prepare(`
|
|
816
|
+
INSERT OR REPLACE INTO memory_entries (
|
|
817
|
+
id, key, namespace, content, type,
|
|
818
|
+
embedding, embedding_dimensions, embedding_model,
|
|
819
|
+
created_at, updated_at, status
|
|
820
|
+
) VALUES (?, ?, ?, ?, 'semantic', ?, ?, 'Xenova/all-MiniLM-L6-v2', ?, ?, 'active')
|
|
821
|
+
`).run(id, entry.key, entry.namespace, entry.content, embeddingJson, embedding.length, now, now);
|
|
822
|
+
return true;
|
|
823
|
+
}
|
|
824
|
+
catch {
|
|
825
|
+
return null;
|
|
826
|
+
}
|
|
1012
827
|
}
|
|
1013
828
|
// ===== Phase 4: Controller access =====
|
|
1014
829
|
/**
|
|
1015
830
|
* Get a named controller from AgentDB v3 via ControllerRegistry.
|
|
1016
831
|
* Returns null if unavailable.
|
|
1017
832
|
*/
|
|
1018
|
-
export function bridgeGetController(name, dbPath) {
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
return [2 /*return*/, null];
|
|
1029
|
-
try {
|
|
1030
|
-
return [2 /*return*/, (_a = registry.get(name)) !== null && _a !== void 0 ? _a : null];
|
|
1031
|
-
}
|
|
1032
|
-
catch (_c) {
|
|
1033
|
-
return [2 /*return*/, null];
|
|
1034
|
-
}
|
|
1035
|
-
return [2 /*return*/];
|
|
1036
|
-
}
|
|
1037
|
-
});
|
|
1038
|
-
});
|
|
833
|
+
export async function bridgeGetController(name, dbPath) {
|
|
834
|
+
const registry = await getRegistry(dbPath);
|
|
835
|
+
if (!registry)
|
|
836
|
+
return null;
|
|
837
|
+
try {
|
|
838
|
+
return registry.get(name) ?? null;
|
|
839
|
+
}
|
|
840
|
+
catch {
|
|
841
|
+
return null;
|
|
842
|
+
}
|
|
1039
843
|
}
|
|
1040
844
|
/**
|
|
1041
845
|
* Check if a controller is available.
|
|
1042
846
|
*/
|
|
1043
|
-
export function bridgeHasController(name, dbPath) {
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
return
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
controller = registry.get(name);
|
|
1055
|
-
return [2 /*return*/, controller !== null && controller !== undefined];
|
|
1056
|
-
}
|
|
1057
|
-
catch (_b) {
|
|
1058
|
-
return [2 /*return*/, false];
|
|
1059
|
-
}
|
|
1060
|
-
return [2 /*return*/];
|
|
1061
|
-
}
|
|
1062
|
-
});
|
|
1063
|
-
});
|
|
847
|
+
export async function bridgeHasController(name, dbPath) {
|
|
848
|
+
const registry = await getRegistry(dbPath);
|
|
849
|
+
if (!registry)
|
|
850
|
+
return false;
|
|
851
|
+
try {
|
|
852
|
+
const controller = registry.get(name);
|
|
853
|
+
return controller !== null && controller !== undefined;
|
|
854
|
+
}
|
|
855
|
+
catch {
|
|
856
|
+
return false;
|
|
857
|
+
}
|
|
1064
858
|
}
|
|
1065
859
|
/**
|
|
1066
860
|
* List all controllers and their status.
|
|
1067
861
|
*/
|
|
1068
|
-
export function bridgeListControllers(dbPath) {
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
return
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
try {
|
|
1079
|
-
return [2 /*return*/, registry.listControllers()];
|
|
1080
|
-
}
|
|
1081
|
-
catch (_b) {
|
|
1082
|
-
return [2 /*return*/, null];
|
|
1083
|
-
}
|
|
1084
|
-
return [2 /*return*/];
|
|
1085
|
-
}
|
|
1086
|
-
});
|
|
1087
|
-
});
|
|
862
|
+
export async function bridgeListControllers(dbPath) {
|
|
863
|
+
const registry = await getRegistry(dbPath);
|
|
864
|
+
if (!registry)
|
|
865
|
+
return null;
|
|
866
|
+
try {
|
|
867
|
+
return registry.listControllers();
|
|
868
|
+
}
|
|
869
|
+
catch {
|
|
870
|
+
return null;
|
|
871
|
+
}
|
|
1088
872
|
}
|
|
1089
873
|
/**
|
|
1090
874
|
* Check if the AgentDB v3 bridge is available.
|
|
1091
875
|
*/
|
|
1092
|
-
export function isBridgeAvailable(dbPath) {
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
case 0:
|
|
1098
|
-
if (bridgeAvailable !== null)
|
|
1099
|
-
return [2 /*return*/, bridgeAvailable];
|
|
1100
|
-
return [4 /*yield*/, getRegistry(dbPath)];
|
|
1101
|
-
case 1:
|
|
1102
|
-
registry = _a.sent();
|
|
1103
|
-
return [2 /*return*/, registry !== null];
|
|
1104
|
-
}
|
|
1105
|
-
});
|
|
1106
|
-
});
|
|
876
|
+
export async function isBridgeAvailable(dbPath) {
|
|
877
|
+
if (bridgeAvailable !== null)
|
|
878
|
+
return bridgeAvailable;
|
|
879
|
+
const registry = await getRegistry(dbPath);
|
|
880
|
+
return registry !== null;
|
|
1107
881
|
}
|
|
1108
882
|
/**
|
|
1109
883
|
* Get the ControllerRegistry instance (for advanced consumers).
|
|
1110
884
|
*/
|
|
1111
|
-
export function getControllerRegistry(dbPath) {
|
|
1112
|
-
return
|
|
1113
|
-
return __generator(this, function (_a) {
|
|
1114
|
-
return [2 /*return*/, getRegistry(dbPath)];
|
|
1115
|
-
});
|
|
1116
|
-
});
|
|
885
|
+
export async function getControllerRegistry(dbPath) {
|
|
886
|
+
return getRegistry(dbPath);
|
|
1117
887
|
}
|
|
1118
888
|
/**
|
|
1119
889
|
* Shutdown the bridge and release resources.
|
|
1120
890
|
*/
|
|
1121
|
-
export function shutdownBridge() {
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
_b.sent();
|
|
1134
|
-
return [3 /*break*/, 4];
|
|
1135
|
-
case 3:
|
|
1136
|
-
_a = _b.sent();
|
|
1137
|
-
return [3 /*break*/, 4];
|
|
1138
|
-
case 4:
|
|
1139
|
-
registryInstance = null;
|
|
1140
|
-
registryPromise = null;
|
|
1141
|
-
bridgeAvailable = null;
|
|
1142
|
-
_b.label = 5;
|
|
1143
|
-
case 5: return [2 /*return*/];
|
|
1144
|
-
}
|
|
1145
|
-
});
|
|
1146
|
-
});
|
|
891
|
+
export async function shutdownBridge() {
|
|
892
|
+
if (registryInstance) {
|
|
893
|
+
try {
|
|
894
|
+
await registryInstance.shutdown();
|
|
895
|
+
}
|
|
896
|
+
catch {
|
|
897
|
+
// Best-effort
|
|
898
|
+
}
|
|
899
|
+
registryInstance = null;
|
|
900
|
+
registryPromise = null;
|
|
901
|
+
bridgeAvailable = null;
|
|
902
|
+
}
|
|
1147
903
|
}
|
|
1148
904
|
// ===== Phase 3: ReasoningBank pattern operations =====
|
|
1149
905
|
/**
|
|
1150
906
|
* Store a pattern via ReasoningBank controller.
|
|
1151
907
|
* Falls back to raw SQL if ReasoningBank unavailable.
|
|
1152
908
|
*/
|
|
1153
|
-
export function bridgeStorePattern(options) {
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
return
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
return [2 /*return*/, { success: true, patternId: patternId, controller: 'reasoningBank' }];
|
|
1180
|
-
case 4: return [4 /*yield*/, bridgeStoreEntry({
|
|
1181
|
-
key: patternId,
|
|
1182
|
-
value: JSON.stringify({ pattern: options.pattern, type: options.type, confidence: options.confidence, metadata: options.metadata }),
|
|
1183
|
-
namespace: 'pattern',
|
|
1184
|
-
generateEmbeddingFlag: true,
|
|
1185
|
-
tags: [options.type, 'reasoning-pattern'],
|
|
1186
|
-
dbPath: options.dbPath
|
|
1187
|
-
})];
|
|
1188
|
-
case 5:
|
|
1189
|
-
result = _b.sent();
|
|
1190
|
-
return [2 /*return*/, result ? { success: true, patternId: result.id, controller: 'bridge-fallback' } : null];
|
|
1191
|
-
case 6:
|
|
1192
|
-
_a = _b.sent();
|
|
1193
|
-
return [2 /*return*/, null];
|
|
1194
|
-
case 7: return [2 /*return*/];
|
|
1195
|
-
}
|
|
909
|
+
export async function bridgeStorePattern(options) {
|
|
910
|
+
const registry = await getRegistry(options.dbPath);
|
|
911
|
+
if (!registry)
|
|
912
|
+
return null;
|
|
913
|
+
try {
|
|
914
|
+
const reasoningBank = registry.get('reasoningBank');
|
|
915
|
+
const patternId = generateId('pattern');
|
|
916
|
+
if (reasoningBank && typeof reasoningBank.store === 'function') {
|
|
917
|
+
await reasoningBank.store({
|
|
918
|
+
id: patternId,
|
|
919
|
+
content: options.pattern,
|
|
920
|
+
type: options.type,
|
|
921
|
+
confidence: options.confidence,
|
|
922
|
+
metadata: options.metadata,
|
|
923
|
+
timestamp: Date.now(),
|
|
924
|
+
});
|
|
925
|
+
return { success: true, patternId, controller: 'reasoningBank' };
|
|
926
|
+
}
|
|
927
|
+
// Fallback: store via bridge SQL
|
|
928
|
+
const result = await bridgeStoreEntry({
|
|
929
|
+
key: patternId,
|
|
930
|
+
value: JSON.stringify({ pattern: options.pattern, type: options.type, confidence: options.confidence, metadata: options.metadata }),
|
|
931
|
+
namespace: 'pattern',
|
|
932
|
+
generateEmbeddingFlag: true,
|
|
933
|
+
tags: [options.type, 'reasoning-pattern'],
|
|
934
|
+
dbPath: options.dbPath,
|
|
1196
935
|
});
|
|
1197
|
-
|
|
936
|
+
return result ? { success: true, patternId: result.id, controller: 'bridge-fallback' } : null;
|
|
937
|
+
}
|
|
938
|
+
catch {
|
|
939
|
+
return null;
|
|
940
|
+
}
|
|
1198
941
|
}
|
|
1199
942
|
/**
|
|
1200
943
|
* Search patterns via ReasoningBank controller.
|
|
1201
944
|
*/
|
|
1202
|
-
export function bridgeSearchPatterns(options) {
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
return
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
score: (_b = (_a = r.score) !== null && _a !== void 0 ? _a : r.confidence) !== null && _b !== void 0 ? _b : 0
|
|
1230
|
-
});
|
|
1231
|
-
}) : [],
|
|
1232
|
-
controller: 'reasoningBank'
|
|
1233
|
-
}];
|
|
1234
|
-
case 4: return [4 /*yield*/, bridgeSearchEntries({
|
|
1235
|
-
query: options.query,
|
|
1236
|
-
namespace: 'pattern',
|
|
1237
|
-
limit: options.topK || 5,
|
|
1238
|
-
threshold: options.minConfidence || 0.3,
|
|
1239
|
-
dbPath: options.dbPath
|
|
1240
|
-
})];
|
|
1241
|
-
case 5:
|
|
1242
|
-
result = _b.sent();
|
|
1243
|
-
return [2 /*return*/, result ? {
|
|
1244
|
-
results: result.results.map(function (r) { return ({ id: r.id, content: r.content, score: r.score }); }),
|
|
1245
|
-
controller: 'bridge-fallback'
|
|
1246
|
-
} : null];
|
|
1247
|
-
case 6:
|
|
1248
|
-
_a = _b.sent();
|
|
1249
|
-
return [2 /*return*/, null];
|
|
1250
|
-
case 7: return [2 /*return*/];
|
|
1251
|
-
}
|
|
945
|
+
export async function bridgeSearchPatterns(options) {
|
|
946
|
+
const registry = await getRegistry(options.dbPath);
|
|
947
|
+
if (!registry)
|
|
948
|
+
return null;
|
|
949
|
+
try {
|
|
950
|
+
const reasoningBank = registry.get('reasoningBank');
|
|
951
|
+
if (reasoningBank && typeof reasoningBank.search === 'function') {
|
|
952
|
+
const results = await reasoningBank.search(options.query, {
|
|
953
|
+
topK: options.topK || 5,
|
|
954
|
+
minScore: options.minConfidence || 0.3,
|
|
955
|
+
});
|
|
956
|
+
return {
|
|
957
|
+
results: Array.isArray(results) ? results.map((r) => ({
|
|
958
|
+
id: r.id || r.patternId || '',
|
|
959
|
+
content: r.content || r.pattern || '',
|
|
960
|
+
score: r.score ?? r.confidence ?? 0,
|
|
961
|
+
})) : [],
|
|
962
|
+
controller: 'reasoningBank',
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
// Fallback: search via bridge
|
|
966
|
+
const result = await bridgeSearchEntries({
|
|
967
|
+
query: options.query,
|
|
968
|
+
namespace: 'pattern',
|
|
969
|
+
limit: options.topK || 5,
|
|
970
|
+
threshold: options.minConfidence || 0.3,
|
|
971
|
+
dbPath: options.dbPath,
|
|
1252
972
|
});
|
|
1253
|
-
|
|
973
|
+
return result ? {
|
|
974
|
+
results: result.results.map(r => ({ id: r.id, content: r.content, score: r.score })),
|
|
975
|
+
controller: 'bridge-fallback',
|
|
976
|
+
} : null;
|
|
977
|
+
}
|
|
978
|
+
catch {
|
|
979
|
+
return null;
|
|
980
|
+
}
|
|
1254
981
|
}
|
|
1255
982
|
// ===== Phase 3: Feedback recording =====
|
|
1256
983
|
/**
|
|
1257
984
|
* Record task feedback for learning via ReasoningBank or LearningSystem.
|
|
1258
985
|
* Wired into hooks_post-task handler.
|
|
1259
986
|
*/
|
|
1260
|
-
export function bridgeRecordFeedback(options) {
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
learningSystem = registry.get('learningSystem');
|
|
1277
|
-
if (!learningSystem) return [3 /*break*/, 9];
|
|
1278
|
-
_g.label = 3;
|
|
1279
|
-
case 3:
|
|
1280
|
-
_g.trys.push([3, 8, , 9]);
|
|
1281
|
-
if (!(typeof learningSystem.recordFeedback === 'function')) return [3 /*break*/, 5];
|
|
1282
|
-
return [4 /*yield*/, learningSystem.recordFeedback({
|
|
1283
|
-
taskId: options.taskId, success: options.success, quality: options.quality,
|
|
1284
|
-
agent: options.agent, duration: options.duration, timestamp: Date.now()
|
|
1285
|
-
})];
|
|
1286
|
-
case 4:
|
|
1287
|
-
_g.sent();
|
|
987
|
+
export async function bridgeRecordFeedback(options) {
|
|
988
|
+
const registry = await getRegistry(options.dbPath);
|
|
989
|
+
if (!registry)
|
|
990
|
+
return null;
|
|
991
|
+
try {
|
|
992
|
+
let controller = 'none';
|
|
993
|
+
let updated = 0;
|
|
994
|
+
// Try LearningSystem first (Phase 4)
|
|
995
|
+
const learningSystem = registry.get('learningSystem');
|
|
996
|
+
if (learningSystem) {
|
|
997
|
+
try {
|
|
998
|
+
if (typeof learningSystem.recordFeedback === 'function') {
|
|
999
|
+
await learningSystem.recordFeedback({
|
|
1000
|
+
taskId: options.taskId, success: options.success, quality: options.quality,
|
|
1001
|
+
agent: options.agent, duration: options.duration, timestamp: Date.now(),
|
|
1002
|
+
});
|
|
1288
1003
|
controller = 'learningSystem';
|
|
1289
1004
|
updated++;
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
return [4 /*yield*/, learningSystem.record(options.taskId, options.quality, options.success ? 'success' : 'failure')];
|
|
1294
|
-
case 6:
|
|
1295
|
-
_g.sent();
|
|
1005
|
+
}
|
|
1006
|
+
else if (typeof learningSystem.record === 'function') {
|
|
1007
|
+
await learningSystem.record(options.taskId, options.quality, options.success ? 'success' : 'failure');
|
|
1296
1008
|
controller = 'learningSystem';
|
|
1297
1009
|
updated++;
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
score: options.quality, timestamp: Date.now()
|
|
1313
|
-
})];
|
|
1314
|
-
case 11:
|
|
1315
|
-
_g.sent();
|
|
1316
|
-
controller = controller === 'none' ? 'reasoningBank' : controller + "+reasoningBank";
|
|
1317
|
-
updated++;
|
|
1318
|
-
return [3 /*break*/, 14];
|
|
1319
|
-
case 12:
|
|
1320
|
-
if (!(typeof reasoningBank.record === 'function')) return [3 /*break*/, 14];
|
|
1321
|
-
return [4 /*yield*/, reasoningBank.record(options.taskId, options.quality)];
|
|
1322
|
-
case 13:
|
|
1323
|
-
_g.sent();
|
|
1324
|
-
controller = controller === 'none' ? 'reasoningBank' : controller + "+reasoningBank";
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
catch { /* API mismatch — skip */ }
|
|
1013
|
+
}
|
|
1014
|
+
// Also record in ReasoningBank for pattern reinforcement
|
|
1015
|
+
const reasoningBank = registry.get('reasoningBank');
|
|
1016
|
+
if (reasoningBank) {
|
|
1017
|
+
try {
|
|
1018
|
+
if (typeof reasoningBank.recordOutcome === 'function') {
|
|
1019
|
+
await reasoningBank.recordOutcome({
|
|
1020
|
+
taskId: options.taskId, verdict: options.success ? 'success' : 'failure',
|
|
1021
|
+
score: options.quality, timestamp: Date.now(),
|
|
1022
|
+
});
|
|
1023
|
+
controller = controller === 'none' ? 'reasoningBank' : `${controller}+reasoningBank`;
|
|
1325
1024
|
updated++;
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
return [3 /*break*/, 16];
|
|
1331
|
-
case 16:
|
|
1332
|
-
if (!(options.success && options.quality >= 0.9 && ((_a = options.patterns) === null || _a === void 0 ? void 0 : _a.length))) return [3 /*break*/, 23];
|
|
1333
|
-
skills = registry.get('skills');
|
|
1334
|
-
if (!(skills && typeof skills.promote === 'function')) return [3 /*break*/, 23];
|
|
1335
|
-
_i = 0, _d = options.patterns;
|
|
1336
|
-
_g.label = 17;
|
|
1337
|
-
case 17:
|
|
1338
|
-
if (!(_i < _d.length)) return [3 /*break*/, 22];
|
|
1339
|
-
pattern = _d[_i];
|
|
1340
|
-
_g.label = 18;
|
|
1341
|
-
case 18:
|
|
1342
|
-
_g.trys.push([18, 20, , 21]);
|
|
1343
|
-
return [4 /*yield*/, skills.promote(pattern, options.quality)];
|
|
1344
|
-
case 19:
|
|
1345
|
-
_g.sent();
|
|
1025
|
+
}
|
|
1026
|
+
else if (typeof reasoningBank.record === 'function') {
|
|
1027
|
+
await reasoningBank.record(options.taskId, options.quality);
|
|
1028
|
+
controller = controller === 'none' ? 'reasoningBank' : `${controller}+reasoningBank`;
|
|
1346
1029
|
updated++;
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
key: "feedback-" + options.taskId,
|
|
1359
|
-
value: JSON.stringify(options),
|
|
1360
|
-
namespace: 'feedback',
|
|
1361
|
-
tags: [options.success ? 'success' : 'failure', options.agent || 'unknown'],
|
|
1362
|
-
dbPath: options.dbPath
|
|
1363
|
-
})];
|
|
1364
|
-
case 24:
|
|
1365
|
-
storeResult = _g.sent();
|
|
1366
|
-
if (storeResult === null || storeResult === void 0 ? void 0 : storeResult.success) {
|
|
1367
|
-
controller = controller === 'none' ? 'bridge-store' : controller + "+bridge-store";
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
catch { /* API mismatch — skip */ }
|
|
1033
|
+
}
|
|
1034
|
+
// Phase 4: SkillLibrary promotion for high-quality patterns
|
|
1035
|
+
if (options.success && options.quality >= 0.9 && options.patterns?.length) {
|
|
1036
|
+
const skills = registry.get('skills');
|
|
1037
|
+
if (skills && typeof skills.promote === 'function') {
|
|
1038
|
+
for (const pattern of options.patterns) {
|
|
1039
|
+
try {
|
|
1040
|
+
await skills.promote(pattern, options.quality);
|
|
1368
1041
|
updated++;
|
|
1369
1042
|
}
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
return [2 /*return*/, null];
|
|
1374
|
-
case 26: return [2 /*return*/];
|
|
1043
|
+
catch { /* skip */ }
|
|
1044
|
+
}
|
|
1045
|
+
controller += '+skills';
|
|
1375
1046
|
}
|
|
1047
|
+
}
|
|
1048
|
+
// Always store feedback as a memory entry for retrieval (ensures it persists)
|
|
1049
|
+
const storeResult = await bridgeStoreEntry({
|
|
1050
|
+
key: `feedback-${options.taskId}`,
|
|
1051
|
+
value: JSON.stringify(options),
|
|
1052
|
+
namespace: 'feedback',
|
|
1053
|
+
tags: [options.success ? 'success' : 'failure', options.agent || 'unknown'],
|
|
1054
|
+
dbPath: options.dbPath,
|
|
1376
1055
|
});
|
|
1377
|
-
|
|
1056
|
+
if (storeResult?.success) {
|
|
1057
|
+
controller = controller === 'none' ? 'bridge-store' : `${controller}+bridge-store`;
|
|
1058
|
+
updated++;
|
|
1059
|
+
}
|
|
1060
|
+
return { success: true, controller, updated };
|
|
1061
|
+
}
|
|
1062
|
+
catch {
|
|
1063
|
+
return null;
|
|
1064
|
+
}
|
|
1378
1065
|
}
|
|
1379
1066
|
// ===== Phase 3: CausalMemoryGraph =====
|
|
1380
1067
|
/**
|
|
1381
1068
|
* Record a causal edge between two entries (e.g., task → result).
|
|
1382
1069
|
*/
|
|
1383
|
-
export function bridgeRecordCausalEdge(options) {
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
try {
|
|
1407
|
-
ctx.db.prepare("\n INSERT OR REPLACE INTO memory_entries (id, key, namespace, content, type, created_at, updated_at, status)\n VALUES (?, ?, 'causal-edges', ?, 'procedural', ?, ?, 'active')\n ").run(generateId('edge'), options.sourceId + "\u2192" + options.targetId, JSON.stringify(options), Date.now(), Date.now());
|
|
1408
|
-
return [2 /*return*/, { success: true, controller: 'bridge-fallback' }];
|
|
1409
|
-
}
|
|
1410
|
-
catch ( /* skip */_c) { /* skip */ }
|
|
1411
|
-
}
|
|
1412
|
-
return [2 /*return*/, null];
|
|
1413
|
-
}
|
|
1414
|
-
catch (_d) {
|
|
1415
|
-
return [2 /*return*/, null];
|
|
1416
|
-
}
|
|
1417
|
-
return [2 /*return*/];
|
|
1070
|
+
export async function bridgeRecordCausalEdge(options) {
|
|
1071
|
+
const registry = await getRegistry(options.dbPath);
|
|
1072
|
+
if (!registry)
|
|
1073
|
+
return null;
|
|
1074
|
+
try {
|
|
1075
|
+
const causalGraph = registry.get('causalGraph');
|
|
1076
|
+
if (causalGraph && typeof causalGraph.addEdge === 'function') {
|
|
1077
|
+
causalGraph.addEdge(options.sourceId, options.targetId, {
|
|
1078
|
+
relation: options.relation,
|
|
1079
|
+
weight: options.weight ?? 1.0,
|
|
1080
|
+
timestamp: Date.now(),
|
|
1081
|
+
});
|
|
1082
|
+
return { success: true, controller: 'causalGraph' };
|
|
1083
|
+
}
|
|
1084
|
+
// Fallback: store edge as metadata
|
|
1085
|
+
const ctx = getDb(registry);
|
|
1086
|
+
if (ctx) {
|
|
1087
|
+
try {
|
|
1088
|
+
ctx.db.prepare(`
|
|
1089
|
+
INSERT OR REPLACE INTO memory_entries (id, key, namespace, content, type, created_at, updated_at, status)
|
|
1090
|
+
VALUES (?, ?, 'causal-edges', ?, 'procedural', ?, ?, 'active')
|
|
1091
|
+
`).run(generateId('edge'), `${options.sourceId}→${options.targetId}`, JSON.stringify(options), Date.now(), Date.now());
|
|
1092
|
+
return { success: true, controller: 'bridge-fallback' };
|
|
1418
1093
|
}
|
|
1419
|
-
|
|
1420
|
-
|
|
1094
|
+
catch { /* skip */ }
|
|
1095
|
+
}
|
|
1096
|
+
return null;
|
|
1097
|
+
}
|
|
1098
|
+
catch {
|
|
1099
|
+
return null;
|
|
1100
|
+
}
|
|
1421
1101
|
}
|
|
1422
1102
|
// ===== Phase 5: ReflexionMemory session lifecycle =====
|
|
1423
1103
|
/**
|
|
1424
1104
|
* Start a session with ReflexionMemory episodic replay.
|
|
1425
1105
|
* Loads relevant past session patterns for the new session.
|
|
1426
1106
|
*/
|
|
1427
|
-
export function bridgeSessionStart(options) {
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
return
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
controller = 'reflexion';
|
|
1448
|
-
_b.label = 4;
|
|
1449
|
-
case 4: return [4 /*yield*/, bridgeSearchEntries({
|
|
1450
|
-
query: options.context || 'session patterns',
|
|
1451
|
-
namespace: 'session',
|
|
1452
|
-
limit: 10,
|
|
1453
|
-
threshold: 0.2,
|
|
1454
|
-
dbPath: options.dbPath
|
|
1455
|
-
})];
|
|
1456
|
-
case 5:
|
|
1457
|
-
searchResult = _b.sent();
|
|
1458
|
-
if (searchResult === null || searchResult === void 0 ? void 0 : searchResult.results) {
|
|
1459
|
-
restoredPatterns = searchResult.results.length;
|
|
1460
|
-
}
|
|
1461
|
-
return [2 /*return*/, {
|
|
1462
|
-
success: true,
|
|
1463
|
-
controller: controller === 'none' ? 'bridge-search' : controller,
|
|
1464
|
-
restoredPatterns: restoredPatterns,
|
|
1465
|
-
sessionId: options.sessionId
|
|
1466
|
-
}];
|
|
1467
|
-
case 6:
|
|
1468
|
-
_a = _b.sent();
|
|
1469
|
-
return [2 /*return*/, null];
|
|
1470
|
-
case 7: return [2 /*return*/];
|
|
1471
|
-
}
|
|
1107
|
+
export async function bridgeSessionStart(options) {
|
|
1108
|
+
const registry = await getRegistry(options.dbPath);
|
|
1109
|
+
if (!registry)
|
|
1110
|
+
return null;
|
|
1111
|
+
try {
|
|
1112
|
+
let restoredPatterns = 0;
|
|
1113
|
+
let controller = 'none';
|
|
1114
|
+
// Try ReflexionMemory for episodic session replay
|
|
1115
|
+
const reflexion = registry.get('reflexion');
|
|
1116
|
+
if (reflexion && typeof reflexion.startEpisode === 'function') {
|
|
1117
|
+
await reflexion.startEpisode(options.sessionId, { context: options.context });
|
|
1118
|
+
controller = 'reflexion';
|
|
1119
|
+
}
|
|
1120
|
+
// Load recent patterns from past sessions
|
|
1121
|
+
const searchResult = await bridgeSearchEntries({
|
|
1122
|
+
query: options.context || 'session patterns',
|
|
1123
|
+
namespace: 'session',
|
|
1124
|
+
limit: 10,
|
|
1125
|
+
threshold: 0.2,
|
|
1126
|
+
dbPath: options.dbPath,
|
|
1472
1127
|
});
|
|
1473
|
-
|
|
1128
|
+
if (searchResult?.results) {
|
|
1129
|
+
restoredPatterns = searchResult.results.length;
|
|
1130
|
+
}
|
|
1131
|
+
return {
|
|
1132
|
+
success: true,
|
|
1133
|
+
controller: controller === 'none' ? 'bridge-search' : controller,
|
|
1134
|
+
restoredPatterns,
|
|
1135
|
+
sessionId: options.sessionId,
|
|
1136
|
+
};
|
|
1137
|
+
}
|
|
1138
|
+
catch {
|
|
1139
|
+
return null;
|
|
1140
|
+
}
|
|
1474
1141
|
}
|
|
1475
1142
|
/**
|
|
1476
1143
|
* End a session and persist episodic summary to ReflexionMemory.
|
|
1477
1144
|
*/
|
|
1478
|
-
export function bridgeSessionEnd(options) {
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
value: JSON.stringify({
|
|
1511
|
-
sessionId: options.sessionId,
|
|
1512
|
-
summary: options.summary || 'Session ended',
|
|
1513
|
-
tasksCompleted: (_a = options.tasksCompleted) !== null && _a !== void 0 ? _a : 0,
|
|
1514
|
-
patternsLearned: (_b = options.patternsLearned) !== null && _b !== void 0 ? _b : 0,
|
|
1515
|
-
endedAt: new Date().toISOString()
|
|
1516
|
-
}),
|
|
1517
|
-
namespace: 'session',
|
|
1518
|
-
tags: ['session-end'],
|
|
1519
|
-
upsert: true,
|
|
1520
|
-
dbPath: options.dbPath
|
|
1521
|
-
})];
|
|
1522
|
-
case 5:
|
|
1523
|
-
// Persist session summary as memory entry
|
|
1524
|
-
_e.sent();
|
|
1525
|
-
if (controller === 'none')
|
|
1526
|
-
controller = 'bridge-store';
|
|
1527
|
-
persisted = true;
|
|
1528
|
-
nightlyLearner = registry.get('nightlyLearner');
|
|
1529
|
-
if (!(nightlyLearner && typeof nightlyLearner.consolidate === 'function')) return [3 /*break*/, 9];
|
|
1530
|
-
_e.label = 6;
|
|
1531
|
-
case 6:
|
|
1532
|
-
_e.trys.push([6, 8, , 9]);
|
|
1533
|
-
return [4 /*yield*/, nightlyLearner.consolidate({ sessionId: options.sessionId })];
|
|
1534
|
-
case 7:
|
|
1535
|
-
_e.sent();
|
|
1536
|
-
controller += '+nightlyLearner';
|
|
1537
|
-
return [3 /*break*/, 9];
|
|
1538
|
-
case 8:
|
|
1539
|
-
_c = _e.sent();
|
|
1540
|
-
return [3 /*break*/, 9];
|
|
1541
|
-
case 9: return [2 /*return*/, { success: true, controller: controller, persisted: persisted }];
|
|
1542
|
-
case 10:
|
|
1543
|
-
_d = _e.sent();
|
|
1544
|
-
return [2 /*return*/, null];
|
|
1545
|
-
case 11: return [2 /*return*/];
|
|
1546
|
-
}
|
|
1145
|
+
export async function bridgeSessionEnd(options) {
|
|
1146
|
+
const registry = await getRegistry(options.dbPath);
|
|
1147
|
+
if (!registry)
|
|
1148
|
+
return null;
|
|
1149
|
+
try {
|
|
1150
|
+
let controller = 'none';
|
|
1151
|
+
let persisted = false;
|
|
1152
|
+
// End episode in ReflexionMemory
|
|
1153
|
+
const reflexion = registry.get('reflexion');
|
|
1154
|
+
if (reflexion && typeof reflexion.endEpisode === 'function') {
|
|
1155
|
+
await reflexion.endEpisode(options.sessionId, {
|
|
1156
|
+
summary: options.summary,
|
|
1157
|
+
tasksCompleted: options.tasksCompleted,
|
|
1158
|
+
patternsLearned: options.patternsLearned,
|
|
1159
|
+
});
|
|
1160
|
+
controller = 'reflexion';
|
|
1161
|
+
persisted = true;
|
|
1162
|
+
}
|
|
1163
|
+
// Persist session summary as memory entry
|
|
1164
|
+
await bridgeStoreEntry({
|
|
1165
|
+
key: `session-${options.sessionId}`,
|
|
1166
|
+
value: JSON.stringify({
|
|
1167
|
+
sessionId: options.sessionId,
|
|
1168
|
+
summary: options.summary || 'Session ended',
|
|
1169
|
+
tasksCompleted: options.tasksCompleted ?? 0,
|
|
1170
|
+
patternsLearned: options.patternsLearned ?? 0,
|
|
1171
|
+
endedAt: new Date().toISOString(),
|
|
1172
|
+
}),
|
|
1173
|
+
namespace: 'session',
|
|
1174
|
+
tags: ['session-end'],
|
|
1175
|
+
upsert: true,
|
|
1176
|
+
dbPath: options.dbPath,
|
|
1547
1177
|
});
|
|
1548
|
-
|
|
1178
|
+
if (controller === 'none')
|
|
1179
|
+
controller = 'bridge-store';
|
|
1180
|
+
persisted = true;
|
|
1181
|
+
// Phase 3: Trigger NightlyLearner consolidation if available
|
|
1182
|
+
const nightlyLearner = registry.get('nightlyLearner');
|
|
1183
|
+
if (nightlyLearner && typeof nightlyLearner.consolidate === 'function') {
|
|
1184
|
+
try {
|
|
1185
|
+
await nightlyLearner.consolidate({ sessionId: options.sessionId });
|
|
1186
|
+
controller += '+nightlyLearner';
|
|
1187
|
+
}
|
|
1188
|
+
catch { /* non-fatal */ }
|
|
1189
|
+
}
|
|
1190
|
+
return { success: true, controller, persisted };
|
|
1191
|
+
}
|
|
1192
|
+
catch {
|
|
1193
|
+
return null;
|
|
1194
|
+
}
|
|
1549
1195
|
}
|
|
1550
1196
|
// ===== Phase 5: SemanticRouter bridge =====
|
|
1551
1197
|
/**
|
|
1552
1198
|
* Route a task via AgentDB's SemanticRouter.
|
|
1553
1199
|
* Returns null to fall back to local ruvector router.
|
|
1554
1200
|
*/
|
|
1555
|
-
export function bridgeRouteTask(options) {
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
return [4 /*yield*/, semanticRouter.route(options.task, { context: options.context })];
|
|
1572
|
-
case 3:
|
|
1573
|
-
result = _e.sent();
|
|
1574
|
-
if (result) {
|
|
1575
|
-
return [2 /*return*/, {
|
|
1576
|
-
route: result.route || result.category || 'general',
|
|
1577
|
-
confidence: (_b = (_a = result.confidence) !== null && _a !== void 0 ? _a : result.score) !== null && _b !== void 0 ? _b : 0.5,
|
|
1578
|
-
agents: result.agents || result.suggestedAgents || [],
|
|
1579
|
-
controller: 'semanticRouter'
|
|
1580
|
-
}];
|
|
1581
|
-
}
|
|
1582
|
-
_e.label = 4;
|
|
1583
|
-
case 4:
|
|
1584
|
-
learningSystem = registry.get('learningSystem');
|
|
1585
|
-
if (!(learningSystem && typeof learningSystem.recommendAlgorithm === 'function')) return [3 /*break*/, 6];
|
|
1586
|
-
return [4 /*yield*/, learningSystem.recommendAlgorithm(options.task)];
|
|
1587
|
-
case 5:
|
|
1588
|
-
rec = _e.sent();
|
|
1589
|
-
if (rec) {
|
|
1590
|
-
return [2 /*return*/, {
|
|
1591
|
-
route: rec.algorithm || rec.route || 'general',
|
|
1592
|
-
confidence: (_c = rec.confidence) !== null && _c !== void 0 ? _c : 0.5,
|
|
1593
|
-
agents: rec.agents || [],
|
|
1594
|
-
controller: 'learningSystem'
|
|
1595
|
-
}];
|
|
1596
|
-
}
|
|
1597
|
-
_e.label = 6;
|
|
1598
|
-
case 6: return [2 /*return*/, null]; // Fall back to local router
|
|
1599
|
-
case 7:
|
|
1600
|
-
_d = _e.sent();
|
|
1601
|
-
return [2 /*return*/, null];
|
|
1602
|
-
case 8: return [2 /*return*/];
|
|
1201
|
+
export async function bridgeRouteTask(options) {
|
|
1202
|
+
const registry = await getRegistry(options.dbPath);
|
|
1203
|
+
if (!registry)
|
|
1204
|
+
return null;
|
|
1205
|
+
try {
|
|
1206
|
+
// Try AgentDB's SemanticRouter
|
|
1207
|
+
const semanticRouter = registry.get('semanticRouter');
|
|
1208
|
+
if (semanticRouter && typeof semanticRouter.route === 'function') {
|
|
1209
|
+
const result = await semanticRouter.route(options.task, { context: options.context });
|
|
1210
|
+
if (result) {
|
|
1211
|
+
return {
|
|
1212
|
+
route: result.route || result.category || 'general',
|
|
1213
|
+
confidence: result.confidence ?? result.score ?? 0.5,
|
|
1214
|
+
agents: result.agents || result.suggestedAgents || [],
|
|
1215
|
+
controller: 'semanticRouter',
|
|
1216
|
+
};
|
|
1603
1217
|
}
|
|
1604
|
-
}
|
|
1605
|
-
|
|
1218
|
+
}
|
|
1219
|
+
// Try LearningSystem recommendAlgorithm (Phase 4)
|
|
1220
|
+
const learningSystem = registry.get('learningSystem');
|
|
1221
|
+
if (learningSystem && typeof learningSystem.recommendAlgorithm === 'function') {
|
|
1222
|
+
const rec = await learningSystem.recommendAlgorithm(options.task);
|
|
1223
|
+
if (rec) {
|
|
1224
|
+
return {
|
|
1225
|
+
route: rec.algorithm || rec.route || 'general',
|
|
1226
|
+
confidence: rec.confidence ?? 0.5,
|
|
1227
|
+
agents: rec.agents || [],
|
|
1228
|
+
controller: 'learningSystem',
|
|
1229
|
+
};
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
return null; // Fall back to local router
|
|
1233
|
+
}
|
|
1234
|
+
catch {
|
|
1235
|
+
return null;
|
|
1236
|
+
}
|
|
1606
1237
|
}
|
|
1607
1238
|
// ===== Phase 4: Health check with attestation =====
|
|
1608
1239
|
/**
|
|
1609
1240
|
* Get comprehensive bridge health including all controller statuses.
|
|
1610
1241
|
*/
|
|
1611
|
-
export function bridgeHealthCheck(dbPath) {
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
return [2 /*return*/, { available: true, controllers: controllers, attestationCount: attestationCount, cacheStats: cacheStats }];
|
|
1636
|
-
}
|
|
1637
|
-
catch (_e) {
|
|
1638
|
-
return [2 /*return*/, null];
|
|
1639
|
-
}
|
|
1640
|
-
return [2 /*return*/];
|
|
1641
|
-
}
|
|
1642
|
-
});
|
|
1643
|
-
});
|
|
1242
|
+
export async function bridgeHealthCheck(dbPath) {
|
|
1243
|
+
const registry = await getRegistry(dbPath);
|
|
1244
|
+
if (!registry)
|
|
1245
|
+
return null;
|
|
1246
|
+
try {
|
|
1247
|
+
const controllers = registry.listControllers();
|
|
1248
|
+
// Phase 4: AttestationLog stats
|
|
1249
|
+
let attestationCount = 0;
|
|
1250
|
+
const attestation = registry.get('attestationLog');
|
|
1251
|
+
if (attestation && typeof attestation.count === 'function') {
|
|
1252
|
+
attestationCount = attestation.count();
|
|
1253
|
+
}
|
|
1254
|
+
// Phase 2: TieredCache stats
|
|
1255
|
+
let cacheStats = { size: 0, hits: 0, misses: 0 };
|
|
1256
|
+
const cache = registry.get('tieredCache');
|
|
1257
|
+
if (cache && typeof cache.stats === 'function') {
|
|
1258
|
+
const s = cache.stats();
|
|
1259
|
+
cacheStats = { size: s.size ?? 0, hits: s.hits ?? 0, misses: s.misses ?? 0 };
|
|
1260
|
+
}
|
|
1261
|
+
return { available: true, controllers, attestationCount, cacheStats };
|
|
1262
|
+
}
|
|
1263
|
+
catch {
|
|
1264
|
+
return null;
|
|
1265
|
+
}
|
|
1644
1266
|
}
|
|
1645
1267
|
// ===== Phase 7: Hierarchical memory, consolidation, batch, context, semantic route =====
|
|
1646
1268
|
/**
|
|
@@ -1652,42 +1274,31 @@ export function bridgeHealthCheck(dbPath) {
|
|
|
1652
1274
|
* Stub API (fallback):
|
|
1653
1275
|
* store(key, value, tier) — synchronous
|
|
1654
1276
|
*/
|
|
1655
|
-
export function bridgeHierarchicalStore(params) {
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
return
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
case 4:
|
|
1681
|
-
// Stub fallback
|
|
1682
|
-
hm.store(params.key, params.value, tier);
|
|
1683
|
-
return [2 /*return*/, { success: true, key: params.key, tier: tier }];
|
|
1684
|
-
case 5:
|
|
1685
|
-
e_1 = _a.sent();
|
|
1686
|
-
return [2 /*return*/, { success: false, error: e_1.message }];
|
|
1687
|
-
case 6: return [2 /*return*/];
|
|
1688
|
-
}
|
|
1689
|
-
});
|
|
1690
|
-
});
|
|
1277
|
+
export async function bridgeHierarchicalStore(params) {
|
|
1278
|
+
const registry = await getRegistry();
|
|
1279
|
+
if (!registry)
|
|
1280
|
+
return null;
|
|
1281
|
+
try {
|
|
1282
|
+
const hm = registry.get('hierarchicalMemory');
|
|
1283
|
+
if (!hm)
|
|
1284
|
+
return { success: false, error: 'HierarchicalMemory not available' };
|
|
1285
|
+
const tier = params.tier || 'working';
|
|
1286
|
+
// Detect real HierarchicalMemory (has async store returning id) vs stub
|
|
1287
|
+
if (typeof hm.getStats === 'function' && typeof hm.promote === 'function') {
|
|
1288
|
+
// Real agentdb HierarchicalMemory
|
|
1289
|
+
const id = await hm.store(params.value, params.importance || 0.5, tier, {
|
|
1290
|
+
metadata: { key: params.key },
|
|
1291
|
+
tags: [params.key],
|
|
1292
|
+
});
|
|
1293
|
+
return { success: true, id, key: params.key, tier };
|
|
1294
|
+
}
|
|
1295
|
+
// Stub fallback
|
|
1296
|
+
hm.store(params.key, params.value, tier);
|
|
1297
|
+
return { success: true, key: params.key, tier };
|
|
1298
|
+
}
|
|
1299
|
+
catch (e) {
|
|
1300
|
+
return { success: false, error: e.message };
|
|
1301
|
+
}
|
|
1691
1302
|
}
|
|
1692
1303
|
/**
|
|
1693
1304
|
* Recall from hierarchical memory.
|
|
@@ -1698,47 +1309,37 @@ export function bridgeHierarchicalStore(params) {
|
|
|
1698
1309
|
* Stub API (fallback):
|
|
1699
1310
|
* recall(query: string, topK: number) → synchronous array
|
|
1700
1311
|
*/
|
|
1701
|
-
export function bridgeHierarchicalRecall(params) {
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
return
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
memoryQuery = {
|
|
1719
|
-
query: params.query,
|
|
1720
|
-
k: params.topK || 5
|
|
1721
|
-
};
|
|
1722
|
-
if (params.tier) {
|
|
1723
|
-
memoryQuery.tier = params.tier;
|
|
1724
|
-
}
|
|
1725
|
-
return [4 /*yield*/, hm.recall(memoryQuery)];
|
|
1726
|
-
case 3:
|
|
1727
|
-
results_1 = _a.sent();
|
|
1728
|
-
return [2 /*return*/, { results: results_1 || [], controller: 'hierarchicalMemory' }];
|
|
1729
|
-
case 4:
|
|
1730
|
-
results = hm.recall(params.query, params.topK || 5);
|
|
1731
|
-
filtered = params.tier
|
|
1732
|
-
? results.filter(function (r) { return r.tier === params.tier; })
|
|
1733
|
-
: results;
|
|
1734
|
-
return [2 /*return*/, { results: filtered, controller: 'hierarchicalMemory' }];
|
|
1735
|
-
case 5:
|
|
1736
|
-
e_2 = _a.sent();
|
|
1737
|
-
return [2 /*return*/, { results: [], error: e_2.message }];
|
|
1738
|
-
case 6: return [2 /*return*/];
|
|
1312
|
+
export async function bridgeHierarchicalRecall(params) {
|
|
1313
|
+
const registry = await getRegistry();
|
|
1314
|
+
if (!registry)
|
|
1315
|
+
return null;
|
|
1316
|
+
try {
|
|
1317
|
+
const hm = registry.get('hierarchicalMemory');
|
|
1318
|
+
if (!hm)
|
|
1319
|
+
return { results: [], error: 'HierarchicalMemory not available' };
|
|
1320
|
+
// Detect real HierarchicalMemory vs stub
|
|
1321
|
+
if (typeof hm.getStats === 'function' && typeof hm.promote === 'function') {
|
|
1322
|
+
// Real agentdb HierarchicalMemory — recall takes MemoryQuery object
|
|
1323
|
+
const memoryQuery = {
|
|
1324
|
+
query: params.query,
|
|
1325
|
+
k: params.topK || 5,
|
|
1326
|
+
};
|
|
1327
|
+
if (params.tier) {
|
|
1328
|
+
memoryQuery.tier = params.tier;
|
|
1739
1329
|
}
|
|
1740
|
-
|
|
1741
|
-
|
|
1330
|
+
const results = await hm.recall(memoryQuery);
|
|
1331
|
+
return { results: results || [], controller: 'hierarchicalMemory' };
|
|
1332
|
+
}
|
|
1333
|
+
// Stub fallback — recall(string, number)
|
|
1334
|
+
const results = hm.recall(params.query, params.topK || 5);
|
|
1335
|
+
const filtered = params.tier
|
|
1336
|
+
? results.filter((r) => r.tier === params.tier)
|
|
1337
|
+
: results;
|
|
1338
|
+
return { results: filtered, controller: 'hierarchicalMemory' };
|
|
1339
|
+
}
|
|
1340
|
+
catch (e) {
|
|
1341
|
+
return { results: [], error: e.message };
|
|
1342
|
+
}
|
|
1742
1343
|
}
|
|
1743
1344
|
/**
|
|
1744
1345
|
* Run memory consolidation.
|
|
@@ -1749,33 +1350,20 @@ export function bridgeHierarchicalRecall(params) {
|
|
|
1749
1350
|
* Stub API (fallback):
|
|
1750
1351
|
* consolidate() → { promoted, pruned, timestamp }
|
|
1751
1352
|
*/
|
|
1752
|
-
export function bridgeConsolidate(params) {
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
return
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
if (!mc)
|
|
1767
|
-
return [2 /*return*/, { success: false, error: 'MemoryConsolidation not available' }];
|
|
1768
|
-
return [4 /*yield*/, mc.consolidate()];
|
|
1769
|
-
case 3:
|
|
1770
|
-
result = _a.sent();
|
|
1771
|
-
return [2 /*return*/, { success: true, consolidated: result }];
|
|
1772
|
-
case 4:
|
|
1773
|
-
e_3 = _a.sent();
|
|
1774
|
-
return [2 /*return*/, { success: false, error: e_3.message }];
|
|
1775
|
-
case 5: return [2 /*return*/];
|
|
1776
|
-
}
|
|
1777
|
-
});
|
|
1778
|
-
});
|
|
1353
|
+
export async function bridgeConsolidate(params) {
|
|
1354
|
+
const registry = await getRegistry();
|
|
1355
|
+
if (!registry)
|
|
1356
|
+
return null;
|
|
1357
|
+
try {
|
|
1358
|
+
const mc = registry.get('memoryConsolidation');
|
|
1359
|
+
if (!mc)
|
|
1360
|
+
return { success: false, error: 'MemoryConsolidation not available' };
|
|
1361
|
+
const result = await mc.consolidate();
|
|
1362
|
+
return { success: true, consolidated: result };
|
|
1363
|
+
}
|
|
1364
|
+
catch (e) {
|
|
1365
|
+
return { success: false, error: e.message };
|
|
1366
|
+
}
|
|
1779
1367
|
}
|
|
1780
1368
|
/**
|
|
1781
1369
|
* Batch operations (insert, update, delete).
|
|
@@ -1783,182 +1371,124 @@ export function bridgeConsolidate(params) {
|
|
|
1783
1371
|
* - delete: calls bulkDelete(table, conditions) on episodes table
|
|
1784
1372
|
* - update: calls bulkUpdate(table, updates, conditions) on episodes table
|
|
1785
1373
|
*/
|
|
1786
|
-
export function bridgeBatchOperation(params) {
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
return
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
switch (_a) {
|
|
1805
|
-
case 'insert': return [3 /*break*/, 3];
|
|
1806
|
-
case 'delete': return [3 /*break*/, 5];
|
|
1807
|
-
case 'update': return [3 /*break*/, 10];
|
|
1808
|
-
}
|
|
1809
|
-
return [3 /*break*/, 15];
|
|
1810
|
-
case 3:
|
|
1811
|
-
episodes = params.entries.map(function (e) { return ({
|
|
1812
|
-
content: e.value || e.content || JSON.stringify(e),
|
|
1813
|
-
metadata: e.metadata || { key: e.key }
|
|
1814
|
-
}); });
|
|
1815
|
-
return [4 /*yield*/, batch.insertEpisodes(episodes)];
|
|
1816
|
-
case 4:
|
|
1817
|
-
result = _d.sent();
|
|
1818
|
-
return [3 /*break*/, 16];
|
|
1819
|
-
case 5:
|
|
1820
|
-
keys = params.entries.map(function (e) { return e.key; }).filter(Boolean);
|
|
1821
|
-
_i = 0, keys_1 = keys;
|
|
1822
|
-
_d.label = 6;
|
|
1823
|
-
case 6:
|
|
1824
|
-
if (!(_i < keys_1.length)) return [3 /*break*/, 9];
|
|
1825
|
-
key = keys_1[_i];
|
|
1826
|
-
return [4 /*yield*/, batch.bulkDelete('episodes', { key: key })];
|
|
1827
|
-
case 7:
|
|
1828
|
-
_d.sent();
|
|
1829
|
-
_d.label = 8;
|
|
1830
|
-
case 8:
|
|
1831
|
-
_i++;
|
|
1832
|
-
return [3 /*break*/, 6];
|
|
1833
|
-
case 9:
|
|
1834
|
-
result = { deleted: keys.length };
|
|
1835
|
-
return [3 /*break*/, 16];
|
|
1836
|
-
case 10:
|
|
1837
|
-
_b = 0, _c = params.entries;
|
|
1838
|
-
_d.label = 11;
|
|
1839
|
-
case 11:
|
|
1840
|
-
if (!(_b < _c.length)) return [3 /*break*/, 14];
|
|
1841
|
-
entry = _c[_b];
|
|
1842
|
-
return [4 /*yield*/, batch.bulkUpdate('episodes', { content: entry.value || entry.content }, { key: entry.key })];
|
|
1843
|
-
case 12:
|
|
1844
|
-
_d.sent();
|
|
1845
|
-
_d.label = 13;
|
|
1846
|
-
case 13:
|
|
1847
|
-
_b++;
|
|
1848
|
-
return [3 /*break*/, 11];
|
|
1849
|
-
case 14:
|
|
1850
|
-
result = { updated: params.entries.length };
|
|
1851
|
-
return [3 /*break*/, 16];
|
|
1852
|
-
case 15: return [2 /*return*/, { success: false, error: "Unknown operation: " + params.operation }];
|
|
1853
|
-
case 16: return [2 /*return*/, { success: true, operation: params.operation, count: params.entries.length, result: result }];
|
|
1854
|
-
case 17:
|
|
1855
|
-
e_4 = _d.sent();
|
|
1856
|
-
return [2 /*return*/, { success: false, error: e_4.message }];
|
|
1857
|
-
case 18: return [2 /*return*/];
|
|
1374
|
+
export async function bridgeBatchOperation(params) {
|
|
1375
|
+
const registry = await getRegistry();
|
|
1376
|
+
if (!registry)
|
|
1377
|
+
return null;
|
|
1378
|
+
try {
|
|
1379
|
+
const batch = registry.get('batchOperations');
|
|
1380
|
+
if (!batch)
|
|
1381
|
+
return { success: false, error: 'BatchOperations not available' };
|
|
1382
|
+
let result;
|
|
1383
|
+
switch (params.operation) {
|
|
1384
|
+
case 'insert': {
|
|
1385
|
+
// insertEpisodes expects [{content, metadata?, embedding?}]
|
|
1386
|
+
const episodes = params.entries.map((e) => ({
|
|
1387
|
+
content: e.value || e.content || JSON.stringify(e),
|
|
1388
|
+
metadata: e.metadata || { key: e.key },
|
|
1389
|
+
}));
|
|
1390
|
+
result = await batch.insertEpisodes(episodes);
|
|
1391
|
+
break;
|
|
1858
1392
|
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1393
|
+
case 'delete': {
|
|
1394
|
+
// bulkDelete(table, conditions) — conditions is a WHERE clause object
|
|
1395
|
+
const keys = params.entries.map((e) => e.key).filter(Boolean);
|
|
1396
|
+
for (const key of keys) {
|
|
1397
|
+
await batch.bulkDelete('episodes', { key });
|
|
1398
|
+
}
|
|
1399
|
+
result = { deleted: keys.length };
|
|
1400
|
+
break;
|
|
1401
|
+
}
|
|
1402
|
+
case 'update': {
|
|
1403
|
+
// bulkUpdate(table, updates, conditions)
|
|
1404
|
+
for (const entry of params.entries) {
|
|
1405
|
+
await batch.bulkUpdate('episodes', { content: entry.value || entry.content }, { key: entry.key });
|
|
1406
|
+
}
|
|
1407
|
+
result = { updated: params.entries.length };
|
|
1408
|
+
break;
|
|
1409
|
+
}
|
|
1410
|
+
default: return { success: false, error: `Unknown operation: ${params.operation}` };
|
|
1411
|
+
}
|
|
1412
|
+
return { success: true, operation: params.operation, count: params.entries.length, result };
|
|
1413
|
+
}
|
|
1414
|
+
catch (e) {
|
|
1415
|
+
return { success: false, error: e.message };
|
|
1416
|
+
}
|
|
1861
1417
|
}
|
|
1862
1418
|
/**
|
|
1863
1419
|
* Synthesize context from memories.
|
|
1864
1420
|
* ContextSynthesizer.synthesize is a static method that takes MemoryPattern[] (not a string).
|
|
1865
1421
|
*/
|
|
1866
|
-
export function bridgeContextSynthesize(params) {
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
return
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
memories = [];
|
|
1885
|
-
if (!(hm && typeof hm.recall === 'function')) return [3 /*break*/, 6];
|
|
1886
|
-
recalled = void 0;
|
|
1887
|
-
if (!(typeof hm.promote === 'function')) return [3 /*break*/, 4];
|
|
1888
|
-
return [4 /*yield*/, hm.recall({ query: params.query, k: params.maxEntries || 10 })];
|
|
1889
|
-
case 3:
|
|
1890
|
-
// Real agentdb HierarchicalMemory
|
|
1891
|
-
recalled = _a.sent();
|
|
1892
|
-
return [3 /*break*/, 5];
|
|
1893
|
-
case 4:
|
|
1894
|
-
// Stub
|
|
1895
|
-
recalled = hm.recall(params.query, params.maxEntries || 10);
|
|
1896
|
-
_a.label = 5;
|
|
1897
|
-
case 5:
|
|
1898
|
-
memories = (recalled || []).map(function (r) { return ({
|
|
1899
|
-
content: r.value || r.content || '',
|
|
1900
|
-
key: r.key || r.id || '',
|
|
1901
|
-
reward: 1,
|
|
1902
|
-
verdict: 'success'
|
|
1903
|
-
}); });
|
|
1904
|
-
_a.label = 6;
|
|
1905
|
-
case 6:
|
|
1906
|
-
result = CS.synthesize(memories, { includeRecommendations: true });
|
|
1907
|
-
return [2 /*return*/, { success: true, synthesis: result }];
|
|
1908
|
-
case 7:
|
|
1909
|
-
e_5 = _a.sent();
|
|
1910
|
-
return [2 /*return*/, { success: false, error: e_5.message }];
|
|
1911
|
-
case 8: return [2 /*return*/];
|
|
1422
|
+
export async function bridgeContextSynthesize(params) {
|
|
1423
|
+
const registry = await getRegistry();
|
|
1424
|
+
if (!registry)
|
|
1425
|
+
return null;
|
|
1426
|
+
try {
|
|
1427
|
+
const CS = registry.get('contextSynthesizer');
|
|
1428
|
+
if (!CS || typeof CS.synthesize !== 'function') {
|
|
1429
|
+
return { success: false, error: 'ContextSynthesizer not available' };
|
|
1430
|
+
}
|
|
1431
|
+
// Gather memory patterns from hierarchical memory as input
|
|
1432
|
+
const hm = registry.get('hierarchicalMemory');
|
|
1433
|
+
let memories = [];
|
|
1434
|
+
if (hm && typeof hm.recall === 'function') {
|
|
1435
|
+
// Detect real HierarchicalMemory (MemoryQuery object) vs stub (string, number)
|
|
1436
|
+
let recalled;
|
|
1437
|
+
if (typeof hm.promote === 'function') {
|
|
1438
|
+
// Real agentdb HierarchicalMemory
|
|
1439
|
+
recalled = await hm.recall({ query: params.query, k: params.maxEntries || 10 });
|
|
1912
1440
|
}
|
|
1913
|
-
|
|
1914
|
-
|
|
1441
|
+
else {
|
|
1442
|
+
// Stub
|
|
1443
|
+
recalled = hm.recall(params.query, params.maxEntries || 10);
|
|
1444
|
+
}
|
|
1445
|
+
memories = (recalled || []).map((r) => ({
|
|
1446
|
+
content: r.value || r.content || '',
|
|
1447
|
+
key: r.key || r.id || '',
|
|
1448
|
+
reward: 1,
|
|
1449
|
+
verdict: 'success',
|
|
1450
|
+
}));
|
|
1451
|
+
}
|
|
1452
|
+
const result = CS.synthesize(memories, { includeRecommendations: true });
|
|
1453
|
+
return { success: true, synthesis: result };
|
|
1454
|
+
}
|
|
1455
|
+
catch (e) {
|
|
1456
|
+
return { success: false, error: e.message };
|
|
1457
|
+
}
|
|
1915
1458
|
}
|
|
1916
1459
|
/**
|
|
1917
1460
|
* Route via SemanticRouter.
|
|
1918
1461
|
* Available since agentdb 3.0.0-alpha.10 — uses @ruvector/router for
|
|
1919
1462
|
* semantic matching with keyword fallback.
|
|
1920
1463
|
*/
|
|
1921
|
-
export function bridgeSemanticRoute(params) {
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
return
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
if (!router)
|
|
1936
|
-
return [2 /*return*/, { route: null, error: 'SemanticRouter not available' }];
|
|
1937
|
-
return [4 /*yield*/, router.route(params.input)];
|
|
1938
|
-
case 3:
|
|
1939
|
-
result = _a.sent();
|
|
1940
|
-
return [2 /*return*/, { route: result, controller: 'semanticRouter' }];
|
|
1941
|
-
case 4:
|
|
1942
|
-
e_6 = _a.sent();
|
|
1943
|
-
return [2 /*return*/, { route: null, error: e_6.message }];
|
|
1944
|
-
case 5: return [2 /*return*/];
|
|
1945
|
-
}
|
|
1946
|
-
});
|
|
1947
|
-
});
|
|
1464
|
+
export async function bridgeSemanticRoute(params) {
|
|
1465
|
+
const registry = await getRegistry();
|
|
1466
|
+
if (!registry)
|
|
1467
|
+
return null;
|
|
1468
|
+
try {
|
|
1469
|
+
const router = registry.get('semanticRouter');
|
|
1470
|
+
if (!router)
|
|
1471
|
+
return { route: null, error: 'SemanticRouter not available' };
|
|
1472
|
+
const result = await router.route(params.input);
|
|
1473
|
+
return { route: result, controller: 'semanticRouter' };
|
|
1474
|
+
}
|
|
1475
|
+
catch (e) {
|
|
1476
|
+
return { route: null, error: e.message };
|
|
1477
|
+
}
|
|
1948
1478
|
}
|
|
1949
1479
|
// ===== Utility =====
|
|
1950
1480
|
function cosineSim(a, b) {
|
|
1951
1481
|
if (!a || !b || a.length === 0 || b.length === 0)
|
|
1952
1482
|
return 0;
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
for (
|
|
1956
|
-
|
|
1483
|
+
const len = Math.min(a.length, b.length);
|
|
1484
|
+
let dot = 0, normA = 0, normB = 0;
|
|
1485
|
+
for (let i = 0; i < len; i++) {
|
|
1486
|
+
const ai = a[i], bi = b[i];
|
|
1957
1487
|
dot += ai * bi;
|
|
1958
1488
|
normA += ai * ai;
|
|
1959
1489
|
normB += bi * bi;
|
|
1960
1490
|
}
|
|
1961
|
-
|
|
1491
|
+
const mag = Math.sqrt(normA * normB);
|
|
1962
1492
|
return mag === 0 ? 0 : dot / mag;
|
|
1963
1493
|
}
|
|
1964
1494
|
//# sourceMappingURL=memory-bridge.js.map
|