@monoes/monomindcli 1.10.47 → 1.10.55

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 (573) hide show
  1. package/.claude/agents/optimization/benchmark-suite.md +2 -0
  2. package/.claude/agents/optimization/load-balancer.md +2 -0
  3. package/.claude/agents/optimization/performance-monitor.md +2 -0
  4. package/.claude/agents/optimization/resource-allocator.md +3 -1
  5. package/.claude/agents/optimization/topology-optimizer.md +2 -0
  6. package/.claude/commands/mastermind/_repeat.md +21 -0
  7. package/.claude/commands/mastermind/_taskfile.md +235 -0
  8. package/.claude/commands/mastermind/adr.md +11 -0
  9. package/.claude/commands/mastermind/approve.md +94 -0
  10. package/.claude/commands/mastermind/autodev.md +32 -0
  11. package/.claude/commands/mastermind/budget.md +7 -0
  12. package/.claude/commands/mastermind/code-review.md +317 -0
  13. package/.claude/commands/mastermind/createorg.md +40 -1
  14. package/.claude/commands/mastermind/createtask.md +383 -0
  15. package/.claude/commands/mastermind/debug.md +22 -0
  16. package/.claude/commands/mastermind/design.md +20 -0
  17. package/.claude/commands/mastermind/do.md +526 -0
  18. package/.claude/commands/mastermind/execute.md +20 -0
  19. package/.claude/commands/mastermind/finish.md +20 -0
  20. package/.claude/commands/mastermind/graph-status.md +7 -0
  21. package/.claude/commands/mastermind/help.md +118 -0
  22. package/.claude/commands/mastermind/ideate.md +261 -0
  23. package/.claude/commands/mastermind/improve.md +345 -0
  24. package/.claude/commands/mastermind/loops.md +7 -0
  25. package/.claude/commands/mastermind/master.md +186 -6
  26. package/.claude/commands/mastermind/memory.md +230 -0
  27. package/.claude/commands/mastermind/plan.md +26 -0
  28. package/.claude/commands/mastermind/receive-review.md +20 -0
  29. package/.claude/commands/mastermind/repeat.md +257 -0
  30. package/.claude/commands/mastermind/runorg.md +3 -0
  31. package/.claude/commands/mastermind/skill-builder.md +20 -0
  32. package/.claude/commands/mastermind/specialagents.md +125 -0
  33. package/.claude/commands/mastermind/swarm.md +161 -0
  34. package/.claude/commands/mastermind/taskdev.md +26 -0
  35. package/.claude/commands/mastermind/tdd.md +22 -0
  36. package/.claude/commands/mastermind/techport.md +4 -0
  37. package/.claude/commands/mastermind/understand.md +139 -0
  38. package/.claude/commands/mastermind/verify.md +22 -0
  39. package/.claude/commands/mastermind/worktree.md +20 -0
  40. package/.claude/commands/monomind/do.md +52 -0
  41. package/.claude/commands/monomind/improve.md +2 -0
  42. package/.claude/helpers/handlers/graph-status-handler.cjs +2 -1
  43. package/.claude/helpers/handlers/route-handler.cjs +61 -11
  44. package/.claude/helpers/hook-handler.cjs +19 -0
  45. package/.claude/helpers/skill-registry.json +122 -51
  46. package/.claude/helpers/statusline.cjs +1 -1
  47. package/.claude/skills/agent-browser-testing/SKILL.md +522 -152
  48. package/.claude/skills/github-issue-triage/SKILL.md +354 -0
  49. package/.claude/skills/github-repo-recap/SKILL.md +207 -0
  50. package/.claude/skills/mastermind/_delegation.md +83 -0
  51. package/.claude/skills/mastermind/_protocol.md +14 -0
  52. package/.claude/skills/mastermind/approve.md +15 -7
  53. package/.claude/skills/mastermind/autodev.md +534 -0
  54. package/.claude/skills/mastermind/createorg.md +21 -5
  55. package/.claude/skills/mastermind/debug.md +232 -0
  56. package/.claude/skills/mastermind/design.md +187 -0
  57. package/.claude/skills/mastermind/execute.md +104 -0
  58. package/.claude/skills/mastermind/finish.md +251 -0
  59. package/.claude/skills/mastermind/plan.md +180 -0
  60. package/.claude/skills/mastermind/receive-review.md +213 -0
  61. package/.claude/skills/mastermind/runorg.md +23 -8
  62. package/.claude/skills/mastermind/skill-builder.md +274 -0
  63. package/.claude/skills/mastermind/taskdev.md +307 -0
  64. package/.claude/skills/mastermind/tdd.md +394 -0
  65. package/.claude/skills/mastermind/verify.md +196 -0
  66. package/.claude/skills/mastermind/worktree.md +160 -132
  67. package/README.md +320 -253
  68. package/dist/src/commands/analyze.d.ts.map +1 -1
  69. package/dist/src/commands/analyze.js +9 -2
  70. package/dist/src/commands/analyze.js.map +1 -1
  71. package/dist/src/commands/benchmark.js.map +1 -1
  72. package/dist/src/commands/completions.js +1 -1
  73. package/dist/src/commands/guidance.js +7 -7
  74. package/dist/src/commands/hooks.d.ts.map +1 -1
  75. package/dist/src/commands/hooks.js +16 -3
  76. package/dist/src/commands/hooks.js.map +1 -1
  77. package/dist/src/commands/index.d.ts +3 -2
  78. package/dist/src/commands/index.d.ts.map +1 -1
  79. package/dist/src/commands/index.js +7 -0
  80. package/dist/src/commands/index.js.map +1 -1
  81. package/dist/src/commands/init.d.ts.map +1 -1
  82. package/dist/src/commands/init.js +47 -13
  83. package/dist/src/commands/init.js.map +1 -1
  84. package/dist/src/commands/neural.d.ts.map +1 -1
  85. package/dist/src/commands/neural.js +100 -14
  86. package/dist/src/commands/neural.js.map +1 -1
  87. package/dist/src/commands/platforms.d.ts +11 -0
  88. package/dist/src/commands/platforms.d.ts.map +1 -0
  89. package/dist/src/commands/platforms.js +195 -0
  90. package/dist/src/commands/platforms.js.map +1 -0
  91. package/dist/src/commands/ruvector/backup.js.map +1 -1
  92. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  93. package/dist/src/commands/ruvector/init.js.map +1 -1
  94. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  95. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  96. package/dist/src/commands/ruvector/status.js.map +1 -1
  97. package/dist/src/commands/update.js +6 -6
  98. package/dist/src/init/executor.d.ts.map +1 -1
  99. package/dist/src/init/executor.js +28 -0
  100. package/dist/src/init/executor.js.map +1 -1
  101. package/dist/src/init/statusline-generator.js +1 -1
  102. package/dist/src/init/types.d.ts +1 -0
  103. package/dist/src/init/types.d.ts.map +1 -1
  104. package/dist/src/mcp-server.d.ts.map +1 -1
  105. package/dist/src/mcp-server.js +92 -0
  106. package/dist/src/mcp-server.js.map +1 -1
  107. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  108. package/dist/src/mcp-tools/hive-mind-tools.js +52 -0
  109. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  110. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  111. package/dist/src/mcp-tools/hooks-tools.js +106 -5
  112. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  113. package/dist/src/mcp-tools/index.d.ts +0 -5
  114. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  115. package/dist/src/mcp-tools/index.js +0 -5
  116. package/dist/src/mcp-tools/index.js.map +1 -1
  117. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  118. package/dist/src/mcp-tools/monograph-tools.js +507 -5587
  119. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  120. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  121. package/dist/src/mcp-tools/neural-tools.js +64 -4
  122. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  123. package/dist/src/mcp-tools/security-tools.js +4 -4
  124. package/dist/src/memory/intelligence.d.ts +2 -2
  125. package/dist/src/memory/intelligence.d.ts.map +1 -1
  126. package/dist/src/memory/intelligence.js +108 -3
  127. package/dist/src/memory/intelligence.js.map +1 -1
  128. package/dist/src/memory/memory-bridge.js +1 -1
  129. package/dist/src/memory/memory-bridge.js.map +1 -1
  130. package/dist/src/memory/sona-optimizer.d.ts +1 -10
  131. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  132. package/dist/src/memory/sona-optimizer.js +0 -46
  133. package/dist/src/memory/sona-optimizer.js.map +1 -1
  134. package/dist/src/runtime/headless.js +3 -3
  135. package/dist/src/ruvector/diff-classifier.d.ts +0 -2
  136. package/dist/src/ruvector/diff-classifier.d.ts.map +1 -1
  137. package/dist/src/ruvector/diff-classifier.js +2 -14
  138. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  139. package/dist/src/ruvector/index.d.ts +26 -9
  140. package/dist/src/ruvector/index.d.ts.map +1 -1
  141. package/dist/src/ruvector/index.js +3 -21
  142. package/dist/src/ruvector/index.js.map +1 -1
  143. package/dist/src/ruvector/ruvllm-wasm.js +2 -2
  144. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
  145. package/dist/src/types.d.ts +0 -15
  146. package/dist/src/types.d.ts.map +1 -1
  147. package/dist/src/types.js +0 -18
  148. package/dist/src/types.js.map +1 -1
  149. package/dist/src/ui/dashboard.html +8763 -9765
  150. package/dist/src/ui/data/agent-avatars.html +763 -0
  151. package/dist/src/ui/data/agent-avatars.json +966 -0
  152. package/dist/src/ui/data/avatars/account-strategist.svg +58 -0
  153. package/dist/src/ui/data/avatars/accounts-payable.svg +54 -0
  154. package/dist/src/ui/data/avatars/adaptive-coordinator.svg +55 -0
  155. package/dist/src/ui/data/avatars/adaptive-coordinator2.svg +54 -0
  156. package/dist/src/ui/data/avatars/ai-citation.svg +57 -0
  157. package/dist/src/ui/data/avatars/ai-engineer.svg +61 -0
  158. package/dist/src/ui/data/avatars/analytics-reporter.svg +53 -0
  159. package/dist/src/ui/data/avatars/api-tester.svg +53 -0
  160. package/dist/src/ui/data/avatars/architecture.svg +54 -0
  161. package/dist/src/ui/data/avatars/automation-governance.svg +55 -0
  162. package/dist/src/ui/data/avatars/backend-dev.svg +53 -0
  163. package/dist/src/ui/data/avatars/benchmarker.svg +54 -0
  164. package/dist/src/ui/data/avatars/blockchain-auditor.svg +53 -0
  165. package/dist/src/ui/data/avatars/byzantine-coord.svg +57 -0
  166. package/dist/src/ui/data/avatars/case-analyst.svg +57 -0
  167. package/dist/src/ui/data/avatars/cicd-engineer.svg +55 -0
  168. package/dist/src/ui/data/avatars/cloud-architect.svg +54 -0
  169. package/dist/src/ui/data/avatars/code-review-swarm.svg +57 -0
  170. package/dist/src/ui/data/avatars/coder-v119.svg +57 -0
  171. package/dist/src/ui/data/avatars/coder.svg +58 -0
  172. package/dist/src/ui/data/avatars/collective-coord.svg +54 -0
  173. package/dist/src/ui/data/avatars/compliance-auditor.svg +58 -0
  174. package/dist/src/ui/data/avatars/consensus-coordinator.svg +54 -0
  175. package/dist/src/ui/data/avatars/content-creator.svg +54 -0
  176. package/dist/src/ui/data/avatars/crdt-synchronizer.svg +53 -0
  177. package/dist/src/ui/data/avatars/cro-specialist.svg +58 -0
  178. package/dist/src/ui/data/avatars/data-consolidator.svg +54 -0
  179. package/dist/src/ui/data/avatars/data-engineer.svg +53 -0
  180. package/dist/src/ui/data/avatars/database-optimizer.svg +61 -0
  181. package/dist/src/ui/data/avatars/deal-strategist.svg +54 -0
  182. package/dist/src/ui/data/avatars/defender.svg +53 -0
  183. package/dist/src/ui/data/avatars/devops-automator.svg +56 -0
  184. package/dist/src/ui/data/avatars/discovery-coach.svg +54 -0
  185. package/dist/src/ui/data/avatars/email-marketing.svg +57 -0
  186. package/dist/src/ui/data/avatars/embedded-firmware.svg +61 -0
  187. package/dist/src/ui/data/avatars/evidence-collector.svg +57 -0
  188. package/dist/src/ui/data/avatars/experiment-tracker.svg +53 -0
  189. package/dist/src/ui/data/avatars/feedback-synthesizer.svg +54 -0
  190. package/dist/src/ui/data/avatars/finance-tracker.svg +54 -0
  191. package/dist/src/ui/data/avatars/frontend-developer.svg +54 -0
  192. package/dist/src/ui/data/avatars/game-audio-engineer.svg +59 -0
  193. package/dist/src/ui/data/avatars/game-designer.svg +54 -0
  194. package/dist/src/ui/data/avatars/gossip-coordinator.svg +54 -0
  195. package/dist/src/ui/data/avatars/hierarchical-coord.svg +54 -0
  196. package/dist/src/ui/data/avatars/incident-commander.svg +57 -0
  197. package/dist/src/ui/data/avatars/infrastructure.svg +54 -0
  198. package/dist/src/ui/data/avatars/input-validator.svg +53 -0
  199. package/dist/src/ui/data/avatars/ios-developer.svg +54 -0
  200. package/dist/src/ui/data/avatars/issue-tracker.svg +53 -0
  201. package/dist/src/ui/data/avatars/judge.svg +55 -0
  202. package/dist/src/ui/data/avatars/launch-strategist.svg +54 -0
  203. package/dist/src/ui/data/avatars/legal-compliance.svg +53 -0
  204. package/dist/src/ui/data/avatars/level-designer.svg +53 -0
  205. package/dist/src/ui/data/avatars/load-balancer.svg +57 -0
  206. package/dist/src/ui/data/avatars/mcp-builder.svg +53 -0
  207. package/dist/src/ui/data/avatars/memory-coordinator.svg +55 -0
  208. package/dist/src/ui/data/avatars/mesh-coordinator.svg +55 -0
  209. package/dist/src/ui/data/avatars/ml-developer.svg +58 -0
  210. package/dist/src/ui/data/avatars/mobile-app-builder.svg +53 -0
  211. package/dist/src/ui/data/avatars/mobile-dev.svg +54 -0
  212. package/dist/src/ui/data/avatars/model-qa.svg +58 -0
  213. package/dist/src/ui/data/avatars/narrative-designer.svg +58 -0
  214. package/dist/src/ui/data/avatars/outbound-strategist.svg +55 -0
  215. package/dist/src/ui/data/avatars/path-validator.svg +54 -0
  216. package/dist/src/ui/data/avatars/payment-agent.svg +53 -0
  217. package/dist/src/ui/data/avatars/perf-analyzer.svg +58 -0
  218. package/dist/src/ui/data/avatars/pipeline-analyst.svg +54 -0
  219. package/dist/src/ui/data/avatars/planner.svg +55 -0
  220. package/dist/src/ui/data/avatars/pr-manager.svg +54 -0
  221. package/dist/src/ui/data/avatars/pricing-strategist.svg +54 -0
  222. package/dist/src/ui/data/avatars/product-manager.svg +54 -0
  223. package/dist/src/ui/data/avatars/production-validator.svg +54 -0
  224. package/dist/src/ui/data/avatars/project-shepherd.svg +54 -0
  225. package/dist/src/ui/data/avatars/proposal-strategist.svg +54 -0
  226. package/dist/src/ui/data/avatars/prosecutor.svg +57 -0
  227. package/dist/src/ui/data/avatars/pseudocode.svg +53 -0
  228. package/dist/src/ui/data/avatars/queen-coordinator.svg +55 -0
  229. package/dist/src/ui/data/avatars/quorum-manager.svg +53 -0
  230. package/dist/src/ui/data/avatars/raft-manager.svg +53 -0
  231. package/dist/src/ui/data/avatars/reality-checker.svg +58 -0
  232. package/dist/src/ui/data/avatars/recruitment.svg +58 -0
  233. package/dist/src/ui/data/avatars/refinement.svg +53 -0
  234. package/dist/src/ui/data/avatars/release-manager.svg +54 -0
  235. package/dist/src/ui/data/avatars/repo-architect.svg +54 -0
  236. package/dist/src/ui/data/avatars/researcher.svg +58 -0
  237. package/dist/src/ui/data/avatars/resource-allocator.svg +53 -0
  238. package/dist/src/ui/data/avatars/reviewer.svg +53 -0
  239. package/dist/src/ui/data/avatars/safe-executor.svg +53 -0
  240. package/dist/src/ui/data/avatars/sales-coach.svg +53 -0
  241. package/dist/src/ui/data/avatars/sales-engineer.svg +58 -0
  242. package/dist/src/ui/data/avatars/scout-explorer.svg +58 -0
  243. package/dist/src/ui/data/avatars/security-architect.svg +54 -0
  244. package/dist/src/ui/data/avatars/security-auditor.svg +55 -0
  245. package/dist/src/ui/data/avatars/senior-developer.svg +58 -0
  246. package/dist/src/ui/data/avatars/senior-pm.svg +58 -0
  247. package/dist/src/ui/data/avatars/seo-specialist.svg +57 -0
  248. package/dist/src/ui/data/avatars/social-media.svg +54 -0
  249. package/dist/src/ui/data/avatars/solidity-engineer.svg +58 -0
  250. package/dist/src/ui/data/avatars/sparc-coder.svg +58 -0
  251. package/dist/src/ui/data/avatars/sparc-coord.svg +56 -0
  252. package/dist/src/ui/data/avatars/specification.svg +57 -0
  253. package/dist/src/ui/data/avatars/sprint-prioritizer.svg +53 -0
  254. package/dist/src/ui/data/avatars/sre.svg +54 -0
  255. package/dist/src/ui/data/avatars/studio-operations.svg +53 -0
  256. package/dist/src/ui/data/avatars/studio-producer.svg +55 -0
  257. package/dist/src/ui/data/avatars/support-responder.svg +56 -0
  258. package/dist/src/ui/data/avatars/system-architect.svg +54 -0
  259. package/dist/src/ui/data/avatars/task-orchestrator.svg +56 -0
  260. package/dist/src/ui/data/avatars/technical-artist.svg +53 -0
  261. package/dist/src/ui/data/avatars/technical-writer.svg +59 -0
  262. package/dist/src/ui/data/avatars/tester.svg +53 -0
  263. package/dist/src/ui/data/avatars/threat-detection.svg +61 -0
  264. package/dist/src/ui/data/avatars/trend-researcher.svg +54 -0
  265. package/dist/src/ui/data/avatars/trial-director.svg +55 -0
  266. package/dist/src/ui/data/avatars/unity-architect.svg +54 -0
  267. package/dist/src/ui/data/avatars/visionos-engineer.svg +57 -0
  268. package/dist/src/ui/data/avatars/worker-specialist.svg +55 -0
  269. package/dist/src/ui/data/avatars/workflow-architect.svg +57 -0
  270. package/dist/src/ui/data/avatars/workflow-automation.svg +54 -0
  271. package/dist/src/ui/data/avatars/zk-steward.svg +54 -0
  272. package/dist/src/ui/data/known-projects.json +1 -1
  273. package/dist/src/ui/data/mastermind-events.jsonl +28 -0
  274. package/dist/src/ui/orgs.html +1171 -0
  275. package/dist/src/ui/server.mjs +529 -43
  276. package/dist/src/update/index.js +1 -1
  277. package/dist/src/update/validator.js +8 -8
  278. package/dist/tsconfig.tsbuildinfo +1 -1
  279. package/package.json +2 -2
  280. package/.claude/agents/academic/academic-anthropologist.md +0 -126
  281. package/.claude/agents/academic/academic-geographer.md +0 -128
  282. package/.claude/agents/academic/academic-historian.md +0 -124
  283. package/.claude/agents/academic/academic-narratologist.md +0 -119
  284. package/.claude/agents/academic/academic-psychologist.md +0 -119
  285. package/.claude/agents/analysis/analyze-code-quality.md +0 -58
  286. package/.claude/agents/analysis/code-analyzer.md +0 -189
  287. package/.claude/agents/analysis/code-review/analyze-code-quality.md +0 -58
  288. package/.claude/agents/consensus/performance-benchmarker.md +0 -831
  289. package/.claude/agents/data/ml/data-ml-model.md +0 -76
  290. package/.claude/agents/development/dev-backend-api.md +0 -178
  291. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -52
  292. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -63
  293. package/.claude/agents/game-development/blender/blender-addon-engineer.md +0 -235
  294. package/.claude/agents/game-development/game-audio-engineer.md +0 -265
  295. package/.claude/agents/game-development/game-designer.md +0 -168
  296. package/.claude/agents/game-development/godot/godot-gameplay-scripter.md +0 -335
  297. package/.claude/agents/game-development/godot/godot-multiplayer-engineer.md +0 -298
  298. package/.claude/agents/game-development/godot/godot-shader-developer.md +0 -267
  299. package/.claude/agents/game-development/level-designer.md +0 -209
  300. package/.claude/agents/game-development/narrative-designer.md +0 -244
  301. package/.claude/agents/game-development/roblox-studio/roblox-avatar-creator.md +0 -298
  302. package/.claude/agents/game-development/roblox-studio/roblox-experience-designer.md +0 -306
  303. package/.claude/agents/game-development/roblox-studio/roblox-systems-scripter.md +0 -326
  304. package/.claude/agents/game-development/technical-artist.md +0 -230
  305. package/.claude/agents/game-development/unity/unity-architect.md +0 -272
  306. package/.claude/agents/game-development/unity/unity-editor-tool-developer.md +0 -311
  307. package/.claude/agents/game-development/unity/unity-multiplayer-engineer.md +0 -322
  308. package/.claude/agents/game-development/unity/unity-shader-graph-artist.md +0 -270
  309. package/.claude/agents/game-development/unreal-engine/unreal-multiplayer-architect.md +0 -314
  310. package/.claude/agents/game-development/unreal-engine/unreal-systems-engineer.md +0 -311
  311. package/.claude/agents/game-development/unreal-engine/unreal-technical-artist.md +0 -257
  312. package/.claude/agents/game-development/unreal-engine/unreal-world-builder.md +0 -274
  313. package/.claude/agents/github/release-swarm.md +0 -597
  314. package/.claude/agents/goal/agent.md +0 -804
  315. package/.claude/agents/goal/code-goal-planner.md +0 -445
  316. package/.claude/agents/marketing/marketing-ai-citation-strategist.md +0 -171
  317. package/.claude/agents/marketing/marketing-app-store-optimizer.md +0 -322
  318. package/.claude/agents/marketing/marketing-baidu-seo-specialist.md +0 -227
  319. package/.claude/agents/marketing/marketing-bilibili-content-strategist.md +0 -200
  320. package/.claude/agents/marketing/marketing-book-co-author.md +0 -111
  321. package/.claude/agents/marketing/marketing-carousel-growth-engine.md +0 -200
  322. package/.claude/agents/marketing/marketing-china-ecommerce-operator.md +0 -284
  323. package/.claude/agents/marketing/marketing-content-creator.md +0 -67
  324. package/.claude/agents/marketing/marketing-cross-border-ecommerce.md +0 -260
  325. package/.claude/agents/marketing/marketing-douyin-strategist.md +0 -150
  326. package/.claude/agents/marketing/marketing-growth-hacker.md +0 -54
  327. package/.claude/agents/marketing/marketing-instagram-curator.md +0 -114
  328. package/.claude/agents/marketing/marketing-kuaishou-strategist.md +0 -224
  329. package/.claude/agents/marketing/marketing-linkedin-content-creator.md +0 -215
  330. package/.claude/agents/marketing/marketing-livestream-commerce-coach.md +0 -306
  331. package/.claude/agents/marketing/marketing-podcast-strategist.md +0 -278
  332. package/.claude/agents/marketing/marketing-private-domain-operator.md +0 -309
  333. package/.claude/agents/marketing/marketing-reddit-community-builder.md +0 -124
  334. package/.claude/agents/marketing/marketing-seo-specialist.md +0 -279
  335. package/.claude/agents/marketing/marketing-short-video-editing-coach.md +0 -413
  336. package/.claude/agents/marketing/marketing-social-media-strategist.md +0 -125
  337. package/.claude/agents/marketing/marketing-tiktok-strategist.md +0 -126
  338. package/.claude/agents/marketing/marketing-twitter-engager.md +0 -127
  339. package/.claude/agents/marketing/marketing-wechat-official-account.md +0 -146
  340. package/.claude/agents/marketing/marketing-weibo-strategist.md +0 -241
  341. package/.claude/agents/marketing/marketing-xiaohongshu-specialist.md +0 -139
  342. package/.claude/agents/marketing/marketing-zhihu-strategist.md +0 -163
  343. package/.claude/agents/neural/safla-neural.md +0 -74
  344. package/.claude/agents/paid-media/paid-media-auditor.md +0 -71
  345. package/.claude/agents/paid-media/paid-media-creative-strategist.md +0 -71
  346. package/.claude/agents/paid-media/paid-media-paid-social-strategist.md +0 -71
  347. package/.claude/agents/paid-media/paid-media-ppc-strategist.md +0 -71
  348. package/.claude/agents/paid-media/paid-media-programmatic-buyer.md +0 -71
  349. package/.claude/agents/paid-media/paid-media-search-query-analyst.md +0 -71
  350. package/.claude/agents/paid-media/paid-media-tracking-specialist.md +0 -71
  351. package/.claude/agents/payments/agentic-payments.md +0 -126
  352. package/.claude/agents/product/product-behavioral-nudge-engine.md +0 -81
  353. package/.claude/agents/product/product-feedback-synthesizer.md +0 -119
  354. package/.claude/agents/product/product-manager.md +0 -469
  355. package/.claude/agents/product/product-sprint-prioritizer.md +0 -154
  356. package/.claude/agents/product/product-trend-researcher.md +0 -159
  357. package/.claude/agents/project-management/project-management-experiment-tracker.md +0 -199
  358. package/.claude/agents/project-management/project-management-jira-workflow-steward.md +0 -231
  359. package/.claude/agents/project-management/project-management-project-shepherd.md +0 -195
  360. package/.claude/agents/project-management/project-management-studio-operations.md +0 -201
  361. package/.claude/agents/project-management/project-management-studio-producer.md +0 -204
  362. package/.claude/agents/project-management/project-manager-senior.md +0 -136
  363. package/.claude/agents/reasoning/agent.md +0 -804
  364. package/.claude/agents/reasoning/goal-planner.md +0 -73
  365. package/.claude/agents/sales/sales-account-strategist.md +0 -228
  366. package/.claude/agents/sales/sales-coach.md +0 -272
  367. package/.claude/agents/sales/sales-deal-strategist.md +0 -181
  368. package/.claude/agents/sales/sales-discovery-coach.md +0 -226
  369. package/.claude/agents/sales/sales-engineer.md +0 -183
  370. package/.claude/agents/sales/sales-outbound-strategist.md +0 -202
  371. package/.claude/agents/sales/sales-pipeline-analyst.md +0 -268
  372. package/.claude/agents/sales/sales-proposal-strategist.md +0 -218
  373. package/.claude/agents/sona/sona-learning-optimizer.md +0 -65
  374. package/.claude/agents/spatial-computing/macos-spatial-metal-engineer.md +0 -338
  375. package/.claude/agents/spatial-computing/terminal-integration-specialist.md +0 -71
  376. package/.claude/agents/spatial-computing/visionos-spatial-engineer.md +0 -55
  377. package/.claude/agents/specialists/memory-specialist.md +0 -298
  378. package/.claude/agents/specialists/performance-engineer.md +0 -387
  379. package/.claude/agents/specialists/queen-coordinator.md +0 -67
  380. package/.claude/agents/specialists/security-architect.md +0 -154
  381. package/.claude/agents/specialized/accounts-payable-agent.md +0 -186
  382. package/.claude/agents/specialized/corporate-training-designer.md +0 -193
  383. package/.claude/agents/specialized/data-consolidation-agent.md +0 -61
  384. package/.claude/agents/specialized/government-digital-presales-consultant.md +0 -364
  385. package/.claude/agents/specialized/healthcare-marketing-compliance.md +0 -396
  386. package/.claude/agents/specialized/recruitment-specialist.md +0 -510
  387. package/.claude/agents/specialized/report-distribution-agent.md +0 -66
  388. package/.claude/agents/specialized/sales-data-extraction-agent.md +0 -68
  389. package/.claude/agents/specialized/specialized-french-consulting-market.md +0 -193
  390. package/.claude/agents/specialized/specialized-korean-business-navigator.md +0 -217
  391. package/.claude/agents/specialized/specialized-salesforce-architect.md +0 -181
  392. package/.claude/agents/specialized/study-abroad-advisor.md +0 -283
  393. package/.claude/agents/specialized/supply-chain-strategist.md +0 -583
  394. package/.claude/agents/sublinear/consensus-coordinator.md +0 -333
  395. package/.claude/agents/sublinear/matrix-optimizer.md +0 -180
  396. package/.claude/agents/sublinear/pagerank-analyzer.md +0 -295
  397. package/.claude/agents/sublinear/performance-optimizer.md +0 -363
  398. package/.claude/agents/sublinear/trading-predictor.md +0 -242
  399. package/.claude/agents/support/support-analytics-reporter.md +0 -366
  400. package/.claude/agents/support/support-executive-summary-generator.md +0 -213
  401. package/.claude/agents/support/support-finance-tracker.md +0 -443
  402. package/.claude/agents/support/support-infrastructure-maintainer.md +0 -619
  403. package/.claude/agents/support/support-legal-compliance-checker.md +0 -589
  404. package/.claude/agents/support/support-support-responder.md +0 -586
  405. package/.claude/agents/swarm/adaptive-coordinator.md +0 -364
  406. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -318
  407. package/.claude/agents/templates/github-pr-manager.md +0 -155
  408. package/.claude/agents/templates/memory-coordinator.md +0 -163
  409. package/.claude/agents/templates/migration-plan.md +0 -724
  410. package/.claude/agents/templates/orchestrator-task.md +0 -120
  411. package/.claude/agents/templates/performance-analyzer.md +0 -179
  412. package/.claude/agents/templates/sparc-coordinator.md +0 -163
  413. package/.claude/agents/testing/testing-reality-checker.md +0 -237
  414. package/.claude/commands/analysis/token-efficiency.md +0 -42
  415. package/.claude/commands/optimization/README.md +0 -73
  416. package/.claude/commands/optimization/parallel-execution.md +0 -76
  417. package/.claude/commands/swarm/swarm-analysis.md +0 -62
  418. package/.claude/commands/swarm/swarm-background.md +0 -65
  419. package/.claude/commands/swarm/swarm-modes.md +0 -67
  420. package/.claude/commands/swarm/swarm-monitor.md +0 -54
  421. package/.claude/commands/swarm/swarm-status.md +0 -44
  422. package/.claude/commands/swarm/swarm-strategies.md +0 -76
  423. package/.claude/commands/training/model-update.md +0 -78
  424. package/.claude/commands/training/pattern-learn.md +0 -69
  425. package/.claude/commands/training/specialization.md +0 -92
  426. package/.claude/commands/verify/check.md +0 -106
  427. package/.claude/commands/verify/start.md +0 -105
  428. package/.claude/helpers/README.md +0 -105
  429. package/.claude/helpers/context-persistence-hook.mjs +0 -1988
  430. package/.claude/helpers/intelligence.cjs +0 -247
  431. package/.claude/helpers/learning-service.mjs +0 -1302
  432. package/.claude/helpers/memory-palace.cjs +0 -461
  433. package/.claude/helpers/memory.cjs +0 -84
  434. package/.claude/helpers/metrics-db.mjs +0 -488
  435. package/.claude/helpers/router.cjs +0 -559
  436. package/.claude/helpers/session.cjs +0 -126
  437. package/.claude/helpers/swarm-hooks.sh +0 -761
  438. package/.claude/helpers/toggle-statusline.cjs +0 -58
  439. package/.claude/helpers/token-tracker.cjs +0 -934
  440. package/.claude/skills/agentdb-advanced/SKILL.md +0 -549
  441. package/.claude/skills/agentdb-learning/SKILL.md +0 -544
  442. package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -337
  443. package/.claude/skills/agentdb-optimization/SKILL.md +0 -508
  444. package/.claude/skills/agentdb-vector-search/SKILL.md +0 -335
  445. package/.claude/skills/agentic-integration/SKILL.md +0 -265
  446. package/.claude/skills/cli-modernization/SKILL.md +0 -950
  447. package/.claude/skills/core-implementation/SKILL.md +0 -892
  448. package/.claude/skills/ddd-architecture/SKILL.md +0 -444
  449. package/.claude/skills/github-code-review/SKILL.md +0 -1147
  450. package/.claude/skills/github-multi-repo/SKILL.md +0 -912
  451. package/.claude/skills/github-project-management/SKILL.md +0 -1245
  452. package/.claude/skills/github-release-management/SKILL.md +0 -1118
  453. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1107
  454. package/.claude/skills/mcp-optimization/SKILL.md +0 -837
  455. package/.claude/skills/memory-unification/SKILL.md +0 -196
  456. package/.claude/skills/performance-optimization/SKILL.md +0 -416
  457. package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -444
  458. package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -199
  459. package/.claude/skills/security-hardening/SKILL.md +0 -101
  460. package/.claude/skills/stream-chain/SKILL.md +0 -560
  461. package/.claude/skills/swarm-coordination/SKILL.md +0 -451
  462. package/bundled-graph/dist/src/analyze.d.ts +0 -32
  463. package/bundled-graph/dist/src/analyze.d.ts.map +0 -1
  464. package/bundled-graph/dist/src/analyze.js +0 -297
  465. package/bundled-graph/dist/src/analyze.js.map +0 -1
  466. package/bundled-graph/dist/src/build.d.ts +0 -8
  467. package/bundled-graph/dist/src/build.d.ts.map +0 -1
  468. package/bundled-graph/dist/src/build.js.map +0 -1
  469. package/bundled-graph/dist/src/cache.d.ts +0 -12
  470. package/bundled-graph/dist/src/cache.d.ts.map +0 -1
  471. package/bundled-graph/dist/src/cache.js +0 -43
  472. package/bundled-graph/dist/src/cache.js.map +0 -1
  473. package/bundled-graph/dist/src/cluster.d.ts +0 -5
  474. package/bundled-graph/dist/src/cluster.d.ts.map +0 -1
  475. package/bundled-graph/dist/src/cluster.js.map +0 -1
  476. package/bundled-graph/dist/src/detect.d.ts +0 -21
  477. package/bundled-graph/dist/src/detect.d.ts.map +0 -1
  478. package/bundled-graph/dist/src/detect.js +0 -195
  479. package/bundled-graph/dist/src/detect.js.map +0 -1
  480. package/bundled-graph/dist/src/export.d.ts +0 -21
  481. package/bundled-graph/dist/src/export.d.ts.map +0 -1
  482. package/bundled-graph/dist/src/export.js +0 -68
  483. package/bundled-graph/dist/src/export.js.map +0 -1
  484. package/bundled-graph/dist/src/extract/index.d.ts +0 -20
  485. package/bundled-graph/dist/src/extract/index.d.ts.map +0 -1
  486. package/bundled-graph/dist/src/extract/index.js +0 -158
  487. package/bundled-graph/dist/src/extract/index.js.map +0 -1
  488. package/bundled-graph/dist/src/extract/languages/c.d.ts +0 -3
  489. package/bundled-graph/dist/src/extract/languages/c.d.ts.map +0 -1
  490. package/bundled-graph/dist/src/extract/languages/c.js +0 -88
  491. package/bundled-graph/dist/src/extract/languages/c.js.map +0 -1
  492. package/bundled-graph/dist/src/extract/languages/cpp.d.ts +0 -3
  493. package/bundled-graph/dist/src/extract/languages/cpp.d.ts.map +0 -1
  494. package/bundled-graph/dist/src/extract/languages/cpp.js +0 -121
  495. package/bundled-graph/dist/src/extract/languages/cpp.js.map +0 -1
  496. package/bundled-graph/dist/src/extract/languages/csharp.d.ts +0 -3
  497. package/bundled-graph/dist/src/extract/languages/csharp.d.ts.map +0 -1
  498. package/bundled-graph/dist/src/extract/languages/csharp.js +0 -121
  499. package/bundled-graph/dist/src/extract/languages/csharp.js.map +0 -1
  500. package/bundled-graph/dist/src/extract/languages/go.d.ts +0 -3
  501. package/bundled-graph/dist/src/extract/languages/go.d.ts.map +0 -1
  502. package/bundled-graph/dist/src/extract/languages/go.js +0 -181
  503. package/bundled-graph/dist/src/extract/languages/go.js.map +0 -1
  504. package/bundled-graph/dist/src/extract/languages/java.d.ts +0 -3
  505. package/bundled-graph/dist/src/extract/languages/java.d.ts.map +0 -1
  506. package/bundled-graph/dist/src/extract/languages/java.js +0 -117
  507. package/bundled-graph/dist/src/extract/languages/java.js.map +0 -1
  508. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts +0 -3
  509. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts.map +0 -1
  510. package/bundled-graph/dist/src/extract/languages/kotlin.js +0 -112
  511. package/bundled-graph/dist/src/extract/languages/kotlin.js.map +0 -1
  512. package/bundled-graph/dist/src/extract/languages/php.d.ts +0 -3
  513. package/bundled-graph/dist/src/extract/languages/php.d.ts.map +0 -1
  514. package/bundled-graph/dist/src/extract/languages/php.js +0 -130
  515. package/bundled-graph/dist/src/extract/languages/php.js.map +0 -1
  516. package/bundled-graph/dist/src/extract/languages/python.d.ts +0 -3
  517. package/bundled-graph/dist/src/extract/languages/python.d.ts.map +0 -1
  518. package/bundled-graph/dist/src/extract/languages/python.js +0 -230
  519. package/bundled-graph/dist/src/extract/languages/python.js.map +0 -1
  520. package/bundled-graph/dist/src/extract/languages/ruby.d.ts +0 -3
  521. package/bundled-graph/dist/src/extract/languages/ruby.d.ts.map +0 -1
  522. package/bundled-graph/dist/src/extract/languages/ruby.js +0 -120
  523. package/bundled-graph/dist/src/extract/languages/ruby.js.map +0 -1
  524. package/bundled-graph/dist/src/extract/languages/rust.d.ts +0 -3
  525. package/bundled-graph/dist/src/extract/languages/rust.d.ts.map +0 -1
  526. package/bundled-graph/dist/src/extract/languages/rust.js +0 -195
  527. package/bundled-graph/dist/src/extract/languages/rust.js.map +0 -1
  528. package/bundled-graph/dist/src/extract/languages/scala.d.ts +0 -3
  529. package/bundled-graph/dist/src/extract/languages/scala.d.ts.map +0 -1
  530. package/bundled-graph/dist/src/extract/languages/scala.js +0 -110
  531. package/bundled-graph/dist/src/extract/languages/scala.js.map +0 -1
  532. package/bundled-graph/dist/src/extract/languages/swift.d.ts +0 -3
  533. package/bundled-graph/dist/src/extract/languages/swift.d.ts.map +0 -1
  534. package/bundled-graph/dist/src/extract/languages/swift.js +0 -122
  535. package/bundled-graph/dist/src/extract/languages/swift.js.map +0 -1
  536. package/bundled-graph/dist/src/extract/languages/typescript.d.ts +0 -3
  537. package/bundled-graph/dist/src/extract/languages/typescript.d.ts.map +0 -1
  538. package/bundled-graph/dist/src/extract/languages/typescript.js +0 -295
  539. package/bundled-graph/dist/src/extract/languages/typescript.js.map +0 -1
  540. package/bundled-graph/dist/src/extract/semantic.d.ts +0 -38
  541. package/bundled-graph/dist/src/extract/semantic.d.ts.map +0 -1
  542. package/bundled-graph/dist/src/extract/semantic.js +0 -242
  543. package/bundled-graph/dist/src/extract/semantic.js.map +0 -1
  544. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts +0 -48
  545. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts.map +0 -1
  546. package/bundled-graph/dist/src/extract/tree-sitter-runner.js +0 -137
  547. package/bundled-graph/dist/src/extract/tree-sitter-runner.js.map +0 -1
  548. package/bundled-graph/dist/src/extract/types.d.ts +0 -7
  549. package/bundled-graph/dist/src/extract/types.d.ts.map +0 -1
  550. package/bundled-graph/dist/src/extract/types.js +0 -2
  551. package/bundled-graph/dist/src/extract/types.js.map +0 -1
  552. package/bundled-graph/dist/src/index.d.ts +0 -28
  553. package/bundled-graph/dist/src/index.d.ts.map +0 -1
  554. package/bundled-graph/dist/src/index.js +0 -26
  555. package/bundled-graph/dist/src/index.js.map +0 -1
  556. package/bundled-graph/dist/src/pipeline.d.ts +0 -27
  557. package/bundled-graph/dist/src/pipeline.d.ts.map +0 -1
  558. package/bundled-graph/dist/src/pipeline.js +0 -269
  559. package/bundled-graph/dist/src/pipeline.js.map +0 -1
  560. package/bundled-graph/dist/src/report.d.ts +0 -26
  561. package/bundled-graph/dist/src/report.d.ts.map +0 -1
  562. package/bundled-graph/dist/src/report.js +0 -214
  563. package/bundled-graph/dist/src/report.js.map +0 -1
  564. package/bundled-graph/dist/src/types.d.ts +0 -124
  565. package/bundled-graph/dist/src/types.d.ts.map +0 -1
  566. package/bundled-graph/dist/src/types.js +0 -2
  567. package/bundled-graph/dist/src/types.js.map +0 -1
  568. package/bundled-graph/dist/src/visualize.d.ts +0 -4
  569. package/bundled-graph/dist/src/visualize.d.ts.map +0 -1
  570. package/bundled-graph/dist/src/visualize.js +0 -574
  571. package/bundled-graph/dist/src/visualize.js.map +0 -1
  572. package/bundled-graph/dist/tsconfig.tsbuildinfo +0 -1
  573. package/dist/src/ui/dashboard-v2.html +0 -4576
