monomind 1.8.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/.claude/agents/design/design-monodesign.md +121 -0
  2. package/.claude/agents/github/issue-tracker.md +12 -12
  3. package/.claude/agents/github/pr-manager.md +10 -10
  4. package/.claude/agents/github/release-manager.md +49 -105
  5. package/.claude/agents/github/repo-architect.md +73 -92
  6. package/.claude/agents/github/sync-coordinator.md +55 -123
  7. package/.claude/agents/marketing/marketing-competitive-content.md +155 -0
  8. package/.claude/agents/marketing/marketing-content-creator.md +13 -0
  9. package/.claude/agents/marketing/marketing-cro-specialist.md +147 -0
  10. package/.claude/agents/marketing/marketing-email-specialist.md +90 -0
  11. package/.claude/agents/marketing/marketing-launch-strategist.md +129 -0
  12. package/.claude/agents/marketing/marketing-pricing-strategist.md +127 -0
  13. package/.claude/agents/specialists/integration-architect.md +94 -0
  14. package/.claude/commands/agents/README.md +4 -0
  15. package/.claude/commands/agents/agent-capabilities.md +6 -2
  16. package/.claude/commands/agents/agent-coordination.md +4 -0
  17. package/.claude/commands/agents/agent-spawning.md +4 -0
  18. package/.claude/commands/agents/agent-types.md +6 -2
  19. package/.claude/commands/analysis/README.md +14 -5
  20. package/.claude/commands/analysis/bottleneck-detect.md +30 -123
  21. package/.claude/commands/analysis/performance-bottlenecks.md +14 -14
  22. package/.claude/commands/analysis/performance-report.md +38 -11
  23. package/.claude/commands/analysis/token-efficiency.md +13 -16
  24. package/.claude/commands/analysis/token-usage.md +34 -12
  25. package/.claude/commands/automation/README.md +15 -5
  26. package/.claude/commands/automation/auto-agent.md +49 -85
  27. package/.claude/commands/automation/self-healing.md +20 -18
  28. package/.claude/commands/automation/session-memory.md +28 -29
  29. package/.claude/commands/automation/smart-agents.md +17 -9
  30. package/.claude/commands/automation/smart-spawn.md +52 -11
  31. package/.claude/commands/automation/workflow-select.md +46 -11
  32. package/.claude/commands/browse.md +5 -0
  33. package/.claude/commands/coordination/README.md +9 -5
  34. package/.claude/commands/coordination/agent-spawn.md +53 -9
  35. package/.claude/commands/coordination/swarm-init.md +39 -42
  36. package/.claude/commands/coordination/task-orchestrate.md +65 -11
  37. package/.claude/commands/github/README.md +21 -8
  38. package/.claude/commands/github/github-modes.md +9 -5
  39. package/.claude/commands/github/issue-tracker.md +34 -33
  40. package/.claude/commands/github/pr-manager.md +20 -17
  41. package/.claude/commands/github/release-manager.md +37 -49
  42. package/.claude/commands/github/repo-architect.md +39 -41
  43. package/.claude/commands/github/sync-coordinator.md +45 -49
  44. package/.claude/commands/hive-mind/README.md +42 -17
  45. package/.claude/commands/hive-mind/hive-mind-consensus.md +68 -4
  46. package/.claude/commands/hive-mind/hive-mind-init.md +55 -5
  47. package/.claude/commands/hive-mind/hive-mind-memory.md +69 -4
  48. package/.claude/commands/hive-mind/hive-mind-spawn.md +71 -10
  49. package/.claude/commands/hive-mind/hive-mind-status.md +52 -4
  50. package/.claude/commands/hive-mind/hive-mind-stop.md +51 -4
  51. package/.claude/commands/hive-mind/hive-mind.md +74 -14
  52. package/.claude/commands/hooks/README.md +62 -7
  53. package/.claude/commands/hooks/overview.md +94 -35
  54. package/.claude/commands/hooks/post-edit.md +48 -87
  55. package/.claude/commands/hooks/post-task.md +37 -87
  56. package/.claude/commands/hooks/pre-edit.md +52 -84
  57. package/.claude/commands/hooks/pre-task.md +46 -81
  58. package/.claude/commands/hooks/session-end.md +49 -85
  59. package/.claude/commands/hooks/setup.md +87 -58
  60. package/.claude/commands/mastermind/_repeat.md +308 -0
  61. package/.claude/commands/mastermind/architect.md +49 -0
  62. package/.claude/commands/mastermind/brain.md +98 -0
  63. package/.claude/commands/mastermind/build.md +22 -0
  64. package/.claude/commands/mastermind/content.md +22 -0
  65. package/.claude/commands/mastermind/createorg.md +94 -0
  66. package/.claude/commands/mastermind/finance.md +22 -0
  67. package/.claude/commands/mastermind/idea.md +22 -0
  68. package/.claude/commands/mastermind/marketing.md +22 -0
  69. package/.claude/commands/mastermind/master.md +379 -0
  70. package/.claude/commands/mastermind/ops.md +22 -0
  71. package/.claude/commands/mastermind/release.md +22 -0
  72. package/.claude/commands/mastermind/research.md +22 -0
  73. package/.claude/commands/mastermind/review.md +22 -0
  74. package/.claude/commands/mastermind/runorg.md +106 -0
  75. package/.claude/commands/mastermind/sales.md +22 -0
  76. package/.claude/commands/mastermind/techport.md +17 -0
  77. package/.claude/commands/memory/README.md +75 -5
  78. package/.claude/commands/memory/memory-search.md +63 -11
  79. package/.claude/commands/monitoring/README.md +64 -4
  80. package/.claude/commands/monitoring/agent-metrics.md +50 -10
  81. package/.claude/commands/monitoring/agents.md +59 -32
  82. package/.claude/commands/monitoring/status.md +96 -34
  83. package/.claude/commands/monograph/README.md +102 -0
  84. package/.claude/commands/monograph/monograph-build.md +79 -0
  85. package/.claude/commands/monograph/monograph-search.md +96 -0
  86. package/.claude/commands/monograph/monograph-stats.md +53 -0
  87. package/.claude/commands/monograph/monograph-watch.md +63 -0
  88. package/.claude/commands/monograph/monograph-wiki.md +91 -0
  89. package/.claude/commands/monomind/createtask.md +277 -0
  90. package/.claude/commands/{monomind-do.md → monomind/do.md} +21 -8
  91. package/.claude/commands/monomind/help.md +118 -0
  92. package/.claude/commands/{monomind-idea.md → monomind/idea.md} +22 -28
  93. package/.claude/commands/{monomind-improve.md → monomind/improve.md} +21 -27
  94. package/.claude/commands/monomind/memory.md +230 -0
  95. package/.claude/commands/monomind/repeat.md +201 -0
  96. package/.claude/commands/monomind/review.md +313 -0
  97. package/.claude/commands/monomind/specialagents.md +125 -0
  98. package/.claude/commands/monomind/swarm.md +161 -0
  99. package/.claude/commands/monomind/understand.md +148 -0
  100. package/.claude/commands/optimization/README.md +69 -5
  101. package/.claude/commands/optimization/auto-topology.md +66 -43
  102. package/.claude/commands/optimization/parallel-execution.md +65 -39
  103. package/.claude/commands/optimization/performance-optimize.md +79 -0
  104. package/.claude/commands/pair/README.md +48 -230
  105. package/.claude/commands/pair/examples.md +85 -441
  106. package/.claude/commands/pair/modes.md +77 -303
  107. package/.claude/commands/pair/session.md +76 -359
  108. package/.claude/commands/sparc/analyzer.md +9 -26
  109. package/.claude/commands/sparc/architect.md +8 -25
  110. package/.claude/commands/sparc/ask.md +27 -68
  111. package/.claude/commands/sparc/batch-executor.md +8 -25
  112. package/.claude/commands/sparc/code.md +12 -53
  113. package/.claude/commands/sparc/coder.md +8 -25
  114. package/.claude/commands/sparc/debug.md +12 -53
  115. package/.claude/commands/sparc/debugger.md +8 -25
  116. package/.claude/commands/sparc/designer.md +8 -25
  117. package/.claude/commands/sparc/devops.md +16 -57
  118. package/.claude/commands/sparc/docs-writer.md +12 -53
  119. package/.claude/commands/sparc/documenter.md +8 -25
  120. package/.claude/commands/sparc/innovator.md +8 -25
  121. package/.claude/commands/sparc/integration.md +12 -53
  122. package/.claude/commands/sparc/mcp.md +12 -53
  123. package/.claude/commands/sparc/memory-manager.md +28 -25
  124. package/.claude/commands/sparc/optimizer.md +8 -25
  125. package/.claude/commands/sparc/orchestrator.md +35 -97
  126. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +13 -54
  127. package/.claude/commands/sparc/refinement-optimization-mode.md +13 -54
  128. package/.claude/commands/sparc/researcher.md +8 -25
  129. package/.claude/commands/sparc/reviewer.md +8 -25
  130. package/.claude/commands/sparc/security-review.md +13 -54
  131. package/.claude/commands/sparc/sparc-modes.md +97 -151
  132. package/.claude/commands/sparc/sparc.md +16 -56
  133. package/.claude/commands/sparc/spec-pseudocode.md +13 -54
  134. package/.claude/commands/sparc/supabase-admin.md +19 -66
  135. package/.claude/commands/sparc/swarm-coordinator.md +21 -25
  136. package/.claude/commands/sparc/tdd.md +8 -25
  137. package/.claude/commands/sparc/tester.md +8 -25
  138. package/.claude/commands/sparc/tutorial.md +12 -53
  139. package/.claude/commands/sparc/workflow-manager.md +8 -25
  140. package/.claude/commands/sparc.md +76 -130
  141. package/.claude/commands/stream-chain/pipeline.md +72 -77
  142. package/.claude/commands/stream-chain/run.md +133 -47
  143. package/.claude/commands/swarm/README.md +37 -12
  144. package/.claude/commands/swarm/analysis.md +47 -69
  145. package/.claude/commands/swarm/development.md +45 -69
  146. package/.claude/commands/swarm/examples.md +77 -142
  147. package/.claude/commands/swarm/maintenance.md +47 -74
  148. package/.claude/commands/swarm/optimization.md +54 -87
  149. package/.claude/commands/swarm/research.md +47 -107
  150. package/.claude/commands/swarm/swarm-analysis.md +58 -4
  151. package/.claude/commands/swarm/swarm-background.md +61 -4
  152. package/.claude/commands/swarm/swarm-modes.md +63 -4
  153. package/.claude/commands/swarm/swarm-monitor.md +50 -4
  154. package/.claude/commands/swarm/swarm-status.md +40 -4
  155. package/.claude/commands/swarm/swarm-strategies.md +73 -5
  156. package/.claude/commands/swarm/swarm.md +70 -18
  157. package/.claude/commands/swarm/testing.md +51 -102
  158. package/.claude/commands/tokens.md +6 -1
  159. package/.claude/commands/training/README.md +36 -6
  160. package/.claude/commands/training/model-update.md +68 -15
  161. package/.claude/commands/training/neural-patterns.md +54 -55
  162. package/.claude/commands/training/neural-train.md +70 -16
  163. package/.claude/commands/training/pattern-learn.md +60 -16
  164. package/.claude/commands/training/specialization.md +78 -49
  165. package/.claude/commands/truth/start.md +87 -109
  166. package/.claude/commands/ts.md +7 -2
  167. package/.claude/commands/verify/check.md +90 -34
  168. package/.claude/commands/verify/start.md +71 -94
  169. package/.claude/commands/workflows/README.md +62 -6
  170. package/.claude/commands/workflows/development.md +69 -61
  171. package/.claude/commands/workflows/research.md +73 -47
  172. package/.claude/commands/workflows/workflow-create.md +75 -16
  173. package/.claude/commands/workflows/workflow-execute.md +94 -16
  174. package/.claude/commands/workflows/workflow-export.md +81 -16
  175. package/.claude/helpers/control-start.cjs +91 -0
  176. package/.claude/helpers/extras-registry.json +4104 -1991
  177. package/.claude/helpers/graphify-freshen.cjs +44 -13
  178. package/.claude/helpers/hook-handler.cjs +256 -1
  179. package/.claude/helpers/learning-service.mjs +0 -0
  180. package/.claude/helpers/loop-tracker.cjs +107 -0
  181. package/.claude/helpers/metrics-db.mjs +0 -0
  182. package/.claude/helpers/router.cjs +48 -68
  183. package/.claude/helpers/skill-registry.json +89 -104
  184. package/.claude/helpers/statusline.cjs +33 -2
  185. package/.claude/helpers/swarm-hooks.sh +0 -0
  186. package/.claude/scheduled_tasks.lock +1 -0
  187. package/.claude/settings.json +15 -0
  188. package/.claude/skills/.monomind/data/ranked-context.json +5 -0
  189. package/.claude/skills/.monomind/sessions/current.json +13 -0
  190. package/.claude/skills/.monomind/sessions/session-1777829336455.json +15 -0
  191. package/.claude/skills/.monomind/sessions/session-1777831614725.json +15 -0
  192. package/.claude/skills/.monomind/sessions/session-1777832095857.json +15 -0
  193. package/.claude/skills/.monomind/sessions/session-1777839814183.json +15 -0
  194. package/.claude/skills/.monomind/sessions/session-1777841847131.json +15 -0
  195. package/.claude/skills/.monomind/sessions/session-1777843309463.json +15 -0
  196. package/.claude/skills/.monomind/sessions/session-1777880867159.json +15 -0
  197. package/.claude/skills/.monomind/sessions/session-1777881884593.json +15 -0
  198. package/.claude/skills/.monomind/sessions/session-1777884090471.json +15 -0
  199. package/.claude/skills/.monomind/sessions/session-1777884808221.json +15 -0
  200. package/.claude/skills/.monomind/sessions/session-1777885672155.json +15 -0
  201. package/.claude/skills/.monomind/sessions/session-1777886852818.json +15 -0
  202. package/.claude/skills/.monomind/sessions/session-1777896532690.json +15 -0
  203. package/.claude/skills/agentdb-advanced/SKILL.md +11 -12
  204. package/.claude/skills/agentdb-learning/SKILL.md +20 -21
  205. package/.claude/skills/agentdb-memory-patterns/SKILL.md +28 -30
  206. package/.claude/skills/agentdb-optimization/SKILL.md +11 -12
  207. package/.claude/skills/agentdb-vector-search/SKILL.md +37 -41
  208. package/.claude/skills/{v3-integration-deep → agentic-integration}/SKILL.md +20 -13
  209. package/.claude/skills/agentic-jujutsu/SKILL.md +22 -22
  210. package/.claude/skills/{v3-cli-modernization → cli-modernization}/SKILL.md +17 -8
  211. package/.claude/skills/{v3-core-implementation → core-implementation}/SKILL.md +33 -8
  212. package/.claude/skills/{v3-ddd-architecture → ddd-architecture}/SKILL.md +18 -25
  213. package/.claude/skills/github-code-review/SKILL.md +82 -83
  214. package/.claude/skills/github-multi-repo/SKILL.md +42 -46
  215. package/.claude/skills/github-project-management/SKILL.md +83 -88
  216. package/.claude/skills/github-release-management/SKILL.md +12 -18
  217. package/.claude/skills/github-workflow-automation/SKILL.md +70 -74
  218. package/.claude/skills/hooks-automation/SKILL.md +9 -13
  219. package/.claude/skills/mastermind/_intake.md +83 -0
  220. package/.claude/skills/mastermind/_protocol.md +275 -0
  221. package/.claude/skills/mastermind/architect.md +847 -0
  222. package/.claude/skills/mastermind/build.md +158 -0
  223. package/.claude/skills/mastermind/content.md +185 -0
  224. package/.claude/skills/mastermind/createorg.md +318 -0
  225. package/.claude/skills/mastermind/finance.md +154 -0
  226. package/.claude/skills/mastermind/idea.md +158 -0
  227. package/.claude/skills/mastermind/marketing.md +216 -0
  228. package/.claude/skills/mastermind/monotask.md +350 -0
  229. package/.claude/skills/mastermind/ops.md +156 -0
  230. package/.claude/skills/mastermind/references/copywriting-frameworks.md +181 -0
  231. package/.claude/skills/mastermind/references/persuasion-psychology.md +158 -0
  232. package/.claude/skills/mastermind/release.md +156 -0
  233. package/.claude/skills/mastermind/research.md +156 -0
  234. package/.claude/skills/mastermind/review.md +157 -0
  235. package/.claude/skills/mastermind/runorg.md +308 -0
  236. package/.claude/skills/mastermind/sales.md +158 -0
  237. package/.claude/skills/mastermind/techport.md +743 -0
  238. package/.claude/skills/{v3-mcp-optimization → mcp-optimization}/SKILL.md +35 -14
  239. package/.claude/skills/{v3-memory-unification → memory-unification}/SKILL.md +20 -4
  240. package/.claude/skills/monodesign/SKILL.md +302 -0
  241. package/.claude/skills/monodesign/reference/adapt.md +190 -0
  242. package/.claude/skills/monodesign/reference/animate.md +175 -0
  243. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +187 -0
  244. package/.claude/skills/monodesign/reference/audit.md +133 -0
  245. package/.claude/skills/monodesign/reference/bolder.md +113 -0
  246. package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  247. package/.claude/skills/monodesign/reference/brand.md +114 -0
  248. package/.claude/skills/monodesign/reference/clarify.md +174 -0
  249. package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  250. package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  251. package/.claude/skills/monodesign/reference/colorize.md +154 -0
  252. package/.claude/skills/monodesign/reference/component-specs.md +260 -0
  253. package/.claude/skills/monodesign/reference/component-states.md +274 -0
  254. package/.claude/skills/monodesign/reference/component-system.md +358 -0
  255. package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  256. package/.claude/skills/monodesign/reference/craft.md +193 -0
  257. package/.claude/skills/monodesign/reference/critique.md +213 -0
  258. package/.claude/skills/monodesign/reference/delight.md +302 -0
  259. package/.claude/skills/monodesign/reference/design-principles.md +246 -0
  260. package/.claude/skills/monodesign/reference/distill.md +111 -0
  261. package/.claude/skills/monodesign/reference/document.md +427 -0
  262. package/.claude/skills/monodesign/reference/extract.md +69 -0
  263. package/.claude/skills/monodesign/reference/harden.md +347 -0
  264. package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  265. package/.claude/skills/monodesign/reference/image-prompts.md +118 -0
  266. package/.claude/skills/monodesign/reference/interaction-design.md +195 -0
  267. package/.claude/skills/monodesign/reference/layout.md +141 -0
  268. package/.claude/skills/monodesign/reference/live.md +622 -0
  269. package/.claude/skills/monodesign/reference/motion-design.md +109 -0
  270. package/.claude/skills/monodesign/reference/onboard.md +234 -0
  271. package/.claude/skills/monodesign/reference/optimize.md +258 -0
  272. package/.claude/skills/monodesign/reference/overdrive.md +130 -0
  273. package/.claude/skills/monodesign/reference/personas.md +179 -0
  274. package/.claude/skills/monodesign/reference/polish.md +233 -0
  275. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  276. package/.claude/skills/monodesign/reference/product.md +62 -0
  277. package/.claude/skills/monodesign/reference/quieter.md +99 -0
  278. package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  279. package/.claude/skills/monodesign/reference/shape.md +151 -0
  280. package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  281. package/.claude/skills/monodesign/reference/teach.md +156 -0
  282. package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  283. package/.claude/skills/monodesign/reference/typeset.md +124 -0
  284. package/.claude/skills/monodesign/reference/typography.md +159 -0
  285. package/.claude/skills/monodesign/reference/ux-research.md +143 -0
  286. package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  287. package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  288. package/.claude/skills/monomotion/SKILL.md +145 -0
  289. package/.claude/skills/monomotion/rules/api-control.md +139 -0
  290. package/.claude/skills/monomotion/rules/effects.md +109 -0
  291. package/.claude/skills/monomotion/rules/integration.md +140 -0
  292. package/.claude/skills/monomotion/rules/scroll.md +131 -0
  293. package/.claude/skills/monomotion/rules/sequencing.md +105 -0
  294. package/.claude/skills/monomotion/rules/svg.md +101 -0
  295. package/.claude/skills/monomotion/rules/text.md +119 -0
  296. package/.claude/skills/pair-programming/SKILL.md +1 -1
  297. package/.claude/skills/performance-analysis/SKILL.md +3 -3
  298. package/.claude/skills/{v3-performance-optimization → performance-optimization}/SKILL.md +16 -8
  299. package/.claude/skills/reasoningbank-agentdb/SKILL.md +17 -19
  300. package/.claude/skills/reasoningbank-intelligence/SKILL.md +4 -6
  301. package/.claude/skills/{v3-security-overhaul → security-hardening}/SKILL.md +13 -3
  302. package/.claude/skills/skill-builder/SKILL.md +19 -19
  303. package/.claude/skills/sparc-methodology/SKILL.md +55 -211
  304. package/.claude/skills/stop-slop/SKILL.md +67 -0
  305. package/.claude/skills/stop-slop/references/examples.md +61 -0
  306. package/.claude/skills/stop-slop/references/phrases.md +130 -0
  307. package/.claude/skills/stop-slop/references/structures.md +136 -0
  308. package/.claude/skills/swarm-advanced/SKILL.md +13 -43
  309. package/.claude/skills/{v3-swarm-coordination → swarm-coordination}/SKILL.md +39 -21
  310. package/.claude/skills/swarm-orchestration/SKILL.md +12 -12
  311. package/.claude/skills/verification-quality/SKILL.md +5 -5
  312. package/.claude/statusline-command.sh +0 -0
  313. package/.claude/statusline.sh +0 -0
  314. package/.claude-plugin/scripts/install.sh +0 -0
  315. package/.claude-plugin/scripts/uninstall.sh +0 -0
  316. package/.claude-plugin/scripts/verify.sh +0 -0
  317. package/README.md +5 -5
  318. package/package.json +17 -17
  319. package/packages/@monomind/cli/README.md +441 -0
  320. package/packages/@monomind/cli/bin/cli.js +78 -13
  321. package/packages/@monomind/cli/bin/mcp-server.js +0 -0
  322. package/packages/@monomind/cli/dist/src/agents/halt-signal.js +33 -7
  323. package/packages/@monomind/cli/dist/src/agents/managed-agent.js +5 -2
  324. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +3 -2
  325. package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +1 -1
  326. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +5 -2
  327. package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +26 -4
  328. package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +17 -9
  329. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +5 -3
  330. package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +58 -10
  331. package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +0 -1
  332. package/packages/@monomind/cli/dist/src/agents/version-store.js +44 -21
  333. package/packages/@monomind/cli/dist/src/autopilot-state.js +79 -28
  334. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.d.ts +7 -2
  335. package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +20 -8
  336. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.d.ts +2 -1
  337. package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +25 -2
  338. package/packages/@monomind/cli/dist/src/commands/agent.js +6 -4
  339. package/packages/@monomind/cli/dist/src/commands/appliance-advanced.js +23 -0
  340. package/packages/@monomind/cli/dist/src/commands/autopilot.js +3 -3
  341. package/packages/@monomind/cli/dist/src/commands/benchmark.js +119 -8
  342. package/packages/@monomind/cli/dist/src/commands/claims.js +22 -14
  343. package/packages/@monomind/cli/dist/src/commands/config.js +32 -0
  344. package/packages/@monomind/cli/dist/src/commands/daemon.js +13 -11
  345. package/packages/@monomind/cli/dist/src/commands/deployment.js +21 -2
  346. package/packages/@monomind/cli/dist/src/commands/doctor.js +5 -4
  347. package/packages/@monomind/cli/dist/src/commands/embeddings.js +124 -48
  348. package/packages/@monomind/cli/dist/src/commands/hive-mind.js +15 -14
  349. package/packages/@monomind/cli/dist/src/commands/hooks.js +45 -41
  350. package/packages/@monomind/cli/dist/src/commands/index.d.ts +2 -0
  351. package/packages/@monomind/cli/dist/src/commands/index.js +20 -7
  352. package/packages/@monomind/cli/dist/src/commands/init.js +53 -19
  353. package/packages/@monomind/cli/dist/src/commands/mcp.js +31 -44
  354. package/packages/@monomind/cli/dist/src/commands/memory.js +47 -15
  355. package/packages/@monomind/cli/dist/src/commands/migrate.js +156 -108
  356. package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +8 -0
  357. package/packages/@monomind/cli/dist/src/commands/monograph.js +526 -0
  358. package/packages/@monomind/cli/dist/src/commands/neural.js +96 -56
  359. package/packages/@monomind/cli/dist/src/commands/performance.js +30 -8
  360. package/packages/@monomind/cli/dist/src/commands/plugins.js +13 -37
  361. package/packages/@monomind/cli/dist/src/commands/process.js +25 -2
  362. package/packages/@monomind/cli/dist/src/commands/providers.js +37 -5
  363. package/packages/@monomind/cli/dist/src/commands/replay.js +4 -4
  364. package/packages/@monomind/cli/dist/src/commands/route.js +37 -5
  365. package/packages/@monomind/cli/dist/src/commands/ruvector/import.js +12 -2
  366. package/packages/@monomind/cli/dist/src/commands/ruvector/init.js +15 -0
  367. package/packages/@monomind/cli/dist/src/commands/ruvector/status.js +16 -3
  368. package/packages/@monomind/cli/dist/src/commands/security.js +342 -193
  369. package/packages/@monomind/cli/dist/src/commands/session.js +51 -8
  370. package/packages/@monomind/cli/dist/src/commands/start.js +18 -4
  371. package/packages/@monomind/cli/dist/src/commands/swarm.js +47 -36
  372. package/packages/@monomind/cli/dist/src/commands/tokens.js +11 -11
  373. package/packages/@monomind/cli/dist/src/commands/transfer-store.js +1 -1
  374. package/packages/@monomind/cli/dist/src/commands/workflow.js +31 -4
  375. package/packages/@monomind/cli/dist/src/config-adapter.d.ts +2 -1
  376. package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +46 -13
  377. package/packages/@monomind/cli/dist/src/consensus/vote-signer.d.ts +0 -3
  378. package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +9 -1
  379. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +4 -2
  380. package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +25 -8
  381. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.d.ts +10 -3
  382. package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.js +50 -16
  383. package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +27 -5
  384. package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +2 -2
  385. package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +26 -16
  386. package/packages/@monomind/cli/dist/src/eval/trace-collector.js +23 -3
  387. package/packages/@monomind/cli/dist/src/index.js +12 -10
  388. package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +8 -8
  389. package/packages/@monomind/cli/dist/src/init/executor.js +212 -102
  390. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +35 -22
  391. package/packages/@monomind/cli/dist/src/init/mcp-generator.js +3 -3
  392. package/packages/@monomind/cli/dist/src/init/settings-generator.js +10 -3
  393. package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +18 -3
  394. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +3 -1
  395. package/packages/@monomind/cli/dist/src/init/types.d.ts +35 -11
  396. package/packages/@monomind/cli/dist/src/init/types.js +5 -9
  397. package/packages/@monomind/cli/dist/src/interactive/interrupt.js +8 -3
  398. package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +38 -4
  399. package/packages/@monomind/cli/dist/src/mcp-client.js +10 -4
  400. package/packages/@monomind/cli/dist/src/mcp-server.d.ts +9 -2
  401. package/packages/@monomind/cli/dist/src/mcp-server.js +182 -35
  402. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +66 -34
  403. package/packages/@monomind/cli/dist/src/mcp-tools/agentdb-tools.js +34 -7
  404. package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +25 -16
  405. package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +4 -6
  406. package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +12 -2
  407. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +199 -20
  408. package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +68 -18
  409. package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +33 -5
  410. package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +59 -4
  411. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +46 -10
  412. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +46 -5
  413. package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +29 -16
  414. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +38 -10
  415. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +96 -33
  416. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +70 -37
  417. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +29 -13
  418. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +5867 -56
  419. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +121 -37
  420. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +21 -8
  421. package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +10 -8
  422. package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +4 -1
  423. package/packages/@monomind/cli/dist/src/mcp-tools/ruvllm-tools.js +19 -8
  424. package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +57 -17
  425. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +35 -17
  426. package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +4 -3
  427. package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +53 -13
  428. package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +63 -14
  429. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +21 -16
  430. package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +92 -23
  431. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +41 -10
  432. package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +2 -2
  433. package/packages/@monomind/cli/dist/src/memory/intelligence.js +39 -13
  434. package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
  435. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +149 -56
  436. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +107 -45
  437. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +8 -1
  438. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +25 -8
  439. package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +40 -0
  440. package/packages/@monomind/cli/dist/src/observability/replay-reader.js +138 -0
  441. package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +35 -5
  442. package/packages/@monomind/cli/dist/src/parser.d.ts +8 -0
  443. package/packages/@monomind/cli/dist/src/parser.js +48 -14
  444. package/packages/@monomind/cli/dist/src/plugins/manager.js +112 -19
  445. package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +1 -1
  446. package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +80 -62
  447. package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +8 -1
  448. package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +4 -2
  449. package/packages/@monomind/cli/dist/src/production/error-handler.js +27 -5
  450. package/packages/@monomind/cli/dist/src/production/monitoring.js +8 -4
  451. package/packages/@monomind/cli/dist/src/production/rate-limiter.js +30 -22
  452. package/packages/@monomind/cli/dist/src/ruvector/agent-wasm.js +2 -2
  453. package/packages/@monomind/cli/dist/src/ruvector/coverage-router.js +19 -9
  454. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.d.ts +1 -0
  455. package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.js +26 -6
  456. package/packages/@monomind/cli/dist/src/ruvector/enhanced-model-router.js +24 -2
  457. package/packages/@monomind/cli/dist/src/ruvector/index.d.ts +1 -2
  458. package/packages/@monomind/cli/dist/src/ruvector/index.js +2 -2
  459. package/packages/@monomind/cli/dist/src/ruvector/model-router.d.ts +4 -2
  460. package/packages/@monomind/cli/dist/src/ruvector/model-router.js +30 -6
  461. package/packages/@monomind/cli/dist/src/ruvector/moe-router.d.ts +7 -0
  462. package/packages/@monomind/cli/dist/src/ruvector/moe-router.js +35 -12
  463. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.d.ts +7 -1
  464. package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.js +40 -9
  465. package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +3 -1
  466. package/packages/@monomind/cli/dist/src/services/claim-service.js +33 -2
  467. package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +16 -2
  468. package/packages/@monomind/cli/dist/src/services/config-file-manager.js +105 -17
  469. package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +51 -11
  470. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.d.ts +7 -0
  471. package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +188 -45
  472. package/packages/@monomind/cli/dist/src/services/registry-api.js +62 -9
  473. package/packages/@monomind/cli/dist/src/services/ruvector-training.js +8 -0
  474. package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +4 -1
  475. package/packages/@monomind/cli/dist/src/services/worker-daemon.js +112 -28
  476. package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +9 -2
  477. package/packages/@monomind/cli/dist/src/services/worker-queue.js +86 -5
  478. package/packages/@monomind/cli/dist/src/suggest.js +9 -0
  479. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +5 -3
  480. package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +17 -5
  481. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +3 -0
  482. package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +30 -6
  483. package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +5 -3
  484. package/packages/@monomind/cli/dist/src/transfer/export.js +5 -3
  485. package/packages/@monomind/cli/dist/src/transfer/ipfs/client.js +84 -7
  486. package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +13 -4
  487. package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +19 -10
  488. package/packages/@monomind/cli/dist/src/transfer/store/discovery.d.ts +9 -2
  489. package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +68 -13
  490. package/packages/@monomind/cli/dist/src/transfer/store/download.d.ts +15 -6
  491. package/packages/@monomind/cli/dist/src/transfer/store/download.js +113 -24
  492. package/packages/@monomind/cli/dist/src/transfer/store/publish.d.ts +1 -1
  493. package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -14
  494. package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +3 -3
  495. package/packages/@monomind/cli/dist/src/transfer/store/registry.js +32 -16
  496. package/packages/@monomind/cli/dist/src/update/checker.js +17 -4
  497. package/packages/@monomind/cli/dist/src/update/executor.js +25 -20
  498. package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +11 -0
  499. package/packages/@monomind/cli/dist/src/update/rate-limiter.js +23 -3
  500. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +6 -0
  501. package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +22 -0
  502. package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +37 -3
  503. package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +27 -11
  504. package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +51 -13
  505. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +3 -0
  506. package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +6 -2
  507. package/packages/@monomind/cli/dist/src/workflow/template-engine.js +7 -0
  508. package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +95 -14
  509. package/packages/@monomind/cli/package.json +5 -3
  510. package/packages/@monomind/guidance/README.md +1192 -0
  511. package/packages/@monomind/shared/README.md +322 -0
  512. package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +3 -1
  513. package/packages/README.md +513 -0
  514. package/.claude/agents/design/design-brand-guardian.md +0 -323
  515. package/.claude/agents/design/design-image-prompt-engineer.md +0 -237
  516. package/.claude/agents/design/design-inclusive-visuals-specialist.md +0 -72
  517. package/.claude/agents/design/design-ui-designer.md +0 -384
  518. package/.claude/agents/design/design-ux-architect.md +0 -470
  519. package/.claude/agents/design/design-ux-researcher.md +0 -330
  520. package/.claude/agents/design/design-visual-storyteller.md +0 -150
  521. package/.claude/agents/design/design-whimsy-injector.md +0 -439
  522. package/.claude/agents/v3/integration-architect.md +0 -338
  523. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +0 -54
  524. package/.claude/commands/coordination/init.md +0 -44
  525. package/.claude/commands/coordination/orchestrate.md +0 -43
  526. package/.claude/commands/coordination/spawn.md +0 -45
  527. package/.claude/commands/github/code-review-swarm.md +0 -550
  528. package/.claude/commands/github/code-review.md +0 -25
  529. package/.claude/commands/github/github-swarm.md +0 -121
  530. package/.claude/commands/github/issue-triage.md +0 -25
  531. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  532. package/.claude/commands/github/pr-enhance.md +0 -26
  533. package/.claude/commands/github/project-board-sync.md +0 -471
  534. package/.claude/commands/github/release-swarm.md +0 -590
  535. package/.claude/commands/github/repo-analyze.md +0 -25
  536. package/.claude/commands/github/swarm-issue.md +0 -482
  537. package/.claude/commands/github/swarm-pr.md +0 -310
  538. package/.claude/commands/github/workflow-automation.md +0 -468
  539. package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
  540. package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
  541. package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
  542. package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
  543. package/.claude/commands/list-agents.md +0 -17
  544. package/.claude/commands/memory/memory-persist.md +0 -25
  545. package/.claude/commands/memory/memory-usage.md +0 -25
  546. package/.claude/commands/memory/neural.md +0 -47
  547. package/.claude/commands/metrics.md +0 -11
  548. package/.claude/commands/monitoring/real-time-view.md +0 -25
  549. package/.claude/commands/monitoring/swarm-monitor.md +0 -25
  550. package/.claude/commands/monomind-createtask.md +0 -302
  551. package/.claude/commands/monomind-help.md +0 -103
  552. package/.claude/commands/monomind-memory.md +0 -107
  553. package/.claude/commands/monomind-repeat.md +0 -149
  554. package/.claude/commands/monomind-swarm.md +0 -205
  555. package/.claude/commands/optimization/cache-manage.md +0 -25
  556. package/.claude/commands/optimization/topology-optimize.md +0 -25
  557. package/.claude/commands/pair/commands.md +0 -546
  558. package/.claude/commands/pair/config.md +0 -510
  559. package/.claude/commands/pair/start.md +0 -209
  560. package/.claude/commands/use-agent.md +0 -67
  561. package/.claude/skills/monomind-createtask/SKILL.md +0 -269
  562. package/.claude/skills/monomind-task-engine/SKILL.md +0 -358
  563. /package/.claude/agents/{v3 → specialists}/memory-specialist.md +0 -0
  564. /package/.claude/agents/{v3 → specialists}/performance-engineer.md +0 -0
  565. /package/.claude/agents/{v3 → specialists}/queen-coordinator.md +0 -0
  566. /package/.claude/agents/{v3 → specialists}/security-architect.md +0 -0
