@monoes/monomindcli 1.18.15 → 2.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.
Files changed (511) hide show
  1. package/.claude/agents/core/researcher.md +29 -24
  2. package/.claude/agents/github/code-review-swarm.md +1 -1
  3. package/.claude/agents/github/github-modes.md +1 -1
  4. package/.claude/agents/github/issue-tracker.md +1 -3
  5. package/.claude/agents/github/multi-repo-swarm.md +1 -1
  6. package/.claude/agents/github/pr-manager.md +1 -3
  7. package/.claude/agents/github/project-board-sync.md +1 -1
  8. package/.claude/agents/github/release-manager.md +1 -1
  9. package/.claude/agents/github/repo-architect.md +4 -12
  10. package/.claude/agents/github/swarm-issue.md +1 -1
  11. package/.claude/agents/github/swarm-pr.md +1 -1
  12. package/.claude/agents/github/sync-coordinator.md +1 -1
  13. package/.claude/agents/github/workflow-automation.md +1 -1
  14. package/.claude/agents/goal/goal-planner.md +1 -2
  15. package/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
  16. package/.claude/agents/testing/production-validator.md +8 -7
  17. package/.claude/agents/testing/testing-evidence-collector.md +3 -1
  18. package/.claude/commands/github/issue-tracker.md +0 -2
  19. package/.claude/commands/github/pr-manager.md +0 -2
  20. package/.claude/commands/github/repo-architect.md +3 -10
  21. package/.claude/commands/mastermind/code-review.md +4 -4
  22. package/.claude/commands/mastermind/help.md +5 -5
  23. package/.claude/commands/mastermind/okf-export.md +14 -0
  24. package/.claude/commands/mastermind/okf-import.md +15 -0
  25. package/.claude/commands/workflows/README.md +0 -1
  26. package/.claude/commands/workflows/workflow-create.md +0 -1
  27. package/.claude/commands/workflows/workflow-execute.md +1 -3
  28. package/.claude/commands/workflows/workflow-export.md +0 -2
  29. package/.claude/helpers/handlers/agent-start-handler.cjs +28 -36
  30. package/.claude/helpers/handlers/capture-handler.cjs +110 -0
  31. package/.claude/helpers/handlers/edit-handler.cjs +15 -0
  32. package/.claude/helpers/handlers/gates-handler.cjs +2 -8
  33. package/.claude/helpers/handlers/route-handler.cjs +314 -245
  34. package/.claude/helpers/handlers/session-handler.cjs +182 -163
  35. package/.claude/helpers/handlers/session-restore-handler.cjs +95 -53
  36. package/.claude/helpers/handlers/task-handler.cjs +17 -160
  37. package/.claude/helpers/hook-handler.cjs +153 -16
  38. package/.claude/helpers/intelligence.cjs +255 -15
  39. package/.claude/helpers/learning-service.mjs +1 -0
  40. package/.claude/helpers/mastermind-activate.cjs +33 -51
  41. package/.claude/helpers/monolean-activate.cjs +13 -3
  42. package/.claude/helpers/monolean-propagate.cjs +7 -3
  43. package/.claude/helpers/router.cjs +122 -11
  44. package/.claude/helpers/skill-registry.json +0 -189
  45. package/.claude/skills/github-toolkit/SKILL.md +60 -0
  46. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -15
  47. package/.claude/skills/hooks-automation/SKILL.md +0 -1
  48. package/.claude/skills/mastermind-skills/_protocol.md +1 -1
  49. package/.claude/skills/mastermind-skills/architect.md +5 -6
  50. package/.claude/skills/mastermind-skills/autodev.md +8 -5
  51. package/.claude/skills/mastermind-skills/build.md +1 -2
  52. package/.claude/skills/mastermind-skills/review.md +8 -5
  53. package/.claude/skills/mastermind-skills/techport.md +37 -3
  54. package/.claude/skills/memory-toolkit/SKILL.md +75 -0
  55. package/.claude/skills/monodesign/document.md +9 -6
  56. package/.claude/skills/monodesign/extract.md +1 -1
  57. package/.claude/skills/monodesign/reference/document.md +1 -1
  58. package/.claude/skills/monodesign/reference/live.md +1 -1
  59. package/.claude/skills/monolean/SKILL.md +1 -1
  60. package/.claude/skills/specialagent/SKILL.md +2 -4
  61. package/.claude/skills/swarm-advanced/SKILL.md +0 -1
  62. package/README.md +2 -5
  63. package/bin/mcp-server.js +11 -1
  64. package/dist/src/autopilot-state.d.ts.map +1 -1
  65. package/dist/src/autopilot-state.js +4 -5
  66. package/dist/src/autopilot-state.js.map +1 -1
  67. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  68. package/dist/src/browser/dashboard/server.js +69 -1
  69. package/dist/src/browser/dashboard/server.js.map +1 -1
  70. package/dist/src/browser/dashboard/ui.html +214 -1764
  71. package/dist/src/capabilities/index.d.ts +0 -2
  72. package/dist/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/src/capabilities/index.js +0 -1
  74. package/dist/src/capabilities/index.js.map +1 -1
  75. package/dist/src/commands/agent-lifecycle.d.ts.map +1 -1
  76. package/dist/src/commands/agent-lifecycle.js +2 -6
  77. package/dist/src/commands/agent-lifecycle.js.map +1 -1
  78. package/dist/src/commands/agent-ops.d.ts +1 -2
  79. package/dist/src/commands/agent-ops.d.ts.map +1 -1
  80. package/dist/src/commands/agent-ops.js +1 -59
  81. package/dist/src/commands/agent-ops.js.map +1 -1
  82. package/dist/src/commands/agent.d.ts.map +1 -1
  83. package/dist/src/commands/agent.js +2 -3
  84. package/dist/src/commands/agent.js.map +1 -1
  85. package/dist/src/commands/analyze-diff.js +1 -1
  86. package/dist/src/commands/analyze-diff.js.map +1 -1
  87. package/dist/src/commands/analyze.d.ts +0 -4
  88. package/dist/src/commands/analyze.d.ts.map +1 -1
  89. package/dist/src/commands/analyze.js +1 -29
  90. package/dist/src/commands/analyze.js.map +1 -1
  91. package/dist/src/commands/browse-action.d.ts.map +1 -1
  92. package/dist/src/commands/browse-action.js +94 -2
  93. package/dist/src/commands/browse-action.js.map +1 -1
  94. package/dist/src/commands/completions.d.ts.map +1 -1
  95. package/dist/src/commands/completions.js +12 -76
  96. package/dist/src/commands/completions.js.map +1 -1
  97. package/dist/src/commands/config.d.ts.map +1 -1
  98. package/dist/src/commands/config.js +0 -6
  99. package/dist/src/commands/config.js.map +1 -1
  100. package/dist/src/commands/doctor-project-checks.d.ts +13 -3
  101. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  102. package/dist/src/commands/doctor-project-checks.js +131 -23
  103. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  104. package/dist/src/commands/doctor.d.ts.map +1 -1
  105. package/dist/src/commands/doctor.js +6 -5
  106. package/dist/src/commands/doctor.js.map +1 -1
  107. package/dist/src/commands/guidance.d.ts +5 -1
  108. package/dist/src/commands/guidance.d.ts.map +1 -1
  109. package/dist/src/commands/guidance.js +11 -556
  110. package/dist/src/commands/guidance.js.map +1 -1
  111. package/dist/src/commands/hive-mind-comms.d.ts.map +1 -1
  112. package/dist/src/commands/hive-mind-comms.js +11 -4
  113. package/dist/src/commands/hive-mind-comms.js.map +1 -1
  114. package/dist/src/commands/hive-mind-helpers.js +2 -2
  115. package/dist/src/commands/hive-mind-helpers.js.map +1 -1
  116. package/dist/src/commands/hive-mind-ops.d.ts +1 -3
  117. package/dist/src/commands/hive-mind-ops.d.ts.map +1 -1
  118. package/dist/src/commands/hive-mind-ops.js +2 -116
  119. package/dist/src/commands/hive-mind-ops.js.map +1 -1
  120. package/dist/src/commands/hive-mind.d.ts +4 -4
  121. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  122. package/dist/src/commands/hive-mind.js +11 -11
  123. package/dist/src/commands/hive-mind.js.map +1 -1
  124. package/dist/src/commands/hooks-coverage-commands.d.ts.map +1 -1
  125. package/dist/src/commands/hooks-coverage-commands.js +8 -7
  126. package/dist/src/commands/hooks-coverage-commands.js.map +1 -1
  127. package/dist/src/commands/hooks-coverage-gaps.js +1 -1
  128. package/dist/src/commands/hooks-coverage-gaps.js.map +1 -1
  129. package/dist/src/commands/hooks-coverage-routing.js +2 -2
  130. package/dist/src/commands/hooks-coverage-routing.js.map +1 -1
  131. package/dist/src/commands/hooks-extended-commands.d.ts +0 -3
  132. package/dist/src/commands/hooks-extended-commands.d.ts.map +1 -1
  133. package/dist/src/commands/hooks-extended-commands.js +0 -307
  134. package/dist/src/commands/hooks-extended-commands.js.map +1 -1
  135. package/dist/src/commands/hooks-formatting.d.ts +1 -5
  136. package/dist/src/commands/hooks-formatting.d.ts.map +1 -1
  137. package/dist/src/commands/hooks-formatting.js +1 -18
  138. package/dist/src/commands/hooks-formatting.js.map +1 -1
  139. package/dist/src/commands/hooks-workers.d.ts +1 -1
  140. package/dist/src/commands/hooks-workers.d.ts.map +1 -1
  141. package/dist/src/commands/hooks-workers.js +82 -330
  142. package/dist/src/commands/hooks-workers.js.map +1 -1
  143. package/dist/src/commands/hooks.d.ts.map +1 -1
  144. package/dist/src/commands/hooks.js +1 -12
  145. package/dist/src/commands/hooks.js.map +1 -1
  146. package/dist/src/commands/index.d.ts +2 -55
  147. package/dist/src/commands/index.d.ts.map +1 -1
  148. package/dist/src/commands/index.js +23 -216
  149. package/dist/src/commands/index.js.map +1 -1
  150. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  151. package/dist/src/commands/init-wizard.js +3 -5
  152. package/dist/src/commands/init-wizard.js.map +1 -1
  153. package/dist/src/commands/init.d.ts.map +1 -1
  154. package/dist/src/commands/init.js +4 -24
  155. package/dist/src/commands/init.js.map +1 -1
  156. package/dist/src/commands/mcp.d.ts.map +1 -1
  157. package/dist/src/commands/mcp.js +32 -4
  158. package/dist/src/commands/mcp.js.map +1 -1
  159. package/dist/src/commands/memory-admin.d.ts +1 -2
  160. package/dist/src/commands/memory-admin.d.ts.map +1 -1
  161. package/dist/src/commands/memory-admin.js +1 -118
  162. package/dist/src/commands/memory-admin.js.map +1 -1
  163. package/dist/src/commands/memory-transfer.d.ts +1 -2
  164. package/dist/src/commands/memory-transfer.d.ts.map +1 -1
  165. package/dist/src/commands/memory-transfer.js +5 -171
  166. package/dist/src/commands/memory-transfer.js.map +1 -1
  167. package/dist/src/commands/memory.d.ts.map +1 -1
  168. package/dist/src/commands/memory.js +3 -6
  169. package/dist/src/commands/memory.js.map +1 -1
  170. package/dist/src/commands/neural-core.d.ts +3 -1
  171. package/dist/src/commands/neural-core.d.ts.map +1 -1
  172. package/dist/src/commands/neural-core.js +154 -15
  173. package/dist/src/commands/neural-core.js.map +1 -1
  174. package/dist/src/commands/neural-optimize.d.ts.map +1 -1
  175. package/dist/src/commands/neural-optimize.js +13 -15
  176. package/dist/src/commands/neural-optimize.js.map +1 -1
  177. package/dist/src/commands/neural-registry.d.ts +1 -1
  178. package/dist/src/commands/neural-registry.js +14 -14
  179. package/dist/src/commands/neural-registry.js.map +1 -1
  180. package/dist/src/commands/neural.d.ts +1 -1
  181. package/dist/src/commands/neural.js +6 -6
  182. package/dist/src/commands/neural.js.map +1 -1
  183. package/dist/src/commands/performance.d.ts.map +1 -1
  184. package/dist/src/commands/performance.js +68 -58
  185. package/dist/src/commands/performance.js.map +1 -1
  186. package/dist/src/commands/providers.d.ts.map +1 -1
  187. package/dist/src/commands/providers.js +77 -117
  188. package/dist/src/commands/providers.js.map +1 -1
  189. package/dist/src/commands/search-universal.d.ts +7 -1
  190. package/dist/src/commands/search-universal.d.ts.map +1 -1
  191. package/dist/src/commands/search-universal.js +59 -5
  192. package/dist/src/commands/search-universal.js.map +1 -1
  193. package/dist/src/commands/security-cve.d.ts.map +1 -1
  194. package/dist/src/commands/security-cve.js +3 -5
  195. package/dist/src/commands/security-cve.js.map +1 -1
  196. package/dist/src/commands/security-misc.d.ts +0 -1
  197. package/dist/src/commands/security-misc.d.ts.map +1 -1
  198. package/dist/src/commands/security-misc.js +69 -45
  199. package/dist/src/commands/security-misc.js.map +1 -1
  200. package/dist/src/commands/security.d.ts.map +1 -1
  201. package/dist/src/commands/security.js +2 -4
  202. package/dist/src/commands/security.js.map +1 -1
  203. package/dist/src/commands/session.d.ts.map +1 -1
  204. package/dist/src/commands/session.js +137 -281
  205. package/dist/src/commands/session.js.map +1 -1
  206. package/dist/src/commands/start.d.ts.map +1 -1
  207. package/dist/src/commands/start.js +2 -59
  208. package/dist/src/commands/start.js.map +1 -1
  209. package/dist/src/commands/status.d.ts.map +1 -1
  210. package/dist/src/commands/status.js +18 -29
  211. package/dist/src/commands/status.js.map +1 -1
  212. package/dist/src/commands/swarm.d.ts.map +1 -1
  213. package/dist/src/commands/swarm.js +113 -66
  214. package/dist/src/commands/swarm.js.map +1 -1
  215. package/dist/src/commands/task.d.ts.map +1 -1
  216. package/dist/src/commands/task.js +2 -49
  217. package/dist/src/commands/task.js.map +1 -1
  218. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  219. package/dist/src/consensus/audit-writer.js +43 -1
  220. package/dist/src/consensus/audit-writer.js.map +1 -1
  221. package/dist/src/consensus/tally.d.ts +19 -0
  222. package/dist/src/consensus/tally.d.ts.map +1 -0
  223. package/dist/src/consensus/tally.js +34 -0
  224. package/dist/src/consensus/tally.js.map +1 -0
  225. package/dist/src/index.d.ts +3 -2
  226. package/dist/src/index.d.ts.map +1 -1
  227. package/dist/src/index.js +13 -9
  228. package/dist/src/index.js.map +1 -1
  229. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  230. package/dist/src/init/claudemd-generator.js +10 -14
  231. package/dist/src/init/claudemd-generator.js.map +1 -1
  232. package/dist/src/init/executor.d.ts.map +1 -1
  233. package/dist/src/init/executor.js +42 -100
  234. package/dist/src/init/executor.js.map +1 -1
  235. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  236. package/dist/src/init/helpers-generator.js +2 -22
  237. package/dist/src/init/helpers-generator.js.map +1 -1
  238. package/dist/src/init/settings-generator.d.ts.map +1 -1
  239. package/dist/src/init/settings-generator.js +0 -13
  240. package/dist/src/init/settings-generator.js.map +1 -1
  241. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  242. package/dist/src/init/statusline-generator.js +62 -0
  243. package/dist/src/init/statusline-generator.js.map +1 -1
  244. package/dist/src/init/types.d.ts +3 -9
  245. package/dist/src/init/types.d.ts.map +1 -1
  246. package/dist/src/init/types.js +0 -5
  247. package/dist/src/init/types.js.map +1 -1
  248. package/dist/src/knowledge/document-pipeline.d.ts.map +1 -1
  249. package/dist/src/knowledge/document-pipeline.js +18 -8
  250. package/dist/src/knowledge/document-pipeline.js.map +1 -1
  251. package/dist/src/mcp-client.d.ts.map +1 -1
  252. package/dist/src/mcp-client.js +0 -8
  253. package/dist/src/mcp-client.js.map +1 -1
  254. package/dist/src/mcp-server.d.ts.map +1 -1
  255. package/dist/src/mcp-server.js +14 -0
  256. package/dist/src/mcp-server.js.map +1 -1
  257. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  258. package/dist/src/mcp-tools/agent-tools.js +0 -17
  259. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  260. package/dist/src/mcp-tools/coherence/causal-infer.d.ts +5 -5
  261. package/dist/src/mcp-tools/coherence/causal-infer.d.ts.map +1 -1
  262. package/dist/src/mcp-tools/coherence/causal-infer.js +32 -46
  263. package/dist/src/mcp-tools/coherence/causal-infer.js.map +1 -1
  264. package/dist/src/mcp-tools/coherence/coherence-check.d.ts.map +1 -1
  265. package/dist/src/mcp-tools/coherence/coherence-check.js +1 -19
  266. package/dist/src/mcp-tools/coherence/coherence-check.js.map +1 -1
  267. package/dist/src/mcp-tools/coherence/consensus-verify.d.ts +2 -3
  268. package/dist/src/mcp-tools/coherence/consensus-verify.d.ts.map +1 -1
  269. package/dist/src/mcp-tools/coherence/consensus-verify.js +22 -20
  270. package/dist/src/mcp-tools/coherence/consensus-verify.js.map +1 -1
  271. package/dist/src/mcp-tools/coherence/memory-gate.d.ts +3 -2
  272. package/dist/src/mcp-tools/coherence/memory-gate.d.ts.map +1 -1
  273. package/dist/src/mcp-tools/coherence/memory-gate.js +32 -19
  274. package/dist/src/mcp-tools/coherence/memory-gate.js.map +1 -1
  275. package/dist/src/mcp-tools/coherence/quantum-topology.d.ts +4 -4
  276. package/dist/src/mcp-tools/coherence/quantum-topology.d.ts.map +1 -1
  277. package/dist/src/mcp-tools/coherence/quantum-topology.js +11 -17
  278. package/dist/src/mcp-tools/coherence/quantum-topology.js.map +1 -1
  279. package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +2 -3
  280. package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts.map +1 -1
  281. package/dist/src/mcp-tools/coherence/spectral-analyze.js +51 -32
  282. package/dist/src/mcp-tools/coherence/spectral-analyze.js.map +1 -1
  283. package/dist/src/mcp-tools/coherence/types.d.ts +8 -11
  284. package/dist/src/mcp-tools/coherence/types.d.ts.map +1 -1
  285. package/dist/src/mcp-tools/coherence/types.js +3 -18
  286. package/dist/src/mcp-tools/coherence/types.js.map +1 -1
  287. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  288. package/dist/src/mcp-tools/embeddings-tools.js +1 -7
  289. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  290. package/dist/src/mcp-tools/graphify-tools.js +2 -2
  291. package/dist/src/mcp-tools/graphify-tools.js.map +1 -1
  292. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  293. package/dist/src/mcp-tools/guidance-tools.js +9 -19
  294. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  295. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -1
  296. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  297. package/dist/src/mcp-tools/hive-mind-tools.js +198 -40
  298. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  299. package/dist/src/mcp-tools/hooks-advanced.d.ts +18 -0
  300. package/dist/src/mcp-tools/hooks-advanced.d.ts.map +1 -0
  301. package/dist/src/mcp-tools/hooks-advanced.js +25 -0
  302. package/dist/src/mcp-tools/hooks-advanced.js.map +1 -0
  303. package/dist/src/mcp-tools/hooks-intelligence.d.ts +4 -8
  304. package/dist/src/mcp-tools/hooks-intelligence.d.ts.map +1 -1
  305. package/dist/src/mcp-tools/hooks-intelligence.js +33 -482
  306. package/dist/src/mcp-tools/hooks-intelligence.js.map +1 -1
  307. package/dist/src/mcp-tools/hooks-routing.d.ts +1 -3
  308. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  309. package/dist/src/mcp-tools/hooks-routing.js +96 -202
  310. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  311. package/dist/src/mcp-tools/hooks-synthesis.d.ts +31 -0
  312. package/dist/src/mcp-tools/hooks-synthesis.d.ts.map +1 -0
  313. package/dist/src/mcp-tools/hooks-synthesis.js +196 -0
  314. package/dist/src/mcp-tools/hooks-synthesis.js.map +1 -0
  315. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  316. package/dist/src/mcp-tools/hooks-tools.js +10 -11
  317. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  318. package/dist/src/mcp-tools/index.d.ts +0 -3
  319. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  320. package/dist/src/mcp-tools/index.js +0 -4
  321. package/dist/src/mcp-tools/index.js.map +1 -1
  322. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  323. package/dist/src/mcp-tools/memory-tools.js +24 -9
  324. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  325. package/dist/src/mcp-tools/monograph-tools.d.ts +6 -0
  326. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  327. package/dist/src/mcp-tools/monograph-tools.js +370 -95
  328. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  329. package/dist/src/mcp-tools/neural-tools.d.ts +8 -9
  330. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  331. package/dist/src/mcp-tools/neural-tools.js +249 -539
  332. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  333. package/dist/src/mcp-tools/performance-tools.d.ts.map +1 -1
  334. package/dist/src/mcp-tools/performance-tools.js +5 -17
  335. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  336. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +2 -2
  337. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js.map +1 -1
  338. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +4 -4
  339. package/dist/src/mcp-tools/quality-tools.d.ts +7 -2
  340. package/dist/src/mcp-tools/quality-tools.d.ts.map +1 -1
  341. package/dist/src/mcp-tools/quality-tools.js +7 -257
  342. package/dist/src/mcp-tools/quality-tools.js.map +1 -1
  343. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  344. package/dist/src/mcp-tools/security-tools.js +103 -0
  345. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  346. package/dist/src/memory/intelligence.d.ts +9 -9
  347. package/dist/src/memory/intelligence.d.ts.map +1 -1
  348. package/dist/src/memory/intelligence.js +71 -59
  349. package/dist/src/memory/intelligence.js.map +1 -1
  350. package/dist/src/memory/memory-bridge.d.ts +1 -0
  351. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  352. package/dist/src/memory/memory-bridge.js +47 -5
  353. package/dist/src/memory/memory-bridge.js.map +1 -1
  354. package/dist/src/memory/memory-read.d.ts.map +1 -1
  355. package/dist/src/memory/memory-read.js +1 -19
  356. package/dist/src/memory/memory-read.js.map +1 -1
  357. package/dist/src/suggest.d.ts.map +1 -1
  358. package/dist/src/suggest.js +1 -12
  359. package/dist/src/suggest.js.map +1 -1
  360. package/dist/src/transfer/store/discovery.d.ts +3 -2
  361. package/dist/src/transfer/store/discovery.d.ts.map +1 -1
  362. package/dist/src/transfer/store/discovery.js +22 -70
  363. package/dist/src/transfer/store/discovery.js.map +1 -1
  364. package/dist/src/update/checker.d.ts.map +1 -1
  365. package/dist/src/update/checker.js +0 -1
  366. package/dist/src/update/checker.js.map +1 -1
  367. package/dist/src/utils/cosine-similarity.d.ts +22 -0
  368. package/dist/src/utils/cosine-similarity.d.ts.map +1 -0
  369. package/dist/src/utils/cosine-similarity.js +38 -0
  370. package/dist/src/utils/cosine-similarity.js.map +1 -0
  371. package/dist/src/utils/input-guards.d.ts +51 -0
  372. package/dist/src/utils/input-guards.d.ts.map +1 -0
  373. package/dist/src/utils/input-guards.js +223 -0
  374. package/dist/src/utils/input-guards.js.map +1 -0
  375. package/dist/src/utils/json-file.d.ts +33 -0
  376. package/dist/src/utils/json-file.d.ts.map +1 -0
  377. package/dist/src/utils/json-file.js +57 -0
  378. package/dist/src/utils/json-file.js.map +1 -0
  379. package/dist/tsconfig.tsbuildinfo +1 -1
  380. package/package.json +9 -6
  381. package/scripts/sync-claude-assets.sh +16 -20
  382. package/.claude/agents/generated/case-analyst.md +0 -50
  383. package/.claude/agents/generated/channel-intelligence-director.md +0 -87
  384. package/.claude/agents/generated/chief-growth-officer.md +0 -88
  385. package/.claude/agents/generated/churn-analyst.md +0 -53
  386. package/.claude/agents/generated/code-reviewer.md +0 -55
  387. package/.claude/agents/generated/code-validator.md +0 -57
  388. package/.claude/agents/generated/complexity-scanner.md +0 -56
  389. package/.claude/agents/generated/content-seo-strategist.md +0 -90
  390. package/.claude/agents/generated/copy-editor.md +0 -45
  391. package/.claude/agents/generated/court-reporter.md +0 -50
  392. package/.claude/agents/generated/defender.md +0 -51
  393. package/.claude/agents/generated/devbot-orchestrator.md +0 -58
  394. package/.claude/agents/generated/devbot-planner.md +0 -63
  395. package/.claude/agents/generated/developer-community-strategist.md +0 -91
  396. package/.claude/agents/generated/editor-in-chief.md +0 -45
  397. package/.claude/agents/generated/fact-checker.md +0 -45
  398. package/.claude/agents/generated/impact-assessor.md +0 -54
  399. package/.claude/agents/generated/judge.md +0 -51
  400. package/.claude/agents/generated/outreach-partnership-strategist.md +0 -90
  401. package/.claude/agents/generated/prosecutor.md +0 -51
  402. package/.claude/agents/generated/reporter.md +0 -45
  403. package/.claude/agents/generated/social-media-strategist.md +0 -91
  404. package/.claude/agents/generated/video-visual-strategist.md +0 -90
  405. package/.claude/agents/reengineer-squad/boss.md +0 -113
  406. package/.claude/agents/reengineer-squad/critic-architect.md +0 -132
  407. package/.claude/agents/reengineer-squad/git-manager.md +0 -145
  408. package/.claude/agents/reengineer-squad/idea-generator.md +0 -95
  409. package/.claude/agents/reengineer-squad/implementer.md +0 -112
  410. package/.claude/agents/reengineer-squad/integration-planner.md +0 -112
  411. package/.claude/agents/reengineer-squad/source-analyst.md +0 -103
  412. package/.claude/agents/reengineer-squad/target-analyst.md +0 -118
  413. package/.claude/agents/reengineer-squad/tester.md +0 -105
  414. package/.claude/agents/sparc/architecture.md +0 -453
  415. package/.claude/agents/sparc/pseudocode.md +0 -299
  416. package/.claude/agents/sparc/refinement.md +0 -504
  417. package/.claude/agents/sparc/specification.md +0 -258
  418. package/.claude/agents/templates/implementer-sparc-coder.md +0 -231
  419. package/.claude/commands/sparc/analyzer.md +0 -35
  420. package/.claude/commands/sparc/architect.md +0 -36
  421. package/.claude/commands/sparc/ask.md +0 -56
  422. package/.claude/commands/sparc/batch-executor.md +0 -37
  423. package/.claude/commands/sparc/code.md +0 -48
  424. package/.claude/commands/sparc/coder.md +0 -37
  425. package/.claude/commands/sparc/debug.md +0 -42
  426. package/.claude/commands/sparc/debugger.md +0 -37
  427. package/.claude/commands/sparc/designer.md +0 -36
  428. package/.claude/commands/sparc/devops.md +0 -68
  429. package/.claude/commands/sparc/docs-writer.md +0 -39
  430. package/.claude/commands/sparc/documenter.md +0 -37
  431. package/.claude/commands/sparc/innovator.md +0 -37
  432. package/.claude/commands/sparc/integration.md +0 -42
  433. package/.claude/commands/sparc/mcp.md +0 -76
  434. package/.claude/commands/sparc/memory-manager.md +0 -57
  435. package/.claude/commands/sparc/optimizer.md +0 -37
  436. package/.claude/commands/sparc/orchestrator.md +0 -70
  437. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -42
  438. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -42
  439. package/.claude/commands/sparc/researcher.md +0 -37
  440. package/.claude/commands/sparc/reviewer.md +0 -37
  441. package/.claude/commands/sparc/security-review.md +0 -39
  442. package/.claude/commands/sparc/sparc-modes.md +0 -120
  443. package/.claude/commands/sparc/sparc.md +0 -71
  444. package/.claude/commands/sparc/spec-pseudocode.md +0 -39
  445. package/.claude/commands/sparc/supabase-admin.md +0 -301
  446. package/.claude/commands/sparc/swarm-coordinator.md +0 -50
  447. package/.claude/commands/sparc/tdd.md +0 -37
  448. package/.claude/commands/sparc/tester.md +0 -37
  449. package/.claude/commands/sparc/tutorial.md +0 -38
  450. package/.claude/commands/sparc/workflow-manager.md +0 -37
  451. package/.claude/commands/sparc.md +0 -112
  452. package/.claude/helpers/auto-memory-hook.mjs +0 -503
  453. package/.claude/skills/sparc-methodology/SKILL.md +0 -950
  454. package/dist/src/capabilities/enrichment.d.ts +0 -44
  455. package/dist/src/capabilities/enrichment.d.ts.map +0 -1
  456. package/dist/src/capabilities/enrichment.js +0 -141
  457. package/dist/src/capabilities/enrichment.js.map +0 -1
  458. package/dist/src/commands/analyze-boundaries.d.ts +0 -14
  459. package/dist/src/commands/analyze-boundaries.d.ts.map +0 -1
  460. package/dist/src/commands/analyze-boundaries.js +0 -295
  461. package/dist/src/commands/analyze-boundaries.js.map +0 -1
  462. package/dist/src/commands/analyze-graph.d.ts +0 -14
  463. package/dist/src/commands/analyze-graph.d.ts.map +0 -1
  464. package/dist/src/commands/analyze-graph.js +0 -304
  465. package/dist/src/commands/analyze-graph.js.map +0 -1
  466. package/dist/src/commands/claims.d.ts +0 -10
  467. package/dist/src/commands/claims.d.ts.map +0 -1
  468. package/dist/src/commands/claims.js +0 -650
  469. package/dist/src/commands/claims.js.map +0 -1
  470. package/dist/src/commands/daemon.d.ts +0 -8
  471. package/dist/src/commands/daemon.d.ts.map +0 -1
  472. package/dist/src/commands/daemon.js +0 -681
  473. package/dist/src/commands/daemon.js.map +0 -1
  474. package/dist/src/commands/deployment.d.ts +0 -10
  475. package/dist/src/commands/deployment.d.ts.map +0 -1
  476. package/dist/src/commands/deployment.js +0 -706
  477. package/dist/src/commands/deployment.js.map +0 -1
  478. package/dist/src/commands/enrich.d.ts +0 -10
  479. package/dist/src/commands/enrich.d.ts.map +0 -1
  480. package/dist/src/commands/enrich.js +0 -58
  481. package/dist/src/commands/enrich.js.map +0 -1
  482. package/dist/src/commands/issues.d.ts +0 -21
  483. package/dist/src/commands/issues.d.ts.map +0 -1
  484. package/dist/src/commands/issues.js +0 -575
  485. package/dist/src/commands/issues.js.map +0 -1
  486. package/dist/src/commands/workflow.d.ts +0 -8
  487. package/dist/src/commands/workflow.d.ts.map +0 -1
  488. package/dist/src/commands/workflow.js +0 -677
  489. package/dist/src/commands/workflow.js.map +0 -1
  490. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  491. package/dist/src/mcp-tools/workflow-tools.d.ts.map +0 -1
  492. package/dist/src/mcp-tools/workflow-tools.js +0 -717
  493. package/dist/src/mcp-tools/workflow-tools.js.map +0 -1
  494. package/dist/src/services/claim-service.d.ts +0 -198
  495. package/dist/src/services/claim-service.d.ts.map +0 -1
  496. package/dist/src/services/claim-service.js +0 -890
  497. package/dist/src/services/claim-service.js.map +0 -1
  498. package/dist/src/services/headless-worker-executor.d.ts +0 -311
  499. package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
  500. package/dist/src/services/headless-worker-executor.js +0 -1183
  501. package/dist/src/services/headless-worker-executor.js.map +0 -1
  502. package/dist/src/services/worker-daemon.d.ts +0 -248
  503. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  504. package/dist/src/services/worker-daemon.js +0 -1417
  505. package/dist/src/services/worker-daemon.js.map +0 -1
  506. package/dist/src/ui/.monomind/capture/active-run.json +0 -1
  507. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.convs.jsonl +0 -3
  508. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/real-events-1782290897.jsonl +0 -11
  509. package/dist/src/ui/.monomind/orgs/system-trial-qa/runs/rigid-qa-restart-1782288201.jsonl +0 -540
  510. package/dist/src/ui/.monomind/orgs/system-trial-qa-threads.jsonl +0 -3
  511. package/dist/src/ui/.monomind/orgs/test-event-fix/runs/rigid-qa-restart-1782288201.jsonl +0 -2