@@ -1,1302 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Monomind V1 - Persistent Learning Service
4
- *
5
- * Connects ReasoningBank to AgentDB with HNSW indexing and ONNX embeddings.
6
- *
7
- * Features:
8
- * - Persistent pattern storage via AgentDB
9
- * - HNSW indexing for 150x-12,500x faster search
10
- * - ONNX embeddings via agentic-flow@alpha
11
- * - Session-level pattern loading and consolidation
12
- * - Short-term → Long-term pattern promotion
13
- *
14
- * Performance Targets:
15
- * - Pattern search: <1ms (HNSW)
16
- * - Embedding generation: <10ms (ONNX)
17
- * - Pattern storage: <5ms
18
- */
19
-
20
- import { createRequire } from 'module';
21
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
22
- import { join, dirname } from 'path';
23
- import { fileURLToPath } from 'url';
24
- import { execSync, spawn } from 'child_process';
25
- import Database from 'better-sqlite3';
26
-
27
- const __filename = fileURLToPath(import.meta.url);
28
- const __dirname = dirname(__filename);
29
- const PROJECT_ROOT = join(__dirname, '../..');
30
- const DATA_DIR = join(PROJECT_ROOT, '.monomind/learning');
31
- const DB_PATH = join(DATA_DIR, 'patterns.db');
32
- const METRICS_PATH = join(DATA_DIR, 'learning-metrics.json');
33
-
34
- // Ensure data directory exists
35
- if (!existsSync(DATA_DIR)) {
36
- mkdirSync(DATA_DIR, { recursive: true });
37
- }
38
-
39
- // =============================================================================
40
- // Configuration
41
- // =============================================================================
42
-
43
- const CONFIG = {
44
- // HNSW parameters
45
- hnsw: {
46
- M: 16, // Max connections per layer
47
- efConstruction: 200, // Construction time accuracy
48
- efSearch: 100, // Search time accuracy
49
- metric: 'cosine', // Distance metric
50
- },
51
-
52
- // Pattern management
53
- patterns: {
54
- shortTermMaxAge: 24 * 60 * 60 * 1000, // 24 hours
55
- promotionThreshold: 3, // Uses before promotion to long-term
56
- qualityThreshold: 0.6, // Min quality for storage
57
- maxShortTerm: 500, // Max short-term patterns
58
- maxLongTerm: 2000, // Max long-term patterns
59
- dedupThreshold: 0.95, // Similarity for dedup
60
- },
61
-
62
- // Embedding
63
- embedding: {
64
- dimension: 384, // MiniLM-L6 dimension
65
- model: 'all-MiniLM-L6-v2', // ONNX model
66
- batchSize: 32, // Batch size for embedding
67
- },
68
-
69
- // Consolidation
70
- consolidation: {
71
- interval: 30 * 60 * 1000, // 30 minutes
72
- pruneAge: 30 * 24 * 60 * 60 * 1000, // 30 days
73
- minUsageForKeep: 2, // Min uses to keep old pattern
74
- },
75
- };
76
-
77
- // =============================================================================
78
- // Database Schema
79
- // =============================================================================
80
-
81
- function initializeDatabase(db) {
82
- db.exec(`
83
- -- Short-term patterns (session-level)
84
- CREATE TABLE IF NOT EXISTS short_term_patterns (
85
- id TEXT PRIMARY KEY,
86
- strategy TEXT NOT NULL,
87
- domain TEXT DEFAULT 'general',
88
- embedding BLOB NOT NULL,
89
- quality REAL DEFAULT 0.5,
90
- usage_count INTEGER DEFAULT 0,
91
- success_count INTEGER DEFAULT 0,
92
- created_at INTEGER NOT NULL,
93
- updated_at INTEGER NOT NULL,
94
- session_id TEXT,
95
- trajectory_id TEXT,
96
- metadata TEXT
97
- );
98
-
99
- -- Long-term patterns (promoted from short-term)
100
- CREATE TABLE IF NOT EXISTS long_term_patterns (
101
- id TEXT PRIMARY KEY,
102
- strategy TEXT NOT NULL,
103
- domain TEXT DEFAULT 'general',
104
- embedding BLOB NOT NULL,
105
- quality REAL DEFAULT 0.5,
106
- usage_count INTEGER DEFAULT 0,
107
- success_count INTEGER DEFAULT 0,
108
- created_at INTEGER NOT NULL,
109
- updated_at INTEGER NOT NULL,
110
- promoted_at INTEGER,
111
- source_pattern_id TEXT,
112
- quality_history TEXT,
113
- metadata TEXT
114
- );
115
-
116
- -- HNSW index per-pattern mapping (unused: full index snapshots are stored in
117
- -- session_state under keys hnsw_short_term/hnsw_long_term as JSON blobs.
118
- -- This table exists for future per-vector indexing if needed.)
119
- CREATE TABLE IF NOT EXISTS hnsw_index (
120
- id INTEGER PRIMARY KEY,
121
- pattern_type TEXT NOT NULL, -- 'short_term' or 'long_term'
122
- pattern_id TEXT NOT NULL,
123
- vector_id INTEGER NOT NULL,
124
- created_at INTEGER NOT NULL,
125
- UNIQUE(pattern_type, pattern_id)
126
- );
127
-
128
- -- Learning trajectories
129
- CREATE TABLE IF NOT EXISTS trajectories (
130
- id TEXT PRIMARY KEY,
131
- session_id TEXT NOT NULL,
132
- domain TEXT DEFAULT 'general',
133
- steps TEXT NOT NULL,
134
- quality_score REAL,
135
- verdict TEXT,
136
- started_at INTEGER NOT NULL,
137
- ended_at INTEGER,
138
- distilled_pattern_id TEXT
139
- );
140
-
141
- -- Learning metrics
142
- CREATE TABLE IF NOT EXISTS learning_metrics (
143
- id INTEGER PRIMARY KEY AUTOINCREMENT,
144
- timestamp INTEGER NOT NULL,
145
- metric_type TEXT NOT NULL,
146
- metric_name TEXT NOT NULL,
147
- metric_value REAL NOT NULL,
148
- metadata TEXT
149
- );
150
-
151
- -- Session state
152
- CREATE TABLE IF NOT EXISTS session_state (
153
- key TEXT PRIMARY KEY,
154
- value TEXT NOT NULL,
155
- updated_at INTEGER NOT NULL
156
- );
157
-
158
- -- Create indexes
159
- CREATE INDEX IF NOT EXISTS idx_short_term_domain ON short_term_patterns(domain);
160
- CREATE INDEX IF NOT EXISTS idx_short_term_quality ON short_term_patterns(quality DESC);
161
- CREATE INDEX IF NOT EXISTS idx_short_term_usage ON short_term_patterns(usage_count DESC);
162
- CREATE INDEX IF NOT EXISTS idx_long_term_domain ON long_term_patterns(domain);
163
- CREATE INDEX IF NOT EXISTS idx_long_term_quality ON long_term_patterns(quality DESC);
164
- CREATE INDEX IF NOT EXISTS idx_trajectories_session ON trajectories(session_id);
165
- CREATE INDEX IF NOT EXISTS idx_metrics_type ON learning_metrics(metric_type, timestamp);
166
- `);
167
- }
168
-
169
- // =============================================================================
170
- // HNSW Index (In-Memory with SQLite persistence)
171
- // =============================================================================
172
-
173
- // TODO: Replace HNSWIndex with shared HnswLite from @monomind/memory once
174
- // API differences are resolved. Migration notes:
175
- // - HnswLite constructor: (dimensions: number, m: number, efConstruction: number, metric: string)
176
- // vs HNSWIndex constructor: (config: { embedding: { dimension }, hnsw: { m, efConstruction } })
177
- // - HnswLite.add(id: string, vector: Float32Array): void
178
- // vs HNSWIndex.add(patternId, embedding): vectorId (numeric)
179
- // - HnswLite.search(query: Float32Array, k: number, threshold?): { id, score }[]
180
- // vs HNSWIndex.search(queryEmbedding, k): { results: { patternId, similarity, vectorId }[], searchTimeMs }
181
- // - HnswLite.remove(id: string): void (no return)
182
- // vs HNSWIndex.remove(patternId): boolean
183
- // - dist/hnsw-lite.js exists at packages/@monomind/memory/dist/hnsw-lite.js
184
- // - Import: import { HnswLite } from '../../packages/@monomind/memory/dist/hnsw-lite.js'
185
- // Distance metric: HNSWIndex uses cosine similarity (1 - distance) in _searchGraph;
186
- // HnswLite defaults to cosineSimilarity — compatible. See D3 comment in hnsw-lite.ts.
187
- class HNSWIndex {
188
- constructor(config) {
189
- this.config = config;
190
- this.vectors = new Map(); // id -> Float32Array
191
- this.idToVector = new Map(); // patternId -> vectorId
192
- this.vectorToId = new Map(); // vectorId -> patternId
193
- this.nextVectorId = 0;
194
- this.dimension = config.embedding.dimension;
195
-
196
- // Graph structure for HNSW
197
- this.layers = []; // Multi-layer graph
198
- this.entryPoint = null;
199
- this.maxLevel = 0;
200
- }
201
-
202
- // Add vector to index
203
- add(patternId, embedding) {
204
- const vectorId = this.nextVectorId++;
205
- const vector = embedding instanceof Float32Array
206
- ? embedding
207
- : new Float32Array(embedding);
208
-
209
- this.vectors.set(vectorId, vector);
210
- this.idToVector.set(patternId, vectorId);
211
- this.vectorToId.set(vectorId, patternId);
212
-
213
- // Simple HNSW insertion (simplified for performance)
214
- this._insertIntoGraph(vectorId, vector);
215
-
216
- return vectorId;
217
- }
218
-
219
- // Search for k nearest neighbors
220
- search(queryEmbedding, k = 5) {
221
- const query = queryEmbedding instanceof Float32Array
222
- ? queryEmbedding
223
- : new Float32Array(queryEmbedding);
224
-
225
- if (this.vectors.size === 0) return { results: [], searchTimeMs: 0 };
226
-
227
- const startTime = performance.now();
228
-
229
- // HNSW search with early termination
230
- const candidates = this._searchGraph(query, k * 2);
231
-
232
- // Sort by similarity and take top k
233
- const results = candidates
234
- .map(({ vectorId, distance }) => ({
235
- patternId: this.vectorToId.get(vectorId),
236
- similarity: 1 - distance,
237
- vectorId,
238
- }))
239
- .sort((a, b) => b.similarity - a.similarity)
240
- .slice(0, k);
241
-
242
- const searchTime = performance.now() - startTime;
243
-
244
- return { results, searchTimeMs: searchTime };
245
- }
246
-
247
- // Remove vector from index
248
- remove(patternId) {
249
- const vectorId = this.idToVector.get(patternId);
250
- if (vectorId === undefined) return false;
251
-
252
- this.vectors.delete(vectorId);
253
- this.idToVector.delete(patternId);
254
- this.vectorToId.delete(vectorId);
255
- this._removeFromGraph(vectorId);
256
-
257
- return true;
258
- }
259
-
260
- // Get index size
261
- size() {
262
- return this.vectors.size;
263
- }
264
-
265
- // Cosine similarity
266
- _cosineSimilarity(a, b) {
267
- let dot = 0, normA = 0, normB = 0;
268
- for (let i = 0; i < a.length; i++) {
269
- dot += a[i] * b[i];
270
- normA += a[i] * a[i];
271
- normB += b[i] * b[i];
272
- }
273
- const denom = Math.sqrt(normA) * Math.sqrt(normB);
274
- return denom > 0 ? dot / denom : 0;
275
- }
276
-
277
- // Cosine distance
278
- _cosineDistance(a, b) {
279
- return 1 - this._cosineSimilarity(a, b);
280
- }
281
-
282
- // Insert into graph (simplified HNSW)
283
- _insertIntoGraph(vectorId, vector) {
284
- if (this.entryPoint === null) {
285
- this.entryPoint = vectorId;
286
- this.layers.push(new Map([[vectorId, new Set()]]));
287
- return;
288
- }
289
-
290
- // For simplicity, use single-layer graph with neighbor limit
291
- if (this.layers.length === 0) {
292
- this.layers.push(new Map());
293
- }
294
-
295
- const layer = this.layers[0];
296
- layer.set(vectorId, new Set());
297
-
298
- // Find M nearest neighbors and connect
299
- const neighbors = this._findNearest(vector, this.config.hnsw.M);
300
- for (const { vectorId: neighborId } of neighbors) {
301
- layer.get(vectorId).add(neighborId);
302
- layer.get(neighborId)?.add(vectorId);
303
-
304
- // Prune if too many connections
305
- if (layer.get(neighborId)?.size > this.config.hnsw.M * 2) {
306
- this._pruneConnections(neighborId);
307
- }
308
- }
309
- }
310
-
311
- // Search graph for nearest neighbors
312
- _searchGraph(query, k) {
313
- if (this.vectors.size <= k) {
314
- // Brute force for small index
315
- return Array.from(this.vectors.entries())
316
- .map(([vectorId, vector]) => ({
317
- vectorId,
318
- distance: this._cosineDistance(query, vector),
319
- }))
320
- .sort((a, b) => a.distance - b.distance);
321
- }
322
-
323
- // Greedy search from entry point
324
- const visited = new Set();
325
- const candidates = new Map();
326
- const results = [];
327
-
328
- let current = this.entryPoint;
329
- let currentDist = this._cosineDistance(query, this.vectors.get(current));
330
-
331
- candidates.set(current, currentDist);
332
- results.push({ vectorId: current, distance: currentDist });
333
-
334
- const layer = this.layers[0];
335
- let improved = true;
336
- let iterations = 0;
337
- const maxIterations = this.config.hnsw.efSearch;
338
-
339
- while (improved && iterations < maxIterations) {
340
- improved = false;
341
- iterations++;
342
-
343
- // Get best unvisited candidate
344
- let bestCandidate = null;
345
- let bestDist = Infinity;
346
-
347
- for (const [id, dist] of candidates) {
348
- if (!visited.has(id) && dist < bestDist) {
349
- bestDist = dist;
350
- bestCandidate = id;
351
- }
352
- }
353
-
354
- if (bestCandidate === null) break;
355
-
356
- visited.add(bestCandidate);
357
- const neighbors = layer.get(bestCandidate) || new Set();
358
-
359
- for (const neighborId of neighbors) {
360
- if (visited.has(neighborId)) continue;
361
-
362
- const neighborVector = this.vectors.get(neighborId);
363
- if (!neighborVector) continue;
364
-
365
- const dist = this._cosineDistance(query, neighborVector);
366
-
367
- if (!candidates.has(neighborId) || candidates.get(neighborId) > dist) {
368
- candidates.set(neighborId, dist);
369
- results.push({ vectorId: neighborId, distance: dist });
370
- improved = true;
371
- }
372
- }
373
- }
374
-
375
- return results.sort((a, b) => a.distance - b.distance).slice(0, k);
376
- }
377
-
378
- // Find k nearest by brute force
379
- _findNearest(query, k) {
380
- return Array.from(this.vectors.entries())
381
- .map(([vectorId, vector]) => ({
382
- vectorId,
383
- distance: this._cosineDistance(query, vector),
384
- }))
385
- .sort((a, b) => a.distance - b.distance)
386
- .slice(0, k);
387
- }
388
-
389
- // Prune excess connections
390
- _pruneConnections(vectorId) {
391
- const layer = this.layers[0];
392
- const connections = layer.get(vectorId);
393
- if (!connections || connections.size <= this.config.hnsw.M) return;
394
-
395
- const vector = this.vectors.get(vectorId);
396
- const scored = Array.from(connections)
397
- .map(neighborId => ({
398
- neighborId,
399
- distance: this._cosineDistance(vector, this.vectors.get(neighborId)),
400
- }))
401
- .sort((a, b) => a.distance - b.distance);
402
-
403
- // Keep only M nearest
404
- const toRemove = scored.slice(this.config.hnsw.M);
405
- for (const { neighborId } of toRemove) {
406
- connections.delete(neighborId);
407
- layer.get(neighborId)?.delete(vectorId);
408
- }
409
- }
410
-
411
- // Remove from graph
412
- _removeFromGraph(vectorId) {
413
- const layer = this.layers[0];
414
- const connections = layer.get(vectorId);
415
-
416
- if (connections) {
417
- for (const neighborId of connections) {
418
- layer.get(neighborId)?.delete(vectorId);
419
- }
420
- }
421
-
422
- layer.delete(vectorId);
423
-
424
- if (this.entryPoint === vectorId) {
425
- this.entryPoint = layer.size > 0 ? layer.keys().next().value : null;
426
- }
427
- }
428
-
429
- // Serialize index for persistence
430
- serialize() {
431
- return {
432
- vectors: Array.from(this.vectors.entries()).map(([id, vec]) => [id, Array.from(vec)]),
433
- idToVector: Array.from(this.idToVector.entries()),
434
- vectorToId: Array.from(this.vectorToId.entries()),
435
- nextVectorId: this.nextVectorId,
436
- entryPoint: this.entryPoint,
437
- layers: this.layers.map(layer =>
438
- Array.from(layer.entries()).map(([k, v]) => [k, Array.from(v)])
439
- ),
440
- };
441
- }
442
-
443
- // Deserialize index
444
- static deserialize(data, config) {
445
- const index = new HNSWIndex(config);
446
-
447
- if (!data) return index;
448
-
449
- index.vectors = new Map(data.vectors?.map(([id, vec]) => [id, new Float32Array(vec)]) || []);
450
- index.idToVector = new Map(data.idToVector || []);
451
- index.vectorToId = new Map(data.vectorToId || []);
452
- index.nextVectorId = data.nextVectorId || 0;
453
- index.entryPoint = data.entryPoint;
454
- index.layers = (data.layers || []).map(layer =>
455
- new Map(layer.map(([k, v]) => [k, new Set(v)]))
456
- );
457
-
458
- return index;
459
- }
460
- }
461
-
462
- // =============================================================================
463
- // Embedding Service (ONNX via agentic-flow@alpha OptimizedEmbedder)
464
- // =============================================================================
465
-
466
- class EmbeddingService {
467
- constructor(config) {
468
- this.config = config;
469
- this.initialized = false;
470
- this.embedder = null;
471
- this.embeddingCache = new Map();
472
- this.cacheMaxSize = 1000;
473
- }
474
-
475
- async initialize() {
476
- if (this.initialized) return;
477
-
478
- try {
479
- // Dynamically import agentic-flow OptimizedEmbedder
480
- const agenticFlowPath = join(PROJECT_ROOT, 'node_modules/agentic-flow/dist/embeddings/optimized-embedder.js');
481
-
482
- if (existsSync(agenticFlowPath)) {
483
- const { getOptimizedEmbedder } = await import(agenticFlowPath);
484
- this.embedder = getOptimizedEmbedder({
485
- modelId: 'all-MiniLM-L6-v2',
486
- dimension: this.config.embedding.dimension,
487
- cacheSize: 256,
488
- autoDownload: false, // Model should already be downloaded
489
- });
490
-
491
- await this.embedder.init();
492
- this.useAgenticFlow = true;
493
- console.log('[Embedding] Initialized: agentic-flow OptimizedEmbedder (ONNX)');
494
- } else {
495
- this.useAgenticFlow = false;
496
- console.log('[Embedding] agentic-flow not found, using fallback hash embeddings');
497
- }
498
-
499
- this.initialized = true;
500
- } catch (e) {
501
- this.useAgenticFlow = false;
502
- this.initialized = true;
503
- console.log(`[Embedding] Using fallback hash-based embeddings: ${e.message}`);
504
- }
505
- }
506
-
507
- async embed(text) {
508
- if (!this.initialized) await this.initialize();
509
-
510
- // Check cache
511
- const cacheKey = text.slice(0, 200);
512
- if (this.embeddingCache.has(cacheKey)) {
513
- return this.embeddingCache.get(cacheKey);
514
- }
515
-
516
- let embedding;
517
-
518
- if (this.useAgenticFlow && this.embedder) {
519
- try {
520
- // Use agentic-flow OptimizedEmbedder
521
- embedding = await this.embedder.embed(text.slice(0, 500));
522
- } catch (e) {
523
- console.log(`[Embedding] ONNX failed, using fallback: ${e.message}`);
524
- embedding = this._fallbackEmbed(text);
525
- }
526
- } else {
527
- embedding = this._fallbackEmbed(text);
528
- }
529
-
530
- // Cache result
531
- if (this.embeddingCache.size >= this.cacheMaxSize) {
532
- const firstKey = this.embeddingCache.keys().next().value;
533
- this.embeddingCache.delete(firstKey);
534
- }
535
- this.embeddingCache.set(cacheKey, embedding);
536
-
537
- return embedding;
538
- }
539
-
540
- async embedBatch(texts) {
541
- if (this.useAgenticFlow && this.embedder) {
542
- try {
543
- return await this.embedder.embedBatch(texts.map(t => t.slice(0, 500)));
544
- } catch (e) {
545
- // Fallback to sequential
546
- return Promise.all(texts.map(t => this.embed(t)));
547
- }
548
- }
549
- return Promise.all(texts.map(t => this.embed(t)));
550
- }
551
-
552
- // Fallback: deterministic hash-based embedding
553
- _fallbackEmbed(text) {
554
- const embedding = new Float32Array(this.config.embedding.dimension);
555
- const normalized = text.toLowerCase().trim();
556
-
557
- // Create deterministic embedding from text
558
- for (let i = 0; i < embedding.length; i++) {
559
- let hash = 0;
560
- for (let j = 0; j < normalized.length; j++) {
561
- hash = ((hash << 5) - hash + normalized.charCodeAt(j) * (i + 1)) | 0;
562
- }
563
- embedding[i] = (Math.sin(hash) + 1) / 2;
564
- }
565
-
566
- // Normalize
567
- let norm = 0;
568
- for (let i = 0; i < embedding.length; i++) {
569
- norm += embedding[i] * embedding[i];
570
- }
571
- norm = Math.sqrt(norm);
572
- if (norm > 0) {
573
- for (let i = 0; i < embedding.length; i++) {
574
- embedding[i] /= norm;
575
- }
576
- }
577
-
578
- return embedding;
579
- }
580
- }
581
-
582
- // =============================================================================
583
- // Learning Service
584
- //
585
- // Singleton contract (enforced by hook-handler.cjs::getLearningService()):
586
- // - One LearningService instance is created per hook-handler process.
587
- // - initialize() opens the SQLite DB at DB_PATH and loads HNSW indexes;
588
- // it must be called exactly once after construction.
589
- // - consolidate() is called at session-end to prune + promote patterns;
590
- // it operates on the already-open DB — no re-initialization needed.
591
- // - The constructor intentionally leaves all fields null until initialize()
592
- // is called; callers must not invoke other methods before initialize().
593
- // =============================================================================
594
-
595
- class LearningService {
596
- constructor() {
597
- this.db = null;
598
- this.shortTermIndex = null;
599
- this.longTermIndex = null;
600
- this.embeddingService = null;
601
- this.sessionId = null;
602
- this.metrics = {
603
- patternsStored: 0,
604
- patternsRetrieved: 0,
605
- searchTimeTotal: 0,
606
- searchCount: 0,
607
- promotions: 0,
608
- consolidations: 0,
609
- };
610
- }
611
-
612
- async initialize(sessionId = null) {
613
- this.sessionId = sessionId || `session_${Date.now()}`;
614
-
615
- // Initialize database
616
- this.db = new Database(DB_PATH);
617
- initializeDatabase(this.db);
618
-
619
- // Initialize embedding service
620
- this.embeddingService = new EmbeddingService(CONFIG);
621
- await this.embeddingService.initialize();
622
-
623
- // Initialize HNSW indexes
624
- this.shortTermIndex = new HNSWIndex(CONFIG);
625
- this.longTermIndex = new HNSWIndex(CONFIG);
626
-
627
- // Load existing patterns into indexes
628
- await this._loadIndexes();
629
-
630
- // Record session start
631
- this._setState('current_session', this.sessionId);
632
- this._setState('session_start', Date.now().toString());
633
-
634
- console.log(`[Learning] Initialized session ${this.sessionId}`);
635
- console.log(`[Learning] Short-term patterns: ${this.shortTermIndex.size()}`);
636
- console.log(`[Learning] Long-term patterns: ${this.longTermIndex.size()}`);
637
-
638
- return {
639
- sessionId: this.sessionId,
640
- shortTermPatterns: this.shortTermIndex.size(),
641
- longTermPatterns: this.longTermIndex.size(),
642
- };
643
- }
644
-
645
- // Store a new pattern
646
- async storePattern(strategy, domain = 'general', metadata = {}) {
647
- const now = Date.now();
648
- const id = `pat_${now}_${Math.random().toString(36).slice(2, 9)}`;
649
-
650
- // Generate embedding
651
- const embedding = await this.embeddingService.embed(strategy);
652
-
653
- // Check for duplicates
654
- const { results } = this.shortTermIndex.search(embedding, 1);
655
- if (results.length > 0 && results[0].similarity > CONFIG.patterns.dedupThreshold) {
656
- // Update existing pattern instead
657
- const existingId = results[0].patternId;
658
- this._updatePatternUsage(existingId, 'short_term');
659
- return { id: existingId, action: 'updated', similarity: results[0].similarity };
660
- }
661
-
662
- // Store in database
663
- const stmt = this.db.prepare(`
664
- INSERT INTO short_term_patterns
665
- (id, strategy, domain, embedding, quality, usage_count, created_at, updated_at, session_id, metadata)
666
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
667
- `);
668
-
669
- stmt.run(
670
- id, strategy, domain,
671
- Buffer.from(embedding.buffer),
672
- metadata.quality || 0.5,
673
- 1, now, now,
674
- this.sessionId,
675
- JSON.stringify(metadata)
676
- );
677
-
678
- // Add to HNSW index
679
- this.shortTermIndex.add(id, embedding);
680
-
681
- this.metrics.patternsStored++;
682
-
683
- // Check if we need to prune
684
- this._pruneShortTerm();
685
-
686
- // Persist index snapshot non-blocking
687
- this._saveIndexes().catch(e => console.error('[LearningService] saveIndexes error:', e));
688
-
689
- return { id, action: 'created', embedding: Array.from(embedding).slice(0, 5) };
690
- }
691
-
692
- // Search for similar patterns
693
- async searchPatterns(query, k = 5, includeShortTerm = true) {
694
- const embedding = typeof query === 'string'
695
- ? await this.embeddingService.embed(query)
696
- : query;
697
-
698
- const results = [];
699
-
700
- // Search long-term first (higher quality)
701
- const longTermResults = this.longTermIndex.search(embedding, k);
702
- results.push(...longTermResults.results.map(r => ({ ...r, type: 'long_term' })));
703
-
704
- // Search short-term if needed
705
- if (includeShortTerm) {
706
- const shortTermResults = this.shortTermIndex.search(embedding, k);
707
- results.push(...shortTermResults.results.map(r => ({ ...r, type: 'short_term' })));
708
- }
709
-
710
- // Sort by similarity and dedupe
711
- results.sort((a, b) => b.similarity - a.similarity);
712
- const seen = new Set();
713
- const deduped = results.filter(r => {
714
- if (seen.has(r.patternId)) return false;
715
- seen.add(r.patternId);
716
- return true;
717
- }).slice(0, k);
718
-
719
- // Get full pattern data
720
- const patterns = deduped.map(r => {
721
- const table = r.type === 'long_term' ? 'long_term_patterns' : 'short_term_patterns';
722
- const row = this.db.prepare(`SELECT * FROM ${table} WHERE id = ?`).get(r.patternId);
723
- return {
724
- ...r,
725
- strategy: row?.strategy,
726
- domain: row?.domain,
727
- quality: row?.quality,
728
- usageCount: row?.usage_count,
729
- };
730
- });
731
-
732
- this.metrics.patternsRetrieved += patterns.length;
733
- this.metrics.searchCount++;
734
- this.metrics.searchTimeTotal += longTermResults.searchTimeMs;
735
-
736
- return {
737
- patterns,
738
- searchTimeMs: longTermResults.searchTimeMs,
739
- totalLongTerm: this.longTermIndex.size(),
740
- totalShortTerm: this.shortTermIndex.size(),
741
- };
742
- }
743
-
744
- // Record pattern usage (for promotion)
745
- recordPatternUsage(patternId, success = true) {
746
- // Try short-term first
747
- let updated = this._updatePatternUsage(patternId, 'short_term', success);
748
- if (!updated) {
749
- updated = this._updatePatternUsage(patternId, 'long_term', success);
750
- }
751
-
752
- // Check for promotion
753
- if (updated) {
754
- this._checkPromotion(patternId);
755
- }
756
-
757
- return updated;
758
- }
759
-
760
- // Promote patterns from short-term to long-term
761
- _checkPromotion(patternId) {
762
- const row = this.db.prepare(`
763
- SELECT * FROM short_term_patterns WHERE id = ?
764
- `).get(patternId);
765
-
766
- if (!row) return false;
767
-
768
- // Check promotion criteria
769
- const shouldPromote =
770
- row.usage_count >= CONFIG.patterns.promotionThreshold &&
771
- row.quality >= CONFIG.patterns.qualityThreshold;
772
-
773
- if (!shouldPromote) return false;
774
-
775
- const now = Date.now();
776
-
777
- // Insert into long-term
778
- this.db.prepare(`
779
- INSERT INTO long_term_patterns
780
- (id, strategy, domain, embedding, quality, usage_count, success_count,
781
- created_at, updated_at, promoted_at, source_pattern_id, quality_history, metadata)
782
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
783
- `).run(
784
- `lt_${patternId}`,
785
- row.strategy,
786
- row.domain,
787
- row.embedding,
788
- row.quality,
789
- row.usage_count,
790
- row.success_count,
791
- row.created_at,
792
- now,
793
- now,
794
- patternId,
795
- JSON.stringify([row.quality]),
796
- row.metadata
797
- );
798
-
799
- // Add to long-term index
800
- this.longTermIndex.add(`lt_${patternId}`, this._bufferToFloat32Array(row.embedding));
801
-
802
- // Remove from short-term
803
- this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(patternId);
804
- this.shortTermIndex.remove(patternId);
805
-
806
- this.metrics.promotions++;
807
- console.log(`[Learning] Promoted pattern ${patternId} to long-term`);
808
-
809
- return true;
810
- }
811
-
812
- // Update pattern usage
813
- _updatePatternUsage(patternId, table, success = true) {
814
- const tableName = table === 'long_term' ? 'long_term_patterns' : 'short_term_patterns';
815
-
816
- const result = this.db.prepare(`
817
- UPDATE ${tableName}
818
- SET usage_count = usage_count + 1,
819
- success_count = success_count + ?,
820
- quality = (quality * usage_count + ?) / (usage_count + 1),
821
- updated_at = ?
822
- WHERE id = ?
823
- `).run(success ? 1 : 0, success ? 1.0 : 0.0, Date.now(), patternId);
824
-
825
- return result.changes > 0;
826
- }
827
-
828
- // Consolidate patterns (dedup, prune, merge)
829
- async consolidate() {
830
- const startTime = Date.now();
831
- const stats = {
832
- duplicatesRemoved: 0,
833
- patternsProned: 0,
834
- patternsMerged: 0,
835
- };
836
-
837
- // 1. Remove old short-term patterns
838
- const oldThreshold = Date.now() - CONFIG.patterns.shortTermMaxAge;
839
- const pruned = this.db.prepare(`
840
- DELETE FROM short_term_patterns
841
- WHERE created_at < ? AND usage_count < ?
842
- `).run(oldThreshold, CONFIG.patterns.promotionThreshold);
843
- stats.patternsProned = pruned.changes;
844
-
845
- // 2. Rebuild indexes
846
- await this._loadIndexes();
847
-
848
- // 3. Remove duplicates in long-term (simhash-bucketed to avoid O(n²) cosine)
849
- const longTermPatterns = this.db.prepare('SELECT * FROM long_term_patterns').all();
850
-
851
- // Build simhash fingerprints for all patterns
852
- const fingerprints = new Map();
853
- for (const p of longTermPatterns) {
854
- fingerprints.set(p.id, this._simhash(p.strategy || ''));
855
- }
856
-
857
- // Near-dup detection: only compare pairs with Hamming distance < 4
858
- for (let i = 0; i < longTermPatterns.length; i++) {
859
- for (let j = i + 1; j < longTermPatterns.length; j++) {
860
- const hammingDist = this._hammingDistance(
861
- fingerprints.get(longTermPatterns[i].id),
862
- fingerprints.get(longTermPatterns[j].id)
863
- );
864
- if (hammingDist >= 4) continue; // Skip dissimilar pairs (fast path)
865
- const sim = this._cosineSimilarity(
866
- this._bufferToFloat32Array(longTermPatterns[i].embedding),
867
- this._bufferToFloat32Array(longTermPatterns[j].embedding)
868
- );
869
- if (sim > CONFIG.patterns.dedupThreshold) {
870
- // Keep the higher quality one
871
- const toRemove = longTermPatterns[i].quality >= longTermPatterns[j].quality
872
- ? longTermPatterns[j].id
873
- : longTermPatterns[i].id;
874
- this.db.prepare('DELETE FROM long_term_patterns WHERE id = ?').run(toRemove);
875
- stats.duplicatesRemoved++;
876
- }
877
- }
878
- }
879
-
880
- // 4. Prune old long-term patterns
881
- const pruneAge = Date.now() - CONFIG.consolidation.pruneAge;
882
- const oldPruned = this.db.prepare(`
883
- DELETE FROM long_term_patterns
884
- WHERE updated_at < ? AND usage_count < ?
885
- `).run(pruneAge, CONFIG.consolidation.minUsageForKeep);
886
- stats.patternsProned += oldPruned.changes;
887
-
888
- // Rebuild indexes after changes
889
- await this._loadIndexes();
890
-
891
- this.metrics.consolidations++;
892
-
893
- // 5. Promote eligible episodic patterns to semantic long-term memory
894
- const promResult = await this.promoteEpisodic();
895
- if (promResult.promoted > 0) {
896
- console.log(`[Learning] Promoted ${promResult.promoted} episodic pattern(s) to semantic memory`);
897
- }
898
-
899
- // Persist updated index snapshot non-blocking
900
- this._saveIndexes().catch(e => console.error('[LearningService] saveIndexes error:', e));
901
-
902
- const duration = Date.now() - startTime;
903
- console.log(`[Learning] Consolidation complete in ${duration}ms:`, stats);
904
-
905
- return { ...stats, promoted: promResult.promoted, durationMs: duration };
906
- }
907
-
908
- // Promote short-term episodic patterns to long-term semantic memory
909
- async promoteEpisodic() {
910
- const threshold = CONFIG.patterns.promotionThreshold;
911
- const candidates = this.db.prepare(`
912
- SELECT * FROM short_term_patterns
913
- WHERE usage_count >= ?
914
- ORDER BY quality DESC
915
- `).all(threshold);
916
-
917
- let promoted = 0;
918
- for (const pattern of candidates) {
919
- try {
920
- // Check if already in long-term (using source_pattern_id link)
921
- const exists = this.db.prepare('SELECT id FROM long_term_patterns WHERE source_pattern_id = ? OR id = ?').get(pattern.id, `lt_${pattern.id}`);
922
- if (exists) {
923
- // Remove from short-term since it was already promoted
924
- this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(pattern.id);
925
- this.shortTermIndex.remove(pattern.id);
926
- continue;
927
- }
928
-
929
- const now = Date.now();
930
- const ltId = `lt_${pattern.id}`;
931
-
932
- // Promote to long-term
933
- this.db.prepare(`
934
- INSERT OR IGNORE INTO long_term_patterns
935
- (id, strategy, domain, embedding, quality, usage_count, success_count,
936
- created_at, updated_at, promoted_at, source_pattern_id, metadata)
937
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
938
- `).run(
939
- ltId, pattern.strategy, pattern.domain, pattern.embedding,
940
- pattern.quality, pattern.usage_count, pattern.success_count || 0,
941
- pattern.created_at, now, now, pattern.id, pattern.metadata
942
- );
943
-
944
- // Add to long-term HNSW index
945
- const embedding = this._bufferToFloat32Array(pattern.embedding);
946
- if (embedding) this.longTermIndex.add(ltId, embedding);
947
-
948
- // Remove from short-term
949
- this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(pattern.id);
950
- this.shortTermIndex.remove(pattern.id);
951
- promoted++;
952
- } catch (e) { /* skip individual failures */ }
953
- }
954
-
955
- if (promoted > 0) {
956
- this.metrics.promotions += promoted;
957
- this._saveIndexes().catch(e => console.error('[LearningService] saveIndexes error:', e));
958
- }
959
-
960
- return { promoted };
961
- }
962
-
963
- // Export learning data for session end
964
- async exportSession() {
965
- const sessionPatterns = this.db.prepare(`
966
- SELECT * FROM short_term_patterns WHERE session_id = ?
967
- `).all(this.sessionId);
968
-
969
- const trajectories = this.db.prepare(`
970
- SELECT * FROM trajectories WHERE session_id = ?
971
- `).all(this.sessionId);
972
-
973
- return {
974
- sessionId: this.sessionId,
975
- patterns: sessionPatterns.length,
976
- trajectories: trajectories.length,
977
- metrics: this.metrics,
978
- shortTermTotal: this.shortTermIndex.size(),
979
- longTermTotal: this.longTermIndex.size(),
980
- };
981
- }
982
-
983
- // Get learning statistics
984
- getStats() {
985
- const shortTermCount = this.db.prepare('SELECT COUNT(*) as count FROM short_term_patterns').get().count;
986
- const longTermCount = this.db.prepare('SELECT COUNT(*) as count FROM long_term_patterns').get().count;
987
- const trajectoryCount = this.db.prepare('SELECT COUNT(*) as count FROM trajectories').get().count;
988
-
989
- const avgQuality = this.db.prepare(`
990
- SELECT AVG(quality) as avg FROM (
991
- SELECT quality FROM short_term_patterns
992
- UNION ALL
993
- SELECT quality FROM long_term_patterns
994
- )
995
- `).get().avg || 0;
996
-
997
- return {
998
- shortTermPatterns: shortTermCount,
999
- longTermPatterns: longTermCount,
1000
- trajectories: trajectoryCount,
1001
- avgQuality,
1002
- avgSearchTimeMs: this.metrics.searchCount > 0
1003
- ? this.metrics.searchTimeTotal / this.metrics.searchCount
1004
- : 0,
1005
- ...this.metrics,
1006
- };
1007
- }
1008
-
1009
- // Save full HNSW index snapshots to session_state (key-value TEXT store).
1010
- // Using session_state (not hnsw_index) because session_state stores arbitrary blobs;
1011
- // hnsw_index stores per-pattern mappings and is not designed for full snapshots.
1012
- async _saveIndexes() {
1013
- try {
1014
- const shortTermData = JSON.stringify(this.shortTermIndex.serialize());
1015
- const longTermData = JSON.stringify(this.longTermIndex.serialize());
1016
- this.db.prepare(`
1017
- INSERT OR REPLACE INTO session_state (key, value, updated_at)
1018
- VALUES ('hnsw_short_term', ?, ?)
1019
- `).run(shortTermData, Date.now());
1020
- this.db.prepare(`
1021
- INSERT OR REPLACE INTO session_state (key, value, updated_at)
1022
- VALUES ('hnsw_long_term', ?, ?)
1023
- `).run(longTermData, Date.now());
1024
- } catch (e) {
1025
- console.error('[LearningService] Failed to save HNSW indexes:', e.message);
1026
- }
1027
- }
1028
-
1029
- // Load indexes from database — try serialized snapshot first, fall back to rebuild
1030
- async _loadIndexes() {
1031
- try {
1032
- const shortRow = this.db.prepare("SELECT value FROM session_state WHERE key = 'hnsw_short_term'").get();
1033
- const longRow = this.db.prepare("SELECT value FROM session_state WHERE key = 'hnsw_long_term'").get();
1034
- if (shortRow && longRow) {
1035
- this.shortTermIndex = HNSWIndex.deserialize(JSON.parse(shortRow.value), CONFIG);
1036
- this.longTermIndex = HNSWIndex.deserialize(JSON.parse(longRow.value), CONFIG);
1037
- return;
1038
- }
1039
- } catch (e) {
1040
- console.error('[LearningService] Failed to restore HNSW snapshots, rebuilding:', e.message);
1041
- }
1042
-
1043
- // Rebuild from patterns tables (fallback)
1044
- this.shortTermIndex = new HNSWIndex(CONFIG);
1045
- const shortTermPatterns = this.db.prepare('SELECT id, embedding FROM short_term_patterns').all();
1046
- for (const row of shortTermPatterns) {
1047
- const embedding = this._bufferToFloat32Array(row.embedding);
1048
- if (embedding) {
1049
- this.shortTermIndex.add(row.id, embedding);
1050
- }
1051
- }
1052
-
1053
- this.longTermIndex = new HNSWIndex(CONFIG);
1054
- const longTermPatterns = this.db.prepare('SELECT id, embedding FROM long_term_patterns').all();
1055
- for (const row of longTermPatterns) {
1056
- const embedding = this._bufferToFloat32Array(row.embedding);
1057
- if (embedding) {
1058
- this.longTermIndex.add(row.id, embedding);
1059
- }
1060
- }
1061
- }
1062
-
1063
- // Prune short-term patterns if over limit
1064
- _pruneShortTerm() {
1065
- const count = this.db.prepare('SELECT COUNT(*) as count FROM short_term_patterns').get().count;
1066
-
1067
- if (count <= CONFIG.patterns.maxShortTerm) return;
1068
-
1069
- // Remove lowest quality patterns
1070
- const toRemove = count - CONFIG.patterns.maxShortTerm;
1071
- const ids = this.db.prepare(`
1072
- SELECT id FROM short_term_patterns
1073
- ORDER BY quality ASC, usage_count ASC
1074
- LIMIT ?
1075
- `).all(toRemove).map(r => r.id);
1076
-
1077
- for (const id of ids) {
1078
- this.db.prepare('DELETE FROM short_term_patterns WHERE id = ?').run(id);
1079
- this.shortTermIndex.remove(id);
1080
- }
1081
- }
1082
-
1083
- // Get/set state
1084
- _getState(key) {
1085
- const row = this.db.prepare('SELECT value FROM session_state WHERE key = ?').get(key);
1086
- return row?.value;
1087
- }
1088
-
1089
- _setState(key, value) {
1090
- this.db.prepare(`
1091
- INSERT OR REPLACE INTO session_state (key, value, updated_at)
1092
- VALUES (?, ?, ?)
1093
- `).run(key, value, Date.now());
1094
- }
1095
-
1096
- // 32-bit simhash via bit-weighting of character bigrams
1097
- _simhash(text) {
1098
- const bits = new Int32Array(32);
1099
- const chars = text.toLowerCase().replace(/\s+/g, ' ');
1100
- for (let i = 0; i < chars.length - 1; i++) {
1101
- const bigram = chars.charCodeAt(i) * 31 + chars.charCodeAt(i + 1);
1102
- for (let b = 0; b < 32; b++) {
1103
- bits[b] += (bigram >> b) & 1 ? 1 : -1;
1104
- }
1105
- }
1106
- let hash = 0;
1107
- for (let b = 0; b < 32; b++) {
1108
- if (bits[b] > 0) hash |= (1 << b);
1109
- }
1110
- return hash >>> 0; // unsigned
1111
- }
1112
-
1113
- _hammingDistance(a, b) {
1114
- let x = a ^ b;
1115
- let count = 0;
1116
- while (x) { count += x & 1; x >>>= 1; }
1117
- return count;
1118
- }
1119
-
1120
- // Cosine similarity helper
1121
- _cosineSimilarity(a, b) {
1122
- let dot = 0, normA = 0, normB = 0;
1123
- for (let i = 0; i < a.length; i++) {
1124
- dot += a[i] * b[i];
1125
- normA += a[i] * a[i];
1126
- normB += b[i] * b[i];
1127
- }
1128
- const denom = Math.sqrt(normA) * Math.sqrt(normB);
1129
- return denom > 0 ? dot / denom : 0;
1130
- }
1131
-
1132
- // Close database
1133
- close() {
1134
- if (this.db) {
1135
- this.db.close();
1136
- this.db = null;
1137
- }
1138
- }
1139
-
1140
- // Helper: Safely convert SQLite Buffer to Float32Array
1141
- // Handles byte alignment issues that cause "byte length should be multiple of 4"
1142
- _bufferToFloat32Array(buffer) {
1143
- if (!buffer) return null;
1144
-
1145
- // If it's already a Float32Array, return it
1146
- if (buffer instanceof Float32Array) return buffer;
1147
-
1148
- // Get the expected number of floats based on embedding dimension
1149
- const numFloats = this.config?.embedding?.dimension || CONFIG.embedding.dimension;
1150
- const expectedBytes = numFloats * 4;
1151
-
1152
- // Create a properly aligned Uint8Array copy
1153
- const uint8 = new Uint8Array(expectedBytes);
1154
- const sourceLength = Math.min(buffer.length, expectedBytes);
1155
-
1156
- // Copy bytes from Buffer to Uint8Array
1157
- for (let i = 0; i < sourceLength; i++) {
1158
- uint8[i] = buffer[i];
1159
- }
1160
-
1161
- // Create Float32Array from the aligned buffer
1162
- return new Float32Array(uint8.buffer);
1163
- }
1164
- }
1165
-
1166
- // =============================================================================
1167
- // CLI Interface
1168
- // =============================================================================
1169
-
1170
- async function main() {
1171
- const command = process.argv[2] || 'help';
1172
- const service = new LearningService();
1173
-
1174
- try {
1175
- switch (command) {
1176
- case 'init':
1177
- case 'start': {
1178
- const sessionId = process.argv[3];
1179
- const result = await service.initialize(sessionId);
1180
- console.log(JSON.stringify(result, null, 2));
1181
- break;
1182
- }
1183
-
1184
- case 'store': {
1185
- await service.initialize();
1186
- const strategy = process.argv[3];
1187
- const domain = process.argv[4] || 'general';
1188
- if (!strategy) {
1189
- console.error('Usage: learning-service.mjs store <strategy> [domain]');
1190
- process.exit(1);
1191
- }
1192
- const result = await service.storePattern(strategy, domain);
1193
- console.log(JSON.stringify(result, null, 2));
1194
- break;
1195
- }
1196
-
1197
- case 'search': {
1198
- await service.initialize();
1199
- const query = process.argv[3];
1200
- const k = parseInt(process.argv[4]) || 5;
1201
- if (!query) {
1202
- console.error('Usage: learning-service.mjs search <query> [k]');
1203
- process.exit(1);
1204
- }
1205
- const result = await service.searchPatterns(query, k);
1206
- console.log(JSON.stringify(result, null, 2));
1207
- break;
1208
- }
1209
-
1210
- case 'consolidate': {
1211
- await service.initialize();
1212
- const result = await service.consolidate();
1213
- console.log(JSON.stringify(result, null, 2));
1214
- break;
1215
- }
1216
-
1217
- case 'export': {
1218
- await service.initialize();
1219
- const result = await service.exportSession();
1220
- console.log(JSON.stringify(result, null, 2));
1221
- break;
1222
- }
1223
-
1224
- case 'stats': {
1225
- await service.initialize();
1226
- const stats = service.getStats();
1227
- console.log(JSON.stringify(stats, null, 2));
1228
- break;
1229
- }
1230
-
1231
- case 'benchmark': {
1232
- await service.initialize();
1233
-
1234
- console.log('[Benchmark] Starting HNSW performance test...');
1235
-
1236
- // Store test patterns
1237
- const testPatterns = [
1238
- 'Implement authentication with JWT tokens',
1239
- 'Fix memory leak in event handler',
1240
- 'Optimize database query performance',
1241
- 'Add unit tests for user service',
1242
- 'Refactor component to use hooks',
1243
- ];
1244
-
1245
- for (const strategy of testPatterns) {
1246
- await service.storePattern(strategy, 'code');
1247
- }
1248
-
1249
- // Benchmark search
1250
- const searchTimes = [];
1251
- for (let i = 0; i < 100; i++) {
1252
- const start = performance.now();
1253
- await service.searchPatterns('implement authentication', 3);
1254
- searchTimes.push(performance.now() - start);
1255
- }
1256
-
1257
- const avgSearch = searchTimes.reduce((a, b) => a + b) / searchTimes.length;
1258
- const p95Search = searchTimes.sort((a, b) => a - b)[Math.floor(searchTimes.length * 0.95)];
1259
-
1260
- console.log(JSON.stringify({
1261
- avgSearchMs: avgSearch.toFixed(3),
1262
- p95SearchMs: p95Search.toFixed(3),
1263
- totalPatterns: service.getStats().shortTermPatterns + service.getStats().longTermPatterns,
1264
- hnswActive: true,
1265
- searchImprovementEstimate: `${Math.round(50 / Math.max(avgSearch, 0.1))}x`,
1266
- }, null, 2));
1267
- break;
1268
- }
1269
-
1270
- case 'help':
1271
- default:
1272
- console.log(`
1273
- Monomind V1 Learning Service
1274
-
1275
- Usage: learning-service.mjs <command> [args]
1276
-
1277
- Commands:
1278
- init [sessionId] Initialize learning service
1279
- store <strategy> [domain] Store a new pattern
1280
- search <query> [k] Search for similar patterns
1281
- consolidate Consolidate and prune patterns
1282
- export Export session learning data
1283
- stats Get learning statistics
1284
- benchmark Run HNSW performance benchmark
1285
- help Show this help message
1286
- `);
1287
- }
1288
- } finally {
1289
- service.close();
1290
- }
1291
- }
1292
-
1293
- // Export for programmatic use
1294
- export { LearningService, HNSWIndex, EmbeddingService, CONFIG };
1295
-
1296
- // Run CLI if executed directly
1297
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
1298
- main().catch(e => {
1299
- console.error('Error:', e.message);
1300
- process.exit(1);
1301
- });
1302
- }