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.
Files changed (344) hide show
  1. package/.claude/agents/core/coder.md +1 -1
  2. package/.claude/agents/core/planner.md +2 -2
  3. package/.claude/agents/core/researcher.md +1 -1
  4. package/.claude/agents/core/reviewer.md +1 -1
  5. package/.claude/agents/core/tester.md +1 -1
  6. package/.claude/agents/data/data-ml-model.md +4 -4
  7. package/.claude/agents/development/dev-backend-api.md +4 -4
  8. package/.claude/agents/documentation/docs-api-openapi.md +4 -4
  9. package/.claude/agents/github/code-review-swarm.md +2 -2
  10. package/.claude/agents/github/issue-tracker.md +2 -2
  11. package/.claude/agents/github/pr-manager.md +2 -2
  12. package/.claude/agents/github/release-manager.md +2 -2
  13. package/.claude/agents/github/workflow-automation.md +2 -2
  14. package/.claude/agents/sparc/architecture.md +3 -3
  15. package/.claude/agents/sparc/pseudocode.md +2 -2
  16. package/.claude/agents/sparc/refinement.md +3 -3
  17. package/.claude/agents/sparc/specification.md +2 -2
  18. package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
  19. package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
  20. package/.claude/agents/swarm/mesh-coordinator.md +1 -1
  21. package/.claude/agents/templates/base-template-generator.md +25 -4
  22. package/.claude/agents/templates/sparc-coordinator.md +3 -3
  23. package/.claude/helpers/auto-commit.sh +1 -1
  24. package/.claude/helpers/auto-memory-hook.mjs +27 -9
  25. package/.claude/helpers/hook-handler.cjs +58 -18
  26. package/.claude/helpers/statusline.cjs +420 -613
  27. package/.claude/helpers/statusline.js +3 -3
  28. package/.claude/settings.json +9 -9
  29. package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
  30. package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
  31. package/README.md +383 -170
  32. package/bin/cli.js +6 -6
  33. package/bin/mcp-server.js +1 -1
  34. package/bin/preinstall.cjs +2 -0
  35. package/dist/src/appliance/gguf-engine.d.ts +91 -0
  36. package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
  37. package/dist/src/appliance/gguf-engine.js +425 -0
  38. package/dist/src/appliance/gguf-engine.js.map +1 -0
  39. package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  40. package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
  41. package/dist/src/appliance/ruvllm-bridge.js +292 -0
  42. package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
  43. package/dist/src/appliance/rvfa-builder.d.ts +44 -0
  44. package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
  45. package/dist/src/appliance/rvfa-builder.js +329 -0
  46. package/dist/src/appliance/rvfa-builder.js.map +1 -0
  47. package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  48. package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
  49. package/dist/src/appliance/rvfa-distribution.js +370 -0
  50. package/dist/src/appliance/rvfa-distribution.js.map +1 -0
  51. package/dist/src/appliance/rvfa-format.d.ts +111 -0
  52. package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
  53. package/dist/src/appliance/rvfa-format.js +393 -0
  54. package/dist/src/appliance/rvfa-format.js.map +1 -0
  55. package/dist/src/appliance/rvfa-runner.d.ts +69 -0
  56. package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
  57. package/dist/src/appliance/rvfa-runner.js +237 -0
  58. package/dist/src/appliance/rvfa-runner.js.map +1 -0
  59. package/dist/src/appliance/rvfa-signing.d.ts +123 -0
  60. package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
  61. package/dist/src/appliance/rvfa-signing.js +347 -0
  62. package/dist/src/appliance/rvfa-signing.js.map +1 -0
  63. package/dist/src/commands/agent.d.ts.map +1 -1
  64. package/dist/src/commands/agent.js +121 -21
  65. package/dist/src/commands/agent.js.map +1 -1
  66. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  67. package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
  68. package/dist/src/commands/appliance-advanced.js +215 -0
  69. package/dist/src/commands/appliance-advanced.js.map +1 -0
  70. package/dist/src/commands/appliance.d.ts +8 -0
  71. package/dist/src/commands/appliance.d.ts.map +1 -0
  72. package/dist/src/commands/appliance.js +406 -0
  73. package/dist/src/commands/appliance.js.map +1 -0
  74. package/dist/src/commands/benchmark.js +2 -2
  75. package/dist/src/commands/benchmark.js.map +1 -1
  76. package/dist/src/commands/claims.js +1 -1
  77. package/dist/src/commands/claims.js.map +1 -1
  78. package/dist/src/commands/cleanup.d.ts +13 -0
  79. package/dist/src/commands/cleanup.d.ts.map +1 -0
  80. package/dist/src/commands/cleanup.js +218 -0
  81. package/dist/src/commands/cleanup.js.map +1 -0
  82. package/dist/src/commands/config.js +1 -1
  83. package/dist/src/commands/config.js.map +1 -1
  84. package/dist/src/commands/daemon.d.ts.map +1 -1
  85. package/dist/src/commands/daemon.js +81 -18
  86. package/dist/src/commands/daemon.js.map +1 -1
  87. package/dist/src/commands/deployment.js +1 -1
  88. package/dist/src/commands/deployment.js.map +1 -1
  89. package/dist/src/commands/doctor.d.ts.map +1 -1
  90. package/dist/src/commands/doctor.js +99 -51
  91. package/dist/src/commands/doctor.js.map +1 -1
  92. package/dist/src/commands/embeddings.js +1 -1
  93. package/dist/src/commands/embeddings.js.map +1 -1
  94. package/dist/src/commands/hive-mind.js +26 -26
  95. package/dist/src/commands/hive-mind.js.map +1 -1
  96. package/dist/src/commands/hooks.d.ts.map +1 -1
  97. package/dist/src/commands/hooks.js +800 -100
  98. package/dist/src/commands/hooks.js.map +1 -1
  99. package/dist/src/commands/index.d.ts +9 -2
  100. package/dist/src/commands/index.d.ts.map +1 -1
  101. package/dist/src/commands/index.js +20 -2
  102. package/dist/src/commands/index.js.map +1 -1
  103. package/dist/src/commands/init.d.ts +1 -1
  104. package/dist/src/commands/init.d.ts.map +1 -1
  105. package/dist/src/commands/init.js +22 -18
  106. package/dist/src/commands/init.js.map +1 -1
  107. package/dist/src/commands/mcp.d.ts.map +1 -1
  108. package/dist/src/commands/mcp.js +23 -5
  109. package/dist/src/commands/mcp.js.map +1 -1
  110. package/dist/src/commands/memory.d.ts.map +1 -1
  111. package/dist/src/commands/memory.js +24 -0
  112. package/dist/src/commands/memory.js.map +1 -1
  113. package/dist/src/commands/neural.d.ts.map +1 -1
  114. package/dist/src/commands/neural.js +13 -7
  115. package/dist/src/commands/neural.js.map +1 -1
  116. package/dist/src/commands/performance.js +1 -1
  117. package/dist/src/commands/performance.js.map +1 -1
  118. package/dist/src/commands/plugins.js +1 -1
  119. package/dist/src/commands/plugins.js.map +1 -1
  120. package/dist/src/commands/providers.js +1 -1
  121. package/dist/src/commands/providers.js.map +1 -1
  122. package/dist/src/commands/ruvector/import.js +2 -2
  123. package/dist/src/commands/ruvector/import.js.map +1 -1
  124. package/dist/src/commands/ruvector/index.js +1 -1
  125. package/dist/src/commands/ruvector/index.js.map +1 -1
  126. package/dist/src/commands/ruvector/setup.js +6 -6
  127. package/dist/src/commands/security.d.ts.map +1 -1
  128. package/dist/src/commands/security.js +47 -16
  129. package/dist/src/commands/security.js.map +1 -1
  130. package/dist/src/commands/session.d.ts +1 -1
  131. package/dist/src/commands/session.js +1 -1
  132. package/dist/src/commands/start.d.ts +1 -1
  133. package/dist/src/commands/start.js +12 -12
  134. package/dist/src/commands/start.js.map +1 -1
  135. package/dist/src/commands/status.d.ts +1 -1
  136. package/dist/src/commands/status.d.ts.map +1 -1
  137. package/dist/src/commands/status.js +13 -6
  138. package/dist/src/commands/status.js.map +1 -1
  139. package/dist/src/commands/swarm.js +2 -2
  140. package/dist/src/commands/swarm.js.map +1 -1
  141. package/dist/src/commands/task.d.ts +1 -1
  142. package/dist/src/commands/task.js +1 -1
  143. package/dist/src/commands/transfer-store.js +1 -1
  144. package/dist/src/commands/transfer-store.js.map +1 -1
  145. package/dist/src/config-adapter.js +1 -1
  146. package/dist/src/config-adapter.js.map +1 -1
  147. package/dist/src/index.d.ts +4 -3
  148. package/dist/src/index.d.ts.map +1 -1
  149. package/dist/src/index.js +5 -3
  150. package/dist/src/index.js.map +1 -1
  151. package/dist/src/init/claudemd-generator.js +30 -30
  152. package/dist/src/init/claudemd-generator.js.map +1 -1
  153. package/dist/src/init/executor.d.ts.map +1 -1
  154. package/dist/src/init/executor.js +86 -101
  155. package/dist/src/init/executor.js.map +1 -1
  156. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  157. package/dist/src/init/helpers-generator.js +96 -26
  158. package/dist/src/init/helpers-generator.js.map +1 -1
  159. package/dist/src/init/mcp-generator.d.ts +0 -1
  160. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  161. package/dist/src/init/mcp-generator.js +34 -18
  162. package/dist/src/init/mcp-generator.js.map +1 -1
  163. package/dist/src/init/settings-generator.d.ts.map +1 -1
  164. package/dist/src/init/settings-generator.js +107 -41
  165. package/dist/src/init/settings-generator.js.map +1 -1
  166. package/dist/src/init/statusline-generator.d.ts +16 -8
  167. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  168. package/dist/src/init/statusline-generator.js +537 -1019
  169. package/dist/src/init/statusline-generator.js.map +1 -1
  170. package/dist/src/init/types.d.ts +14 -4
  171. package/dist/src/init/types.d.ts.map +1 -1
  172. package/dist/src/init/types.js +9 -2
  173. package/dist/src/init/types.js.map +1 -1
  174. package/dist/src/mcp-client.d.ts.map +1 -1
  175. package/dist/src/mcp-client.js +10 -0
  176. package/dist/src/mcp-client.js.map +1 -1
  177. package/dist/src/mcp-server.d.ts.map +1 -1
  178. package/dist/src/mcp-server.js +30 -4
  179. package/dist/src/mcp-server.js.map +1 -1
  180. package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
  181. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
  182. package/dist/src/mcp-tools/agentdb-tools.js +557 -0
  183. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
  184. package/dist/src/mcp-tools/browser-tools.js +2 -2
  185. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  186. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  187. package/dist/src/mcp-tools/config-tools.js +21 -2
  188. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  189. package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
  190. package/dist/src/mcp-tools/coordination-tools.js +192 -13
  191. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  192. package/dist/src/mcp-tools/daa-tools.js +5 -5
  193. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  194. package/dist/src/mcp-tools/github-tools.js +2 -2
  195. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  196. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  197. package/dist/src/mcp-tools/hive-mind-tools.js +263 -35
  198. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  199. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  200. package/dist/src/mcp-tools/hooks-tools.js +355 -40
  201. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  202. package/dist/src/mcp-tools/index.d.ts +2 -0
  203. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  204. package/dist/src/mcp-tools/index.js +2 -0
  205. package/dist/src/mcp-tools/index.js.map +1 -1
  206. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  207. package/dist/src/mcp-tools/memory-tools.js +31 -1
  208. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  209. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  210. package/dist/src/mcp-tools/neural-tools.js +32 -27
  211. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  212. package/dist/src/mcp-tools/performance-tools.js +1 -1
  213. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  214. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  215. package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
  216. package/dist/src/mcp-tools/ruvllm-tools.js +283 -0
  217. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
  218. package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
  219. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  220. package/dist/src/mcp-tools/swarm-tools.js +216 -30
  221. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  222. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  223. package/dist/src/mcp-tools/system-tools.js +109 -6
  224. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  225. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  226. package/dist/src/mcp-tools/task-tools.js +102 -0
  227. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  228. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
  229. package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
  230. package/dist/src/mcp-tools/wasm-agent-tools.js +230 -0
  231. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
  232. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
  233. package/dist/src/mcp-tools/workflow-tools.js +91 -0
  234. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  235. package/dist/src/memory/ewc-consolidation.d.ts +24 -0
  236. package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
  237. package/dist/src/memory/ewc-consolidation.js +59 -0
  238. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  239. package/dist/src/memory/intelligence.d.ts +53 -0
  240. package/dist/src/memory/intelligence.d.ts.map +1 -1
  241. package/dist/src/memory/intelligence.js +264 -7
  242. package/dist/src/memory/intelligence.js.map +1 -1
  243. package/dist/src/memory/memory-bridge.d.ts +407 -0
  244. package/dist/src/memory/memory-bridge.d.ts.map +1 -0
  245. package/dist/src/memory/memory-bridge.js +1494 -0
  246. package/dist/src/memory/memory-bridge.js.map +1 -0
  247. package/dist/src/memory/memory-initializer.d.ts +17 -1
  248. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  249. package/dist/src/memory/memory-initializer.js +320 -42
  250. package/dist/src/memory/memory-initializer.js.map +1 -1
  251. package/dist/src/output.d.ts.map +1 -1
  252. package/dist/src/output.js +1 -0
  253. package/dist/src/output.js.map +1 -1
  254. package/dist/src/parser.d.ts +10 -0
  255. package/dist/src/parser.d.ts.map +1 -1
  256. package/dist/src/parser.js +49 -3
  257. package/dist/src/parser.js.map +1 -1
  258. package/dist/src/plugins/manager.d.ts.map +1 -1
  259. package/dist/src/plugins/manager.js +31 -14
  260. package/dist/src/plugins/manager.js.map +1 -1
  261. package/dist/src/plugins/store/discovery.js +5 -5
  262. package/dist/src/plugins/store/discovery.js.map +1 -1
  263. package/dist/src/plugins/tests/standalone-test.js +4 -4
  264. package/dist/src/plugins/tests/standalone-test.js.map +1 -1
  265. package/dist/src/production/error-handler.js +1 -1
  266. package/dist/src/production/error-handler.js.map +1 -1
  267. package/dist/src/runtime/headless.d.ts +3 -3
  268. package/dist/src/runtime/headless.js +6 -6
  269. package/dist/src/runtime/headless.js.map +1 -1
  270. package/dist/src/ruvector/agent-wasm.d.ts +182 -0
  271. package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
  272. package/dist/src/ruvector/agent-wasm.js +316 -0
  273. package/dist/src/ruvector/agent-wasm.js.map +1 -0
  274. package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -1
  275. package/dist/src/ruvector/enhanced-model-router.js +25 -15
  276. package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
  277. package/dist/src/ruvector/index.d.ts +7 -1
  278. package/dist/src/ruvector/index.d.ts.map +1 -1
  279. package/dist/src/ruvector/index.js +17 -1
  280. package/dist/src/ruvector/index.js.map +1 -1
  281. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  282. package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
  283. package/dist/src/ruvector/ruvllm-wasm.js +363 -0
  284. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
  285. package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  286. package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
  287. package/dist/src/services/agentic-flow-bridge.js +95 -0
  288. package/dist/src/services/agentic-flow-bridge.js.map +1 -0
  289. package/dist/src/services/claim-service.js +1 -1
  290. package/dist/src/services/claim-service.js.map +1 -1
  291. package/dist/src/services/container-worker-pool.d.ts.map +1 -1
  292. package/dist/src/services/container-worker-pool.js +3 -1
  293. package/dist/src/services/container-worker-pool.js.map +1 -1
  294. package/dist/src/services/index.d.ts +1 -1
  295. package/dist/src/services/index.d.ts.map +1 -1
  296. package/dist/src/services/registry-api.d.ts +1 -1
  297. package/dist/src/services/registry-api.js +1 -1
  298. package/dist/src/services/ruvector-training.d.ts +11 -2
  299. package/dist/src/services/ruvector-training.d.ts.map +1 -1
  300. package/dist/src/services/ruvector-training.js +233 -43
  301. package/dist/src/services/ruvector-training.js.map +1 -1
  302. package/dist/src/services/worker-daemon.d.ts +28 -3
  303. package/dist/src/services/worker-daemon.d.ts.map +1 -1
  304. package/dist/src/services/worker-daemon.js +156 -17
  305. package/dist/src/services/worker-daemon.js.map +1 -1
  306. package/dist/src/services/worker-queue.d.ts.map +1 -1
  307. package/dist/src/services/worker-queue.js +2 -0
  308. package/dist/src/services/worker-queue.js.map +1 -1
  309. package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
  310. package/dist/src/transfer/deploy-seraphine.js +4 -4
  311. package/dist/src/transfer/deploy-seraphine.js.map +1 -1
  312. package/dist/src/transfer/ipfs/client.d.ts.map +1 -1
  313. package/dist/src/transfer/ipfs/client.js +8 -0
  314. package/dist/src/transfer/ipfs/client.js.map +1 -1
  315. package/dist/src/transfer/ipfs/upload.d.ts.map +1 -1
  316. package/dist/src/transfer/ipfs/upload.js +0 -2
  317. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  318. package/dist/src/transfer/models/seraphine.d.ts +1 -1
  319. package/dist/src/transfer/models/seraphine.js +5 -5
  320. package/dist/src/transfer/models/seraphine.js.map +1 -1
  321. package/dist/src/transfer/serialization/cfp.d.ts +1 -1
  322. package/dist/src/transfer/serialization/cfp.d.ts.map +1 -1
  323. package/dist/src/transfer/serialization/cfp.js +9 -6
  324. package/dist/src/transfer/serialization/cfp.js.map +1 -1
  325. package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
  326. package/dist/src/transfer/storage/gcs.js +71 -29
  327. package/dist/src/transfer/storage/gcs.js.map +1 -1
  328. package/dist/src/transfer/store/discovery.js +4 -4
  329. package/dist/src/transfer/store/discovery.js.map +1 -1
  330. package/dist/src/transfer/store/registry.js +1 -1
  331. package/dist/src/transfer/store/registry.js.map +1 -1
  332. package/dist/src/transfer/store/tests/standalone-test.js +4 -4
  333. package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
  334. package/dist/src/transfer/types.d.ts +1 -1
  335. package/dist/src/types.d.ts +1 -1
  336. package/dist/src/types.js +1 -1
  337. package/dist/src/update/validator.js +1 -1
  338. package/dist/src/update/validator.js.map +1 -1
  339. package/dist/tsconfig.tsbuildinfo +1 -1
  340. package/package.json +13 -10
  341. package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
  342. package/.claude/agents/custom/design-architect.yaml +0 -48
  343. package/.claude/agents/custom/ui-developer.yaml +0 -46
  344. 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
