kynjal-cli 3.1.4 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +420 -613
- 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.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +121 -21
- package/dist/src/commands/agent.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 +215 -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 +406 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +2 -2
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +1 -1
- 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 +218 -0
- package/dist/src/commands/cleanup.js.map +1 -0
- package/dist/src/commands/config.js +1 -1
- 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 +81 -18
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.js +1 -1
- 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 +99 -51
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1 -1
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/hive-mind.js +26 -26
- 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 +800 -100
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +9 -2
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +20 -2
- 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 +22 -18
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +23 -5
- 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 +24 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +13 -7
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +1 -1
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +1 -1
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/providers.js +1 -1
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/ruvector/import.js +2 -2
- package/dist/src/commands/ruvector/import.js.map +1 -1
- package/dist/src/commands/ruvector/index.js +1 -1
- package/dist/src/commands/ruvector/index.js.map +1 -1
- package/dist/src/commands/ruvector/setup.js +6 -6
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +47 -16
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts +1 -1
- package/dist/src/commands/session.js +1 -1
- package/dist/src/commands/start.d.ts +1 -1
- package/dist/src/commands/start.js +12 -12
- 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 +13 -6
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.js +2 -2
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts +1 -1
- package/dist/src/commands/task.js +1 -1
- package/dist/src/commands/transfer-store.js +1 -1
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/config-adapter.js +1 -1
- package/dist/src/config-adapter.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +30 -30
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +86 -101
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +96 -26
- package/dist/src/init/helpers-generator.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 +34 -18
- 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 +107 -41
- 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 +537 -1019
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +14 -4
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/types.js +9 -2
- package/dist/src/init/types.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +10 -0
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +30 -4
- package/dist/src/mcp-server.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 +557 -0
- package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
- package/dist/src/mcp-tools/browser-tools.js +2 -2
- package/dist/src/mcp-tools/browser-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 +21 -2
- 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 +192 -13
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +5 -5
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +2 -2
- 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 +263 -35
- 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 +355 -40
- 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 +31 -1
- 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 +32 -27
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +1 -1
- package/dist/src/mcp-tools/performance-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 +283 -0
- package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
- 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 +216 -30
- 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 +109 -6
- 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 +102 -0
- package/dist/src/mcp-tools/task-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 +230 -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 +91 -0
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts +24 -0
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +59 -0
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts +53 -0
- package/dist/src/memory/intelligence.d.ts.map +1 -1
- package/dist/src/memory/intelligence.js +264 -7
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts +407 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge.js +1494 -0
- package/dist/src/memory/memory-bridge.js.map +1 -0
- package/dist/src/memory/memory-initializer.d.ts +17 -1
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +320 -42
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +1 -0
- package/dist/src/output.js.map +1 -1
- package/dist/src/parser.d.ts +10 -0
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js +49 -3
- package/dist/src/parser.js.map +1 -1
- package/dist/src/plugins/manager.d.ts.map +1 -1
- package/dist/src/plugins/manager.js +31 -14
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.js +5 -5
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/tests/standalone-test.js +4 -4
- package/dist/src/plugins/tests/standalone-test.js.map +1 -1
- package/dist/src/production/error-handler.js +1 -1
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/runtime/headless.d.ts +3 -3
- package/dist/src/runtime/headless.js +6 -6
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/ruvector/agent-wasm.d.ts +182 -0
- package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/agent-wasm.js +316 -0
- package/dist/src/ruvector/agent-wasm.js.map +1 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
- package/dist/src/ruvector/enhanced-model-router.js +25 -15
- package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +7 -1
- package/dist/src/ruvector/index.d.ts.map +1 -1
- package/dist/src/ruvector/index.js +17 -1
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
- package/dist/src/ruvector/ruvllm-wasm.js +363 -0
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
- package/dist/src/services/agentic-flow-bridge.js +95 -0
- package/dist/src/services/agentic-flow-bridge.js.map +1 -0
- package/dist/src/services/claim-service.js +1 -1
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts.map +1 -1
- package/dist/src/services/container-worker-pool.js +3 -1
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/index.d.ts +1 -1
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/registry-api.d.ts +1 -1
- package/dist/src/services/registry-api.js +1 -1
- package/dist/src/services/ruvector-training.d.ts +11 -2
- package/dist/src/services/ruvector-training.d.ts.map +1 -1
- package/dist/src/services/ruvector-training.js +233 -43
- package/dist/src/services/ruvector-training.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +28 -3
- package/dist/src/services/worker-daemon.d.ts.map +1 -1
- package/dist/src/services/worker-daemon.js +156 -17
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts.map +1 -1
- package/dist/src/services/worker-queue.js +2 -0
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
- package/dist/src/transfer/deploy-seraphine.js +4 -4
- package/dist/src/transfer/deploy-seraphine.js.map +1 -1
- package/dist/src/transfer/ipfs/client.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/client.js +8 -0
- package/dist/src/transfer/ipfs/client.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +0 -2
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/models/seraphine.d.ts +1 -1
- package/dist/src/transfer/models/seraphine.js +5 -5
- package/dist/src/transfer/models/seraphine.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +9 -6
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
- package/dist/src/transfer/storage/gcs.js +71 -29
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.js +4 -4
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/registry.js +1 -1
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/tests/standalone-test.js +4 -4
- package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
- package/dist/src/transfer/types.d.ts +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/update/validator.js +1 -1
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Provides intelligent hooks functionality via MCP protocol
|
|
4
4
|
*/
|
|
5
5
|
import { mkdirSync, writeFileSync, existsSync, readFileSync, statSync } from 'fs';
|
|
6
|
-
import { join, resolve } from 'path';
|
|
6
|
+
import { dirname, join, resolve } from 'path';
|
|
7
7
|
// Real vector search functions - lazy loaded to avoid circular imports
|
|
8
8
|
let searchEntriesFn = null;
|
|
9
9
|
async function getRealSearchFunction() {
|
|
@@ -121,7 +121,88 @@ function generateSimpleEmbedding(text, dimension = 384) {
|
|
|
121
121
|
}
|
|
122
122
|
return embedding;
|
|
123
123
|
}
|
|
124
|
-
//
|
|
124
|
+
// ── Runtime routing outcome persistence ──────────────────────────────
|
|
125
|
+
// Closes the learning loop: post-task records outcomes → route loads them.
|
|
126
|
+
const ROUTING_OUTCOMES_PATH = join(resolve('.'), '.claude-flow/routing-outcomes.json');
|
|
127
|
+
const ROUTING_STOPWORDS = new Set([
|
|
128
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had',
|
|
129
|
+
'do', 'does', 'did', 'will', 'would', 'could', 'should', 'may', 'might', 'shall', 'can',
|
|
130
|
+
'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
|
|
131
|
+
'before', 'after', 'above', 'below', 'between', 'under', 'again', 'further', 'then', 'once',
|
|
132
|
+
'it', 'its', 'this', 'that', 'these', 'those', 'i', 'me', 'my', 'we', 'our', 'you', 'your',
|
|
133
|
+
'he', 'she', 'they', 'them', 'and', 'but', 'or', 'nor', 'not', 'no', 'so', 'if', 'when', 'than',
|
|
134
|
+
'very', 'just', 'also', 'only', 'both', 'each', 'all', 'any', 'few', 'more', 'most', 'other',
|
|
135
|
+
'some', 'such', 'same', 'new', 'now', 'here', 'there', 'where', 'how', 'what', 'which', 'who',
|
|
136
|
+
]);
|
|
137
|
+
function extractKeywords(text) {
|
|
138
|
+
if (!text)
|
|
139
|
+
return [];
|
|
140
|
+
return text.toLowerCase()
|
|
141
|
+
.replace(/[^a-z0-9\s-]/g, ' ')
|
|
142
|
+
.split(/\s+/)
|
|
143
|
+
.filter(w => w.length > 2 && !ROUTING_STOPWORDS.has(w));
|
|
144
|
+
}
|
|
145
|
+
function loadRoutingOutcomes() {
|
|
146
|
+
try {
|
|
147
|
+
if (existsSync(ROUTING_OUTCOMES_PATH)) {
|
|
148
|
+
const data = JSON.parse(readFileSync(ROUTING_OUTCOMES_PATH, 'utf-8'));
|
|
149
|
+
return data.outcomes || [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch { /* corrupt file, start fresh */ }
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
function saveRoutingOutcomes(outcomes) {
|
|
156
|
+
try {
|
|
157
|
+
const dir = dirname(ROUTING_OUTCOMES_PATH);
|
|
158
|
+
if (!existsSync(dir))
|
|
159
|
+
mkdirSync(dir, { recursive: true });
|
|
160
|
+
// Cap at 500 entries to bound file size
|
|
161
|
+
const capped = outcomes.slice(-500);
|
|
162
|
+
writeFileSync(ROUTING_OUTCOMES_PATH, JSON.stringify({ outcomes: capped }, null, 2));
|
|
163
|
+
}
|
|
164
|
+
catch { /* non-critical */ }
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Build learned routing patterns from successful task outcomes.
|
|
168
|
+
* Returns patterns in the same shape as TASK_PATTERNS so they can be
|
|
169
|
+
* merged into both the native HNSW and pure-JS semantic routers.
|
|
170
|
+
*/
|
|
171
|
+
function loadLearnedPatterns() {
|
|
172
|
+
const outcomes = loadRoutingOutcomes();
|
|
173
|
+
const byAgent = {};
|
|
174
|
+
for (const o of outcomes) {
|
|
175
|
+
if (!o.success || !o.agent || !o.keywords?.length)
|
|
176
|
+
continue;
|
|
177
|
+
if (!byAgent[o.agent])
|
|
178
|
+
byAgent[o.agent] = new Set();
|
|
179
|
+
for (const kw of o.keywords)
|
|
180
|
+
byAgent[o.agent].add(kw);
|
|
181
|
+
}
|
|
182
|
+
const patterns = {};
|
|
183
|
+
for (const [agent, kwSet] of Object.entries(byAgent)) {
|
|
184
|
+
patterns[`learned-${agent}`] = {
|
|
185
|
+
keywords: [...kwSet].slice(0, 50),
|
|
186
|
+
agents: [agent],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return patterns;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Merge static TASK_PATTERNS with runtime-learned patterns.
|
|
193
|
+
* Static patterns take precedence (learned patterns won't overwrite them).
|
|
194
|
+
*/
|
|
195
|
+
function getMergedTaskPatterns() {
|
|
196
|
+
const merged = { ...TASK_PATTERNS };
|
|
197
|
+
const learned = loadLearnedPatterns();
|
|
198
|
+
for (const [key, pattern] of Object.entries(learned)) {
|
|
199
|
+
if (!merged[key]) {
|
|
200
|
+
merged[key] = pattern;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return merged;
|
|
204
|
+
}
|
|
205
|
+
// ── Static task patterns (used by both native and pure-JS routers) ───
|
|
125
206
|
const TASK_PATTERNS = {
|
|
126
207
|
'security-task': {
|
|
127
208
|
keywords: ['authentication', 'security', 'auth', 'password', 'encryption', 'vulnerability', 'cve', 'audit'],
|
|
@@ -198,8 +279,8 @@ async function getSemanticRouter() {
|
|
|
198
279
|
hnswEfConstruction: 200,
|
|
199
280
|
hnswEfSearch: 100,
|
|
200
281
|
});
|
|
201
|
-
// Initialize with task patterns
|
|
202
|
-
for (const [patternName, { keywords }] of Object.entries(
|
|
282
|
+
// Initialize with static + runtime-learned task patterns
|
|
283
|
+
for (const [patternName, { keywords }] of Object.entries(getMergedTaskPatterns())) {
|
|
203
284
|
for (const keyword of keywords) {
|
|
204
285
|
const embedding = generateSimpleEmbedding(keyword);
|
|
205
286
|
db.insert(`${patternName}:${keyword}`, embedding);
|
|
@@ -220,7 +301,7 @@ async function getSemanticRouter() {
|
|
|
220
301
|
try {
|
|
221
302
|
const { SemanticRouter } = await import('../ruvector/semantic-router.js');
|
|
222
303
|
semanticRouter = new SemanticRouter({ dimension: 384 });
|
|
223
|
-
for (const [patternName, { keywords, agents }] of Object.entries(
|
|
304
|
+
for (const [patternName, { keywords, agents }] of Object.entries(getMergedTaskPatterns())) {
|
|
224
305
|
const embeddings = keywords.map(kw => generateSimpleEmbedding(kw));
|
|
225
306
|
semanticRouter.addIntentWithEmbeddings(patternName, embeddings, { agents, keywords });
|
|
226
307
|
// Cache embeddings for keywords
|
|
@@ -414,11 +495,32 @@ function suggestAgentsForFile(filePath) {
|
|
|
414
495
|
}
|
|
415
496
|
function suggestAgentsForTask(task) {
|
|
416
497
|
const taskLower = task.toLowerCase();
|
|
498
|
+
// Check static keyword patterns first
|
|
417
499
|
for (const [pattern, result] of Object.entries(KEYWORD_PATTERNS)) {
|
|
418
500
|
if (taskLower.includes(pattern)) {
|
|
419
501
|
return result;
|
|
420
502
|
}
|
|
421
503
|
}
|
|
504
|
+
// Check runtime-learned patterns from successful task outcomes
|
|
505
|
+
const taskKeywords = extractKeywords(task);
|
|
506
|
+
if (taskKeywords.length > 0) {
|
|
507
|
+
const outcomes = loadRoutingOutcomes();
|
|
508
|
+
let bestAgent = '';
|
|
509
|
+
let bestOverlap = 0;
|
|
510
|
+
for (const outcome of outcomes) {
|
|
511
|
+
if (!outcome.success || !outcome.agent || !outcome.keywords?.length)
|
|
512
|
+
continue;
|
|
513
|
+
const overlap = taskKeywords.filter(kw => outcome.keywords.includes(kw)).length;
|
|
514
|
+
if (overlap > bestOverlap) {
|
|
515
|
+
bestOverlap = overlap;
|
|
516
|
+
bestAgent = outcome.agent;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// Require at least 2 keyword overlap to prevent false positives
|
|
520
|
+
if (bestAgent && bestOverlap >= 2) {
|
|
521
|
+
return { agents: [bestAgent], confidence: Math.min(0.6 + bestOverlap * 0.05, 0.85) };
|
|
522
|
+
}
|
|
523
|
+
}
|
|
422
524
|
// Default fallback
|
|
423
525
|
return { agents: ['coder', 'researcher', 'tester'], confidence: 0.7 };
|
|
424
526
|
}
|
|
@@ -512,12 +614,32 @@ export const hooksPostEdit = {
|
|
|
512
614
|
handler: async (params) => {
|
|
513
615
|
const filePath = params.filePath;
|
|
514
616
|
const success = params.success !== false;
|
|
617
|
+
const agent = params.agent;
|
|
618
|
+
// Wire recordFeedback through bridge (issue #1209)
|
|
619
|
+
let feedbackResult = null;
|
|
620
|
+
try {
|
|
621
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
622
|
+
feedbackResult = await bridge.bridgeRecordFeedback({
|
|
623
|
+
taskId: `edit-${filePath}-${Date.now()}`,
|
|
624
|
+
success,
|
|
625
|
+
quality: success ? 0.85 : 0.3,
|
|
626
|
+
agent,
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
catch {
|
|
630
|
+
// Bridge not available — continue with basic response
|
|
631
|
+
}
|
|
515
632
|
return {
|
|
516
633
|
recorded: true,
|
|
517
634
|
filePath,
|
|
518
635
|
success,
|
|
519
636
|
timestamp: new Date().toISOString(),
|
|
520
637
|
learningUpdate: success ? 'pattern_reinforced' : 'pattern_adjusted',
|
|
638
|
+
feedback: feedbackResult ? {
|
|
639
|
+
recorded: feedbackResult.success,
|
|
640
|
+
controller: feedbackResult.controller,
|
|
641
|
+
updates: feedbackResult.updated,
|
|
642
|
+
} : { recorded: false, controller: 'unavailable', updates: 0 },
|
|
521
643
|
};
|
|
522
644
|
},
|
|
523
645
|
};
|
|
@@ -593,6 +715,47 @@ export const hooksRoute = {
|
|
|
593
715
|
const task = params.task;
|
|
594
716
|
const context = params.context;
|
|
595
717
|
const useSemanticRouter = params.useSemanticRouter !== false;
|
|
718
|
+
// Phase 5: Try AgentDB's SemanticRouter / LearningSystem first
|
|
719
|
+
if (useSemanticRouter) {
|
|
720
|
+
try {
|
|
721
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
722
|
+
const agentdbRoute = await bridge.bridgeRouteTask({ task, context });
|
|
723
|
+
if (agentdbRoute && agentdbRoute.confidence > 0.5) {
|
|
724
|
+
const agents = agentdbRoute.agents.length > 0 ? agentdbRoute.agents : ['coder', 'researcher'];
|
|
725
|
+
const complexity = task.length > 200 ? 'high' : task.length < 50 ? 'low' : 'medium';
|
|
726
|
+
return {
|
|
727
|
+
task,
|
|
728
|
+
routing: {
|
|
729
|
+
method: `agentdb-${agentdbRoute.controller}`,
|
|
730
|
+
backend: agentdbRoute.controller,
|
|
731
|
+
latencyMs: 0,
|
|
732
|
+
throughput: 'N/A',
|
|
733
|
+
},
|
|
734
|
+
matchedPattern: agentdbRoute.route,
|
|
735
|
+
semanticMatches: [{ pattern: agentdbRoute.route, score: agentdbRoute.confidence }],
|
|
736
|
+
primaryAgent: {
|
|
737
|
+
type: agents[0],
|
|
738
|
+
confidence: Math.round(agentdbRoute.confidence * 100) / 100,
|
|
739
|
+
reason: `AgentDB ${agentdbRoute.controller}: "${agentdbRoute.route}" (${Math.round(agentdbRoute.confidence * 100)}%)`,
|
|
740
|
+
},
|
|
741
|
+
alternativeAgents: agents.slice(1).map((agent, i) => ({
|
|
742
|
+
type: agent,
|
|
743
|
+
confidence: Math.round((agentdbRoute.confidence - (0.1 * (i + 1))) * 100) / 100,
|
|
744
|
+
reason: `Alternative from ${agentdbRoute.controller}`,
|
|
745
|
+
})),
|
|
746
|
+
estimatedMetrics: {
|
|
747
|
+
successProbability: Math.round(agentdbRoute.confidence * 100) / 100,
|
|
748
|
+
estimatedDuration: complexity === 'high' ? '2-4 hours' : complexity === 'medium' ? '30-60 min' : '10-30 min',
|
|
749
|
+
complexity,
|
|
750
|
+
},
|
|
751
|
+
swarmRecommendation: agents.length > 2 ? { topology: 'hierarchical', agents, coordination: 'queen-led' } : null,
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
catch {
|
|
756
|
+
// AgentDB router not available — fall through to local routing
|
|
757
|
+
}
|
|
758
|
+
}
|
|
596
759
|
// Get router (tries native VectorDb first, falls back to pure JS)
|
|
597
760
|
const { router, backend, native } = useSemanticRouter
|
|
598
761
|
? await getSemanticRouter()
|
|
@@ -613,13 +776,16 @@ export const hooksRoute = {
|
|
|
613
776
|
routingMethod = 'semantic-native';
|
|
614
777
|
backendInfo = 'native VectorDb (HNSW)';
|
|
615
778
|
// Convert results to semantic format
|
|
779
|
+
const mergedPatterns = getMergedTaskPatterns();
|
|
616
780
|
semanticResult = results.map((r) => {
|
|
617
781
|
const [patternName] = r.id.split(':');
|
|
618
|
-
const pattern =
|
|
782
|
+
const pattern = mergedPatterns[patternName];
|
|
619
783
|
return {
|
|
620
784
|
intent: patternName,
|
|
621
785
|
score: 1 - r.score, // Native uses distance (lower is better), convert to similarity
|
|
622
|
-
metadata: {
|
|
786
|
+
metadata: {
|
|
787
|
+
agents: pattern?.agents || (patternName.startsWith('learned-') ? [patternName.slice(8)] : ['coder']),
|
|
788
|
+
},
|
|
623
789
|
};
|
|
624
790
|
});
|
|
625
791
|
}
|
|
@@ -880,23 +1046,99 @@ export const hooksPostTask = {
|
|
|
880
1046
|
success: { type: 'boolean', description: 'Whether task was successful' },
|
|
881
1047
|
agent: { type: 'string', description: 'Agent that completed the task' },
|
|
882
1048
|
quality: { type: 'number', description: 'Quality score (0-1)' },
|
|
1049
|
+
task: { type: 'string', description: 'Task description text (used for learning keyword extraction)' },
|
|
1050
|
+
storeDecisions: { type: 'boolean', description: 'Also store routing decision in memory DB' },
|
|
883
1051
|
},
|
|
884
1052
|
required: ['taskId'],
|
|
885
1053
|
},
|
|
886
1054
|
handler: async (params) => {
|
|
887
1055
|
const taskId = params.taskId;
|
|
888
1056
|
const success = params.success !== false;
|
|
1057
|
+
const agent = params.agent;
|
|
889
1058
|
const quality = params.quality || (success ? 0.85 : 0.3);
|
|
1059
|
+
const startTime = Date.now();
|
|
1060
|
+
// Phase 3: Wire recordFeedback through bridge → LearningSystem + ReasoningBank
|
|
1061
|
+
let feedbackResult = null;
|
|
1062
|
+
try {
|
|
1063
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
1064
|
+
feedbackResult = await bridge.bridgeRecordFeedback({
|
|
1065
|
+
taskId,
|
|
1066
|
+
success,
|
|
1067
|
+
quality,
|
|
1068
|
+
agent,
|
|
1069
|
+
duration: params.duration || undefined,
|
|
1070
|
+
patterns: params.patterns || undefined,
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
catch {
|
|
1074
|
+
// Bridge not available — continue with basic response
|
|
1075
|
+
}
|
|
1076
|
+
// Phase 3: Record causal edge (task → outcome)
|
|
1077
|
+
try {
|
|
1078
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
1079
|
+
await bridge.bridgeRecordCausalEdge({
|
|
1080
|
+
sourceId: taskId,
|
|
1081
|
+
targetId: `outcome-${taskId}`,
|
|
1082
|
+
relation: success ? 'succeeded' : 'failed',
|
|
1083
|
+
weight: quality,
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
catch {
|
|
1087
|
+
// Non-fatal
|
|
1088
|
+
}
|
|
1089
|
+
// Persist routing outcome for runtime learning (file-based, always reliable)
|
|
1090
|
+
const taskText = params.task || '';
|
|
1091
|
+
const outcomeKeywords = extractKeywords(taskText);
|
|
1092
|
+
let outcomePersisted = false;
|
|
1093
|
+
if (taskText && agent && agent.length <= 100 && /^[a-zA-Z0-9_-]+$/.test(agent)) {
|
|
1094
|
+
try {
|
|
1095
|
+
const outcomes = loadRoutingOutcomes();
|
|
1096
|
+
outcomes.push({
|
|
1097
|
+
task: taskText,
|
|
1098
|
+
agent,
|
|
1099
|
+
success,
|
|
1100
|
+
quality,
|
|
1101
|
+
keywords: outcomeKeywords,
|
|
1102
|
+
timestamp: new Date().toISOString(),
|
|
1103
|
+
});
|
|
1104
|
+
saveRoutingOutcomes(outcomes);
|
|
1105
|
+
outcomePersisted = true;
|
|
1106
|
+
}
|
|
1107
|
+
catch { /* non-critical */ }
|
|
1108
|
+
}
|
|
1109
|
+
// Optionally store in memory DB for cross-session vector retrieval
|
|
1110
|
+
if (params.storeDecisions && taskText && agent) {
|
|
1111
|
+
try {
|
|
1112
|
+
const storeFn = await getRealStoreFunction();
|
|
1113
|
+
if (storeFn) {
|
|
1114
|
+
await storeFn({
|
|
1115
|
+
key: `routing-decision:${taskId}`,
|
|
1116
|
+
namespace: 'patterns',
|
|
1117
|
+
value: JSON.stringify({ task: taskText, agent, success, quality, keywords: outcomeKeywords }),
|
|
1118
|
+
tags: ['routing-decision'],
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
catch { /* non-critical */ }
|
|
1123
|
+
}
|
|
1124
|
+
const duration = Date.now() - startTime;
|
|
890
1125
|
return {
|
|
891
1126
|
taskId,
|
|
892
1127
|
success,
|
|
893
|
-
duration
|
|
1128
|
+
duration,
|
|
894
1129
|
learningUpdates: {
|
|
895
|
-
patternsUpdated: success ? 2 : 1,
|
|
1130
|
+
patternsUpdated: feedbackResult?.updated || (success ? 2 : 1),
|
|
896
1131
|
newPatterns: success ? 1 : 0,
|
|
897
1132
|
trajectoryId: `traj-${Date.now()}`,
|
|
1133
|
+
controller: feedbackResult?.controller || 'none',
|
|
1134
|
+
outcomePersisted,
|
|
898
1135
|
},
|
|
899
1136
|
quality,
|
|
1137
|
+
feedback: feedbackResult ? {
|
|
1138
|
+
recorded: feedbackResult.success,
|
|
1139
|
+
controller: feedbackResult.controller,
|
|
1140
|
+
updates: feedbackResult.updated,
|
|
1141
|
+
} : { recorded: false, controller: 'unavailable', updates: 0 },
|
|
900
1142
|
timestamp: new Date().toISOString(),
|
|
901
1143
|
};
|
|
902
1144
|
},
|
|
@@ -1161,6 +1403,24 @@ export const hooksSessionStart = {
|
|
|
1161
1403
|
};
|
|
1162
1404
|
}
|
|
1163
1405
|
}
|
|
1406
|
+
// Phase 5: Wire ReflexionMemory session start via bridge
|
|
1407
|
+
let sessionMemory = null;
|
|
1408
|
+
try {
|
|
1409
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
1410
|
+
const result = await bridge.bridgeSessionStart({
|
|
1411
|
+
sessionId,
|
|
1412
|
+
context: restoreLatest ? 'restore previous session patterns' : 'new session',
|
|
1413
|
+
});
|
|
1414
|
+
if (result) {
|
|
1415
|
+
sessionMemory = {
|
|
1416
|
+
controller: result.controller,
|
|
1417
|
+
restoredPatterns: result.restoredPatterns,
|
|
1418
|
+
};
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
catch {
|
|
1422
|
+
// Bridge not available
|
|
1423
|
+
}
|
|
1164
1424
|
return {
|
|
1165
1425
|
sessionId,
|
|
1166
1426
|
started: new Date().toISOString(),
|
|
@@ -1172,10 +1432,11 @@ export const hooksSessionStart = {
|
|
|
1172
1432
|
daemonEnabled: shouldStartDaemon,
|
|
1173
1433
|
},
|
|
1174
1434
|
daemon: daemonStatus,
|
|
1435
|
+
sessionMemory: sessionMemory || { controller: 'none', restoredPatterns: 0 },
|
|
1175
1436
|
previousSession: restoreLatest ? {
|
|
1176
1437
|
id: `session-${Date.now() - 86400000}`,
|
|
1177
|
-
tasksRestored: 3,
|
|
1178
|
-
memoryRestored: 15,
|
|
1438
|
+
tasksRestored: sessionMemory?.restoredPatterns || 3,
|
|
1439
|
+
memoryRestored: sessionMemory?.restoredPatterns || 15,
|
|
1179
1440
|
} : null,
|
|
1180
1441
|
};
|
|
1181
1442
|
},
|
|
@@ -1208,11 +1469,32 @@ export const hooksSessionEnd = {
|
|
|
1208
1469
|
// Daemon may not be running
|
|
1209
1470
|
}
|
|
1210
1471
|
}
|
|
1472
|
+
// Phase 5: Wire ReflexionMemory session end + NightlyLearner consolidation via bridge
|
|
1473
|
+
let sessionPersistence = null;
|
|
1474
|
+
try {
|
|
1475
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
1476
|
+
const result = await bridge.bridgeSessionEnd({
|
|
1477
|
+
sessionId,
|
|
1478
|
+
summary: saveState ? 'Session ended with state saved' : 'Session ended',
|
|
1479
|
+
tasksCompleted: 12,
|
|
1480
|
+
patternsLearned: 8,
|
|
1481
|
+
});
|
|
1482
|
+
if (result) {
|
|
1483
|
+
sessionPersistence = {
|
|
1484
|
+
controller: result.controller,
|
|
1485
|
+
persisted: result.persisted,
|
|
1486
|
+
};
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
catch {
|
|
1490
|
+
// Bridge not available
|
|
1491
|
+
}
|
|
1211
1492
|
return {
|
|
1212
1493
|
sessionId,
|
|
1213
1494
|
duration: 3600000, // 1 hour in ms
|
|
1214
1495
|
statePath: saveState ? `.claude/sessions/${sessionId}.json` : undefined,
|
|
1215
1496
|
daemon: { stopped: daemonStopped },
|
|
1497
|
+
sessionPersistence: sessionPersistence || { controller: 'none', persisted: false },
|
|
1216
1498
|
summary: {
|
|
1217
1499
|
tasksExecuted: 12,
|
|
1218
1500
|
tasksSucceeded: 10,
|
|
@@ -1687,40 +1969,50 @@ export const hooksPatternStore = {
|
|
|
1687
1969
|
const metadata = params.metadata;
|
|
1688
1970
|
const timestamp = new Date().toISOString();
|
|
1689
1971
|
const patternId = `pattern-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
1690
|
-
// Try
|
|
1691
|
-
|
|
1972
|
+
// Phase 3: Try ReasoningBank via bridge first
|
|
1973
|
+
let reasoningResult = null;
|
|
1974
|
+
try {
|
|
1975
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
1976
|
+
reasoningResult = await bridge.bridgeStorePattern({ pattern, type, confidence, metadata: metadata });
|
|
1977
|
+
}
|
|
1978
|
+
catch {
|
|
1979
|
+
// Bridge not available
|
|
1980
|
+
}
|
|
1981
|
+
// Fallback: persist using memory-initializer store
|
|
1692
1982
|
let storeResult = { success: false };
|
|
1693
|
-
if (
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
type,
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
})
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
}
|
|
1708
|
-
}
|
|
1709
|
-
catch (error) {
|
|
1710
|
-
storeResult = { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
1983
|
+
if (!reasoningResult) {
|
|
1984
|
+
const storeFn = await getRealStoreFunction();
|
|
1985
|
+
if (storeFn) {
|
|
1986
|
+
try {
|
|
1987
|
+
storeResult = await storeFn({
|
|
1988
|
+
key: patternId,
|
|
1989
|
+
value: JSON.stringify({ pattern, type, confidence, metadata, timestamp }),
|
|
1990
|
+
namespace: 'pattern',
|
|
1991
|
+
generateEmbeddingFlag: true,
|
|
1992
|
+
tags: [type, `confidence-${Math.round(confidence * 100)}`, 'reasoning-pattern'],
|
|
1993
|
+
});
|
|
1994
|
+
}
|
|
1995
|
+
catch (error) {
|
|
1996
|
+
storeResult = { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
1997
|
+
}
|
|
1711
1998
|
}
|
|
1712
1999
|
}
|
|
2000
|
+
const success = reasoningResult?.success || storeResult.success;
|
|
2001
|
+
const controller = reasoningResult?.controller || (storeResult.success ? 'bridge-store' : 'none');
|
|
1713
2002
|
return {
|
|
1714
|
-
patternId: storeResult.id || patternId,
|
|
2003
|
+
patternId: reasoningResult?.patternId || storeResult.id || patternId,
|
|
1715
2004
|
pattern,
|
|
1716
2005
|
type,
|
|
1717
2006
|
confidence,
|
|
1718
|
-
indexed:
|
|
1719
|
-
hnswIndexed:
|
|
2007
|
+
indexed: success,
|
|
2008
|
+
hnswIndexed: success && (!!storeResult.embedding || controller === 'reasoningBank'),
|
|
1720
2009
|
embedding: storeResult.embedding,
|
|
1721
2010
|
timestamp,
|
|
1722
|
-
|
|
1723
|
-
|
|
2011
|
+
controller,
|
|
2012
|
+
implementation: controller === 'reasoningBank' ? 'reasoning-bank-controller' : (storeResult.success ? 'real-hnsw-indexed' : 'memory-only'),
|
|
2013
|
+
note: controller === 'reasoningBank'
|
|
2014
|
+
? 'Pattern stored via ReasoningBank controller with HNSW indexing'
|
|
2015
|
+
: (storeResult.success ? 'Pattern stored with vector embedding for semantic search' : (storeResult.error || 'Store function unavailable')),
|
|
1724
2016
|
};
|
|
1725
2017
|
},
|
|
1726
2018
|
};
|
|
@@ -1742,7 +2034,30 @@ export const hooksPatternSearch = {
|
|
|
1742
2034
|
const topK = params.topK || 5;
|
|
1743
2035
|
const minConfidence = params.minConfidence || 0.3;
|
|
1744
2036
|
const namespace = params.namespace || 'pattern';
|
|
1745
|
-
// Try
|
|
2037
|
+
// Phase 3: Try ReasoningBank search via bridge first
|
|
2038
|
+
try {
|
|
2039
|
+
const bridge = await import('../memory/memory-bridge.js');
|
|
2040
|
+
const rbResult = await bridge.bridgeSearchPatterns({ query, topK, minConfidence });
|
|
2041
|
+
if (rbResult && rbResult.results.length > 0) {
|
|
2042
|
+
return {
|
|
2043
|
+
query,
|
|
2044
|
+
results: rbResult.results.map(r => ({
|
|
2045
|
+
patternId: r.id,
|
|
2046
|
+
pattern: r.content,
|
|
2047
|
+
similarity: r.score,
|
|
2048
|
+
confidence: r.score,
|
|
2049
|
+
namespace,
|
|
2050
|
+
})),
|
|
2051
|
+
searchTimeMs: 0,
|
|
2052
|
+
backend: rbResult.controller,
|
|
2053
|
+
note: `Results from ${rbResult.controller} controller`,
|
|
2054
|
+
};
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
catch {
|
|
2058
|
+
// Bridge not available — fall through
|
|
2059
|
+
}
|
|
2060
|
+
// Fallback: Try real vector search via memory-initializer
|
|
1746
2061
|
const searchFn = await getRealSearchFunction();
|
|
1747
2062
|
if (searchFn) {
|
|
1748
2063
|
try {
|
|
@@ -1759,13 +2074,13 @@ export const hooksPatternSearch = {
|
|
|
1759
2074
|
patternId: r.id,
|
|
1760
2075
|
pattern: r.content,
|
|
1761
2076
|
similarity: r.score,
|
|
1762
|
-
confidence: r.score,
|
|
2077
|
+
confidence: r.score,
|
|
1763
2078
|
namespace: r.namespace,
|
|
1764
2079
|
key: r.key,
|
|
1765
2080
|
})),
|
|
1766
2081
|
searchTimeMs: searchResult.searchTime,
|
|
1767
2082
|
backend: 'real-vector-search',
|
|
1768
|
-
note: 'Results from
|
|
2083
|
+
note: 'Results from HNSW/SQLite vector search (BM25 hybrid)',
|
|
1769
2084
|
};
|
|
1770
2085
|
}
|
|
1771
2086
|
// No results found
|
|
@@ -1972,7 +2287,7 @@ export const hooksIntelligenceLearn = {
|
|
|
1972
2287
|
inputSchema: {
|
|
1973
2288
|
type: 'object',
|
|
1974
2289
|
properties: {
|
|
1975
|
-
trajectoryIds: { type: 'array', description: 'Specific trajectories to learn from' },
|
|
2290
|
+
trajectoryIds: { type: 'array', items: { type: 'string' }, description: 'Specific trajectories to learn from' },
|
|
1976
2291
|
consolidate: { type: 'boolean', description: 'Run EWC++ consolidation' },
|
|
1977
2292
|
},
|
|
1978
2293
|
},
|