kynjal-cli 3.1.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/core/planner.md +2 -2
- package/.claude/agents/core/researcher.md +1 -1
- package/.claude/agents/core/reviewer.md +1 -1
- package/.claude/agents/core/tester.md +1 -1
- package/.claude/agents/data/data-ml-model.md +4 -4
- package/.claude/agents/development/dev-backend-api.md +4 -4
- package/.claude/agents/documentation/docs-api-openapi.md +4 -4
- package/.claude/agents/github/code-review-swarm.md +2 -2
- package/.claude/agents/github/issue-tracker.md +2 -2
- package/.claude/agents/github/pr-manager.md +2 -2
- package/.claude/agents/github/release-manager.md +2 -2
- package/.claude/agents/github/workflow-automation.md +2 -2
- package/.claude/agents/sparc/architecture.md +3 -3
- package/.claude/agents/sparc/pseudocode.md +2 -2
- package/.claude/agents/sparc/refinement.md +3 -3
- package/.claude/agents/sparc/specification.md +2 -2
- package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
- package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
- package/.claude/agents/swarm/mesh-coordinator.md +1 -1
- package/.claude/agents/templates/base-template-generator.md +25 -4
- package/.claude/agents/templates/sparc-coordinator.md +3 -3
- package/.claude/helpers/auto-commit.sh +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +27 -9
- package/.claude/helpers/hook-handler.cjs +58 -18
- package/.claude/helpers/statusline.cjs +14 -33
- package/.claude/helpers/statusline.js +3 -3
- package/.claude/settings.json +9 -9
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
- package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
- package/README.md +383 -170
- package/bin/cli.js +6 -6
- package/bin/mcp-server.js +1 -1
- package/bin/preinstall.cjs +2 -0
- package/dist/src/appliance/gguf-engine.js +664 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +492 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +383 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +533 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.js +465 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +373 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +469 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/benchmarks/pretrain/index.js +542 -331
- package/dist/src/benchmarks/pretrain/index.js.map +1 -1
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +725 -502
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.js +1548 -1218
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +324 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +581 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +523 -372
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +364 -274
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.d.ts.map +1 -0
- package/dist/src/commands/cleanup.js +262 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/completions.js +118 -477
- package/dist/src/commands/completions.js.map +1 -1
- package/dist/src/commands/config.js +303 -237
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +597 -425
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +275 -194
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +690 -460
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1543 -1293
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/guidance.js +596 -449
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.js +938 -854
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +3677 -2570
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.js +322 -122
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +943 -787
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.js +558 -383
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +605 -475
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +1031 -814
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +347 -282
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +1563 -1283
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +643 -497
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +841 -668
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.js +447 -392
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.js +256 -162
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +220 -150
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/route.js +665 -520
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/ruvector/backup.js +651 -505
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js +401 -349
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +267 -225
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +75 -37
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/init.js +359 -336
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js +322 -335
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js +431 -375
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +117 -703
- package/dist/src/commands/ruvector/setup.js.map +1 -1
- package/dist/src/commands/ruvector/status.js +419 -364
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +610 -456
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +627 -505
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +368 -271
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +492 -379
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +488 -408
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +539 -424
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/transfer-store.js +412 -322
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.js +291 -196
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.js +486 -386
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/config-adapter.js +40 -39
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.js +416 -312
- package/dist/src/index.js.map +1 -1
- package/dist/src/infrastructure/in-memory-repositories.js +507 -246
- package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +78 -368
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.js +1019 -1345
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.js +60 -635
- 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.d.ts +0 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js +62 -42
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +167 -100
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +16 -8
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +20 -1300
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +15 -5
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +66 -76
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.js +130 -76
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.js +758 -445
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +492 -391
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/agentdb-tools.js +758 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/analyze-tools.js +236 -172
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +142 -80
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +375 -252
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +565 -473
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +284 -190
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +600 -349
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +367 -289
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +693 -582
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +312 -261
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +2 -0
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +2 -0
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +514 -329
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +428 -326
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +480 -420
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +278 -204
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- package/dist/src/mcp-tools/security-tools.js +429 -297
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +234 -185
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +303 -64
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +352 -200
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +357 -189
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +196 -148
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +333 -186
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +471 -335
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +345 -173
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.js +841 -359
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.js +1964 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.js +1895 -1602
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.js +329 -199
- 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 +273 -242
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.js +217 -124
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.js +531 -278
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +362 -275
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/index.js +105 -48
- package/dist/src/plugins/store/index.js.map +1 -1
- package/dist/src/plugins/store/search.js +107 -69
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
- package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +223 -172
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/plugins/tests/test-plugin-store.js +228 -190
- package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
- package/dist/src/production/circuit-breaker.js +126 -62
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.js +156 -86
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.js +220 -139
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.js +93 -74
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.js +167 -75
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/prompt.js +560 -436
- package/dist/src/prompt.js.map +1 -1
- package/dist/src/runtime/headless.js +289 -200
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.js +511 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/ast-analyzer.js +232 -145
- package/dist/src/ruvector/ast-analyzer.js.map +1 -1
- package/dist/src/ruvector/coverage-router.js +419 -287
- package/dist/src/ruvector/coverage-router.js.map +1 -1
- package/dist/src/ruvector/coverage-tools.js +101 -56
- package/dist/src/ruvector/coverage-tools.js.map +1 -1
- package/dist/src/ruvector/diff-classifier.js +451 -324
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +337 -251
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/flash-attention.js +254 -223
- package/dist/src/ruvector/flash-attention.js.map +1 -1
- package/dist/src/ruvector/graph-analyzer.js +680 -486
- package/dist/src/ruvector/graph-analyzer.js.map +1 -1
- package/dist/src/ruvector/index.js +113 -27
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/lora-adapter.js +248 -155
- package/dist/src/ruvector/lora-adapter.js.map +1 -1
- package/dist/src/ruvector/model-router.js +248 -175
- package/dist/src/ruvector/model-router.js.map +1 -1
- package/dist/src/ruvector/moe-router.js +286 -228
- package/dist/src/ruvector/moe-router.js.map +1 -1
- package/dist/src/ruvector/q-learning-router.js +338 -257
- package/dist/src/ruvector/q-learning-router.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.js +527 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/ruvector/semantic-router.js +67 -60
- package/dist/src/ruvector/semantic-router.js.map +1 -1
- package/dist/src/ruvector/vector-db.js +205 -119
- package/dist/src/ruvector/vector-db.js.map +1 -1
- package/dist/src/services/agentic-flow-bridge.js +168 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +940 -615
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.js +669 -399
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/headless-worker-executor.js +467 -441
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/index.d.ts +5 -5
- 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.js +201 -93
- package/dist/src/services/registry-api.js.map +1 -1
- package/dist/src/services/ruvector-training.js +414 -144
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.js +928 -531
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.js +550 -331
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/suggest.js +55 -45
- package/dist/src/suggest.js.map +1 -1
- package/dist/src/transfer/anonymization/index.js +37 -29
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +156 -129
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/export.js +142 -84
- 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 +2 -0
- package/dist/src/transfer/index.js.map +1 -1
- package/dist/src/transfer/ipfs/client.js +337 -179
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +434 -290
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.js +58 -58
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +37 -33
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.js +248 -139
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +353 -243
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.js +365 -243
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/index.js +130 -63
- package/dist/src/transfer/store/index.js.map +1 -1
- package/dist/src/transfer/store/publish.js +258 -184
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.js +73 -51
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.js +96 -64
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +231 -174
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/test-seraphine.js +130 -95
- package/dist/src/transfer/test-seraphine.js.map +1 -1
- package/dist/src/transfer/tests/test-store.js +239 -194
- package/dist/src/transfer/tests/test-store.js.map +1 -1
- package/dist/src/types.js +56 -27
- package/dist/src/types.js.map +1 -1
- package/dist/src/update/checker.js +183 -106
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.js +198 -135
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.js +85 -38
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.js +31 -19
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.js +64 -38
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -10
- package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
- package/.claude/agents/custom/design-architect.yaml +0 -48
- package/.claude/agents/custom/ui-developer.yaml +0 -46
- package/.claude/agents/custom/ux-researcher.yaml +0 -60
- package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
- package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
- package/dist/src/commands/index.d.ts +0 -108
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/config-adapter.d.ts +0 -15
- package/dist/src/config-adapter.d.ts.map +0 -1
- package/dist/src/index.d.ts +0 -76
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
- package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
- package/dist/src/init/claudemd-generator.d.ts +0 -25
- package/dist/src/init/claudemd-generator.d.ts.map +0 -1
- package/dist/src/init/executor.d.ts +0 -41
- package/dist/src/init/executor.d.ts.map +0 -1
- package/dist/src/init/helpers-generator.d.ts +0 -60
- package/dist/src/init/helpers-generator.d.ts.map +0 -1
- package/dist/src/mcp-client.d.ts +0 -92
- package/dist/src/mcp-client.d.ts.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -161
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-tools/auto-install.d.ts +0 -83
- package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
- package/dist/src/mcp-tools/types.d.ts +0 -31
- package/dist/src/mcp-tools/types.d.ts.map +0 -1
- package/dist/src/memory/ewc-consolidation.d.ts +0 -271
- package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
- package/dist/src/memory/intelligence.d.ts +0 -285
- package/dist/src/memory/intelligence.d.ts.map +0 -1
- package/dist/src/memory/memory-initializer.d.ts +0 -396
- package/dist/src/memory/memory-initializer.d.ts.map +0 -1
- package/dist/src/memory/sona-optimizer.d.ts +0 -227
- package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
- package/dist/src/parser.d.ts +0 -41
- package/dist/src/parser.d.ts.map +0 -1
- package/dist/src/plugins/manager.d.ts +0 -133
- package/dist/src/plugins/manager.d.ts.map +0 -1
- package/dist/src/plugins/store/discovery.d.ts +0 -88
- package/dist/src/plugins/store/discovery.d.ts.map +0 -1
- package/dist/src/plugins/store/index.d.ts +0 -76
- package/dist/src/plugins/store/index.d.ts.map +0 -1
- package/dist/src/plugins/store/search.d.ts +0 -46
- package/dist/src/plugins/store/search.d.ts.map +0 -1
- package/dist/src/plugins/store/types.d.ts +0 -274
- package/dist/src/plugins/store/types.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.d.ts +0 -101
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -92
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -161
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -80
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/prompt.d.ts +0 -44
- package/dist/src/prompt.d.ts.map +0 -1
- package/dist/src/runtime/headless.d.ts +0 -60
- package/dist/src/runtime/headless.d.ts.map +0 -1
- package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
- package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/coverage-router.d.ts +0 -160
- package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
- package/dist/src/ruvector/diff-classifier.d.ts +0 -175
- package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
- package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
- package/dist/src/ruvector/flash-attention.d.ts +0 -195
- package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
- package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
- package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
- package/dist/src/ruvector/index.d.ts +0 -34
- package/dist/src/ruvector/index.d.ts.map +0 -1
- package/dist/src/ruvector/lora-adapter.d.ts +0 -218
- package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
- package/dist/src/ruvector/model-router.d.ts +0 -220
- package/dist/src/ruvector/model-router.d.ts.map +0 -1
- package/dist/src/ruvector/moe-router.d.ts +0 -206
- package/dist/src/ruvector/moe-router.d.ts.map +0 -1
- package/dist/src/ruvector/q-learning-router.d.ts +0 -211
- package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
- package/dist/src/ruvector/semantic-router.d.ts +0 -77
- package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
- package/dist/src/ruvector/vector-db.d.ts +0 -69
- package/dist/src/ruvector/vector-db.d.ts.map +0 -1
- package/dist/src/services/claim-service.d.ts +0 -204
- package/dist/src/services/claim-service.d.ts.map +0 -1
- package/dist/src/services/container-worker-pool.d.ts +0 -197
- package/dist/src/services/container-worker-pool.d.ts.map +0 -1
- package/dist/src/services/headless-worker-executor.d.ts +0 -304
- package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
- package/dist/src/services/registry-api.d.ts +0 -58
- package/dist/src/services/registry-api.d.ts.map +0 -1
- package/dist/src/services/ruvector-training.d.ts +0 -213
- package/dist/src/services/ruvector-training.d.ts.map +0 -1
- package/dist/src/services/worker-daemon.d.ts +0 -203
- package/dist/src/services/worker-daemon.d.ts.map +0 -1
- package/dist/src/services/worker-queue.d.ts +0 -194
- package/dist/src/services/worker-queue.d.ts.map +0 -1
- package/dist/src/suggest.d.ts +0 -53
- package/dist/src/suggest.d.ts.map +0 -1
- package/dist/src/transfer/export.d.ts +0 -25
- package/dist/src/transfer/export.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/client.d.ts +0 -109
- package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
- package/dist/src/transfer/ipfs/upload.d.ts +0 -95
- package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
- package/dist/src/transfer/models/seraphine.d.ts +0 -72
- package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
- package/dist/src/transfer/serialization/cfp.d.ts +0 -49
- package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
- package/dist/src/transfer/storage/gcs.d.ts +0 -82
- package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
- package/dist/src/transfer/store/discovery.d.ts +0 -84
- package/dist/src/transfer/store/discovery.d.ts.map +0 -1
- package/dist/src/transfer/store/download.d.ts +0 -70
- package/dist/src/transfer/store/download.d.ts.map +0 -1
- package/dist/src/transfer/store/index.d.ts +0 -84
- package/dist/src/transfer/store/index.d.ts.map +0 -1
- package/dist/src/transfer/store/publish.d.ts +0 -76
- package/dist/src/transfer/store/publish.d.ts.map +0 -1
- package/dist/src/transfer/store/search.d.ts +0 -54
- package/dist/src/transfer/store/search.d.ts.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/types.d.ts +0 -198
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/update/checker.d.ts +0 -34
- package/dist/src/update/checker.d.ts.map +0 -1
- package/dist/src/update/executor.d.ts +0 -32
- package/dist/src/update/executor.d.ts.map +0 -1
- package/dist/src/update/index.d.ts +0 -33
- package/dist/src/update/index.d.ts.map +0 -1
- package/dist/src/update/rate-limiter.d.ts +0 -20
- package/dist/src/update/rate-limiter.d.ts.map +0 -1
- package/dist/src/update/validator.d.ts +0 -17
- package/dist/src/update/validator.d.ts.map +0 -1
|
@@ -0,0 +1,1964 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Bridge — Routes CLI memory operations through ControllerRegistry + AgentDB v3
|
|
3
|
+
*
|
|
4
|
+
* Per ADR-053 Phases 1-6: Full controller activation pipeline.
|
|
5
|
+
* CLI → ControllerRegistry → AgentDB v3 controllers.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: Core CRUD + embeddings + HNSW + controller access (complete)
|
|
8
|
+
* Phase 2: BM25 hybrid search, TieredCache read/write, MutationGuard validation
|
|
9
|
+
* Phase 3: ReasoningBank pattern store, recordFeedback, CausalMemoryGraph edges
|
|
10
|
+
* Phase 4: SkillLibrary promotion, ExplainableRecall provenance, AttestationLog
|
|
11
|
+
* Phase 5: ReflexionMemory session lifecycle, WitnessChain attestation
|
|
12
|
+
* Phase 6: AgentDB MCP tools (separate file), COW branching
|
|
13
|
+
*
|
|
14
|
+
* Uses better-sqlite3 API (synchronous .all()/.get()/.run()) since that's
|
|
15
|
+
* what AgentDB v3 uses internally.
|
|
16
|
+
*
|
|
17
|
+
* @module v3/cli/memory-bridge
|
|
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
|
+
import * as path from 'path';
|
|
76
|
+
import * as crypto from 'crypto';
|
|
77
|
+
// ===== Lazy singleton =====
|
|
78
|
+
var registryPromise = null;
|
|
79
|
+
var registryInstance = null;
|
|
80
|
+
var bridgeAvailable = null;
|
|
81
|
+
/**
|
|
82
|
+
* Resolve database path with path traversal protection.
|
|
83
|
+
* Only allows paths within or below the project's .swarm directory,
|
|
84
|
+
* or the special ':memory:' path.
|
|
85
|
+
*/
|
|
86
|
+
function getDbPath(customPath) {
|
|
87
|
+
var swarmDir = path.resolve(process.cwd(), '.swarm');
|
|
88
|
+
if (!customPath)
|
|
89
|
+
return path.join(swarmDir, 'memory.db');
|
|
90
|
+
if (customPath === ':memory:')
|
|
91
|
+
return ':memory:';
|
|
92
|
+
var resolved = path.resolve(customPath);
|
|
93
|
+
// Ensure the path doesn't escape the working directory
|
|
94
|
+
var cwd = process.cwd();
|
|
95
|
+
if (!resolved.startsWith(cwd)) {
|
|
96
|
+
return path.join(swarmDir, 'memory.db'); // fallback to safe default
|
|
97
|
+
}
|
|
98
|
+
return resolved;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate a secure random ID for memory entries.
|
|
102
|
+
*/
|
|
103
|
+
function generateId(prefix) {
|
|
104
|
+
return prefix + "_" + Date.now() + "_" + crypto.randomBytes(8).toString('hex');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Lazily initialize the ControllerRegistry singleton.
|
|
108
|
+
* Returns null if @claude-flow/memory is not available.
|
|
109
|
+
*/
|
|
110
|
+
function getRegistry(dbPath) {
|
|
111
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
112
|
+
var _this = this;
|
|
113
|
+
return __generator(this, function (_a) {
|
|
114
|
+
if (bridgeAvailable === false)
|
|
115
|
+
return [2 /*return*/, null];
|
|
116
|
+
if (registryInstance)
|
|
117
|
+
return [2 /*return*/, registryInstance];
|
|
118
|
+
if (!registryPromise) {
|
|
119
|
+
registryPromise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
120
|
+
var ControllerRegistry, registry, origLog_1, _a;
|
|
121
|
+
return __generator(this, function (_b) {
|
|
122
|
+
switch (_b.label) {
|
|
123
|
+
case 0:
|
|
124
|
+
_b.trys.push([0, 6, , 7]);
|
|
125
|
+
return [4 /*yield*/, import('@claude-flow/memory')];
|
|
126
|
+
case 1:
|
|
127
|
+
ControllerRegistry = (_b.sent()).ControllerRegistry;
|
|
128
|
+
registry = new ControllerRegistry();
|
|
129
|
+
origLog_1 = console.log;
|
|
130
|
+
console.log = function () {
|
|
131
|
+
var _a;
|
|
132
|
+
var args = [];
|
|
133
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
134
|
+
args[_i] = arguments[_i];
|
|
135
|
+
}
|
|
136
|
+
var msg = String((_a = args[0]) !== null && _a !== void 0 ? _a : '');
|
|
137
|
+
if (msg.includes('Transformers.js') ||
|
|
138
|
+
msg.includes('better-sqlite3') ||
|
|
139
|
+
msg.includes('[AgentDB]') ||
|
|
140
|
+
msg.includes('[HNSWLibBackend]') ||
|
|
141
|
+
msg.includes('RuVector graph'))
|
|
142
|
+
return;
|
|
143
|
+
origLog_1.apply(console, args);
|
|
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
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}); })();
|
|
179
|
+
}
|
|
180
|
+
return [2 /*return*/, registryPromise];
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// ===== Phase 2: BM25 hybrid scoring =====
|
|
185
|
+
/**
|
|
186
|
+
* BM25 scoring for keyword-based search.
|
|
187
|
+
* Replaces naive String.includes() with proper information retrieval scoring.
|
|
188
|
+
* Parameters tuned for short memory entries (k1=1.2, b=0.75).
|
|
189
|
+
*/
|
|
190
|
+
function bm25Score(queryTerms, docContent, avgDocLength, docCount, termDocFreqs) {
|
|
191
|
+
var k1 = 1.2;
|
|
192
|
+
var b = 0.75;
|
|
193
|
+
var docWords = docContent.toLowerCase().split(/\s+/);
|
|
194
|
+
var docLength = docWords.length;
|
|
195
|
+
var score = 0;
|
|
196
|
+
var _loop_1 = function (term) {
|
|
197
|
+
var tf = docWords.filter(function (w) { return w === term || w.includes(term); }).length;
|
|
198
|
+
if (tf === 0)
|
|
199
|
+
return "continue";
|
|
200
|
+
var df = termDocFreqs.get(term) || 1;
|
|
201
|
+
var idf = Math.log((docCount - df + 0.5) / (df + 0.5) + 1);
|
|
202
|
+
var tfNorm = (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLength / Math.max(1, avgDocLength))));
|
|
203
|
+
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
|
+
}
|
|
209
|
+
return score;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Compute BM25 term document frequencies for a set of rows.
|
|
213
|
+
*/
|
|
214
|
+
function computeTermDocFreqs(queryTerms, rows) {
|
|
215
|
+
var termDocFreqs = new Map();
|
|
216
|
+
var totalLength = 0;
|
|
217
|
+
for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
|
|
218
|
+
var row = rows_1[_i];
|
|
219
|
+
var content = (row.content || '').toLowerCase();
|
|
220
|
+
var words = content.split(/\s+/);
|
|
221
|
+
totalLength += words.length;
|
|
222
|
+
for (var _a = 0, queryTerms_2 = queryTerms; _a < queryTerms_2.length; _a++) {
|
|
223
|
+
var term = queryTerms_2[_a];
|
|
224
|
+
if (content.includes(term)) {
|
|
225
|
+
termDocFreqs.set(term, (termDocFreqs.get(term) || 0) + 1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return { termDocFreqs: termDocFreqs, avgDocLength: rows.length > 0 ? totalLength / rows.length : 1 };
|
|
230
|
+
}
|
|
231
|
+
// ===== Phase 2: TieredCache helpers =====
|
|
232
|
+
/**
|
|
233
|
+
* Try to read from TieredCache before hitting DB.
|
|
234
|
+
* Returns cached value or null if cache miss.
|
|
235
|
+
*/
|
|
236
|
+
function cacheGet(registry, cacheKey) {
|
|
237
|
+
var _a;
|
|
238
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
239
|
+
var cache;
|
|
240
|
+
return __generator(this, function (_b) {
|
|
241
|
+
try {
|
|
242
|
+
cache = registry.get('tieredCache');
|
|
243
|
+
if (!cache || typeof cache.get !== 'function')
|
|
244
|
+
return [2 /*return*/, null];
|
|
245
|
+
return [2 /*return*/, (_a = cache.get(cacheKey)) !== null && _a !== void 0 ? _a : null];
|
|
246
|
+
}
|
|
247
|
+
catch (_c) {
|
|
248
|
+
return [2 /*return*/, null];
|
|
249
|
+
}
|
|
250
|
+
return [2 /*return*/];
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Write to TieredCache after DB write.
|
|
256
|
+
*/
|
|
257
|
+
function cacheSet(registry, cacheKey, value) {
|
|
258
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
259
|
+
var cache;
|
|
260
|
+
return __generator(this, function (_a) {
|
|
261
|
+
try {
|
|
262
|
+
cache = registry.get('tieredCache');
|
|
263
|
+
if (cache && typeof cache.set === 'function') {
|
|
264
|
+
cache.set(cacheKey, value);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (_b) {
|
|
268
|
+
// Non-fatal
|
|
269
|
+
}
|
|
270
|
+
return [2 /*return*/];
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Invalidate a cache key after mutation.
|
|
276
|
+
*/
|
|
277
|
+
function cacheInvalidate(registry, cacheKey) {
|
|
278
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
279
|
+
var cache;
|
|
280
|
+
return __generator(this, function (_a) {
|
|
281
|
+
try {
|
|
282
|
+
cache = registry.get('tieredCache');
|
|
283
|
+
if (cache && typeof cache["delete"] === 'function') {
|
|
284
|
+
cache["delete"](cacheKey);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch (_b) {
|
|
288
|
+
// Non-fatal
|
|
289
|
+
}
|
|
290
|
+
return [2 /*return*/];
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// ===== Phase 2: MutationGuard helpers =====
|
|
295
|
+
/**
|
|
296
|
+
* Validate a mutation through MutationGuard before executing.
|
|
297
|
+
* Returns true if the mutation is allowed, false if rejected.
|
|
298
|
+
* When guard is unavailable (not installed), mutations are allowed.
|
|
299
|
+
* When guard is present but throws, mutations are DENIED (fail-closed).
|
|
300
|
+
*/
|
|
301
|
+
function guardValidate(registry, operation, params) {
|
|
302
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
303
|
+
var guard, result;
|
|
304
|
+
return __generator(this, function (_a) {
|
|
305
|
+
try {
|
|
306
|
+
guard = registry.get('mutationGuard');
|
|
307
|
+
if (!guard || typeof guard.validate !== 'function') {
|
|
308
|
+
return [2 /*return*/, { allowed: true }]; // No guard installed = allow (degraded mode)
|
|
309
|
+
}
|
|
310
|
+
result = guard.validate({ operation: operation, params: params, timestamp: Date.now() });
|
|
311
|
+
return [2 /*return*/, { allowed: (result === null || result === void 0 ? void 0 : result.allowed) === true, reason: result === null || result === void 0 ? void 0 : result.reason }];
|
|
312
|
+
}
|
|
313
|
+
catch (_b) {
|
|
314
|
+
return [2 /*return*/, { allowed: false, reason: 'MutationGuard validation error' }]; // Fail-closed
|
|
315
|
+
}
|
|
316
|
+
return [2 /*return*/];
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
// ===== Phase 3: AttestationLog helpers =====
|
|
321
|
+
/**
|
|
322
|
+
* Log a write operation to AttestationLog/WitnessChain.
|
|
323
|
+
*/
|
|
324
|
+
function logAttestation(registry, operation, entryId, metadata) {
|
|
325
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
326
|
+
var attestation;
|
|
327
|
+
return __generator(this, function (_a) {
|
|
328
|
+
try {
|
|
329
|
+
attestation = registry.get('attestationLog');
|
|
330
|
+
if (!attestation)
|
|
331
|
+
return [2 /*return*/];
|
|
332
|
+
if (typeof attestation.record === 'function') {
|
|
333
|
+
attestation.record(__assign({ operation: operation, entryId: entryId, timestamp: Date.now() }, metadata));
|
|
334
|
+
}
|
|
335
|
+
else if (typeof attestation.log === 'function') {
|
|
336
|
+
attestation.log(operation, entryId, metadata);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch (_b) {
|
|
340
|
+
// Non-fatal — attestation is observability, not correctness
|
|
341
|
+
}
|
|
342
|
+
return [2 /*return*/];
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Get the AgentDB database handle and ensure memory_entries table exists.
|
|
348
|
+
* Returns null if not available.
|
|
349
|
+
*/
|
|
350
|
+
function getDb(registry) {
|
|
351
|
+
var agentdb = registry.getAgentDB();
|
|
352
|
+
if (!(agentdb === null || agentdb === void 0 ? void 0 : agentdb.database))
|
|
353
|
+
return null;
|
|
354
|
+
var db = agentdb.database;
|
|
355
|
+
// Ensure memory_entries table exists (idempotent)
|
|
356
|
+
try {
|
|
357
|
+
db.exec("CREATE TABLE IF NOT EXISTS memory_entries (\n id TEXT PRIMARY KEY,\n key TEXT NOT NULL,\n namespace TEXT DEFAULT 'default',\n content TEXT NOT NULL,\n type TEXT DEFAULT 'semantic',\n embedding TEXT,\n embedding_model TEXT DEFAULT 'local',\n embedding_dimensions INTEGER,\n tags TEXT,\n metadata TEXT,\n owner_id TEXT,\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n expires_at INTEGER,\n last_accessed_at INTEGER,\n access_count INTEGER DEFAULT 0,\n status TEXT DEFAULT 'active',\n UNIQUE(namespace, key)\n )");
|
|
358
|
+
// Ensure indexes
|
|
359
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_bridge_ns ON memory_entries(namespace)");
|
|
360
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_bridge_key ON memory_entries(key)");
|
|
361
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_bridge_status ON memory_entries(status)");
|
|
362
|
+
}
|
|
363
|
+
catch (_a) {
|
|
364
|
+
// Table already exists or db is read-only — that's fine
|
|
365
|
+
}
|
|
366
|
+
return { db: db, agentdb: agentdb };
|
|
367
|
+
}
|
|
368
|
+
// ===== Bridge functions — match memory-initializer.ts signatures =====
|
|
369
|
+
/**
|
|
370
|
+
* Store an entry via AgentDB v3.
|
|
371
|
+
* Phase 2-5: Routes through MutationGuard → TieredCache → DB → AttestationLog.
|
|
372
|
+
* Returns null to signal fallback to sql.js.
|
|
373
|
+
*/
|
|
374
|
+
export function bridgeStoreEntry(options) {
|
|
375
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
376
|
+
var registry, ctx, key, value, _a, namespace, _b, tags, ttl, id, now, guardResult, embeddingJson, dimensions, model, embedder, emb, _c, insertSql, stmt, safeNs, safeKey, cacheKey, _d;
|
|
377
|
+
return __generator(this, function (_e) {
|
|
378
|
+
switch (_e.label) {
|
|
379
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
380
|
+
case 1:
|
|
381
|
+
registry = _e.sent();
|
|
382
|
+
if (!registry)
|
|
383
|
+
return [2 /*return*/, null];
|
|
384
|
+
ctx = getDb(registry);
|
|
385
|
+
if (!ctx)
|
|
386
|
+
return [2 /*return*/, null];
|
|
387
|
+
_e.label = 2;
|
|
388
|
+
case 2:
|
|
389
|
+
_e.trys.push([2, 11, , 12]);
|
|
390
|
+
key = options.key, value = options.value, _a = options.namespace, namespace = _a === void 0 ? 'default' : _a, _b = options.tags, tags = _b === void 0 ? [] : _b, ttl = options.ttl;
|
|
391
|
+
id = generateId('entry');
|
|
392
|
+
now = Date.now();
|
|
393
|
+
return [4 /*yield*/, guardValidate(registry, 'store', { key: key, namespace: namespace, size: value.length })];
|
|
394
|
+
case 3:
|
|
395
|
+
guardResult = _e.sent();
|
|
396
|
+
if (!guardResult.allowed) {
|
|
397
|
+
return [2 /*return*/, { success: false, id: id, error: "MutationGuard rejected: " + guardResult.reason }];
|
|
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();
|
|
411
|
+
if (emb) {
|
|
412
|
+
embeddingJson = JSON.stringify(Array.from(emb));
|
|
413
|
+
dimensions = emb.length;
|
|
414
|
+
model = 'Xenova/all-MiniLM-L6-v2';
|
|
415
|
+
}
|
|
416
|
+
_e.label = 6;
|
|
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*/];
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Search entries via AgentDB v3.
|
|
456
|
+
* Phase 2: BM25 hybrid scoring replaces naive String.includes() keyword fallback.
|
|
457
|
+
* Combines cosine similarity (semantic) with BM25 (lexical) via reciprocal rank fusion.
|
|
458
|
+
*/
|
|
459
|
+
export function bridgeSearchEntries(options) {
|
|
460
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
461
|
+
var registry, ctx, queryStr, _a, namespace, _b, limit, _c, threshold, startTime, queryEmbedding, embedder, emb, _d, nsFilter, rows, stmt, queryTerms, _e, termDocFreqs, avgDocLength, docCount, results, _i, rows_2, row, semanticScore, bm25ScoreVal, embedding, score, provenance, _f;
|
|
462
|
+
return __generator(this, function (_g) {
|
|
463
|
+
switch (_g.label) {
|
|
464
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
465
|
+
case 1:
|
|
466
|
+
registry = _g.sent();
|
|
467
|
+
if (!registry)
|
|
468
|
+
return [2 /*return*/, null];
|
|
469
|
+
ctx = getDb(registry);
|
|
470
|
+
if (!ctx)
|
|
471
|
+
return [2 /*return*/, null];
|
|
472
|
+
_g.label = 2;
|
|
473
|
+
case 2:
|
|
474
|
+
_g.trys.push([2, 8, , 9]);
|
|
475
|
+
queryStr = options.query, _a = options.namespace, namespace = _a === void 0 ? 'default' : _a, _b = options.limit, limit = _b === void 0 ? 10 : _b, _c = options.threshold, threshold = _c === void 0 ? 0.3 : _c;
|
|
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*/];
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* List entries via AgentDB v3.
|
|
562
|
+
*/
|
|
563
|
+
export function bridgeListEntries(options) {
|
|
564
|
+
var _a, _b;
|
|
565
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
566
|
+
var registry, ctx, namespace, _c, limit, _d, offset, nsFilter, nsParams, total, countStmt, countRow, entries, stmt, rows, _i, rows_3, row;
|
|
567
|
+
return __generator(this, function (_e) {
|
|
568
|
+
switch (_e.label) {
|
|
569
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
570
|
+
case 1:
|
|
571
|
+
registry = _e.sent();
|
|
572
|
+
if (!registry)
|
|
573
|
+
return [2 /*return*/, null];
|
|
574
|
+
ctx = getDb(registry);
|
|
575
|
+
if (!ctx)
|
|
576
|
+
return [2 /*return*/, null];
|
|
577
|
+
try {
|
|
578
|
+
namespace = options.namespace, _c = options.limit, limit = _c === void 0 ? 20 : _c, _d = options.offset, offset = _d === void 0 ? 0 : _d;
|
|
579
|
+
nsFilter = namespace ? "AND namespace = ?" : '';
|
|
580
|
+
nsParams = namespace ? [namespace] : [];
|
|
581
|
+
total = 0;
|
|
582
|
+
try {
|
|
583
|
+
countStmt = ctx.db.prepare("SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' " + nsFilter);
|
|
584
|
+
countRow = countStmt.get.apply(countStmt, nsParams);
|
|
585
|
+
total = (_a = countRow === null || countRow === void 0 ? void 0 : countRow.cnt) !== null && _a !== void 0 ? _a : 0;
|
|
586
|
+
}
|
|
587
|
+
catch (_f) {
|
|
588
|
+
return [2 /*return*/, null];
|
|
589
|
+
}
|
|
590
|
+
entries = [];
|
|
591
|
+
try {
|
|
592
|
+
stmt = ctx.db.prepare("\n SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at\n FROM memory_entries\n WHERE status = 'active' " + nsFilter + "\n ORDER BY updated_at DESC\n LIMIT ? OFFSET ?\n ");
|
|
593
|
+
rows = stmt.all.apply(stmt, __spreadArray(__spreadArray([], nsParams, false), [limit, offset], false));
|
|
594
|
+
for (_i = 0, rows_3 = rows; _i < rows_3.length; _i++) {
|
|
595
|
+
row = rows_3[_i];
|
|
596
|
+
entries.push({
|
|
597
|
+
id: String(row.id).substring(0, 20),
|
|
598
|
+
key: row.key || String(row.id).substring(0, 15),
|
|
599
|
+
namespace: row.namespace || 'default',
|
|
600
|
+
size: (row.content || '').length,
|
|
601
|
+
accessCount: (_b = row.access_count) !== null && _b !== void 0 ? _b : 0,
|
|
602
|
+
createdAt: row.created_at || new Date().toISOString(),
|
|
603
|
+
updatedAt: row.updated_at || new Date().toISOString(),
|
|
604
|
+
hasEmbedding: !!(row.embedding && String(row.embedding).length > 10)
|
|
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*/];
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Get a specific entry via AgentDB v3.
|
|
623
|
+
* Phase 2: TieredCache consulted before DB hit.
|
|
624
|
+
*/
|
|
625
|
+
export function bridgeGetEntry(options) {
|
|
626
|
+
var _a, _b;
|
|
627
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
628
|
+
var registry, ctx, key, _c, namespace, safeNs, safeKey, cacheKey, cached, row, stmt, tags, entry, _d;
|
|
629
|
+
return __generator(this, function (_e) {
|
|
630
|
+
switch (_e.label) {
|
|
631
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
632
|
+
case 1:
|
|
633
|
+
registry = _e.sent();
|
|
634
|
+
if (!registry)
|
|
635
|
+
return [2 /*return*/, null];
|
|
636
|
+
ctx = getDb(registry);
|
|
637
|
+
if (!ctx)
|
|
638
|
+
return [2 /*return*/, null];
|
|
639
|
+
_e.label = 2;
|
|
640
|
+
case 2:
|
|
641
|
+
_e.trys.push([2, 5, , 6]);
|
|
642
|
+
key = options.key, _c = options.namespace, namespace = _c === void 0 ? 'default' : _c;
|
|
643
|
+
safeNs = String(namespace).replace(/:/g, '_');
|
|
644
|
+
safeKey = String(key).replace(/:/g, '_');
|
|
645
|
+
cacheKey = "entry:" + safeNs + ":" + safeKey;
|
|
646
|
+
return [4 /*yield*/, cacheGet(registry, cacheKey)];
|
|
647
|
+
case 3:
|
|
648
|
+
cached = _e.sent();
|
|
649
|
+
if (cached && cached.content) {
|
|
650
|
+
return [2 /*return*/, {
|
|
651
|
+
success: true,
|
|
652
|
+
found: true,
|
|
653
|
+
cacheHit: true,
|
|
654
|
+
entry: {
|
|
655
|
+
id: String(cached.id || ''),
|
|
656
|
+
key: cached.key || key,
|
|
657
|
+
namespace: cached.namespace || namespace,
|
|
658
|
+
content: cached.content || '',
|
|
659
|
+
accessCount: (_a = cached.accessCount) !== null && _a !== void 0 ? _a : 0,
|
|
660
|
+
createdAt: cached.createdAt || new Date().toISOString(),
|
|
661
|
+
updatedAt: cached.updatedAt || new Date().toISOString(),
|
|
662
|
+
hasEmbedding: !!cached.embedding,
|
|
663
|
+
tags: cached.tags || []
|
|
664
|
+
}
|
|
665
|
+
}];
|
|
666
|
+
}
|
|
667
|
+
row = void 0;
|
|
668
|
+
try {
|
|
669
|
+
stmt = ctx.db.prepare("\n SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at, tags\n FROM memory_entries\n WHERE status = 'active' AND key = ? AND namespace = ?\n LIMIT 1\n ");
|
|
670
|
+
row = stmt.get(key, namespace);
|
|
671
|
+
}
|
|
672
|
+
catch (_f) {
|
|
673
|
+
return [2 /*return*/, null];
|
|
674
|
+
}
|
|
675
|
+
if (!row) {
|
|
676
|
+
return [2 /*return*/, { success: true, found: false }];
|
|
677
|
+
}
|
|
678
|
+
// Update access count
|
|
679
|
+
try {
|
|
680
|
+
ctx.db.prepare("UPDATE memory_entries SET access_count = access_count + 1, last_accessed_at = ? WHERE id = ?").run(Date.now(), row.id);
|
|
681
|
+
}
|
|
682
|
+
catch (_g) {
|
|
683
|
+
// Non-fatal
|
|
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*/];
|
|
713
|
+
}
|
|
714
|
+
});
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
/**
|
|
718
|
+
* Delete an entry via AgentDB v3.
|
|
719
|
+
* Phase 5: MutationGuard validation, cache invalidation, attestation logging.
|
|
720
|
+
*/
|
|
721
|
+
export function bridgeDeleteEntry(options) {
|
|
722
|
+
var _a, _b;
|
|
723
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
724
|
+
var registry, ctx, key, _c, namespace, guardResult, changes, result, safeNs, safeKey, remaining, row, _d;
|
|
725
|
+
return __generator(this, function (_e) {
|
|
726
|
+
switch (_e.label) {
|
|
727
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
728
|
+
case 1:
|
|
729
|
+
registry = _e.sent();
|
|
730
|
+
if (!registry)
|
|
731
|
+
return [2 /*return*/, null];
|
|
732
|
+
ctx = getDb(registry);
|
|
733
|
+
if (!ctx)
|
|
734
|
+
return [2 /*return*/, null];
|
|
735
|
+
_e.label = 2;
|
|
736
|
+
case 2:
|
|
737
|
+
_e.trys.push([2, 7, , 8]);
|
|
738
|
+
key = options.key, _c = options.namespace, namespace = _c === void 0 ? 'default' : _c;
|
|
739
|
+
return [4 /*yield*/, guardValidate(registry, 'delete', { key: key, namespace: namespace })];
|
|
740
|
+
case 3:
|
|
741
|
+
guardResult = _e.sent();
|
|
742
|
+
if (!guardResult.allowed) {
|
|
743
|
+
return [2 /*return*/, { success: false, deleted: false, key: key, namespace: namespace, remainingEntries: 0, error: "MutationGuard rejected: " + guardResult.reason }];
|
|
744
|
+
}
|
|
745
|
+
changes = 0;
|
|
746
|
+
try {
|
|
747
|
+
result = ctx.db.prepare("\n UPDATE memory_entries\n SET status = 'deleted', updated_at = ?\n WHERE key = ? AND namespace = ? AND status = 'active'\n ").run(Date.now(), key, namespace);
|
|
748
|
+
changes = (_a = result === null || result === void 0 ? void 0 : result.changes) !== null && _a !== void 0 ? _a : 0;
|
|
749
|
+
}
|
|
750
|
+
catch (_f) {
|
|
751
|
+
return [2 /*return*/, null];
|
|
752
|
+
}
|
|
753
|
+
safeNs = String(namespace).replace(/:/g, '_');
|
|
754
|
+
safeKey = String(key).replace(/:/g, '_');
|
|
755
|
+
return [4 /*yield*/, cacheInvalidate(registry, "entry:" + safeNs + ":" + safeKey)];
|
|
756
|
+
case 4:
|
|
757
|
+
_e.sent();
|
|
758
|
+
if (!(changes > 0)) return [3 /*break*/, 6];
|
|
759
|
+
return [4 /*yield*/, logAttestation(registry, 'delete', key, { namespace: namespace })];
|
|
760
|
+
case 5:
|
|
761
|
+
_e.sent();
|
|
762
|
+
_e.label = 6;
|
|
763
|
+
case 6:
|
|
764
|
+
remaining = 0;
|
|
765
|
+
try {
|
|
766
|
+
row = ctx.db.prepare("SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active'").get();
|
|
767
|
+
remaining = (_b = row === null || row === void 0 ? void 0 : row.cnt) !== null && _b !== void 0 ? _b : 0;
|
|
768
|
+
}
|
|
769
|
+
catch (_g) {
|
|
770
|
+
// Non-fatal
|
|
771
|
+
}
|
|
772
|
+
return [2 /*return*/, {
|
|
773
|
+
success: true,
|
|
774
|
+
deleted: changes > 0,
|
|
775
|
+
key: key,
|
|
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
|
+
});
|
|
787
|
+
}
|
|
788
|
+
// ===== Phase 2: Embedding bridge =====
|
|
789
|
+
/**
|
|
790
|
+
* Generate embedding via AgentDB v3's embedder.
|
|
791
|
+
* Returns null if bridge unavailable — caller falls back to own ONNX/hash.
|
|
792
|
+
*/
|
|
793
|
+
export function bridgeGenerateEmbedding(text, dbPath) {
|
|
794
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
795
|
+
var registry, agentdb, embedder, emb, _a;
|
|
796
|
+
return __generator(this, function (_b) {
|
|
797
|
+
switch (_b.label) {
|
|
798
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
799
|
+
case 1:
|
|
800
|
+
registry = _b.sent();
|
|
801
|
+
if (!registry)
|
|
802
|
+
return [2 /*return*/, null];
|
|
803
|
+
_b.label = 2;
|
|
804
|
+
case 2:
|
|
805
|
+
_b.trys.push([2, 4, , 5]);
|
|
806
|
+
agentdb = registry.getAgentDB();
|
|
807
|
+
embedder = agentdb === null || agentdb === void 0 ? void 0 : agentdb.embedder;
|
|
808
|
+
if (!embedder)
|
|
809
|
+
return [2 /*return*/, null];
|
|
810
|
+
return [4 /*yield*/, embedder.embed(text)];
|
|
811
|
+
case 3:
|
|
812
|
+
emb = _b.sent();
|
|
813
|
+
if (!emb)
|
|
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
|
+
});
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Load embedding model via AgentDB v3 (it loads on init).
|
|
830
|
+
* Returns null if unavailable.
|
|
831
|
+
*/
|
|
832
|
+
export function bridgeLoadEmbeddingModel(dbPath) {
|
|
833
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
834
|
+
var startTime, registry, agentdb, embedder, test, _a;
|
|
835
|
+
return __generator(this, function (_b) {
|
|
836
|
+
switch (_b.label) {
|
|
837
|
+
case 0:
|
|
838
|
+
startTime = Date.now();
|
|
839
|
+
return [4 /*yield*/, getRegistry(dbPath)];
|
|
840
|
+
case 1:
|
|
841
|
+
registry = _b.sent();
|
|
842
|
+
if (!registry)
|
|
843
|
+
return [2 /*return*/, null];
|
|
844
|
+
_b.label = 2;
|
|
845
|
+
case 2:
|
|
846
|
+
_b.trys.push([2, 4, , 5]);
|
|
847
|
+
agentdb = registry.getAgentDB();
|
|
848
|
+
embedder = agentdb === null || agentdb === void 0 ? void 0 : agentdb.embedder;
|
|
849
|
+
if (!embedder)
|
|
850
|
+
return [2 /*return*/, null];
|
|
851
|
+
return [4 /*yield*/, embedder.embed('test')];
|
|
852
|
+
case 3:
|
|
853
|
+
test = _b.sent();
|
|
854
|
+
if (!test)
|
|
855
|
+
return [2 /*return*/, null];
|
|
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
|
+
});
|
|
869
|
+
}
|
|
870
|
+
// ===== Phase 3: HNSW bridge =====
|
|
871
|
+
/**
|
|
872
|
+
* Get HNSW status from AgentDB v3's vector backend or HNSW index.
|
|
873
|
+
* Returns null if unavailable.
|
|
874
|
+
*/
|
|
875
|
+
export function bridgeGetHNSWStatus(dbPath) {
|
|
876
|
+
var _a;
|
|
877
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
878
|
+
var registry, ctx, entryCount, row;
|
|
879
|
+
return __generator(this, function (_b) {
|
|
880
|
+
switch (_b.label) {
|
|
881
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
882
|
+
case 1:
|
|
883
|
+
registry = _b.sent();
|
|
884
|
+
if (!registry)
|
|
885
|
+
return [2 /*return*/, null];
|
|
886
|
+
try {
|
|
887
|
+
ctx = getDb(registry);
|
|
888
|
+
if (!ctx)
|
|
889
|
+
return [2 /*return*/, null];
|
|
890
|
+
entryCount = 0;
|
|
891
|
+
try {
|
|
892
|
+
row = ctx.db.prepare("SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' AND embedding IS NOT NULL").get();
|
|
893
|
+
entryCount = (_a = row === null || row === void 0 ? void 0 : row.cnt) !== null && _a !== void 0 ? _a : 0;
|
|
894
|
+
}
|
|
895
|
+
catch (_c) {
|
|
896
|
+
// Table might not exist
|
|
897
|
+
}
|
|
898
|
+
return [2 /*return*/, {
|
|
899
|
+
available: true,
|
|
900
|
+
initialized: true,
|
|
901
|
+
entryCount: entryCount,
|
|
902
|
+
dimensions: 384
|
|
903
|
+
}];
|
|
904
|
+
}
|
|
905
|
+
catch (_d) {
|
|
906
|
+
return [2 /*return*/, null];
|
|
907
|
+
}
|
|
908
|
+
return [2 /*return*/];
|
|
909
|
+
}
|
|
910
|
+
});
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
/**
|
|
914
|
+
* Search using AgentDB v3's embedder + SQLite entries.
|
|
915
|
+
* This is the HNSW-equivalent search through the bridge.
|
|
916
|
+
* Returns null if unavailable.
|
|
917
|
+
*/
|
|
918
|
+
export function bridgeSearchHNSW(queryEmbedding, options, dbPath) {
|
|
919
|
+
var _a, _b;
|
|
920
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
921
|
+
var registry, ctx, k, threshold, nsFilter, rows, stmt, results, _i, rows_4, row, emb, score;
|
|
922
|
+
return __generator(this, function (_c) {
|
|
923
|
+
switch (_c.label) {
|
|
924
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
925
|
+
case 1:
|
|
926
|
+
registry = _c.sent();
|
|
927
|
+
if (!registry)
|
|
928
|
+
return [2 /*return*/, null];
|
|
929
|
+
ctx = getDb(registry);
|
|
930
|
+
if (!ctx)
|
|
931
|
+
return [2 /*return*/, null];
|
|
932
|
+
try {
|
|
933
|
+
k = (_a = options === null || options === void 0 ? void 0 : options.k) !== null && _a !== void 0 ? _a : 10;
|
|
934
|
+
threshold = (_b = options === null || options === void 0 ? void 0 : options.threshold) !== null && _b !== void 0 ? _b : 0.3;
|
|
935
|
+
nsFilter = (options === null || options === void 0 ? void 0 : options.namespace) && options.namespace !== 'all'
|
|
936
|
+
? "AND namespace = ?"
|
|
937
|
+
: '';
|
|
938
|
+
rows = void 0;
|
|
939
|
+
try {
|
|
940
|
+
stmt = ctx.db.prepare("\n SELECT id, key, namespace, content, embedding\n FROM memory_entries\n WHERE status = 'active' AND embedding IS NOT NULL " + nsFilter + "\n LIMIT 10000\n ");
|
|
941
|
+
rows = nsFilter
|
|
942
|
+
? stmt.all(options.namespace)
|
|
943
|
+
: stmt.all();
|
|
944
|
+
}
|
|
945
|
+
catch (_d) {
|
|
946
|
+
return [2 /*return*/, null];
|
|
947
|
+
}
|
|
948
|
+
results = [];
|
|
949
|
+
for (_i = 0, rows_4 = rows; _i < rows_4.length; _i++) {
|
|
950
|
+
row = rows_4[_i];
|
|
951
|
+
if (!row.embedding)
|
|
952
|
+
continue;
|
|
953
|
+
try {
|
|
954
|
+
emb = JSON.parse(row.embedding);
|
|
955
|
+
score = cosineSim(queryEmbedding, emb);
|
|
956
|
+
if (score >= threshold) {
|
|
957
|
+
results.push({
|
|
958
|
+
id: String(row.id).substring(0, 12),
|
|
959
|
+
key: row.key || String(row.id).substring(0, 15),
|
|
960
|
+
content: (row.content || '').substring(0, 60) +
|
|
961
|
+
((row.content || '').length > 60 ? '...' : ''),
|
|
962
|
+
score: score,
|
|
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*/];
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
});
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Add entry to the bridge's database with embedding.
|
|
984
|
+
* Returns null if unavailable.
|
|
985
|
+
*/
|
|
986
|
+
export function bridgeAddToHNSW(id, embedding, entry, dbPath) {
|
|
987
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
988
|
+
var registry, ctx, now, embeddingJson;
|
|
989
|
+
return __generator(this, function (_a) {
|
|
990
|
+
switch (_a.label) {
|
|
991
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
992
|
+
case 1:
|
|
993
|
+
registry = _a.sent();
|
|
994
|
+
if (!registry)
|
|
995
|
+
return [2 /*return*/, null];
|
|
996
|
+
ctx = getDb(registry);
|
|
997
|
+
if (!ctx)
|
|
998
|
+
return [2 /*return*/, null];
|
|
999
|
+
try {
|
|
1000
|
+
now = Date.now();
|
|
1001
|
+
embeddingJson = JSON.stringify(embedding);
|
|
1002
|
+
ctx.db.prepare("\n INSERT OR REPLACE INTO memory_entries (\n id, key, namespace, content, type,\n embedding, embedding_dimensions, embedding_model,\n created_at, updated_at, status\n ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, 'Xenova/all-MiniLM-L6-v2', ?, ?, 'active')\n ").run(id, entry.key, entry.namespace, entry.content, embeddingJson, embedding.length, now, now);
|
|
1003
|
+
return [2 /*return*/, true];
|
|
1004
|
+
}
|
|
1005
|
+
catch (_b) {
|
|
1006
|
+
return [2 /*return*/, null];
|
|
1007
|
+
}
|
|
1008
|
+
return [2 /*return*/];
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
// ===== Phase 4: Controller access =====
|
|
1014
|
+
/**
|
|
1015
|
+
* Get a named controller from AgentDB v3 via ControllerRegistry.
|
|
1016
|
+
* Returns null if unavailable.
|
|
1017
|
+
*/
|
|
1018
|
+
export function bridgeGetController(name, dbPath) {
|
|
1019
|
+
var _a;
|
|
1020
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1021
|
+
var registry;
|
|
1022
|
+
return __generator(this, function (_b) {
|
|
1023
|
+
switch (_b.label) {
|
|
1024
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
1025
|
+
case 1:
|
|
1026
|
+
registry = _b.sent();
|
|
1027
|
+
if (!registry)
|
|
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
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
/**
|
|
1041
|
+
* Check if a controller is available.
|
|
1042
|
+
*/
|
|
1043
|
+
export function bridgeHasController(name, dbPath) {
|
|
1044
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1045
|
+
var registry, controller;
|
|
1046
|
+
return __generator(this, function (_a) {
|
|
1047
|
+
switch (_a.label) {
|
|
1048
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
1049
|
+
case 1:
|
|
1050
|
+
registry = _a.sent();
|
|
1051
|
+
if (!registry)
|
|
1052
|
+
return [2 /*return*/, false];
|
|
1053
|
+
try {
|
|
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
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* List all controllers and their status.
|
|
1067
|
+
*/
|
|
1068
|
+
export function bridgeListControllers(dbPath) {
|
|
1069
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1070
|
+
var registry;
|
|
1071
|
+
return __generator(this, function (_a) {
|
|
1072
|
+
switch (_a.label) {
|
|
1073
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
1074
|
+
case 1:
|
|
1075
|
+
registry = _a.sent();
|
|
1076
|
+
if (!registry)
|
|
1077
|
+
return [2 /*return*/, null];
|
|
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
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* Check if the AgentDB v3 bridge is available.
|
|
1091
|
+
*/
|
|
1092
|
+
export function isBridgeAvailable(dbPath) {
|
|
1093
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1094
|
+
var registry;
|
|
1095
|
+
return __generator(this, function (_a) {
|
|
1096
|
+
switch (_a.label) {
|
|
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
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Get the ControllerRegistry instance (for advanced consumers).
|
|
1110
|
+
*/
|
|
1111
|
+
export function getControllerRegistry(dbPath) {
|
|
1112
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1113
|
+
return __generator(this, function (_a) {
|
|
1114
|
+
return [2 /*return*/, getRegistry(dbPath)];
|
|
1115
|
+
});
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1118
|
+
/**
|
|
1119
|
+
* Shutdown the bridge and release resources.
|
|
1120
|
+
*/
|
|
1121
|
+
export function shutdownBridge() {
|
|
1122
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1123
|
+
var _a;
|
|
1124
|
+
return __generator(this, function (_b) {
|
|
1125
|
+
switch (_b.label) {
|
|
1126
|
+
case 0:
|
|
1127
|
+
if (!registryInstance) return [3 /*break*/, 5];
|
|
1128
|
+
_b.label = 1;
|
|
1129
|
+
case 1:
|
|
1130
|
+
_b.trys.push([1, 3, , 4]);
|
|
1131
|
+
return [4 /*yield*/, registryInstance.shutdown()];
|
|
1132
|
+
case 2:
|
|
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
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
// ===== Phase 3: ReasoningBank pattern operations =====
|
|
1149
|
+
/**
|
|
1150
|
+
* Store a pattern via ReasoningBank controller.
|
|
1151
|
+
* Falls back to raw SQL if ReasoningBank unavailable.
|
|
1152
|
+
*/
|
|
1153
|
+
export function bridgeStorePattern(options) {
|
|
1154
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1155
|
+
var registry, reasoningBank, patternId, result, _a;
|
|
1156
|
+
return __generator(this, function (_b) {
|
|
1157
|
+
switch (_b.label) {
|
|
1158
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1159
|
+
case 1:
|
|
1160
|
+
registry = _b.sent();
|
|
1161
|
+
if (!registry)
|
|
1162
|
+
return [2 /*return*/, null];
|
|
1163
|
+
_b.label = 2;
|
|
1164
|
+
case 2:
|
|
1165
|
+
_b.trys.push([2, 6, , 7]);
|
|
1166
|
+
reasoningBank = registry.get('reasoningBank');
|
|
1167
|
+
patternId = generateId('pattern');
|
|
1168
|
+
if (!(reasoningBank && typeof reasoningBank.store === 'function')) return [3 /*break*/, 4];
|
|
1169
|
+
return [4 /*yield*/, reasoningBank.store({
|
|
1170
|
+
id: patternId,
|
|
1171
|
+
content: options.pattern,
|
|
1172
|
+
type: options.type,
|
|
1173
|
+
confidence: options.confidence,
|
|
1174
|
+
metadata: options.metadata,
|
|
1175
|
+
timestamp: Date.now()
|
|
1176
|
+
})];
|
|
1177
|
+
case 3:
|
|
1178
|
+
_b.sent();
|
|
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
|
+
}
|
|
1196
|
+
});
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
/**
|
|
1200
|
+
* Search patterns via ReasoningBank controller.
|
|
1201
|
+
*/
|
|
1202
|
+
export function bridgeSearchPatterns(options) {
|
|
1203
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1204
|
+
var registry, reasoningBank, results, result, _a;
|
|
1205
|
+
return __generator(this, function (_b) {
|
|
1206
|
+
switch (_b.label) {
|
|
1207
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1208
|
+
case 1:
|
|
1209
|
+
registry = _b.sent();
|
|
1210
|
+
if (!registry)
|
|
1211
|
+
return [2 /*return*/, null];
|
|
1212
|
+
_b.label = 2;
|
|
1213
|
+
case 2:
|
|
1214
|
+
_b.trys.push([2, 6, , 7]);
|
|
1215
|
+
reasoningBank = registry.get('reasoningBank');
|
|
1216
|
+
if (!(reasoningBank && typeof reasoningBank.search === 'function')) return [3 /*break*/, 4];
|
|
1217
|
+
return [4 /*yield*/, reasoningBank.search(options.query, {
|
|
1218
|
+
topK: options.topK || 5,
|
|
1219
|
+
minScore: options.minConfidence || 0.3
|
|
1220
|
+
})];
|
|
1221
|
+
case 3:
|
|
1222
|
+
results = _b.sent();
|
|
1223
|
+
return [2 /*return*/, {
|
|
1224
|
+
results: Array.isArray(results) ? results.map(function (r) {
|
|
1225
|
+
var _a, _b;
|
|
1226
|
+
return ({
|
|
1227
|
+
id: r.id || r.patternId || '',
|
|
1228
|
+
content: r.content || r.pattern || '',
|
|
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
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
// ===== Phase 3: Feedback recording =====
|
|
1256
|
+
/**
|
|
1257
|
+
* Record task feedback for learning via ReasoningBank or LearningSystem.
|
|
1258
|
+
* Wired into hooks_post-task handler.
|
|
1259
|
+
*/
|
|
1260
|
+
export function bridgeRecordFeedback(options) {
|
|
1261
|
+
var _a;
|
|
1262
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1263
|
+
var registry, controller, updated, learningSystem, _b, reasoningBank, _c, skills, _i, _d, pattern, _e, storeResult, _f;
|
|
1264
|
+
return __generator(this, function (_g) {
|
|
1265
|
+
switch (_g.label) {
|
|
1266
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1267
|
+
case 1:
|
|
1268
|
+
registry = _g.sent();
|
|
1269
|
+
if (!registry)
|
|
1270
|
+
return [2 /*return*/, null];
|
|
1271
|
+
_g.label = 2;
|
|
1272
|
+
case 2:
|
|
1273
|
+
_g.trys.push([2, 25, , 26]);
|
|
1274
|
+
controller = 'none';
|
|
1275
|
+
updated = 0;
|
|
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();
|
|
1288
|
+
controller = 'learningSystem';
|
|
1289
|
+
updated++;
|
|
1290
|
+
return [3 /*break*/, 7];
|
|
1291
|
+
case 5:
|
|
1292
|
+
if (!(typeof learningSystem.record === 'function')) return [3 /*break*/, 7];
|
|
1293
|
+
return [4 /*yield*/, learningSystem.record(options.taskId, options.quality, options.success ? 'success' : 'failure')];
|
|
1294
|
+
case 6:
|
|
1295
|
+
_g.sent();
|
|
1296
|
+
controller = 'learningSystem';
|
|
1297
|
+
updated++;
|
|
1298
|
+
_g.label = 7;
|
|
1299
|
+
case 7: return [3 /*break*/, 9];
|
|
1300
|
+
case 8:
|
|
1301
|
+
_b = _g.sent();
|
|
1302
|
+
return [3 /*break*/, 9];
|
|
1303
|
+
case 9:
|
|
1304
|
+
reasoningBank = registry.get('reasoningBank');
|
|
1305
|
+
if (!reasoningBank) return [3 /*break*/, 16];
|
|
1306
|
+
_g.label = 10;
|
|
1307
|
+
case 10:
|
|
1308
|
+
_g.trys.push([10, 15, , 16]);
|
|
1309
|
+
if (!(typeof reasoningBank.recordOutcome === 'function')) return [3 /*break*/, 12];
|
|
1310
|
+
return [4 /*yield*/, reasoningBank.recordOutcome({
|
|
1311
|
+
taskId: options.taskId, verdict: options.success ? 'success' : 'failure',
|
|
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";
|
|
1325
|
+
updated++;
|
|
1326
|
+
_g.label = 14;
|
|
1327
|
+
case 14: return [3 /*break*/, 16];
|
|
1328
|
+
case 15:
|
|
1329
|
+
_c = _g.sent();
|
|
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();
|
|
1346
|
+
updated++;
|
|
1347
|
+
return [3 /*break*/, 21];
|
|
1348
|
+
case 20:
|
|
1349
|
+
_e = _g.sent();
|
|
1350
|
+
return [3 /*break*/, 21];
|
|
1351
|
+
case 21:
|
|
1352
|
+
_i++;
|
|
1353
|
+
return [3 /*break*/, 17];
|
|
1354
|
+
case 22:
|
|
1355
|
+
controller += '+skills';
|
|
1356
|
+
_g.label = 23;
|
|
1357
|
+
case 23: return [4 /*yield*/, bridgeStoreEntry({
|
|
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";
|
|
1368
|
+
updated++;
|
|
1369
|
+
}
|
|
1370
|
+
return [2 /*return*/, { success: true, controller: controller, updated: updated }];
|
|
1371
|
+
case 25:
|
|
1372
|
+
_f = _g.sent();
|
|
1373
|
+
return [2 /*return*/, null];
|
|
1374
|
+
case 26: return [2 /*return*/];
|
|
1375
|
+
}
|
|
1376
|
+
});
|
|
1377
|
+
});
|
|
1378
|
+
}
|
|
1379
|
+
// ===== Phase 3: CausalMemoryGraph =====
|
|
1380
|
+
/**
|
|
1381
|
+
* Record a causal edge between two entries (e.g., task → result).
|
|
1382
|
+
*/
|
|
1383
|
+
export function bridgeRecordCausalEdge(options) {
|
|
1384
|
+
var _a;
|
|
1385
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1386
|
+
var registry, causalGraph, ctx;
|
|
1387
|
+
return __generator(this, function (_b) {
|
|
1388
|
+
switch (_b.label) {
|
|
1389
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1390
|
+
case 1:
|
|
1391
|
+
registry = _b.sent();
|
|
1392
|
+
if (!registry)
|
|
1393
|
+
return [2 /*return*/, null];
|
|
1394
|
+
try {
|
|
1395
|
+
causalGraph = registry.get('causalGraph');
|
|
1396
|
+
if (causalGraph && typeof causalGraph.addEdge === 'function') {
|
|
1397
|
+
causalGraph.addEdge(options.sourceId, options.targetId, {
|
|
1398
|
+
relation: options.relation,
|
|
1399
|
+
weight: (_a = options.weight) !== null && _a !== void 0 ? _a : 1.0,
|
|
1400
|
+
timestamp: Date.now()
|
|
1401
|
+
});
|
|
1402
|
+
return [2 /*return*/, { success: true, controller: 'causalGraph' }];
|
|
1403
|
+
}
|
|
1404
|
+
ctx = getDb(registry);
|
|
1405
|
+
if (ctx) {
|
|
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*/];
|
|
1418
|
+
}
|
|
1419
|
+
});
|
|
1420
|
+
});
|
|
1421
|
+
}
|
|
1422
|
+
// ===== Phase 5: ReflexionMemory session lifecycle =====
|
|
1423
|
+
/**
|
|
1424
|
+
* Start a session with ReflexionMemory episodic replay.
|
|
1425
|
+
* Loads relevant past session patterns for the new session.
|
|
1426
|
+
*/
|
|
1427
|
+
export function bridgeSessionStart(options) {
|
|
1428
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1429
|
+
var registry, restoredPatterns, controller, reflexion, searchResult, _a;
|
|
1430
|
+
return __generator(this, function (_b) {
|
|
1431
|
+
switch (_b.label) {
|
|
1432
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1433
|
+
case 1:
|
|
1434
|
+
registry = _b.sent();
|
|
1435
|
+
if (!registry)
|
|
1436
|
+
return [2 /*return*/, null];
|
|
1437
|
+
_b.label = 2;
|
|
1438
|
+
case 2:
|
|
1439
|
+
_b.trys.push([2, 6, , 7]);
|
|
1440
|
+
restoredPatterns = 0;
|
|
1441
|
+
controller = 'none';
|
|
1442
|
+
reflexion = registry.get('reflexion');
|
|
1443
|
+
if (!(reflexion && typeof reflexion.startEpisode === 'function')) return [3 /*break*/, 4];
|
|
1444
|
+
return [4 /*yield*/, reflexion.startEpisode(options.sessionId, { context: options.context })];
|
|
1445
|
+
case 3:
|
|
1446
|
+
_b.sent();
|
|
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
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
});
|
|
1474
|
+
}
|
|
1475
|
+
/**
|
|
1476
|
+
* End a session and persist episodic summary to ReflexionMemory.
|
|
1477
|
+
*/
|
|
1478
|
+
export function bridgeSessionEnd(options) {
|
|
1479
|
+
var _a, _b;
|
|
1480
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1481
|
+
var registry, controller, persisted, reflexion, nightlyLearner, _c, _d;
|
|
1482
|
+
return __generator(this, function (_e) {
|
|
1483
|
+
switch (_e.label) {
|
|
1484
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1485
|
+
case 1:
|
|
1486
|
+
registry = _e.sent();
|
|
1487
|
+
if (!registry)
|
|
1488
|
+
return [2 /*return*/, null];
|
|
1489
|
+
_e.label = 2;
|
|
1490
|
+
case 2:
|
|
1491
|
+
_e.trys.push([2, 10, , 11]);
|
|
1492
|
+
controller = 'none';
|
|
1493
|
+
persisted = false;
|
|
1494
|
+
reflexion = registry.get('reflexion');
|
|
1495
|
+
if (!(reflexion && typeof reflexion.endEpisode === 'function')) return [3 /*break*/, 4];
|
|
1496
|
+
return [4 /*yield*/, reflexion.endEpisode(options.sessionId, {
|
|
1497
|
+
summary: options.summary,
|
|
1498
|
+
tasksCompleted: options.tasksCompleted,
|
|
1499
|
+
patternsLearned: options.patternsLearned
|
|
1500
|
+
})];
|
|
1501
|
+
case 3:
|
|
1502
|
+
_e.sent();
|
|
1503
|
+
controller = 'reflexion';
|
|
1504
|
+
persisted = true;
|
|
1505
|
+
_e.label = 4;
|
|
1506
|
+
case 4:
|
|
1507
|
+
// Persist session summary as memory entry
|
|
1508
|
+
return [4 /*yield*/, bridgeStoreEntry({
|
|
1509
|
+
key: "session-" + options.sessionId,
|
|
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
|
+
}
|
|
1547
|
+
});
|
|
1548
|
+
});
|
|
1549
|
+
}
|
|
1550
|
+
// ===== Phase 5: SemanticRouter bridge =====
|
|
1551
|
+
/**
|
|
1552
|
+
* Route a task via AgentDB's SemanticRouter.
|
|
1553
|
+
* Returns null to fall back to local ruvector router.
|
|
1554
|
+
*/
|
|
1555
|
+
export function bridgeRouteTask(options) {
|
|
1556
|
+
var _a, _b, _c;
|
|
1557
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1558
|
+
var registry, semanticRouter, result, learningSystem, rec, _d;
|
|
1559
|
+
return __generator(this, function (_e) {
|
|
1560
|
+
switch (_e.label) {
|
|
1561
|
+
case 0: return [4 /*yield*/, getRegistry(options.dbPath)];
|
|
1562
|
+
case 1:
|
|
1563
|
+
registry = _e.sent();
|
|
1564
|
+
if (!registry)
|
|
1565
|
+
return [2 /*return*/, null];
|
|
1566
|
+
_e.label = 2;
|
|
1567
|
+
case 2:
|
|
1568
|
+
_e.trys.push([2, 7, , 8]);
|
|
1569
|
+
semanticRouter = registry.get('semanticRouter');
|
|
1570
|
+
if (!(semanticRouter && typeof semanticRouter.route === 'function')) return [3 /*break*/, 4];
|
|
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*/];
|
|
1603
|
+
}
|
|
1604
|
+
});
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
// ===== Phase 4: Health check with attestation =====
|
|
1608
|
+
/**
|
|
1609
|
+
* Get comprehensive bridge health including all controller statuses.
|
|
1610
|
+
*/
|
|
1611
|
+
export function bridgeHealthCheck(dbPath) {
|
|
1612
|
+
var _a, _b, _c;
|
|
1613
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1614
|
+
var registry, controllers, attestationCount, attestation, cacheStats, cache, s;
|
|
1615
|
+
return __generator(this, function (_d) {
|
|
1616
|
+
switch (_d.label) {
|
|
1617
|
+
case 0: return [4 /*yield*/, getRegistry(dbPath)];
|
|
1618
|
+
case 1:
|
|
1619
|
+
registry = _d.sent();
|
|
1620
|
+
if (!registry)
|
|
1621
|
+
return [2 /*return*/, null];
|
|
1622
|
+
try {
|
|
1623
|
+
controllers = registry.listControllers();
|
|
1624
|
+
attestationCount = 0;
|
|
1625
|
+
attestation = registry.get('attestationLog');
|
|
1626
|
+
if (attestation && typeof attestation.count === 'function') {
|
|
1627
|
+
attestationCount = attestation.count();
|
|
1628
|
+
}
|
|
1629
|
+
cacheStats = { size: 0, hits: 0, misses: 0 };
|
|
1630
|
+
cache = registry.get('tieredCache');
|
|
1631
|
+
if (cache && typeof cache.stats === 'function') {
|
|
1632
|
+
s = cache.stats();
|
|
1633
|
+
cacheStats = { size: (_a = s.size) !== null && _a !== void 0 ? _a : 0, hits: (_b = s.hits) !== null && _b !== void 0 ? _b : 0, misses: (_c = s.misses) !== null && _c !== void 0 ? _c : 0 };
|
|
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
|
+
});
|
|
1644
|
+
}
|
|
1645
|
+
// ===== Phase 7: Hierarchical memory, consolidation, batch, context, semantic route =====
|
|
1646
|
+
/**
|
|
1647
|
+
* Store to hierarchical memory with tier.
|
|
1648
|
+
* Valid tiers: working, episodic, semantic
|
|
1649
|
+
*
|
|
1650
|
+
* Real HierarchicalMemory API (agentdb alpha.10+):
|
|
1651
|
+
* store(content, importance?, tier?, options?) → Promise<string>
|
|
1652
|
+
* Stub API (fallback):
|
|
1653
|
+
* store(key, value, tier) — synchronous
|
|
1654
|
+
*/
|
|
1655
|
+
export function bridgeHierarchicalStore(params) {
|
|
1656
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1657
|
+
var registry, hm, tier, id, e_1;
|
|
1658
|
+
return __generator(this, function (_a) {
|
|
1659
|
+
switch (_a.label) {
|
|
1660
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1661
|
+
case 1:
|
|
1662
|
+
registry = _a.sent();
|
|
1663
|
+
if (!registry)
|
|
1664
|
+
return [2 /*return*/, null];
|
|
1665
|
+
_a.label = 2;
|
|
1666
|
+
case 2:
|
|
1667
|
+
_a.trys.push([2, 5, , 6]);
|
|
1668
|
+
hm = registry.get('hierarchicalMemory');
|
|
1669
|
+
if (!hm)
|
|
1670
|
+
return [2 /*return*/, { success: false, error: 'HierarchicalMemory not available' }];
|
|
1671
|
+
tier = params.tier || 'working';
|
|
1672
|
+
if (!(typeof hm.getStats === 'function' && typeof hm.promote === 'function')) return [3 /*break*/, 4];
|
|
1673
|
+
return [4 /*yield*/, hm.store(params.value, params.importance || 0.5, tier, {
|
|
1674
|
+
metadata: { key: params.key },
|
|
1675
|
+
tags: [params.key]
|
|
1676
|
+
})];
|
|
1677
|
+
case 3:
|
|
1678
|
+
id = _a.sent();
|
|
1679
|
+
return [2 /*return*/, { success: true, id: id, key: params.key, tier: tier }];
|
|
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
|
+
});
|
|
1691
|
+
}
|
|
1692
|
+
/**
|
|
1693
|
+
* Recall from hierarchical memory.
|
|
1694
|
+
*
|
|
1695
|
+
* Real HierarchicalMemory API (agentdb alpha.10+):
|
|
1696
|
+
* recall(query: MemoryQuery) → Promise<MemoryItem[]>
|
|
1697
|
+
* where MemoryQuery = { query, tier?, k?, threshold?, context?, includeDecayed? }
|
|
1698
|
+
* Stub API (fallback):
|
|
1699
|
+
* recall(query: string, topK: number) → synchronous array
|
|
1700
|
+
*/
|
|
1701
|
+
export function bridgeHierarchicalRecall(params) {
|
|
1702
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1703
|
+
var registry, hm, memoryQuery, results_1, results, filtered, e_2;
|
|
1704
|
+
return __generator(this, function (_a) {
|
|
1705
|
+
switch (_a.label) {
|
|
1706
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1707
|
+
case 1:
|
|
1708
|
+
registry = _a.sent();
|
|
1709
|
+
if (!registry)
|
|
1710
|
+
return [2 /*return*/, null];
|
|
1711
|
+
_a.label = 2;
|
|
1712
|
+
case 2:
|
|
1713
|
+
_a.trys.push([2, 5, , 6]);
|
|
1714
|
+
hm = registry.get('hierarchicalMemory');
|
|
1715
|
+
if (!hm)
|
|
1716
|
+
return [2 /*return*/, { results: [], error: 'HierarchicalMemory not available' }];
|
|
1717
|
+
if (!(typeof hm.getStats === 'function' && typeof hm.promote === 'function')) return [3 /*break*/, 4];
|
|
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*/];
|
|
1739
|
+
}
|
|
1740
|
+
});
|
|
1741
|
+
});
|
|
1742
|
+
}
|
|
1743
|
+
/**
|
|
1744
|
+
* Run memory consolidation.
|
|
1745
|
+
*
|
|
1746
|
+
* Real MemoryConsolidation API (agentdb alpha.10+):
|
|
1747
|
+
* consolidate() → Promise<ConsolidationReport>
|
|
1748
|
+
* ConsolidationReport = { episodicProcessed, semanticCreated, memoriesForgotten, ... }
|
|
1749
|
+
* Stub API (fallback):
|
|
1750
|
+
* consolidate() → { promoted, pruned, timestamp }
|
|
1751
|
+
*/
|
|
1752
|
+
export function bridgeConsolidate(params) {
|
|
1753
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1754
|
+
var registry, mc, result, e_3;
|
|
1755
|
+
return __generator(this, function (_a) {
|
|
1756
|
+
switch (_a.label) {
|
|
1757
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1758
|
+
case 1:
|
|
1759
|
+
registry = _a.sent();
|
|
1760
|
+
if (!registry)
|
|
1761
|
+
return [2 /*return*/, null];
|
|
1762
|
+
_a.label = 2;
|
|
1763
|
+
case 2:
|
|
1764
|
+
_a.trys.push([2, 4, , 5]);
|
|
1765
|
+
mc = registry.get('memoryConsolidation');
|
|
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
|
+
});
|
|
1779
|
+
}
|
|
1780
|
+
/**
|
|
1781
|
+
* Batch operations (insert, update, delete).
|
|
1782
|
+
* - insert: calls insertEpisodes(entries) where entries are {content, metadata?}
|
|
1783
|
+
* - delete: calls bulkDelete(table, conditions) on episodes table
|
|
1784
|
+
* - update: calls bulkUpdate(table, updates, conditions) on episodes table
|
|
1785
|
+
*/
|
|
1786
|
+
export function bridgeBatchOperation(params) {
|
|
1787
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1788
|
+
var registry, batch, result, _a, episodes, keys, _i, keys_1, key, _b, _c, entry, e_4;
|
|
1789
|
+
return __generator(this, function (_d) {
|
|
1790
|
+
switch (_d.label) {
|
|
1791
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1792
|
+
case 1:
|
|
1793
|
+
registry = _d.sent();
|
|
1794
|
+
if (!registry)
|
|
1795
|
+
return [2 /*return*/, null];
|
|
1796
|
+
_d.label = 2;
|
|
1797
|
+
case 2:
|
|
1798
|
+
_d.trys.push([2, 17, , 18]);
|
|
1799
|
+
batch = registry.get('batchOperations');
|
|
1800
|
+
if (!batch)
|
|
1801
|
+
return [2 /*return*/, { success: false, error: 'BatchOperations not available' }];
|
|
1802
|
+
result = void 0;
|
|
1803
|
+
_a = params.operation;
|
|
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*/];
|
|
1858
|
+
}
|
|
1859
|
+
});
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1862
|
+
/**
|
|
1863
|
+
* Synthesize context from memories.
|
|
1864
|
+
* ContextSynthesizer.synthesize is a static method that takes MemoryPattern[] (not a string).
|
|
1865
|
+
*/
|
|
1866
|
+
export function bridgeContextSynthesize(params) {
|
|
1867
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1868
|
+
var registry, CS, hm, memories, recalled, result, e_5;
|
|
1869
|
+
return __generator(this, function (_a) {
|
|
1870
|
+
switch (_a.label) {
|
|
1871
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1872
|
+
case 1:
|
|
1873
|
+
registry = _a.sent();
|
|
1874
|
+
if (!registry)
|
|
1875
|
+
return [2 /*return*/, null];
|
|
1876
|
+
_a.label = 2;
|
|
1877
|
+
case 2:
|
|
1878
|
+
_a.trys.push([2, 7, , 8]);
|
|
1879
|
+
CS = registry.get('contextSynthesizer');
|
|
1880
|
+
if (!CS || typeof CS.synthesize !== 'function') {
|
|
1881
|
+
return [2 /*return*/, { success: false, error: 'ContextSynthesizer not available' }];
|
|
1882
|
+
}
|
|
1883
|
+
hm = registry.get('hierarchicalMemory');
|
|
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*/];
|
|
1912
|
+
}
|
|
1913
|
+
});
|
|
1914
|
+
});
|
|
1915
|
+
}
|
|
1916
|
+
/**
|
|
1917
|
+
* Route via SemanticRouter.
|
|
1918
|
+
* Available since agentdb 3.0.0-alpha.10 — uses @ruvector/router for
|
|
1919
|
+
* semantic matching with keyword fallback.
|
|
1920
|
+
*/
|
|
1921
|
+
export function bridgeSemanticRoute(params) {
|
|
1922
|
+
return __awaiter(this, void 0, Promise, function () {
|
|
1923
|
+
var registry, router, result, e_6;
|
|
1924
|
+
return __generator(this, function (_a) {
|
|
1925
|
+
switch (_a.label) {
|
|
1926
|
+
case 0: return [4 /*yield*/, getRegistry()];
|
|
1927
|
+
case 1:
|
|
1928
|
+
registry = _a.sent();
|
|
1929
|
+
if (!registry)
|
|
1930
|
+
return [2 /*return*/, null];
|
|
1931
|
+
_a.label = 2;
|
|
1932
|
+
case 2:
|
|
1933
|
+
_a.trys.push([2, 4, , 5]);
|
|
1934
|
+
router = registry.get('semanticRouter');
|
|
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
|
+
});
|
|
1948
|
+
}
|
|
1949
|
+
// ===== Utility =====
|
|
1950
|
+
function cosineSim(a, b) {
|
|
1951
|
+
if (!a || !b || a.length === 0 || b.length === 0)
|
|
1952
|
+
return 0;
|
|
1953
|
+
var len = Math.min(a.length, b.length);
|
|
1954
|
+
var dot = 0, normA = 0, normB = 0;
|
|
1955
|
+
for (var i = 0; i < len; i++) {
|
|
1956
|
+
var ai = a[i], bi = b[i];
|
|
1957
|
+
dot += ai * bi;
|
|
1958
|
+
normA += ai * ai;
|
|
1959
|
+
normB += bi * bi;
|
|
1960
|
+
}
|
|
1961
|
+
var mag = Math.sqrt(normA * normB);
|
|
1962
|
+
return mag === 0 ? 0 : dot / mag;
|
|
1963
|
+
}
|
|
1964
|
+
//# sourceMappingURL=memory-bridge.js.map
|