@@ -4,10 +4,10 @@
4
4
  * Implements MCP tools for ADR-016: Collaborative Issue Claims
5
5
  * Provides programmatic access to claim operations for MCP clients.
6
6
  *
7
- * @module @monoes/cli/mcp-tools/claims
7
+ * @module @monomind/cli/mcp-tools/claims
8
8
  */
9
9
  // File-based persistence
10
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
10
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs';
11
11
  import { join, resolve } from 'path';
12
12
  const CLAIMS_DIR = '.monomind/claims';
13
13
  const CLAIMS_FILE = 'claims.json';
@@ -34,7 +34,10 @@ function loadClaims() {
34
34
  }
35
35
  function saveClaims(store) {
36
36
  ensureClaimsDir();
37
- writeFileSync(getClaimsPath(), JSON.stringify(store, null, 2), 'utf-8');
37
+ const dest = getClaimsPath();
38
+ const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
39
+ writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
40
+ renameSync(tmp, dest);
38
41
  }
39
42
  function formatClaimant(claimant) {
40
43
  return claimant.type === 'human'
@@ -78,13 +81,22 @@ export const claimsTools = [
78
81
  const issueId = input.issueId;
79
82
  const claimantStr = input.claimant;
80
83
  const context = input.context;
84
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
85
+ if (!issueId || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
86
+ return { success: false, error: 'Invalid issueId' };
87
+ }
81
88
  const claimant = parseClaimant(claimantStr);
82
89
  if (!claimant) {
83
90
  return { success: false, error: 'Invalid claimant format. Use "human:userId:name" or "agent:agentId:agentType"' };
84
91
  }
85
92
  const store = loadClaims();
86
- // Check if already claimed
87
- if (store.claims[issueId]) {
93
+ const MAX_CLAIMS = 10000;
94
+ if (Object.keys(store.claims).length >= MAX_CLAIMS) {
95
+ return { success: false, error: 'Claims store at capacity' };
96
+ }
97
+ // Check if already claimed (Object.hasOwn defends against bracket access
98
+ // resolving to inherited Object.prototype methods like `toString`)
99
+ if (Object.hasOwn(store.claims, issueId)) {
88
100
  const existing = store.claims[issueId];
89
101
  return {
90
102
  success: false,
@@ -137,15 +149,19 @@ export const claimsTools = [
137
149
  const issueId = input.issueId;
138
150
  const claimantStr = input.claimant;
139
151
  const reason = input.reason;
152
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
153
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
154
+ return { success: false, error: 'Invalid issueId' };
155
+ }
140
156
  const claimant = parseClaimant(claimantStr);
141
157
  if (!claimant) {
142
158
  return { success: false, error: 'Invalid claimant format' };
143
159
  }
144
160
  const store = loadClaims();
145
- const claim = store.claims[issueId];
146
- if (!claim) {
161
+ if (!Object.hasOwn(store.claims, issueId)) {
147
162
  return { success: false, error: 'Issue is not claimed' };
148
163
  }
164
+ const claim = store.claims[issueId];
149
165
  // Verify ownership
150
166
  if (formatClaimant(claim.claimant) !== formatClaimant(claimant)) {
151
167
  return { success: false, error: 'Only the current claimant can release' };
@@ -197,16 +213,20 @@ export const claimsTools = [
197
213
  const toStr = input.to;
198
214
  const reason = input.reason;
199
215
  const progress = input.progress || 0;
216
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
217
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
218
+ return { success: false, error: 'Invalid issueId' };
219
+ }
200
220
  const from = parseClaimant(fromStr);
201
221
  const to = parseClaimant(toStr);
202
222
  if (!from || !to) {
203
223
  return { success: false, error: 'Invalid claimant format' };
204
224
  }
205
225
  const store = loadClaims();
206
- const claim = store.claims[issueId];
207
- if (!claim) {
226
+ if (!Object.hasOwn(store.claims, issueId)) {
208
227
  return { success: false, error: 'Issue is not claimed' };
209
228
  }
229
+ const claim = store.claims[issueId];
210
230
  if (formatClaimant(claim.claimant) !== formatClaimant(from)) {
211
231
  return { success: false, error: 'Only the current claimant can request handoff' };
212
232
  }
@@ -246,15 +266,19 @@ export const claimsTools = [
246
266
  handler: async (input) => {
247
267
  const issueId = input.issueId;
248
268
  const claimantStr = input.claimant;
269
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
270
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
271
+ return { success: false, error: 'Invalid issueId' };
272
+ }
249
273
  const claimant = parseClaimant(claimantStr);
250
274
  if (!claimant) {
251
275
  return { success: false, error: 'Invalid claimant format' };
252
276
  }
253
277
  const store = loadClaims();
254
- const claim = store.claims[issueId];
255
- if (!claim) {
278
+ if (!Object.hasOwn(store.claims, issueId)) {
256
279
  return { success: false, error: 'Issue is not claimed' };
257
280
  }
281
+ const claim = store.claims[issueId];
258
282
  if (claim.status !== 'handoff-pending') {
259
283
  return { success: false, error: 'No pending handoff for this issue' };
260
284
  }
@@ -294,6 +318,10 @@ export const claimsTools = [
294
318
  description: 'New status',
295
319
  enum: ['active', 'paused', 'blocked', 'review-requested', 'completed'],
296
320
  },
321
+ claimant: {
322
+ type: 'string',
323
+ description: 'Claimant identifier (must match current owner)',
324
+ },
297
325
  note: {
298
326
  type: 'string',
299
327
  description: 'Status note or reason',
@@ -308,13 +336,27 @@ export const claimsTools = [
308
336
  handler: async (input) => {
309
337
  const issueId = input.issueId;
310
338
  const status = input.status;
339
+ const claimantStr = input.claimant;
311
340
  const note = input.note;
312
341
  const progress = input.progress;
342
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
343
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
344
+ return { success: false, error: 'Invalid issueId' };
345
+ }
313
346
  const store = loadClaims();
314
- const claim = store.claims[issueId];
315
- if (!claim) {
347
+ if (!Object.hasOwn(store.claims, issueId)) {
316
348
  return { success: false, error: 'Issue is not claimed' };
317
349
  }
350
+ const claim = store.claims[issueId];
351
+ if (claimantStr) {
352
+ const claimant = parseClaimant(claimantStr);
353
+ if (!claimant) {
354
+ return { success: false, error: 'Invalid claimant format' };
355
+ }
356
+ if (formatClaimant(claim.claimant) !== formatClaimant(claimant)) {
357
+ return { success: false, error: 'Only the current claimant can update status' };
358
+ }
359
+ }
318
360
  const now = new Date().toISOString();
319
361
  claim.status = status;
320
362
  claim.statusChangedAt = now;
@@ -411,11 +453,15 @@ export const claimsTools = [
411
453
  const reason = input.reason;
412
454
  const preferredTypes = input.preferredTypes;
413
455
  const context = input.context;
456
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
457
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
458
+ return { success: false, error: 'Invalid issueId' };
459
+ }
414
460
  const store = loadClaims();
415
- const claim = store.claims[issueId];
416
- if (!claim) {
461
+ if (!Object.hasOwn(store.claims, issueId)) {
417
462
  return { success: false, error: 'Issue is not claimed' };
418
463
  }
464
+ const claim = store.claims[issueId];
419
465
  const now = new Date().toISOString();
420
466
  claim.status = 'stealable';
421
467
  claim.statusChangedAt = now;
@@ -457,16 +503,20 @@ export const claimsTools = [
457
503
  handler: async (input) => {
458
504
  const issueId = input.issueId;
459
505
  const stealerStr = input.stealer;
506
+ const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
507
+ if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
508
+ return { success: false, error: 'Invalid issueId' };
509
+ }
460
510
  const stealer = parseClaimant(stealerStr);
461
511
  if (!stealer) {
462
512
  return { success: false, error: 'Invalid claimant format' };
463
513
  }
464
514
  const store = loadClaims();
465
- const claim = store.claims[issueId];
466
- const stealableInfo = store.stealable[issueId];
467
- if (!claim) {
515
+ if (!Object.hasOwn(store.claims, issueId)) {
468
516
  return { success: false, error: 'Issue is not claimed' };
469
517
  }
518
+ const claim = store.claims[issueId];
519
+ const stealableInfo = Object.hasOwn(store.stealable, issueId) ? store.stealable[issueId] : undefined;
470
520
  if (!stealableInfo) {
471
521
  return { success: false, error: 'Issue is not stealable' };
472
522
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Tool definitions for configuration management with file persistence.
5
5
  */
6
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
7
7
  import { join } from 'node:path';
8
8
  import { getProjectCwd } from './types.js';
9
9
  // Storage paths
@@ -34,12 +34,22 @@ function ensureConfigDir() {
34
34
  mkdirSync(dir, { recursive: true, mode: 0o700 });
35
35
  }
36
36
  }
37
+ const MAX_CONFIG_STORE_BYTES = 5 * 1024 * 1024; // 5 MB
37
38
  function loadConfigStore() {
38
39
  try {
39
40
  const path = getConfigPath();
40
41
  if (existsSync(path)) {
42
+ if (statSync(path).size > MAX_CONFIG_STORE_BYTES) {
43
+ return { values: { ...DEFAULT_CONFIG }, scopes: {}, version: '3.0.0', updatedAt: new Date().toISOString() };
44
+ }
41
45
  const data = readFileSync(path, 'utf-8');
42
- return JSON.parse(data);
46
+ const parsed = JSON.parse(data);
47
+ return {
48
+ values: filterDangerousKeys(parsed.values ?? {}),
49
+ scopes: filterDangerousKeys(parsed.scopes ?? {}),
50
+ version: typeof parsed.version === 'string' ? parsed.version : '3.0.0',
51
+ updatedAt: typeof parsed.updatedAt === 'string' ? parsed.updatedAt : new Date().toISOString(),
52
+ };
43
53
  }
44
54
  }
45
55
  catch {
@@ -55,7 +65,10 @@ function loadConfigStore() {
55
65
  function saveConfigStore(store) {
56
66
  ensureConfigDir();
57
67
  store.updatedAt = new Date().toISOString();
58
- writeFileSync(getConfigPath(), JSON.stringify(store, null, 2), 'utf-8');
68
+ const dest = getConfigPath();
69
+ const tmpPath = `${dest}.${process.pid}.${Date.now()}.tmp`;
70
+ writeFileSync(tmpPath, JSON.stringify(store, null, 2), 'utf-8');
71
+ renameSync(tmpPath, dest);
59
72
  }
60
73
  function getNestedValue(obj, key) {
61
74
  const parts = key.split('.');
@@ -71,11 +84,18 @@ function getNestedValue(obj, key) {
71
84
  return current;
72
85
  }
73
86
  const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
74
- function filterDangerousKeys(obj) {
87
+ function filterDangerousKeys(obj, depth = 0) {
75
88
  const filtered = {};
89
+ if (depth > 20)
90
+ return filtered;
76
91
  for (const [key, value] of Object.entries(obj)) {
77
92
  if (!DANGEROUS_KEYS.has(key)) {
78
- filtered[key] = value;
93
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
94
+ filtered[key] = filterDangerousKeys(value, depth + 1);
95
+ }
96
+ else {
97
+ filtered[key] = value;
98
+ }
79
99
  }
80
100
  }
81
101
  return filtered;
@@ -156,6 +176,14 @@ export const configTools = [
156
176
  const key = input.key;
157
177
  const value = input.value;
158
178
  const scope = input.scope || 'default';
179
+ for (const seg of key.split('.')) {
180
+ if (DANGEROUS_KEYS.has(seg)) {
181
+ return { success: false, error: `Forbidden key segment: "${seg}"` };
182
+ }
183
+ }
184
+ if (DANGEROUS_KEYS.has(scope)) {
185
+ return { success: false, error: `Forbidden scope: "${scope}"` };
186
+ }
159
187
  const previousValue = store.values[key];
160
188
  if (scope === 'default') {
161
189
  store.values[key] = value;
@@ -9,7 +9,7 @@
9
9
  * - Useful for single-machine workflow orchestration
10
10
  */
11
11
  import { getProjectCwd } from './types.js';
12
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
12
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
14
  // Storage paths
15
15
  const STORAGE_DIR = '.monomind';
@@ -61,7 +61,10 @@ function loadCoordStore() {
61
61
  }
62
62
  function saveCoordStore(store) {
63
63
  ensureCoordDir();
64
- writeFileSync(getCoordPath(), JSON.stringify(store, null, 2), 'utf-8');
64
+ const dest = getCoordPath();
65
+ const tmp = dest + '.tmp';
66
+ writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
67
+ renameSync(tmp, dest);
65
68
  }
66
69
  export const coordinationTools = [
67
70
  {
@@ -302,8 +305,22 @@ export const coordinationTools = [
302
305
  active: nodes.filter(n => n.status === 'active').length,
303
306
  };
304
307
  }
308
+ const FORBIDDEN_NODE_IDS = new Set(['__proto__', 'constructor', 'prototype']);
309
+ const MAX_NODES = 1000;
310
+ const MAX_NODE_ID_LEN = 200;
305
311
  if (action === 'add') {
306
312
  const nodeId = input.nodeId || `node-${Date.now()}`;
313
+ if (typeof nodeId !== 'string' || nodeId.length === 0 || nodeId.length > MAX_NODE_ID_LEN) {
314
+ return { success: false, error: 'Invalid nodeId' };
315
+ }
316
+ if (FORBIDDEN_NODE_IDS.has(nodeId)) {
317
+ return { success: false, error: 'Forbidden node ID' };
318
+ }
319
+ // Cap to prevent unbounded growth → disk exhaustion DoS via repeated
320
+ // add calls. Allow re-add of existing node (no growth in that case).
321
+ if (Object.keys(store.nodes).length >= MAX_NODES && !Object.hasOwn(store.nodes, nodeId)) {
322
+ return { success: false, error: `Node limit reached (${MAX_NODES})` };
323
+ }
307
324
  store.nodes[nodeId] = {
308
325
  id: nodeId,
309
326
  status: 'active',
@@ -320,7 +337,13 @@ export const coordinationTools = [
320
337
  }
321
338
  if (action === 'remove') {
322
339
  const nodeId = input.nodeId;
323
- if (!store.nodes[nodeId]) {
340
+ // Match the `add` denylist + Object.hasOwn so a tampered store.json
341
+ // can't have its inherited Object.prototype slots exposed via remove.
342
+ if (typeof nodeId !== 'string' || nodeId.length === 0 || nodeId.length > MAX_NODE_ID_LEN ||
343
+ FORBIDDEN_NODE_IDS.has(nodeId)) {
344
+ return { success: false, error: 'Invalid nodeId' };
345
+ }
346
+ if (!Object.hasOwn(store.nodes, nodeId)) {
324
347
  return { success: false, error: 'Node not found' };
325
348
  }
326
349
  delete store.nodes[nodeId];
@@ -334,7 +357,15 @@ export const coordinationTools = [
334
357
  }
335
358
  if (action === 'heartbeat') {
336
359
  const nodeId = input.nodeId;
337
- if (store.nodes[nodeId]) {
360
+ if (!nodeId || typeof nodeId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(nodeId)) {
361
+ return {
362
+ success: false,
363
+ action: 'heartbeat',
364
+ nodeId,
365
+ error: 'Invalid node ID',
366
+ };
367
+ }
368
+ if (Object.hasOwn(store.nodes, nodeId)) {
338
369
  store.nodes[nodeId].lastHeartbeat = new Date().toISOString();
339
370
  store.nodes[nodeId].status = 'active';
340
371
  saveCoordStore(store);
@@ -441,6 +472,25 @@ export const coordinationTools = [
441
472
  };
442
473
  }
443
474
  }
475
+ if (consensus.pending.length >= 200) {
476
+ return { success: false, error: 'Pending proposals limit (200) reached. Resolve existing proposals first.' };
477
+ }
478
+ // Validate proposal size and shape — schema only declares object,
479
+ // so without these checks an attacker could submit a 10MB blob 200x
480
+ // and inflate store.json to 2GB on every saveCoordStore.
481
+ if (input.proposal === null || typeof input.proposal !== 'object' || Array.isArray(input.proposal)) {
482
+ return { success: false, error: 'proposal must be a plain object' };
483
+ }
484
+ let proposalSerialized;
485
+ try {
486
+ proposalSerialized = JSON.stringify(input.proposal);
487
+ }
488
+ catch {
489
+ return { success: false, error: 'proposal contains non-serializable values' };
490
+ }
491
+ if (proposalSerialized.length > 64 * 1024) {
492
+ return { success: false, error: 'proposal exceeds 64KB limit' };
493
+ }
444
494
  consensus.pending.push({
445
495
  proposalId,
446
496
  type: 'coordination',
@@ -544,6 +594,11 @@ export const coordinationTools = [
544
594
  term: p.term,
545
595
  byzantineDetected: p.byzantineVoters?.length ? p.byzantineVoters : undefined,
546
596
  });
597
+ // Cap consensus history to prevent unbounded growth
598
+ const MAX_CONSENSUS_HISTORY = 1000;
599
+ if (consensus.history.length > MAX_CONSENSUS_HISTORY) {
600
+ consensus.history = consensus.history.slice(-MAX_CONSENSUS_HISTORY);
601
+ }
547
602
  consensus.pending = consensus.pending.filter(x => x.proposalId !== p.proposalId);
548
603
  }
549
604
  saveCoordStore(store);
@@ -9,7 +9,7 @@
9
9
  * - Useful for workflow orchestration and state tracking
10
10
  */
11
11
  import { getProjectCwd } from './types.js';
12
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
12
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
13
13
  import { join } from 'node:path';
14
14
  // Storage paths
15
15
  const STORAGE_DIR = '.monomind';
@@ -31,6 +31,12 @@ function loadDAAStore() {
31
31
  try {
32
32
  const path = getDAAPath();
33
33
  if (existsSync(path)) {
34
+ // Cap on disk read so a planted multi-GB store.json can't OOM the daemon
35
+ // on first MCP call.
36
+ const stat = statSync(path);
37
+ if (stat.size > 25 * 1024 * 1024) {
38
+ return { agents: {}, workflows: {}, knowledge: {}, version: '3.0.0' };
39
+ }
34
40
  return JSON.parse(readFileSync(path, 'utf-8'));
35
41
  }
36
42
  }
@@ -41,7 +47,11 @@ function loadDAAStore() {
41
47
  }
42
48
  function saveDAAStore(store) {
43
49
  ensureDAADir();
44
- writeFileSync(getDAAPath(), JSON.stringify(store, null, 2), 'utf-8');
50
+ // Unique tmp filename so concurrent daa_* MCP calls cannot collide on the
51
+ // same .tmp path mid-write.
52
+ const tmpPath = `${getDAAPath()}.${process.pid}.${Date.now()}.tmp`;
53
+ writeFileSync(tmpPath, JSON.stringify(store, null, 2), 'utf-8');
54
+ renameSync(tmpPath, getDAAPath());
45
55
  }
46
56
  export const daaTools = [
47
57
  {
@@ -81,6 +91,9 @@ export const daaTools = [
81
91
  createdAt: new Date().toISOString(),
82
92
  lastActivity: new Date().toISOString(),
83
93
  };
94
+ if (['__proto__', 'constructor', 'prototype'].includes(id)) {
95
+ return { success: false, error: 'Forbidden agent ID' };
96
+ }
84
97
  store.agents[id] = agent;
85
98
  saveDAAStore(store);
86
99
  // Store agent in AgentDB for searchable agent registry
@@ -123,9 +136,12 @@ export const daaTools = [
123
136
  required: ['agentId'],
124
137
  },
125
138
  handler: async (input) => {
126
- const store = loadDAAStore();
127
139
  const agentId = input.agentId;
128
- const agent = store.agents[agentId];
140
+ if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
141
+ return { success: false, error: 'Invalid agent id' };
142
+ }
143
+ const store = loadDAAStore();
144
+ const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
129
145
  if (!agent) {
130
146
  return { success: false, error: 'Agent not found' };
131
147
  }
@@ -179,8 +195,14 @@ export const daaTools = [
179
195
  required: ['id', 'name'],
180
196
  },
181
197
  handler: async (input) => {
182
- const store = loadDAAStore();
183
198
  const id = input.id;
199
+ // Reject prototype-pollution keys: writing to store.workflows['__proto__']
200
+ // mutates Object.prototype for the process.
201
+ if (typeof id !== 'string' || id.length === 0 || id.length > 256 ||
202
+ ['__proto__', 'constructor', 'prototype'].includes(id)) {
203
+ return { success: false, error: 'Invalid workflow id' };
204
+ }
205
+ const store = loadDAAStore();
184
206
  const workflow = {
185
207
  id,
186
208
  name: input.name,
@@ -218,9 +240,12 @@ export const daaTools = [
218
240
  required: ['workflowId'],
219
241
  },
220
242
  handler: async (input) => {
221
- const store = loadDAAStore();
222
243
  const workflowId = input.workflowId;
223
- const workflow = store.workflows[workflowId];
244
+ if (typeof workflowId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(workflowId)) {
245
+ return { success: false, error: 'Invalid workflow id' };
246
+ }
247
+ const store = loadDAAStore();
248
+ const workflow = Object.hasOwn(store.workflows, workflowId) ? store.workflows[workflowId] : undefined;
224
249
  if (!workflow) {
225
250
  return { success: false, error: 'Workflow not found' };
226
251
  }
@@ -290,7 +315,12 @@ export const daaTools = [
290
315
  _storedIn = 'agentdb';
291
316
  }
292
317
  catch { /* AgentDB not available */ }
293
- // Backward compat: always persist in JSON store
318
+ // Backward compat: always persist in JSON store (cap at 1000 entries)
319
+ if (Object.keys(store.knowledge).length >= 1000) {
320
+ const oldest = Object.keys(store.knowledge)[0];
321
+ if (oldest)
322
+ delete store.knowledge[oldest];
323
+ }
294
324
  store.knowledge[knowledgeId] = knowledgeEntry;
295
325
  saveDAAStore(store);
296
326
  return {
@@ -322,7 +352,10 @@ export const daaTools = [
322
352
  const store = loadDAAStore();
323
353
  const agentId = input.agentId;
324
354
  if (agentId) {
325
- const agent = store.agents[agentId];
355
+ if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
356
+ return { success: false, error: 'Invalid agent id' };
357
+ }
358
+ const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
326
359
  if (!agent) {
327
360
  return { success: false, error: 'Agent not found' };
328
361
  }
@@ -375,7 +408,10 @@ export const daaTools = [
375
408
  const agentId = input.agentId;
376
409
  const action = input.action || 'analyze';
377
410
  if (agentId) {
378
- const agent = store.agents[agentId];
411
+ if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
412
+ return { success: false, error: 'Invalid agent id' };
413
+ }
414
+ const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
379
415
  if (!agent) {
380
416
  return { success: false, error: 'Agent not found' };
381
417
  }
@@ -4,12 +4,38 @@
4
4
  * Tool definitions for ONNX embeddings with hyperbolic support and neural substrate.
5
5
  * Implements ADR-024: Embeddings MCP Tools
6
6
  */
7
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
7
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs';
8
8
  import { join, resolve } from 'path';
9
9
  // Configuration paths
10
10
  const CONFIG_DIR = '.monomind';
11
11
  const EMBEDDINGS_CONFIG = 'embeddings.json';
12
12
  const MODELS_DIR = 'models';
13
+ // Input validation caps — embeddings handlers operate on caller-supplied text and
14
+ // vectors. Without these caps an attacker can pass a 100M-entry array and OOM the
15
+ // process, or a 50MB string and saturate the hash-fallback embedding loop.
16
+ const MAX_TEXT_LENGTH = 64 * 1024;
17
+ const MAX_VECTOR_DIM = 8192;
18
+ function validateText(t, field) {
19
+ if (typeof t !== 'string')
20
+ throw new Error(`${field}: must be a string`);
21
+ if (t.length > MAX_TEXT_LENGTH)
22
+ throw new Error(`${field}: text too long (max ${MAX_TEXT_LENGTH})`);
23
+ return t;
24
+ }
25
+ function validateVector(v, field) {
26
+ if (!Array.isArray(v))
27
+ throw new Error(`${field}: must be a number[]`);
28
+ if (v.length === 0)
29
+ throw new Error(`${field}: empty vector`);
30
+ if (v.length > MAX_VECTOR_DIM)
31
+ throw new Error(`${field}: vector too large (max ${MAX_VECTOR_DIM})`);
32
+ for (let i = 0; i < v.length; i++) {
33
+ if (typeof v[i] !== 'number' || !Number.isFinite(v[i])) {
34
+ throw new Error(`${field}: contains non-finite value at index ${i}`);
35
+ }
36
+ }
37
+ return v;
38
+ }
13
39
  function getConfigPath() {
14
40
  return resolve(join(CONFIG_DIR, EMBEDDINGS_CONFIG));
15
41
  }
@@ -33,7 +59,10 @@ function loadConfig() {
33
59
  }
34
60
  function saveConfig(config) {
35
61
  ensureConfigDir();
36
- writeFileSync(getConfigPath(), JSON.stringify(config, null, 2), 'utf-8');
62
+ const dest = getConfigPath();
63
+ const tmp = dest + '.tmp';
64
+ writeFileSync(tmp, JSON.stringify(config, null, 2), 'utf-8');
65
+ renameSync(tmp, dest);
37
66
  }
38
67
  // Real ONNX embedding generation via memory-initializer
39
68
  let realEmbeddingFn = null;
@@ -229,7 +258,13 @@ export const embeddingsTools = [
229
258
  error: 'Embeddings not initialized. Run embeddings/init first.',
230
259
  };
231
260
  }
232
- const text = input.text;
261
+ let text;
262
+ try {
263
+ text = validateText(input.text, 'text');
264
+ }
265
+ catch (e) {
266
+ return { success: false, error: e.message };
267
+ }
233
268
  const useHyperbolic = input.hyperbolic === true && config.hyperbolic.enabled;
234
269
  // Generate real ONNX embedding
235
270
  const embedding = await generateRealEmbedding(text, config.dimension);
@@ -289,8 +324,14 @@ export const embeddingsTools = [
289
324
  error: 'Embeddings not initialized. Run embeddings/init first.',
290
325
  };
291
326
  }
292
- const text1 = input.text1;
293
- const text2 = input.text2;
327
+ let text1, text2;
328
+ try {
329
+ text1 = validateText(input.text1, 'text1');
330
+ text2 = validateText(input.text2, 'text2');
331
+ }
332
+ catch (e) {
333
+ return { success: false, error: e.message };
334
+ }
294
335
  const metric = input.metric || 'cosine';
295
336
  // Generate real ONNX embeddings for both texts
296
337
  const [emb1, emb2] = await Promise.all([