- // Task patterns used by both native and pure-JS routers
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(TASK_PATTERNS)) {
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(TASK_PATTERNS)) {
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 = TASK_PATTERNS[patternName];
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: { agents: pattern?.agents || ['coder'] },
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: Math.floor(Math.random() * 300) + 60, // 1-6 minutes in seconds
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 to persist using real store
1691
- const storeFn = await getRealStoreFunction();
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 (storeFn) {
1694
- try {
1695
- storeResult = await storeFn({
1696
- key: patternId,
1697
- value: JSON.stringify({
1698
- pattern,
1699
- type,
1700
- confidence,
1701
- metadata,
1702
- timestamp,
1703
- }),
1704
- namespace: 'pattern',
1705
- generateEmbeddingFlag: true, // Generate embedding for HNSW indexing
1706
- tags: [type, `confidence-${Math.round(confidence * 100)}`, 'reasoning-pattern'],
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: storeResult.success,
1719
- hnswIndexed: storeResult.success && !!storeResult.embedding,
2007
+ indexed: success,
2008
+ hnswIndexed: success && (!!storeResult.embedding || controller === 'reasoningBank'),
1720
2009
  embedding: storeResult.embedding,
1721
2010
  timestamp,
1722
- implementation: storeResult.success ? 'real-hnsw-indexed' : 'memory-only',
1723
- note: storeResult.success ? 'Pattern stored with vector embedding for semantic search' : (storeResult.error || 'Store function unavailable'),
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 to use real vector search
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, // Using similarity as confidence
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 actual HNSW/SQLite vector search',
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
  },