@@ -1,219 +1,112 @@
1
1
  /**
2
- * Neural MCP Tools for CLI
2
+ * Pattern Store MCP Tools — "neural" namespace (legacy name, kept for API compat)
3
3
  *
4
- * V2 Compatibility - Neural network and ML tools
4
+ * These tools embed text as vectors and search by cosine similarity.
5
+ * No ML training, gradient descent, or neural network inference occurs.
6
+ * The "train" tool embeds and stores; the "predict" tool finds similar stored
7
+ * patterns. Embeddings come from the shared memory/embedding-operations.ts
8
+ * pipeline (LanceDB bridge -> ONNX -> deterministic hash fallback).
5
9
  *
6
- * HYBRID Implementation:
7
- * - Uses monovector ONNX embeddings when available
8
- * - Falls back to deterministic hash-based embeddings otherwise
9
- * - Pattern storage and search with cosine similarity (real math in all tiers)
10
- * - Training stores patterns as searchable embeddings (not simulated)
11
- *
12
- * Note: The lean build has no neural training. The full loop lives on monoes-full-loop.
10
+ * All pattern storage is delegated to intelligence.ts's LocalReasoningBank
11
+ * (single source of truth for patterns.json). No separate models.json store.
13
12
  */
14
- import { getProjectCwd } from './types.js';
15
- import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
16
- import { join } from 'node:path';
17
- const MAX_NEURAL_STORE_BYTES = 50 * 1024 * 1024; // 50 MB
18
- const NEURAL_RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
19
- // Embeddings via monovector ONNX when available; deterministic hash fallback otherwise.
20
- let realEmbeddings = null;
21
- let embeddingServiceName = 'none';
22
- try {
23
- const monovector = await import('monovector').catch(() => null);
24
- if (monovector?.getOptimizedOnnxEmbedder) {
25
- await monovector.initOnnxEmbedder?.();
26
- const onnxEmb = monovector.getOptimizedOnnxEmbedder();
27
- if (onnxEmb?.embed) {
28
- const probe = await onnxEmb.embed('test');
29
- const hasNonZero = ArrayBuffer.isView(probe) || Array.isArray(probe)
30
- ? [...probe].some((v) => v !== 0)
31
- : false;
32
- if (probe && probe.length > 0 && hasNonZero) {
33
- realEmbeddings = { embed: async (text) => Array.from(await onnxEmb.embed(text)) };
34
- embeddingServiceName = 'monovector/onnx';
35
- }
36
- }
37
- }
38
- }
39
- catch {
40
- // No ONNX embedding provider available, will use hash fallback
41
- }
42
- // Storage paths
43
- const STORAGE_DIR = '.monomind';
44
- const NEURAL_DIR = 'neural';
45
- const MODELS_FILE = 'models.json';
46
- const PATTERNS_FILE = 'patterns.json';
47
- function getNeuralDir() {
48
- return join(getProjectCwd(), STORAGE_DIR, NEURAL_DIR);
49
- }
50
- function getNeuralPath() {
51
- return join(getNeuralDir(), MODELS_FILE);
52
- }
53
- function ensureNeuralDir() {
54
- const dir = getNeuralDir();
55
- if (!existsSync(dir)) {
56
- mkdirSync(dir, { recursive: true });
57
- }
58
- }
59
- function loadNeuralStore() {
13
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
14
+ const MAX_MODEL_ID_LEN = 256;
15
+ const MAX_PATTERNS = 10000;
16
+ const MAX_TRAINING_ENTRIES = 1000;
17
+ const MAX_TEXT_LENGTH = 64 * 1024;
18
+ const MAX_SEARCH_QUERY_LENGTH = 16 * 1024;
19
+ // Embeddings: delegate to the shared embedding pipeline (LanceDB bridge -> ONNX ->
20
+ // deterministic hash fallback) in memory/embedding-operations.ts.
21
+ let lastEmbeddingModel = 'unknown';
22
+ /**
23
+ * Generate embedding via the shared pipeline (LanceDB bridge -> ONNX -> deterministic
24
+ * hash), same one used by CLI `neural` commands and memory search. Falls back to a
25
+ * local deterministic hash only if the shared module fails to load entirely.
26
+ */
27
+ async function generateEmbedding(text, dims = 384) {
28
+ if (!text)
29
+ return new Array(dims).fill(0);
60
30
  try {
61
- const path = getNeuralPath();
62
- if (existsSync(path)) {
63
- if (statSync(path).size > MAX_NEURAL_STORE_BYTES) {
64
- return { models: {}, patterns: {}, version: '3.0.0' };
65
- }
66
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
67
- // Strip proto-polluting keys from top-level containers
68
- const models = {};
69
- for (const [k, v] of Object.entries(raw.models ?? {})) {
70
- if (!NEURAL_RESERVED_KEYS.has(k))
71
- models[k] = v;
72
- }
73
- const patterns = {};
74
- for (const [k, v] of Object.entries(raw.patterns ?? {})) {
75
- if (!NEURAL_RESERVED_KEYS.has(k))
76
- patterns[k] = v;
77
- }
78
- return {
79
- models: models,
80
- patterns: patterns,
81
- version: typeof raw.version === 'string' ? raw.version : '3.0.0',
82
- };
83
- }
31
+ const { generateEmbedding: sharedGenerateEmbedding } = await import('../memory/embedding-operations.js');
32
+ const result = await sharedGenerateEmbedding(text);
33
+ lastEmbeddingModel = result.model;
34
+ return result.embedding;
84
35
  }
85
36
  catch {
86
- // Return empty store
87
- }
88
- return { models: {}, patterns: {}, version: '3.0.0' };
89
- }
90
- function saveNeuralStore(store) {
91
- ensureNeuralDir();
92
- const dest = getNeuralPath();
93
- const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
94
- writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
95
- renameSync(tmp, dest);
96
- }
97
- // Generate embedding - uses real ML embeddings if available, falls back to deterministic hash
98
- async function generateEmbedding(text, dims = 384) {
99
- // If real embeddings available and text provided, use them
100
- if (realEmbeddings && text) {
101
- try {
102
- return await realEmbeddings.embed(text);
103
- }
104
- catch {
105
- // Fall back to hash-based
106
- }
107
- }
108
- // Hash-based deterministic embedding (better than pure random for consistency)
109
- if (text) {
110
- const hash = text.split('').reduce((acc, char, i) => {
111
- return acc + char.charCodeAt(0) * (i + 1);
112
- }, 0);
113
- // Use hash to seed a deterministic embedding
37
+ // memory/embedding-operations.js unavailable — deterministic hash fallback
38
+ lastEmbeddingModel = 'hash-fallback';
39
+ const hash = text.split('').reduce((acc, char, i) => acc + char.charCodeAt(0) * (i + 1), 0);
114
40
  const embedding = [];
115
41
  let seed = hash;
116
42
  for (let i = 0; i < dims; i++) {
117
- // Simple LCG random with seed
118
43
  seed = (seed * 1103515245 + 12345) & 0x7fffffff;
119
44
  embedding.push((seed / 0x7fffffff) * 2 - 1);
120
45
  }
121
46
  return embedding;
122
47
  }
123
- // No text provided — return zero vector (callers should always provide text)
124
- return new Array(dims).fill(0);
125
48
  }
126
- // Cosine similarity for pattern search
127
- function cosineSimilarity(a, b) {
128
- if (a.length !== b.length) {
129
- throw new Error(`Embedding dimension mismatch: ${a.length} vs ${b.length}. Ensure all embeddings use the same provider and dims.`);
130
- }
131
- let dotProduct = 0;
132
- let normA = 0;
133
- let normB = 0;
134
- for (let i = 0; i < a.length; i++) {
135
- dotProduct += a[i] * b[i];
136
- normA += a[i] * a[i];
137
- normB += b[i] * b[i];
138
- }
139
- return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB) || 1);
49
+ /** Truncate and validate a modelId string */
50
+ function sanitizeModelId(raw) {
51
+ if (typeof raw !== 'string')
52
+ return null;
53
+ const id = raw.length > MAX_MODEL_ID_LEN ? raw.slice(0, MAX_MODEL_ID_LEN) : raw;
54
+ if (RESERVED_KEYS.has(id))
55
+ return null;
56
+ return id;
140
57
  }
141
58
  export const neuralTools = [
142
59
  {
143
60
  name: 'neural_train',
144
- description: 'Train a neural model',
61
+ description: 'Embed text as vectors and store as named patterns for later similarity search (no ML training occurs)',
145
62
  category: 'neural',
146
63
  inputSchema: {
147
64
  type: 'object',
148
65
  properties: {
149
- modelId: { type: 'string', description: 'Model ID to train' },
150
- modelType: { type: 'string', enum: ['moe', 'transformer', 'classifier', 'embedding'], description: 'Model type' },
151
- epochs: { type: 'number', description: 'Number of training epochs' },
152
- learningRate: { type: 'number', description: 'Learning rate' },
153
- data: { type: 'object', description: 'Training data' },
66
+ modelId: { type: 'string', description: 'Store ID (groups related patterns)' },
67
+ modelType: { type: 'string', enum: ['pattern', 'embedding'], description: 'Store type' },
68
+ epochs: { type: 'number', description: 'Deprecated ignored. Patterns are embedded and stored, not trained.' },
69
+ learningRate: { type: 'number', description: 'Deprecated — ignored. No gradient-based training occurs.' },
70
+ data: { type: 'object', description: 'Data to embed and store (array of strings or {text/content/label} objects)' },
154
71
  },
155
72
  required: ['modelType'],
156
73
  },
157
74
  handler: async (input) => {
158
- const store = loadNeuralStore();
159
- // Cap modelId to prevent DoS via oversized object keys written to the neural store JSON.
160
- const MAX_MODEL_ID_LEN = 256;
161
75
  const rawModelId = input.modelId || `model-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
162
- const modelId = typeof rawModelId === 'string' && rawModelId.length > MAX_MODEL_ID_LEN
163
- ? rawModelId.slice(0, MAX_MODEL_ID_LEN)
164
- : rawModelId;
165
- const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
166
- if (RESERVED_KEYS.has(modelId)) {
76
+ const modelId = sanitizeModelId(rawModelId);
77
+ if (modelId === null) {
167
78
  return { success: false, error: 'Invalid modelId' };
168
79
  }
169
- const MAX_PATTERNS = 10000;
170
- if (Object.keys(store.patterns ?? {}).length >= MAX_PATTERNS) {
171
- return { success: false, error: `Pattern store full (max ${MAX_PATTERNS}). Run neural_compress first.` };
172
- }
173
- const MAX_MODELS = 100;
174
- if (Object.keys(store.models ?? {}).length >= MAX_MODELS) {
175
- return { success: false, error: `Model store full (max ${MAX_MODELS}). Delete old models first.` };
176
- }
177
- // Runtime-validate modelType against the allowed enum. The JSON schema
178
- // declares an enum but callers that bypass schema validation (e.g. direct
179
- // MCP calls) can pass arbitrary strings, which would be stored verbatim.
180
- const VALID_MODEL_TYPES = new Set(['moe', 'transformer', 'classifier', 'embedding']);
80
+ const VALID_MODEL_TYPES = new Set(['pattern', 'embedding']);
181
81
  const rawModelType = input.modelType;
182
82
  if (!rawModelType || !VALID_MODEL_TYPES.has(rawModelType)) {
183
- return { success: false, error: `Invalid modelType "${rawModelType}". Must be one of: moe, transformer, classifier, embedding` };
83
+ return { success: false, error: `Invalid modelType "${rawModelType}". Must be one of: pattern, embedding` };
184
84
  }
185
85
  const modelType = rawModelType;
186
- // Cap epochs to prevent storing absurdly large numbers in the JSON store.
187
- const MAX_EPOCHS = 10000;
188
- const rawEpochs = typeof input.epochs === 'number' && Number.isFinite(input.epochs) ? input.epochs : 10;
189
- const epochs = Math.max(1, Math.min(Math.floor(rawEpochs), MAX_EPOCHS));
190
- const model = {
191
- id: modelId,
192
- name: `${modelType}-model`,
193
- type: modelType,
194
- status: 'training',
195
- accuracy: 0,
196
- epochs,
197
- config: {
198
- learningRate: input.learningRate || 0.001,
199
- batchSize: 32,
200
- },
201
- };
202
- store.models[modelId] = model;
203
- saveNeuralStore(store);
204
- // Real training: embed training data and store as searchable patterns.
205
- // Cap input array length and re-check the pattern cap inside the loop —
206
- // the pre-loop check at line 199 alone allowed an attacker to bypass
207
- // MAX_PATTERNS by passing a 100k-entry array.
208
- const MAX_TRAINING_ENTRIES = 1000;
209
- const MAX_TEXT_LENGTH = 64 * 1024;
86
+ // Initialize intelligence system (single source of truth)
87
+ const { initializeIntelligence, getReasoningBank, getAllPatterns, flushPatterns } = await import('../memory/intelligence.js');
88
+ const init = await initializeIntelligence();
89
+ if (!init.success) {
90
+ return { success: false, error: 'Failed to initialize intelligence system' };
91
+ }
92
+ const bank = getReasoningBank();
93
+ if (!bank) {
94
+ return { success: false, error: 'ReasoningBank not available' };
95
+ }
96
+ // Check pattern capacity
97
+ const existingPatterns = await getAllPatterns();
98
+ if (existingPatterns.length >= MAX_PATTERNS) {
99
+ return { success: false, error: `Pattern store full (max ${MAX_PATTERNS}). Run neural_compress first.` };
100
+ }
210
101
  const trainingData = input.data;
211
102
  let patternsStored = 0;
212
103
  if (trainingData) {
213
104
  const rawEntries = Array.isArray(trainingData) ? trainingData : [trainingData];
214
105
  const entries = rawEntries.slice(0, MAX_TRAINING_ENTRIES);
215
106
  for (let i = 0; i < entries.length; i++) {
216
- if (Object.keys(store.patterns ?? {}).length >= MAX_PATTERNS)
107
+ // Re-check capacity inside loop to prevent bypass via large arrays
108
+ const currentPatterns = await getAllPatterns();
109
+ if (currentPatterns.length >= MAX_PATTERNS)
217
110
  break;
218
111
  const entry = entries[i];
219
112
  let text = typeof entry === 'string' ? entry
@@ -227,166 +120,80 @@ export const neuralTools = [
227
120
  text = text.slice(0, MAX_TEXT_LENGTH);
228
121
  const embedding = await generateEmbedding(text, 384);
229
122
  const patternId = `${modelId}-train-${i}`;
230
- store.patterns[patternId] = {
123
+ bank.store({
231
124
  id: patternId,
232
- name: typeof entry === 'object' && entry !== null && 'label' in entry
233
- ? String(entry.label) : text.slice(0, 100),
234
125
  type: modelType,
235
126
  embedding,
236
- metadata: { modelId, epoch: epochs, index: i, raw: entry },
237
- createdAt: new Date().toISOString(),
238
- usageCount: 0,
239
- };
240
- patternsStored++;
241
- }
242
- }
243
- model.status = 'ready';
244
- model.accuracy = patternsStored > 0 ? 1.0 : 0; // accuracy = data stored, not simulated
245
- model.trainedAt = new Date().toISOString();
246
- saveNeuralStore(store);
247
- // Mirror patterns to patterns.json so CLI commands (neural patterns list,
248
- // neural predict) can find patterns trained via MCP and vice versa.
249
- if (patternsStored > 0) {
250
- try {
251
- const patternsPath = join(getNeuralDir(), PATTERNS_FILE);
252
- let existing = [];
253
- if (existsSync(patternsPath) && statSync(patternsPath).size <= MAX_NEURAL_STORE_BYTES) {
254
- const raw = readFileSync(patternsPath, 'utf-8');
255
- const parsed = JSON.parse(raw);
256
- if (Array.isArray(parsed))
257
- existing = parsed;
258
- }
259
- const existingIds = new Set(existing.map(p => p['id']));
260
- const newEntries = Object.values(store.patterns)
261
- .filter(p => p.id.startsWith(modelId) && !existingIds.has(p.id))
262
- .map(p => ({
263
- id: p.id,
264
- type: p.type,
265
- content: p.name,
127
+ content: typeof entry === 'object' && entry !== null && 'label' in entry
128
+ ? String(entry.label) : text.slice(0, 100),
266
129
  confidence: 0.8,
267
- usageCount: 0,
268
- embedding: p.embedding,
269
- createdAt: p.createdAt,
270
- }));
271
- if (newEntries.length > 0) {
272
- const merged = [...existing, ...newEntries];
273
- const tmp = `${patternsPath}.${process.pid}.${Date.now()}.tmp`;
274
- writeFileSync(tmp, JSON.stringify(merged, null, 2), 'utf-8');
275
- renameSync(tmp, patternsPath);
276
- }
277
- }
278
- catch {
279
- // Mirror is best-effort; don't fail the train operation
130
+ metadata: { modelId, index: i, raw: entry },
131
+ });
132
+ patternsStored++;
280
133
  }
281
134
  }
135
+ // Flush immediately to persist
136
+ flushPatterns();
137
+ const totalPatterns = (await getAllPatterns()).length;
282
138
  return {
283
139
  success: true,
284
- _realEmbedding: !!realEmbeddings,
140
+ _realEmbedding: lastEmbeddingModel !== 'hash-fallback',
285
141
  modelId,
286
142
  type: modelType,
287
- status: model.status,
143
+ status: 'ready',
288
144
  patternsStored,
289
- totalPatterns: Object.keys(store.patterns).length,
290
- epochs,
291
- trainedAt: model.trainedAt,
145
+ totalPatterns,
146
+ epochs: 1,
147
+ trainedAt: new Date().toISOString(),
292
148
  };
293
149
  },
294
150
  },
295
151
  {
296
152
  name: 'neural_predict',
297
- description: 'Make predictions using a neural model',
153
+ description: 'Find stored patterns most similar to input text via cosine similarity (not ML prediction)',
298
154
  category: 'neural',
299
155
  inputSchema: {
300
156
  type: 'object',
301
157
  properties: {
302
158
  modelId: { type: 'string', description: 'Model ID to use' },
303
- input: { type: 'string', description: 'Input text or data' },
304
- topK: { type: 'number', description: 'Number of top predictions' },
159
+ input: { type: 'string', description: 'Text to find similar patterns for' },
160
+ topK: { type: 'number', description: 'Number of top results to return' },
305
161
  },
306
162
  required: ['input'],
307
163
  },
308
164
  handler: async (input) => {
309
- const store = loadNeuralStore();
310
- // Cap modelId to prevent O(n) hash/compare cost on absurdly long keys.
311
- const MAX_MODEL_ID_LEN_PRED = 256;
312
165
  const rawModelIdPred = input.modelId;
313
- const modelId = typeof rawModelIdPred === 'string' && rawModelIdPred.length > MAX_MODEL_ID_LEN_PRED
314
- ? rawModelIdPred.slice(0, MAX_MODEL_ID_LEN_PRED)
315
- : rawModelIdPred;
316
- const inputText = typeof input.input === 'string' ? input.input.slice(0, 16 * 1024) : '';
317
- const topK = Math.max(1, Math.min(input.topK || 3, 50));
318
- const RESERVED_KEYS_PRED = new Set(['__proto__', 'constructor', 'prototype']);
319
- if (modelId && (RESERVED_KEYS_PRED.has(modelId) || typeof modelId !== 'string')) {
320
- return { success: false, error: 'Invalid modelId' };
321
- }
322
- // Find model or use default
323
- const model = modelId
324
- ? (Object.hasOwn(store.models, modelId) ? store.models[modelId] : undefined)
325
- : Object.values(store.models).find(m => m.status === 'ready');
326
- if (model && model.status !== 'ready') {
327
- return { success: false, error: 'Model not ready' };
166
+ if (rawModelIdPred) {
167
+ const modelId = sanitizeModelId(rawModelIdPred);
168
+ if (modelId === null) {
169
+ return { success: false, error: 'Invalid modelId' };
170
+ }
328
171
  }
329
- // Generate real embedding for the input
172
+ const inputText = typeof input.input === 'string' ? input.input.slice(0, MAX_SEARCH_QUERY_LENGTH) : '';
173
+ const topK = Math.max(1, Math.min(input.topK || 3, 50));
174
+ const { initializeIntelligence, findSimilarPatterns } = await import('../memory/intelligence.js');
175
+ await initializeIntelligence();
330
176
  const startTime = performance.now();
331
177
  const embedding = await generateEmbedding(inputText, 384);
178
+ // Use intelligence.ts findSimilarPatterns which handles embedding + search
179
+ const results = await findSimilarPatterns(inputText, {
180
+ k: topK,
181
+ threshold: 0.1,
182
+ });
332
183
  const latency = Math.round(performance.now() - startTime);
333
- // Search stored patterns via real cosine similarity.
334
- // Merge MCP models.json patterns with CLI patterns.json so both training
335
- // paths are visible from predict.
336
- const MAX_SCAN = 10000;
337
- const EARLY_EXIT_THRESHOLD = 0.1;
338
- const mcpPatterns = Object.values(store.patterns);
339
- const cliPatternsRaw = [];
340
- try {
341
- const cliPath = join(getNeuralDir(), PATTERNS_FILE);
342
- if (existsSync(cliPath) && statSync(cliPath).size <= MAX_NEURAL_STORE_BYTES) {
343
- const raw = JSON.parse(readFileSync(cliPath, 'utf-8'));
344
- if (Array.isArray(raw)) {
345
- const mcpIds = new Set(mcpPatterns.map(p => p.id));
346
- for (const p of raw) {
347
- if (p?.id && !mcpIds.has(p.id) && Array.isArray(p.embedding)) {
348
- cliPatternsRaw.push(p);
349
- }
350
- }
351
- }
352
- }
353
- }
354
- catch { /* best-effort */ }
355
- const cliMapped = cliPatternsRaw.map(p => ({
356
- id: p.id ?? '',
357
- name: p.content ?? p.name ?? p.type ?? '',
358
- type: p.type ?? 'general',
359
- embedding: p.embedding ?? [],
360
- metadata: {},
361
- createdAt: new Date().toISOString(),
362
- usageCount: 0,
184
+ const predictions = results.map(r => ({
185
+ label: r.content || r.type || r.id,
186
+ confidence: r.similarity ?? r.confidence,
187
+ patternId: r.id,
363
188
  }));
364
- const storedPatterns = [...mcpPatterns, ...cliMapped].slice(0, MAX_SCAN);
365
- let predictions;
366
- if (storedPatterns.length > 0) {
367
- const scored = [];
368
- for (const p of storedPatterns) {
369
- if (!Array.isArray(p.embedding) || p.embedding.length !== embedding.length)
370
- continue;
371
- const conf = Math.max(0, cosineSimilarity(embedding, p.embedding));
372
- if (conf < EARLY_EXIT_THRESHOLD)
373
- continue;
374
- scored.push({ label: p.name || p.type || p.id, confidence: conf, patternId: p.id });
375
- }
376
- predictions = scored.sort((a, b) => b.confidence - a.confidence).slice(0, topK);
377
- }
378
- else {
379
- // No patterns stored — no predictions possible
380
- predictions = [];
381
- }
382
189
  return {
383
190
  success: true,
384
- _realEmbedding: !!realEmbeddings,
385
- _hasStoredPatterns: storedPatterns.length > 0,
386
- modelId: model?.id || 'default',
191
+ _realEmbedding: lastEmbeddingModel !== 'hash-fallback',
192
+ _hasStoredPatterns: results.length > 0,
193
+ modelId: rawModelIdPred || 'default',
387
194
  input: inputText,
388
195
  predictions,
389
- embedding: embedding.slice(0, 8), // Preview of embedding
196
+ embedding: embedding.slice(0, 8),
390
197
  embeddingDims: embedding.length,
391
198
  latency,
392
199
  };
@@ -408,116 +215,118 @@ export const neuralTools = [
408
215
  },
409
216
  },
410
217
  handler: async (input) => {
411
- const store = loadNeuralStore();
412
218
  const action = input.action || 'list';
219
+ const { initializeIntelligence, getAllPatterns, getPatternsByType, getReasoningBank, findSimilarPatterns, deletePattern, flushPatterns } = await import('../memory/intelligence.js');
220
+ await initializeIntelligence();
413
221
  if (action === 'list') {
414
- const patterns = Object.values(store.patterns);
415
222
  const typeFilter = input.type;
416
- const filtered = typeFilter ? patterns.filter(p => p.type === typeFilter) : patterns;
223
+ const patterns = typeFilter
224
+ ? await getPatternsByType(typeFilter)
225
+ : await getAllPatterns();
417
226
  return {
418
- patterns: filtered.map(p => ({
227
+ patterns: patterns.map(p => ({
419
228
  id: p.id,
420
- name: p.name,
229
+ name: p.content,
421
230
  type: p.type,
422
231
  usageCount: p.usageCount,
423
- createdAt: p.createdAt,
232
+ createdAt: typeof p.createdAt === 'number' ? new Date(p.createdAt).toISOString() : p.createdAt,
424
233
  })),
425
- total: filtered.length,
234
+ total: patterns.length,
426
235
  };
427
236
  }
428
237
  if (action === 'get') {
429
238
  const patternId = input.patternId;
430
- if (!patternId || NEURAL_RESERVED_KEYS.has(patternId)) {
239
+ if (!patternId || RESERVED_KEYS.has(patternId)) {
431
240
  return { success: false, error: 'Invalid patternId' };
432
241
  }
433
- const pattern = Object.hasOwn(store.patterns, patternId) ? store.patterns[patternId] : undefined;
242
+ const bank = getReasoningBank();
243
+ if (!bank) {
244
+ return { success: false, error: 'ReasoningBank not available' };
245
+ }
246
+ const pattern = bank.get(patternId);
434
247
  if (!pattern) {
435
248
  return { success: false, error: 'Pattern not found' };
436
249
  }
437
- return { success: true, pattern };
250
+ return {
251
+ success: true,
252
+ pattern: {
253
+ id: pattern.id,
254
+ name: pattern.content,
255
+ type: pattern.type,
256
+ embedding: pattern.embedding,
257
+ metadata: pattern.metadata ?? {},
258
+ createdAt: new Date(pattern.createdAt).toISOString(),
259
+ usageCount: pattern.usageCount,
260
+ },
261
+ };
438
262
  }
439
263
  if (action === 'store') {
440
- const MAX_PATTERNS = 10000;
441
- if (Object.keys(store.patterns ?? {}).length >= MAX_PATTERNS) {
264
+ const allPatterns = await getAllPatterns();
265
+ if (allPatterns.length >= MAX_PATTERNS) {
442
266
  return { success: false, error: `Pattern store full (max ${MAX_PATTERNS}). Run neural_compress first.` };
443
267
  }
444
- const patternId = `pattern-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
445
- // Cap name length to prevent DoS in generateEmbedding (hash path is O(n))
446
- const MAX_PATTERN_NAME_LENGTH = 16 * 1024; // 16 KB
268
+ const MAX_PATTERN_NAME_LENGTH = 16 * 1024;
447
269
  const rawPatternName = input.name || 'Unnamed pattern';
448
270
  const patternName = typeof rawPatternName === 'string' && rawPatternName.length > MAX_PATTERN_NAME_LENGTH
449
271
  ? rawPatternName.slice(0, MAX_PATTERN_NAME_LENGTH)
450
272
  : rawPatternName;
451
- // Generate embedding from pattern name/content
452
273
  const embedding = await generateEmbedding(patternName, 384);
453
- const pattern = {
274
+ const patternId = `pattern-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
275
+ const patternType = input.type || 'general';
276
+ const bank = getReasoningBank();
277
+ if (!bank) {
278
+ return { success: false, error: 'ReasoningBank not available' };
279
+ }
280
+ bank.store({
454
281
  id: patternId,
455
- name: patternName,
456
- type: input.type || 'general',
282
+ type: patternType,
457
283
  embedding,
284
+ content: patternName,
285
+ confidence: 0.8,
458
286
  metadata: input.data || {},
459
- createdAt: new Date().toISOString(),
460
- usageCount: 0,
461
- };
462
- store.patterns[patternId] = pattern;
463
- saveNeuralStore(store);
287
+ });
288
+ flushPatterns();
464
289
  return {
465
290
  success: true,
466
- _realEmbedding: !!realEmbeddings,
291
+ _realEmbedding: lastEmbeddingModel !== 'hash-fallback',
467
292
  patternId,
468
- name: pattern.name,
469
- type: pattern.type,
293
+ name: patternName,
294
+ type: patternType,
470
295
  embeddingDims: embedding.length,
471
- createdAt: pattern.createdAt,
296
+ createdAt: new Date().toISOString(),
472
297
  };
473
298
  }
474
299
  if (action === 'search') {
475
- // Cap query length to prevent DoS in generateEmbedding (hash path is O(n))
476
- const MAX_SEARCH_QUERY_LENGTH = 16 * 1024; // 16 KB — matches neural_predict cap
477
300
  const rawQuery = input.query;
478
301
  const query = typeof rawQuery === 'string' && rawQuery.length > MAX_SEARCH_QUERY_LENGTH
479
302
  ? rawQuery.slice(0, MAX_SEARCH_QUERY_LENGTH)
480
303
  : rawQuery;
481
- // Generate query embedding for real similarity search
482
- const queryEmbedding = await generateEmbedding(query, 384);
483
- // Calculate REAL cosine similarity against stored patterns
484
- const results = Object.values(store.patterns)
485
- .map(p => ({
486
- ...p,
487
- similarity: cosineSimilarity(queryEmbedding, p.embedding),
488
- }))
489
- .sort((a, b) => b.similarity - a.similarity)
490
- .slice(0, 10);
491
- // Increment usageCount so prune can track retrieval frequency
492
- for (const r of results) {
493
- if (Object.hasOwn(store.patterns, r.id)) {
494
- store.patterns[r.id].usageCount = (store.patterns[r.id].usageCount || 0) + 1;
495
- }
496
- }
497
- saveNeuralStore(store);
304
+ const results = await findSimilarPatterns(query || '', {
305
+ k: 10,
306
+ threshold: 0.1,
307
+ });
498
308
  return {
499
309
  _realSimilarity: true,
500
- _realEmbedding: !!realEmbeddings,
310
+ _realEmbedding: lastEmbeddingModel !== 'hash-fallback',
501
311
  query,
502
312
  results: results.map(r => ({
503
313
  id: r.id,
504
- name: r.name,
314
+ name: r.content,
505
315
  type: r.type,
506
- similarity: r.similarity,
316
+ similarity: r.similarity ?? r.confidence,
507
317
  })),
508
318
  total: results.length,
509
319
  };
510
320
  }
511
321
  if (action === 'delete') {
512
322
  const patternId = input.patternId;
513
- if (!patternId || NEURAL_RESERVED_KEYS.has(patternId)) {
323
+ if (!patternId || RESERVED_KEYS.has(patternId)) {
514
324
  return { success: false, error: 'Invalid patternId' };
515
325
  }
516
- if (!Object.hasOwn(store.patterns, patternId)) {
326
+ const deleted = await deletePattern(patternId);
327
+ if (!deleted) {
517
328
  return { success: false, error: 'Pattern not found' };
518
329
  }
519
- delete store.patterns[patternId];
520
- saveNeuralStore(store);
521
330
  return { success: true, deleted: patternId };
522
331
  }
523
332
  return { success: false, error: 'Unknown action' };
@@ -525,7 +334,7 @@ export const neuralTools = [
525
334
  },
526
335
  {
527
336
  name: 'neural_compress',
528
- description: 'Compress neural model or embeddings',
337
+ description: 'Compress pattern store (quantize, prune, or deduplicate)',
529
338
  category: 'neural',
530
339
  inputSchema: {
531
340
  type: 'object',
@@ -536,97 +345,39 @@ export const neuralTools = [
536
345
  },
537
346
  },
538
347
  handler: async (input) => {
539
- const store = loadNeuralStore();
540
348
  const method = input.method || 'quantize';
541
- const targetReduction = input.targetSize || 0.5;
542
- const patterns = Object.values(store.patterns);
349
+ const { initializeIntelligence, compactPatterns, getAllPatterns } = await import('../memory/intelligence.js');
350
+ await initializeIntelligence();
351
+ const patterns = await getAllPatterns();
543
352
  if (patterns.length === 0) {
544
353
  return { success: false, error: 'No patterns to compress. Train patterns first with neural_train.' };
545
354
  }
546
355
  const beforeCount = patterns.length;
547
- const beforeSize = patterns.reduce((s, p) => s + (p.embedding?.length || 0) * 4, 0); // Float32 = 4 bytes
548
- if (method === 'quantize') {
549
- try {
550
- const { quantizeInt8, getQuantizationStats } = await import('../memory/memory-initializer.js');
551
- let totalCompressed = 0;
552
- for (const pattern of patterns) {
553
- if (pattern.embedding && pattern.embedding.length > 0) {
554
- const stats = getQuantizationStats(pattern.embedding);
555
- const quantized = quantizeInt8(pattern.embedding);
556
- // Store quantized metadata (keep original embedding for search)
557
- pattern._quantized = {
558
- scale: quantized.scale,
559
- zeroPoint: quantized.zeroPoint,
560
- compressionRatio: stats.compressionRatio,
561
- };
562
- totalCompressed++;
563
- }
564
- }
565
- saveNeuralStore(store);
566
- return {
567
- success: true, _real: true, method,
568
- patternsCompressed: totalCompressed,
569
- note: 'Quantization metadata stored; original embeddings retained for search accuracy.',
570
- };
571
- }
572
- catch {
573
- return { success: false, error: 'Quantization requires memory-initializer. Run `memory init` first.' };
574
- }
575
- }
576
- if (method === 'prune') {
577
- // Prune the least-used fraction of patterns. targetReduction (0-1) is a percentile:
578
- // 0.5 removes the bottom 50% by usageCount, 0.8 removes the bottom 80%, etc.
579
- const counts = Object.values(store.patterns)
580
- .map(p => p.usageCount || 0)
581
- .sort((a, b) => a - b);
582
- const cutoffIdx = Math.floor(targetReduction * counts.length);
583
- const threshold = counts[cutoffIdx] ?? 0;
584
- const toRemove = [];
585
- for (const [id, pattern] of Object.entries(store.patterns)) {
586
- if ((pattern.usageCount || 0) < threshold)
587
- toRemove.push(id);
588
- }
589
- for (const id of toRemove)
590
- delete store.patterns[id];
591
- saveNeuralStore(store);
356
+ if (method === 'quantize' || method === 'distill') {
357
+ // Both quantize and distill map to compactPatterns (dedup by cosine similarity)
358
+ const threshold = method === 'quantize' ? 0.99 : 0.95;
359
+ const result = await compactPatterns(threshold);
592
360
  return {
593
361
  success: true, _real: true, method,
594
- threshold,
595
- patternsRemoved: toRemove.length,
596
- patternsBefore: beforeCount,
597
- patternsAfter: Object.keys(store.patterns).length,
362
+ patternsBefore: result.before,
363
+ patternsAfter: result.after,
364
+ patternsRemoved: result.removed,
365
+ note: method === 'quantize'
366
+ ? 'Near-duplicate patterns removed (cosine > 0.99).'
367
+ : `Similar patterns merged (cosine > ${threshold}).`,
598
368
  };
599
369
  }
600
- if (method === 'distill') {
601
- // Merge similar patterns by cosine similarity > 0.95
602
- const patternList = Object.entries(store.patterns);
603
- const merged = [];
604
- for (let i = 0; i < patternList.length; i++) {
605
- const [idA, a] = patternList[i];
606
- if (merged.includes(idA))
607
- continue;
608
- for (let j = i + 1; j < patternList.length; j++) {
609
- const [idB, b] = patternList[j];
610
- if (!a.embedding || !b.embedding || merged.includes(idB))
611
- continue;
612
- const sim = cosineSimilarity(a.embedding, b.embedding);
613
- if (sim > 0.95) {
614
- // Merge: average embeddings, keep higher usage count
615
- for (let k = 0; k < a.embedding.length; k++) {
616
- a.embedding[k] = (a.embedding[k] + (b.embedding[k] || 0)) / 2;
617
- }
618
- a.usageCount = Math.max(a.usageCount || 0, b.usageCount || 0);
619
- delete store.patterns[idB];
620
- merged.push(idB);
621
- }
622
- }
623
- }
624
- saveNeuralStore(store);
370
+ if (method === 'prune') {
371
+ // Prune maps to compactPatterns with a looser threshold
372
+ const targetReduction = input.targetSize || 0.5;
373
+ // Use a threshold proportional to target reduction (lower = more aggressive)
374
+ const threshold = 0.7 + (1 - targetReduction) * 0.25;
375
+ const result = await compactPatterns(threshold);
625
376
  return {
626
377
  success: true, _real: true, method,
627
- patternsMerged: merged.length,
628
- patternsBefore: beforeCount,
629
- patternsAfter: Object.keys(store.patterns).length,
378
+ patternsBefore: result.before,
379
+ patternsAfter: result.after,
380
+ patternsRemoved: result.removed,
630
381
  };
631
382
  }
632
383
  return { success: false, error: `Unknown method: ${method}. Use quantize, prune, or distill.` };
@@ -634,7 +385,7 @@ export const neuralTools = [
634
385
  },
635
386
  {
636
387
  name: 'neural_status',
637
- description: 'Get neural system status',
388
+ description: 'Get pattern store status (pattern count, embedding dimensions, store health)',
638
389
  category: 'neural',
639
390
  inputSchema: {
640
391
  type: 'object',
@@ -644,55 +395,55 @@ export const neuralTools = [
644
395
  },
645
396
  },
646
397
  handler: async (input) => {
647
- const store = loadNeuralStore();
398
+ const { initializeIntelligence, getIntelligenceStats, getAllPatterns } = await import('../memory/intelligence.js');
399
+ await initializeIntelligence();
400
+ const stats = getIntelligenceStats();
401
+ const patterns = await getAllPatterns();
648
402
  if (input.modelId) {
649
- const MAX_MODEL_ID_LEN_STATUS = 256;
650
- const rawModelIdStatus = input.modelId;
651
- const modelId = typeof rawModelIdStatus === 'string' && rawModelIdStatus.length > MAX_MODEL_ID_LEN_STATUS
652
- ? rawModelIdStatus.slice(0, MAX_MODEL_ID_LEN_STATUS)
653
- : rawModelIdStatus;
654
- if (NEURAL_RESERVED_KEYS.has(modelId)) {
403
+ const modelId = sanitizeModelId(input.modelId);
404
+ if (modelId === null) {
655
405
  return { success: false, error: 'Invalid modelId' };
656
406
  }
657
- const model = Object.hasOwn(store.models, modelId) ? store.models[modelId] : undefined;
658
- if (!model) {
659
- return { success: false, error: 'Model not found' };
660
- }
661
- return { success: true, model };
407
+ // Filter patterns belonging to this model (by metadata or id prefix)
408
+ const modelPatterns = patterns.filter(p => p.id.startsWith(modelId) ||
409
+ (p.metadata?.modelId === modelId));
410
+ return {
411
+ success: true,
412
+ model: {
413
+ id: modelId,
414
+ patternsStored: modelPatterns.length,
415
+ status: modelPatterns.length > 0 ? 'ready' : 'empty',
416
+ },
417
+ };
418
+ }
419
+ const byType = {};
420
+ for (const p of patterns) {
421
+ byType[p.type] = (byType[p.type] || 0) + 1;
662
422
  }
663
- const models = Object.values(store.models);
664
- const patterns = Object.values(store.patterns);
665
423
  return {
666
- _realEmbeddings: !!realEmbeddings,
667
- embeddingProvider: realEmbeddings ? embeddingServiceName : 'hash-based (deterministic)',
424
+ embeddingProvider: lastEmbeddingModel === 'unknown' ? 'not yet used' : lastEmbeddingModel,
425
+ sonaEnabled: stats.sonaEnabled,
668
426
  models: {
669
- total: models.length,
670
- ready: models.filter(m => m.status === 'ready').length,
671
- training: models.filter(m => m.status === 'training').length,
672
- avgAccuracy: models.length > 0
673
- ? models.reduce((sum, m) => sum + m.accuracy, 0) / models.length
674
- : 0,
427
+ total: 0, // models concept removed; patterns are stored directly
428
+ ready: 0,
429
+ indexing: 0,
675
430
  },
676
431
  patterns: {
677
432
  total: patterns.length,
678
- byType: patterns.reduce((acc, p) => {
679
- acc[p.type] = (acc[p.type] || 0) + 1;
680
- return acc;
681
- }, {}),
682
- totalEmbeddingDims: patterns.length > 0 ? patterns[0].embedding.length : 384,
433
+ byType,
434
+ embeddingDims: patterns.length > 0 && patterns[0].embedding ? patterns[0].embedding.length : 384,
683
435
  },
684
- features: {
685
- hnsw: true,
686
- quantization: true,
687
- flashAttention: false,
688
- reasoningBank: true,
436
+ intelligence: {
437
+ reasoningBankSize: stats.reasoningBankSize,
438
+ patternsLearned: stats.patternsLearned,
439
+ trajectoriesRecorded: stats.trajectoriesRecorded,
689
440
  },
690
441
  };
691
442
  },
692
443
  },
693
444
  {
694
445
  name: 'neural_optimize',
695
- description: 'Optimize neural model performance',
446
+ description: 'Optimize pattern store (deduplicate, quantize, prune empty)',
696
447
  category: 'neural',
697
448
  inputSchema: {
698
449
  type: 'object',
@@ -702,9 +453,10 @@ export const neuralTools = [
702
453
  },
703
454
  },
704
455
  handler: async (input) => {
705
- const store = loadNeuralStore();
706
456
  const target = input.target || 'balanced';
707
- const patterns = Object.values(store.patterns);
457
+ const { initializeIntelligence, compactPatterns, getAllPatterns } = await import('../memory/intelligence.js');
458
+ await initializeIntelligence();
459
+ const patterns = await getAllPatterns();
708
460
  if (patterns.length === 0) {
709
461
  return { success: false, error: 'No patterns to optimize. Train patterns first with neural_train.' };
710
462
  }
@@ -712,81 +464,39 @@ export const neuralTools = [
712
464
  const actions = [];
713
465
  const beforeCount = patterns.length;
714
466
  const dims = patterns[0]?.embedding?.length || 0;
715
- let patternsRemoved = 0;
716
- let patternsQuantized = 0;
717
- let duplicatesRemoved = 0;
718
- // speed / balanced: deduplicate identical or near-identical patterns
719
- if (target === 'speed' || target === 'balanced') {
720
- const seen = new Map(); // hash -> id
721
- for (const [id, p] of Object.entries(store.patterns)) {
722
- if (!p.embedding || p.embedding.length === 0)
723
- continue;
724
- // Quick hash: first 8 dims rounded
725
- const hash = p.embedding.slice(0, 8).map(v => v.toFixed(4)).join(',');
726
- if (seen.has(hash)) {
727
- // Verify with full cosine similarity
728
- const existingId = seen.get(hash);
729
- const existing = store.patterns[existingId];
730
- if (existing && cosineSimilarity(p.embedding, existing.embedding) > 0.99) {
731
- existing.usageCount = Math.max(existing.usageCount || 0, p.usageCount || 0);
732
- delete store.patterns[id];
733
- duplicatesRemoved++;
734
- }
735
- }
736
- else {
737
- seen.set(hash, id);
738
- }
739
- }
740
- if (duplicatesRemoved > 0)
741
- actions.push(`Removed ${duplicatesRemoved} near-duplicate patterns`);
467
+ // All optimization targets delegate to compactPatterns with varying thresholds
468
+ let threshold;
469
+ switch (target) {
470
+ case 'speed':
471
+ threshold = 0.99; // only near-exact duplicates
472
+ break;
473
+ case 'memory':
474
+ threshold = 0.90; // aggressive dedup
475
+ break;
476
+ case 'accuracy':
477
+ threshold = 0.98; // conservative
478
+ break;
479
+ case 'balanced':
480
+ default:
481
+ threshold = 0.95;
482
+ break;
742
483
  }
743
- // memory / balanced: quantize large embeddings
744
- if (target === 'memory' || target === 'balanced') {
745
- try {
746
- const { quantizeInt8, getQuantizationStats } = await import('../memory/memory-initializer.js');
747
- for (const p of Object.values(store.patterns)) {
748
- if (p.embedding && p.embedding.length > 0 && !p._quantized) {
749
- const stats = getQuantizationStats(p.embedding);
750
- const q = quantizeInt8(p.embedding);
751
- p._quantized = { scale: q.scale, zeroPoint: q.zeroPoint, compressionRatio: stats.compressionRatio };
752
- patternsQuantized++;
753
- }
754
- }
755
- if (patternsQuantized > 0)
756
- actions.push(`Quantized ${patternsQuantized} pattern embeddings (Int8, ~3.92x)`);
757
- }
758
- catch {
759
- actions.push('Quantization skipped (memory-initializer not available)');
760
- }
484
+ const result = await compactPatterns(threshold);
485
+ if (result.removed > 0) {
486
+ actions.push(`Removed ${result.removed} similar patterns (cosine > ${threshold})`);
761
487
  }
762
- // accuracy / balanced: prune low-usage, zero-embedding patterns
763
- if (target === 'accuracy' || target === 'balanced') {
764
- for (const [id, p] of Object.entries(store.patterns)) {
765
- if (!p.embedding || p.embedding.length === 0) {
766
- delete store.patterns[id];
767
- patternsRemoved++;
768
- continue;
769
- }
770
- // Remove patterns with all-zero embeddings (no useful signal)
771
- const norm = p.embedding.reduce((s, v) => s + v * v, 0);
772
- if (norm < 1e-10) {
773
- delete store.patterns[id];
774
- patternsRemoved++;
775
- }
776
- }
777
- if (patternsRemoved > 0)
778
- actions.push(`Pruned ${patternsRemoved} empty/zero-signal patterns`);
488
+ else {
489
+ actions.push('No duplicate patterns found');
779
490
  }
780
- saveNeuralStore(store);
781
491
  const elapsed = Math.round(performance.now() - startTime);
782
492
  return {
783
493
  success: true, _real: true, target,
784
494
  actions,
785
- patternsBefore: beforeCount,
786
- patternsAfter: Object.keys(store.patterns).length,
787
- duplicatesRemoved,
788
- patternsQuantized,
789
- patternsRemoved,
495
+ patternsBefore: result.before,
496
+ patternsAfter: result.after,
497
+ duplicatesRemoved: result.removed,
498
+ patternsQuantized: 0,
499
+ patternsRemoved: result.removed,
790
500
  embeddingDims: dims,
791
501
  elapsedMs: elapsed,
792
502
  };