@monoes/monomindcli 2.9.22 → 2.9.24

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 (1006) hide show
  1. package/.claude/agents/consensus/quorum-manager.md +35 -54
  2. package/.claude/agents/core/coordinator.md +14 -18
  3. package/.claude/agents/core/researcher.md +1 -1
  4. package/.claude/agents/github/issue-tracker.md +3 -3
  5. package/.claude/agents/github/{code-review-swarm.md → monoswarm-code-review.md} +1 -1
  6. package/.claude/agents/github/{swarm-issue.md → monoswarm-issue.md} +1 -1
  7. package/.claude/agents/github/{multi-repo-swarm.md → monoswarm-multi-repo.md} +1 -1
  8. package/.claude/agents/github/{swarm-pr.md → monoswarm-pr.md} +1 -1
  9. package/.claude/agents/github/pr-manager.md +1 -1
  10. package/.claude/agents/github/release-manager.md +1 -1
  11. package/.claude/agents/github/repo-architect.md +1 -1
  12. package/.claude/agents/github/sync-coordinator.md +4 -4
  13. package/.claude/agents/{hive-mind → monoswarm}/collective-intelligence-coordinator.md +9 -16
  14. package/.claude/agents/{swarm → monoswarm}/mesh-coordinator.md +19 -24
  15. package/.claude/agents/{hive-mind/swarm-memory-manager.md → monoswarm/monoswarm-memory-manager.md} +1 -1
  16. package/.claude/agents/templates/{coordinator-swarm-init.md → coordinator-monoswarm-init.md} +1 -1
  17. package/.claude/agents/testing/{tdd-london-swarm.md → tdd-london-monoswarm.md} +2 -2
  18. package/.claude/commands/agents/agent-coordination.md +3 -3
  19. package/.claude/commands/agents/agent-types.md +1 -1
  20. package/.claude/commands/automation/self-healing.md +1 -1
  21. package/.claude/commands/automation/smart-spawn.md +1 -1
  22. package/.claude/commands/coordination/README.md +1 -1
  23. package/.claude/commands/coordination/{swarm-init.md → monoswarm-init.md} +2 -2
  24. package/.claude/commands/coordination/task-orchestrate.md +4 -4
  25. package/.claude/commands/github/README.md +1 -1
  26. package/.claude/commands/github/issue-tracker.md +2 -2
  27. package/.claude/commands/github/pr-manager.md +1 -1
  28. package/.claude/commands/github/release-manager.md +1 -1
  29. package/.claude/commands/github/repo-architect.md +1 -1
  30. package/.claude/commands/github/sync-coordinator.md +2 -2
  31. package/.claude/commands/hooks/README.md +1 -2
  32. package/.claude/commands/hooks/overview.md +1 -2
  33. package/.claude/commands/hooks/setup.md +0 -3
  34. package/.claude/commands/mastermind/createtask.md +2 -2
  35. package/.claude/commands/mastermind/do.md +3 -3
  36. package/.claude/commands/mastermind/help.md +2 -2
  37. package/.claude/commands/mastermind/ideate.md +1 -1
  38. package/.claude/commands/mastermind/improve.md +1 -1
  39. package/.claude/commands/mastermind/memory.md +2 -2
  40. package/.claude/commands/mastermind/{swarm.md → monoswarm.md} +13 -26
  41. package/.claude/commands/mastermind/topology.md +1 -1
  42. package/.claude/commands/memory/README.md +2 -2
  43. package/.claude/commands/memory/memory-search.md +1 -1
  44. package/.claude/commands/monoswarm/README.md +59 -0
  45. package/.claude/commands/monoswarm/consensus.md +61 -0
  46. package/.claude/commands/monoswarm/init.md +68 -0
  47. package/.claude/commands/monoswarm/memory.md +55 -0
  48. package/.claude/commands/monoswarm/monoswarm.md +139 -0
  49. package/.claude/commands/{swarm → monoswarm}/research.md +2 -2
  50. package/.claude/commands/monoswarm/spawn.md +49 -0
  51. package/.claude/commands/monoswarm/status.md +48 -0
  52. package/.claude/commands/monoswarm/stop.md +46 -0
  53. package/.claude/commands/optimization/auto-topology.md +9 -9
  54. package/.claude/commands/stream-chain/run.md +1 -1
  55. package/.claude/commands/workflows/development.md +1 -1
  56. package/.claude/commands/workflows/research.md +2 -2
  57. package/.claude/helpers/audit-log-writer.cjs +72 -0
  58. package/.claude/helpers/control-start.cjs +84 -26
  59. package/.claude/helpers/handlers/agent-start-handler.cjs +5 -5
  60. package/.claude/helpers/handlers/gates-handler.cjs +31 -10
  61. package/.claude/helpers/handlers/session-restore-handler.cjs +1 -1
  62. package/.claude/helpers/handlers/task-handler.cjs +4 -4
  63. package/.claude/helpers/skill-registry.json +4718 -3669
  64. package/.claude/helpers/statusline.cjs +21 -21
  65. package/.claude/helpers/token-tracker.cjs +0 -6
  66. package/.claude/settings.json +2 -3
  67. package/.claude/skills/hooks-automation/SKILL.md +5 -5
  68. package/.claude/skills/mastermind-protocol/SKILL.md +3 -3
  69. package/.claude/skills/memory-toolkit/SKILL.md +2 -2
  70. package/.claude/skills/{swarm-orchestration → monoswarm}/SKILL.md +106 -42
  71. package/.claude/skills/specialagent/SKILL.md +1 -1
  72. package/README.md +31 -12
  73. package/dist/src/agents/registry-builder.d.ts.map +1 -1
  74. package/dist/src/agents/registry-builder.js +8 -9
  75. package/dist/src/agents/registry-builder.js.map +1 -1
  76. package/dist/src/autopilot-state.d.ts +0 -16
  77. package/dist/src/autopilot-state.d.ts.map +1 -1
  78. package/dist/src/autopilot-state.js +6 -21
  79. package/dist/src/autopilot-state.js.map +1 -1
  80. package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -1
  81. package/dist/src/browser/action-builder/analyzer.js +6 -6
  82. package/dist/src/browser/action-builder/analyzer.js.map +1 -1
  83. package/dist/src/browser/action-builder/types.d.ts.map +1 -1
  84. package/dist/src/browser/adapters/gemini.d.ts.map +1 -1
  85. package/dist/src/browser/adapters/index.d.ts.map +1 -1
  86. package/dist/src/browser/adapters/index.js +2 -2
  87. package/dist/src/browser/adapters/index.js.map +1 -1
  88. package/dist/src/browser/adapters/instagram.d.ts.map +1 -1
  89. package/dist/src/browser/adapters/linkedin.d.ts.map +1 -1
  90. package/dist/src/browser/adapters/linkedin.js +9 -1
  91. package/dist/src/browser/adapters/linkedin.js.map +1 -1
  92. package/dist/src/browser/adapters/x.d.ts.map +1 -1
  93. package/dist/src/browser/adapters/x.js +14 -2
  94. package/dist/src/browser/adapters/x.js.map +1 -1
  95. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  96. package/dist/src/browser/dashboard/server.js +23 -13
  97. package/dist/src/browser/dashboard/server.js.map +1 -1
  98. package/dist/src/browser/dashboard/ui.html +5 -5
  99. package/dist/src/browser/workflow/engine.d.ts +1 -1
  100. package/dist/src/browser/workflow/engine.d.ts.map +1 -1
  101. package/dist/src/browser/workflow/engine.js +74 -25
  102. package/dist/src/browser/workflow/engine.js.map +1 -1
  103. package/dist/src/browser/workflow/store.d.ts +1 -1
  104. package/dist/src/browser/workflow/store.d.ts.map +1 -1
  105. package/dist/src/browser/workflow/store.js +54 -26
  106. package/dist/src/browser/workflow/store.js.map +1 -1
  107. package/dist/src/browser/workflow/types.d.ts.map +1 -1
  108. package/dist/src/capabilities/cap-code.d.ts.map +1 -1
  109. package/dist/src/capabilities/cap-code.js.map +1 -1
  110. package/dist/src/capabilities/cap-data.d.ts.map +1 -1
  111. package/dist/src/capabilities/cap-data.js +28 -8
  112. package/dist/src/capabilities/cap-data.js.map +1 -1
  113. package/dist/src/capabilities/cap-documents.d.ts.map +1 -1
  114. package/dist/src/capabilities/cap-documents.js +136 -54
  115. package/dist/src/capabilities/cap-documents.js.map +1 -1
  116. package/dist/src/capabilities/cap-graph.d.ts.map +1 -1
  117. package/dist/src/capabilities/cap-graph.js +3 -3
  118. package/dist/src/capabilities/cap-graph.js.map +1 -1
  119. package/dist/src/capabilities/cap-media.d.ts.map +1 -1
  120. package/dist/src/capabilities/cap-media.js +1 -1
  121. package/dist/src/capabilities/cap-media.js.map +1 -1
  122. package/dist/src/capabilities/cap-timeline.d.ts.map +1 -1
  123. package/dist/src/capabilities/cap-timeline.js +33 -7
  124. package/dist/src/capabilities/cap-timeline.js.map +1 -1
  125. package/dist/src/capabilities/index.d.ts +5 -5
  126. package/dist/src/capabilities/index.d.ts.map +1 -1
  127. package/dist/src/capabilities/index.js +5 -5
  128. package/dist/src/capabilities/index.js.map +1 -1
  129. package/dist/src/capabilities/manager.d.ts.map +1 -1
  130. package/dist/src/capabilities/manager.js +6 -6
  131. package/dist/src/capabilities/manager.js.map +1 -1
  132. package/dist/src/capabilities/scanner.d.ts.map +1 -1
  133. package/dist/src/capabilities/scanner.js +103 -14
  134. package/dist/src/capabilities/scanner.js.map +1 -1
  135. package/dist/src/commands/agent-lifecycle.d.ts.map +1 -1
  136. package/dist/src/commands/agent-lifecycle.js +120 -41
  137. package/dist/src/commands/agent-lifecycle.js.map +1 -1
  138. package/dist/src/commands/agent-ops.d.ts.map +1 -1
  139. package/dist/src/commands/agent-ops.js +107 -41
  140. package/dist/src/commands/agent-ops.js.map +1 -1
  141. package/dist/src/commands/agent.d.ts.map +1 -1
  142. package/dist/src/commands/agent.js +11 -3
  143. package/dist/src/commands/agent.js.map +1 -1
  144. package/dist/src/commands/analyze-ast.d.ts +1 -1
  145. package/dist/src/commands/analyze-ast.d.ts.map +1 -1
  146. package/dist/src/commands/analyze-ast.js +47 -41
  147. package/dist/src/commands/analyze-ast.js.map +1 -1
  148. package/dist/src/commands/analyze-diff.d.ts.map +1 -1
  149. package/dist/src/commands/analyze-diff.js +147 -35
  150. package/dist/src/commands/analyze-diff.js.map +1 -1
  151. package/dist/src/commands/analyze-imports.d.ts.map +1 -1
  152. package/dist/src/commands/analyze-imports.js +74 -30
  153. package/dist/src/commands/analyze-imports.js.map +1 -1
  154. package/dist/src/commands/analyze-symbols.d.ts.map +1 -1
  155. package/dist/src/commands/analyze-symbols.js +55 -41
  156. package/dist/src/commands/analyze-symbols.js.map +1 -1
  157. package/dist/src/commands/analyze.d.ts +19 -6
  158. package/dist/src/commands/analyze.d.ts.map +1 -1
  159. package/dist/src/commands/analyze.js +90 -28
  160. package/dist/src/commands/analyze.js.map +1 -1
  161. package/dist/src/commands/autopilot.d.ts.map +1 -1
  162. package/dist/src/commands/autopilot.js +5 -90
  163. package/dist/src/commands/autopilot.js.map +1 -1
  164. package/dist/src/commands/browse-action.d.ts.map +1 -1
  165. package/dist/src/commands/browse-action.js +65 -17
  166. package/dist/src/commands/browse-action.js.map +1 -1
  167. package/dist/src/commands/browse-platform.d.ts.map +1 -1
  168. package/dist/src/commands/browse-platform.js +13 -10
  169. package/dist/src/commands/browse-platform.js.map +1 -1
  170. package/dist/src/commands/browse-workflow.d.ts.map +1 -1
  171. package/dist/src/commands/browse-workflow.js +54 -20
  172. package/dist/src/commands/browse-workflow.js.map +1 -1
  173. package/dist/src/commands/browse.d.ts +1 -1
  174. package/dist/src/commands/browse.js +2 -2
  175. package/dist/src/commands/browse.js.map +1 -1
  176. package/dist/src/commands/cleanup.d.ts.map +1 -1
  177. package/dist/src/commands/cleanup.js +115 -49
  178. package/dist/src/commands/cleanup.js.map +1 -1
  179. package/dist/src/commands/completions.d.ts.map +1 -1
  180. package/dist/src/commands/completions.js +34 -21
  181. package/dist/src/commands/completions.js.map +1 -1
  182. package/dist/src/commands/config.d.ts.map +1 -1
  183. package/dist/src/commands/config.js +95 -54
  184. package/dist/src/commands/config.js.map +1 -1
  185. package/dist/src/commands/crash-reporting.d.ts.map +1 -1
  186. package/dist/src/commands/crash-reporting.js +10 -4
  187. package/dist/src/commands/crash-reporting.js.map +1 -1
  188. package/dist/src/commands/design-detect.d.ts.map +1 -1
  189. package/dist/src/commands/design-detect.js +33 -12
  190. package/dist/src/commands/design-detect.js.map +1 -1
  191. package/dist/src/commands/design-palette.d.ts.map +1 -1
  192. package/dist/src/commands/design-palette.js +770 -380
  193. package/dist/src/commands/design-palette.js.map +1 -1
  194. package/dist/src/commands/doc.d.ts.map +1 -1
  195. package/dist/src/commands/doc.js +272 -60
  196. package/dist/src/commands/doc.js.map +1 -1
  197. package/dist/src/commands/doctor-env-checks.d.ts.map +1 -1
  198. package/dist/src/commands/doctor-env-checks.js +130 -31
  199. package/dist/src/commands/doctor-env-checks.js.map +1 -1
  200. package/dist/src/commands/doctor-monoes-checks.d.ts.map +1 -1
  201. package/dist/src/commands/doctor-monoes-checks.js +20 -7
  202. package/dist/src/commands/doctor-monoes-checks.js.map +1 -1
  203. package/dist/src/commands/doctor-project-checks.d.ts +7 -0
  204. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  205. package/dist/src/commands/doctor-project-checks.js +476 -114
  206. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  207. package/dist/src/commands/doctor.d.ts.map +1 -1
  208. package/dist/src/commands/doctor.js +139 -60
  209. package/dist/src/commands/doctor.js.map +1 -1
  210. package/dist/src/commands/download-embeddings.d.ts.map +1 -1
  211. package/dist/src/commands/download-embeddings.js +1 -1
  212. package/dist/src/commands/download-embeddings.js.map +1 -1
  213. package/dist/src/commands/events.d.ts.map +1 -1
  214. package/dist/src/commands/events.js +5 -2
  215. package/dist/src/commands/events.js.map +1 -1
  216. package/dist/src/commands/guidance.d.ts.map +1 -1
  217. package/dist/src/commands/guidance.js +38 -14
  218. package/dist/src/commands/guidance.js.map +1 -1
  219. package/dist/src/commands/hooks-core-commands.d.ts.map +1 -1
  220. package/dist/src/commands/hooks-core-commands.js +71 -44
  221. package/dist/src/commands/hooks-core-commands.js.map +1 -1
  222. package/dist/src/commands/hooks-coverage-commands.d.ts +1 -2
  223. package/dist/src/commands/hooks-coverage-commands.d.ts.map +1 -1
  224. package/dist/src/commands/hooks-coverage-commands.js +140 -58
  225. package/dist/src/commands/hooks-coverage-commands.js.map +1 -1
  226. package/dist/src/commands/hooks-coverage-gaps.d.ts.map +1 -1
  227. package/dist/src/commands/hooks-coverage-gaps.js +74 -36
  228. package/dist/src/commands/hooks-coverage-gaps.js.map +1 -1
  229. package/dist/src/commands/hooks-coverage-routing.d.ts.map +1 -1
  230. package/dist/src/commands/hooks-coverage-routing.js +139 -66
  231. package/dist/src/commands/hooks-coverage-routing.js.map +1 -1
  232. package/dist/src/commands/hooks-coverage-utils.d.ts.map +1 -1
  233. package/dist/src/commands/hooks-coverage-utils.js +27 -8
  234. package/dist/src/commands/hooks-coverage-utils.js.map +1 -1
  235. package/dist/src/commands/hooks-extended-commands.d.ts.map +1 -1
  236. package/dist/src/commands/hooks-extended-commands.js +86 -21
  237. package/dist/src/commands/hooks-extended-commands.js.map +1 -1
  238. package/dist/src/commands/hooks-routing-commands.d.ts +1 -2
  239. package/dist/src/commands/hooks-routing-commands.d.ts.map +1 -1
  240. package/dist/src/commands/hooks-routing-commands.js +175 -183
  241. package/dist/src/commands/hooks-routing-commands.js.map +1 -1
  242. package/dist/src/commands/hooks-workers.d.ts.map +1 -1
  243. package/dist/src/commands/hooks-workers.js +111 -128
  244. package/dist/src/commands/hooks-workers.js.map +1 -1
  245. package/dist/src/commands/hooks.d.ts +1 -1
  246. package/dist/src/commands/hooks.d.ts.map +1 -1
  247. package/dist/src/commands/hooks.js +9 -12
  248. package/dist/src/commands/hooks.js.map +1 -1
  249. package/dist/src/commands/index.d.ts +1 -1
  250. package/dist/src/commands/index.d.ts.map +1 -1
  251. package/dist/src/commands/index.js +2 -2
  252. package/dist/src/commands/index.js.map +1 -1
  253. package/dist/src/commands/init-subcommands.d.ts.map +1 -1
  254. package/dist/src/commands/init-subcommands.js +16 -5
  255. package/dist/src/commands/init-subcommands.js.map +1 -1
  256. package/dist/src/commands/init-upgrade.d.ts.map +1 -1
  257. package/dist/src/commands/init-upgrade.js +46 -23
  258. package/dist/src/commands/init-upgrade.js.map +1 -1
  259. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  260. package/dist/src/commands/init-wizard.js +161 -44
  261. package/dist/src/commands/init-wizard.js.map +1 -1
  262. package/dist/src/commands/init.d.ts.map +1 -1
  263. package/dist/src/commands/init.js +179 -64
  264. package/dist/src/commands/init.js.map +1 -1
  265. package/dist/src/commands/mcp.d.ts +1 -0
  266. package/dist/src/commands/mcp.d.ts.map +1 -1
  267. package/dist/src/commands/mcp.js +229 -134
  268. package/dist/src/commands/mcp.js.map +1 -1
  269. package/dist/src/commands/memory-admin.d.ts.map +1 -1
  270. package/dist/src/commands/memory-admin.js +67 -48
  271. package/dist/src/commands/memory-admin.js.map +1 -1
  272. package/dist/src/commands/memory-crud.d.ts.map +1 -1
  273. package/dist/src/commands/memory-crud.js +97 -60
  274. package/dist/src/commands/memory-crud.js.map +1 -1
  275. package/dist/src/commands/memory-list.d.ts.map +1 -1
  276. package/dist/src/commands/memory-list.js +6 -6
  277. package/dist/src/commands/memory-list.js.map +1 -1
  278. package/dist/src/commands/memory-transfer.d.ts.map +1 -1
  279. package/dist/src/commands/memory-transfer.js +46 -23
  280. package/dist/src/commands/memory-transfer.js.map +1 -1
  281. package/dist/src/commands/memory.d.ts.map +1 -1
  282. package/dist/src/commands/memory.js +63 -35
  283. package/dist/src/commands/memory.js.map +1 -1
  284. package/dist/src/commands/monograph.d.ts.map +1 -1
  285. package/dist/src/commands/monograph.js +170 -57
  286. package/dist/src/commands/monograph.js.map +1 -1
  287. package/dist/src/commands/monoswarm.d.ts +8 -0
  288. package/dist/src/commands/monoswarm.d.ts.map +1 -0
  289. package/dist/src/commands/{swarm.js → monoswarm.js} +93 -315
  290. package/dist/src/commands/monoswarm.js.map +1 -0
  291. package/dist/src/commands/neural-core.d.ts.map +1 -1
  292. package/dist/src/commands/neural-core.js +123 -32
  293. package/dist/src/commands/neural-core.js.map +1 -1
  294. package/dist/src/commands/neural-optimize.d.ts.map +1 -1
  295. package/dist/src/commands/neural-optimize.js +95 -130
  296. package/dist/src/commands/neural-optimize.js.map +1 -1
  297. package/dist/src/commands/neural-registry.d.ts +1 -2
  298. package/dist/src/commands/neural-registry.d.ts.map +1 -1
  299. package/dist/src/commands/neural-registry.js +70 -181
  300. package/dist/src/commands/neural-registry.js.map +1 -1
  301. package/dist/src/commands/org-observe.d.ts +13 -3
  302. package/dist/src/commands/org-observe.d.ts.map +1 -1
  303. package/dist/src/commands/org-observe.js +308 -131
  304. package/dist/src/commands/org-observe.js.map +1 -1
  305. package/dist/src/commands/org-visualize.d.ts.map +1 -1
  306. package/dist/src/commands/org-visualize.js +10 -5
  307. package/dist/src/commands/org-visualize.js.map +1 -1
  308. package/dist/src/commands/org.d.ts +15 -1
  309. package/dist/src/commands/org.d.ts.map +1 -1
  310. package/dist/src/commands/org.js +663 -193
  311. package/dist/src/commands/org.js.map +1 -1
  312. package/dist/src/commands/performance.d.ts.map +1 -1
  313. package/dist/src/commands/performance.js +232 -79
  314. package/dist/src/commands/performance.js.map +1 -1
  315. package/dist/src/commands/platforms.d.ts +1 -1
  316. package/dist/src/commands/platforms.d.ts.map +1 -1
  317. package/dist/src/commands/platforms.js +89 -49
  318. package/dist/src/commands/platforms.js.map +1 -1
  319. package/dist/src/commands/providers.d.ts.map +1 -1
  320. package/dist/src/commands/providers.js +31 -18
  321. package/dist/src/commands/providers.js.map +1 -1
  322. package/dist/src/commands/report-crash.d.ts.map +1 -1
  323. package/dist/src/commands/report-crash.js +17 -5
  324. package/dist/src/commands/report-crash.js.map +1 -1
  325. package/dist/src/commands/route.d.ts.map +1 -1
  326. package/dist/src/commands/route.js +123 -41
  327. package/dist/src/commands/route.js.map +1 -1
  328. package/dist/src/commands/search-universal.d.ts +1 -1
  329. package/dist/src/commands/search-universal.d.ts.map +1 -1
  330. package/dist/src/commands/search-universal.js +29 -14
  331. package/dist/src/commands/search-universal.js.map +1 -1
  332. package/dist/src/commands/security-cve.d.ts.map +1 -1
  333. package/dist/src/commands/security-cve.js +75 -34
  334. package/dist/src/commands/security-cve.js.map +1 -1
  335. package/dist/src/commands/security-misc.d.ts.map +1 -1
  336. package/dist/src/commands/security-misc.js +362 -102
  337. package/dist/src/commands/security-misc.js.map +1 -1
  338. package/dist/src/commands/security-scan.d.ts +13 -0
  339. package/dist/src/commands/security-scan.d.ts.map +1 -1
  340. package/dist/src/commands/security-scan.js +222 -57
  341. package/dist/src/commands/security-scan.js.map +1 -1
  342. package/dist/src/commands/security.d.ts.map +1 -1
  343. package/dist/src/commands/security.js +10 -3
  344. package/dist/src/commands/security.js.map +1 -1
  345. package/dist/src/commands/session.d.ts.map +1 -1
  346. package/dist/src/commands/session.js +81 -75
  347. package/dist/src/commands/session.js.map +1 -1
  348. package/dist/src/commands/start.d.ts.map +1 -1
  349. package/dist/src/commands/start.js +59 -129
  350. package/dist/src/commands/start.js.map +1 -1
  351. package/dist/src/commands/status.d.ts.map +1 -1
  352. package/dist/src/commands/status.js +151 -130
  353. package/dist/src/commands/status.js.map +1 -1
  354. package/dist/src/commands/task.d.ts.map +1 -1
  355. package/dist/src/commands/task.js +115 -84
  356. package/dist/src/commands/task.js.map +1 -1
  357. package/dist/src/commands/tokens.d.ts.map +1 -1
  358. package/dist/src/commands/tokens.js +67 -32
  359. package/dist/src/commands/tokens.js.map +1 -1
  360. package/dist/src/commands/update.d.ts.map +1 -1
  361. package/dist/src/commands/update.js +3 -5
  362. package/dist/src/commands/update.js.map +1 -1
  363. package/dist/src/consensus/audit-writer.d.ts +7 -2
  364. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  365. package/dist/src/consensus/audit-writer.js +19 -11
  366. package/dist/src/consensus/audit-writer.js.map +1 -1
  367. package/dist/src/consensus/tally.d.ts.map +1 -1
  368. package/dist/src/consensus/tally.js +2 -2
  369. package/dist/src/consensus/tally.js.map +1 -1
  370. package/dist/src/index.d.ts +7 -7
  371. package/dist/src/index.d.ts.map +1 -1
  372. package/dist/src/index.js +51 -43
  373. package/dist/src/index.js.map +1 -1
  374. package/dist/src/init/claudemd-generator.d.ts +1 -1
  375. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  376. package/dist/src/init/claudemd-generator.js +52 -36
  377. package/dist/src/init/claudemd-generator.js.map +1 -1
  378. package/dist/src/init/codex-generator.d.ts +16 -0
  379. package/dist/src/init/codex-generator.d.ts.map +1 -0
  380. package/dist/src/init/codex-generator.js +180 -0
  381. package/dist/src/init/codex-generator.js.map +1 -0
  382. package/dist/src/init/copy-assets.d.ts.map +1 -1
  383. package/dist/src/init/copy-assets.js +17 -20
  384. package/dist/src/init/copy-assets.js.map +1 -1
  385. package/dist/src/init/executor.d.ts +1 -1
  386. package/dist/src/init/executor.d.ts.map +1 -1
  387. package/dist/src/init/executor.js +56 -29
  388. package/dist/src/init/executor.js.map +1 -1
  389. package/dist/src/init/geminimd-generator.d.ts +1 -1
  390. package/dist/src/init/geminimd-generator.d.ts.map +1 -1
  391. package/dist/src/init/geminimd-generator.js +2 -2
  392. package/dist/src/init/geminimd-generator.js.map +1 -1
  393. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  394. package/dist/src/init/helpers-generator.js +7 -7
  395. package/dist/src/init/helpers-generator.js.map +1 -1
  396. package/dist/src/init/index.d.ts +8 -7
  397. package/dist/src/init/index.d.ts.map +1 -1
  398. package/dist/src/init/index.js +9 -8
  399. package/dist/src/init/index.js.map +1 -1
  400. package/dist/src/init/kimi-generator.d.ts +1 -1
  401. package/dist/src/init/kimi-generator.d.ts.map +1 -1
  402. package/dist/src/init/kimi-generator.js +34 -28
  403. package/dist/src/init/kimi-generator.js.map +1 -1
  404. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  405. package/dist/src/init/mcp-generator.js +3 -11
  406. package/dist/src/init/mcp-generator.js.map +1 -1
  407. package/dist/src/init/opencode-generator.d.ts.map +1 -1
  408. package/dist/src/init/opencode-generator.js +35 -22
  409. package/dist/src/init/opencode-generator.js.map +1 -1
  410. package/dist/src/init/settings-generator.d.ts.map +1 -1
  411. package/dist/src/init/settings-generator.js +3 -7
  412. package/dist/src/init/settings-generator.js.map +1 -1
  413. package/dist/src/init/shared-instructions-generator.d.ts.map +1 -1
  414. package/dist/src/init/shared-instructions-generator.js +124 -76
  415. package/dist/src/init/shared-instructions-generator.js.map +1 -1
  416. package/dist/src/init/shared.d.ts.map +1 -1
  417. package/dist/src/init/shared.js +26 -25
  418. package/dist/src/init/shared.js.map +1 -1
  419. package/dist/src/init/statusline-generator.js +19 -19
  420. package/dist/src/init/types.d.ts +9 -10
  421. package/dist/src/init/types.d.ts.map +1 -1
  422. package/dist/src/init/types.js +10 -8
  423. package/dist/src/init/types.js.map +1 -1
  424. package/dist/src/init/upgrade.d.ts.map +1 -1
  425. package/dist/src/init/upgrade.js +24 -22
  426. package/dist/src/init/upgrade.js.map +1 -1
  427. package/dist/src/init/write-antigravity.d.ts.map +1 -1
  428. package/dist/src/init/write-antigravity.js +15 -7
  429. package/dist/src/init/write-antigravity.js.map +1 -1
  430. package/dist/src/init/write-capabilities.d.ts.map +1 -1
  431. package/dist/src/init/write-capabilities.js +39 -52
  432. package/dist/src/init/write-capabilities.js.map +1 -1
  433. package/dist/src/init/write-claude.d.ts.map +1 -1
  434. package/dist/src/init/write-claude.js +19 -15
  435. package/dist/src/init/write-claude.js.map +1 -1
  436. package/dist/src/init/write-codex.d.ts +4 -0
  437. package/dist/src/init/write-codex.d.ts.map +1 -0
  438. package/dist/src/init/write-codex.js +122 -0
  439. package/dist/src/init/write-codex.js.map +1 -0
  440. package/dist/src/init/write-kimicode.d.ts.map +1 -1
  441. package/dist/src/init/write-kimicode.js +10 -6
  442. package/dist/src/init/write-kimicode.js.map +1 -1
  443. package/dist/src/init/write-opencode.d.ts.map +1 -1
  444. package/dist/src/init/write-opencode.js +4 -4
  445. package/dist/src/init/write-opencode.js.map +1 -1
  446. package/dist/src/init/write-runtime-config.d.ts.map +1 -1
  447. package/dist/src/init/write-runtime-config.js +24 -24
  448. package/dist/src/init/write-runtime-config.js.map +1 -1
  449. package/dist/src/init/write-sample-org.js +1 -1
  450. package/dist/src/init/write-sample-org.js.map +1 -1
  451. package/dist/src/knowledge/document-pipeline.d.ts.map +1 -1
  452. package/dist/src/knowledge/document-pipeline.js +144 -48
  453. package/dist/src/knowledge/document-pipeline.js.map +1 -1
  454. package/dist/src/knowledge/eval/corpus.d.ts.map +1 -1
  455. package/dist/src/knowledge/eval/corpus.js +18 -9
  456. package/dist/src/knowledge/eval/corpus.js.map +1 -1
  457. package/dist/src/knowledge/eval/golden-set.d.ts.map +1 -1
  458. package/dist/src/knowledge/eval/golden-set.js +4286 -136
  459. package/dist/src/knowledge/eval/golden-set.js.map +1 -1
  460. package/dist/src/knowledge/eval/harness.d.ts +2 -2
  461. package/dist/src/knowledge/eval/harness.d.ts.map +1 -1
  462. package/dist/src/knowledge/eval/harness.js +163 -70
  463. package/dist/src/knowledge/eval/harness.js.map +1 -1
  464. package/dist/src/knowledge/eval/metrics.d.ts.map +1 -1
  465. package/dist/src/knowledge/eval/metrics.js +25 -18
  466. package/dist/src/knowledge/eval/metrics.js.map +1 -1
  467. package/dist/src/knowledge/eval/model-presence.d.ts.map +1 -1
  468. package/dist/src/knowledge/eval/model-presence.js +40 -14
  469. package/dist/src/knowledge/eval/model-presence.js.map +1 -1
  470. package/dist/src/knowledge/eval/network-guard.d.ts.map +1 -1
  471. package/dist/src/knowledge/eval/network-guard.js +22 -10
  472. package/dist/src/knowledge/eval/network-guard.js.map +1 -1
  473. package/dist/src/knowledge/eval/retrievers.d.ts.map +1 -1
  474. package/dist/src/knowledge/eval/retrievers.js +14 -10
  475. package/dist/src/knowledge/eval/retrievers.js.map +1 -1
  476. package/dist/src/knowledge/eval/signals.d.ts.map +1 -1
  477. package/dist/src/knowledge/eval/signals.js +54 -18
  478. package/dist/src/knowledge/eval/signals.js.map +1 -1
  479. package/dist/src/mcp-client.d.ts.map +1 -1
  480. package/dist/src/mcp-client.js +70 -35
  481. package/dist/src/mcp-client.js.map +1 -1
  482. package/dist/src/mcp-server.d.ts +1 -9
  483. package/dist/src/mcp-server.d.ts.map +1 -1
  484. package/dist/src/mcp-server.js +20 -43
  485. package/dist/src/mcp-server.js.map +1 -1
  486. package/dist/src/mcp-tools/agent-tools.d.ts +1 -1
  487. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  488. package/dist/src/mcp-tools/agent-tools.js +87 -52
  489. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  490. package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
  491. package/dist/src/mcp-tools/analyze-tools.js +34 -17
  492. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  493. package/dist/src/mcp-tools/auto-install.d.ts.map +1 -1
  494. package/dist/src/mcp-tools/auto-install.js +3 -3
  495. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  496. package/dist/src/mcp-tools/autopilot-tools.d.ts +1 -1
  497. package/dist/src/mcp-tools/autopilot-tools.d.ts.map +1 -1
  498. package/dist/src/mcp-tools/autopilot-tools.js +32 -70
  499. package/dist/src/mcp-tools/autopilot-tools.js.map +1 -1
  500. package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
  501. package/dist/src/mcp-tools/browser-tools.js +119 -37
  502. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  503. package/dist/src/mcp-tools/claims-tools.d.ts.map +1 -1
  504. package/dist/src/mcp-tools/claims-tools.js +100 -44
  505. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  506. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  507. package/dist/src/mcp-tools/config-tools.js +36 -15
  508. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  509. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  510. package/dist/src/mcp-tools/embeddings-tools.js +34 -23
  511. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  512. package/dist/src/mcp-tools/github-tools.d.ts.map +1 -1
  513. package/dist/src/mcp-tools/github-tools.js +200 -43
  514. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  515. package/dist/src/mcp-tools/graphify-tools.d.ts.map +1 -1
  516. package/dist/src/mcp-tools/graphify-tools.js +2 -2
  517. package/dist/src/mcp-tools/graphify-tools.js.map +1 -1
  518. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  519. package/dist/src/mcp-tools/guidance-tools.js +461 -115
  520. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  521. package/dist/src/mcp-tools/hooks-embedding.d.ts +0 -6
  522. package/dist/src/mcp-tools/hooks-embedding.d.ts.map +1 -1
  523. package/dist/src/mcp-tools/hooks-embedding.js +170 -59
  524. package/dist/src/mcp-tools/hooks-embedding.js.map +1 -1
  525. package/dist/src/mcp-tools/hooks-intelligence.d.ts +0 -9
  526. package/dist/src/mcp-tools/hooks-intelligence.d.ts.map +1 -1
  527. package/dist/src/mcp-tools/hooks-intelligence.js +64 -119
  528. package/dist/src/mcp-tools/hooks-intelligence.js.map +1 -1
  529. package/dist/src/mcp-tools/hooks-routing.d.ts +1 -2
  530. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  531. package/dist/src/mcp-tools/hooks-routing.js +92 -165
  532. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  533. package/dist/src/mcp-tools/hooks-tools.d.ts +1 -1
  534. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  535. package/dist/src/mcp-tools/hooks-tools.js +2 -4
  536. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  537. package/dist/src/mcp-tools/index.d.ts +18 -19
  538. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  539. package/dist/src/mcp-tools/index.js +18 -19
  540. package/dist/src/mcp-tools/index.js.map +1 -1
  541. package/dist/src/mcp-tools/knowledge-tools.d.ts.map +1 -1
  542. package/dist/src/mcp-tools/knowledge-tools.js +88 -28
  543. package/dist/src/mcp-tools/knowledge-tools.js.map +1 -1
  544. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  545. package/dist/src/mcp-tools/memory-tools.js +157 -40
  546. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  547. package/dist/src/mcp-tools/monodesign-tools.d.ts.map +1 -1
  548. package/dist/src/mcp-tools/monodesign-tools.js +63 -22
  549. package/dist/src/mcp-tools/monodesign-tools.js.map +1 -1
  550. package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts.map +1 -1
  551. package/dist/src/mcp-tools/monograph/agent-history-tools.js +22 -9
  552. package/dist/src/mcp-tools/monograph/agent-history-tools.js.map +1 -1
  553. package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -1
  554. package/dist/src/mcp-tools/monograph/build-tools.js +37 -16
  555. package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -1
  556. package/dist/src/mcp-tools/monograph/group-tools.d.ts.map +1 -1
  557. package/dist/src/mcp-tools/monograph/group-tools.js +57 -20
  558. package/dist/src/mcp-tools/monograph/group-tools.js.map +1 -1
  559. package/dist/src/mcp-tools/monograph/health-tools.d.ts.map +1 -1
  560. package/dist/src/mcp-tools/monograph/health-tools.js +13 -7
  561. package/dist/src/mcp-tools/monograph/health-tools.js.map +1 -1
  562. package/dist/src/mcp-tools/monograph/impact-tools.js +6 -6
  563. package/dist/src/mcp-tools/monograph/impact-tools.js.map +1 -1
  564. package/dist/src/mcp-tools/monograph/index.d.ts.map +1 -1
  565. package/dist/src/mcp-tools/monograph/index.js +8 -8
  566. package/dist/src/mcp-tools/monograph/index.js.map +1 -1
  567. package/dist/src/mcp-tools/monograph/query-tools.d.ts.map +1 -1
  568. package/dist/src/mcp-tools/monograph/query-tools.js +140 -65
  569. package/dist/src/mcp-tools/monograph/query-tools.js.map +1 -1
  570. package/dist/src/mcp-tools/monograph/shared.d.ts.map +1 -1
  571. package/dist/src/mcp-tools/monograph/shared.js +42 -22
  572. package/dist/src/mcp-tools/monograph/shared.js.map +1 -1
  573. package/dist/src/mcp-tools/monograph/visualize-tools.d.ts.map +1 -1
  574. package/dist/src/mcp-tools/monograph/visualize-tools.js +87 -36
  575. package/dist/src/mcp-tools/monograph/visualize-tools.js.map +1 -1
  576. package/dist/src/mcp-tools/monograph-compat.d.ts.map +1 -1
  577. package/dist/src/mcp-tools/monograph-compat.js +25 -14
  578. package/dist/src/mcp-tools/monograph-compat.js.map +1 -1
  579. package/dist/src/mcp-tools/monograph-tools.d.ts +1 -1
  580. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  581. package/dist/src/mcp-tools/monograph-tools.js +1 -1
  582. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  583. package/dist/src/mcp-tools/monomind-tools.d.ts.map +1 -1
  584. package/dist/src/mcp-tools/monomind-tools.js +1 -1
  585. package/dist/src/mcp-tools/monomind-tools.js.map +1 -1
  586. package/dist/src/mcp-tools/monoswarm-tools.d.ts +17 -0
  587. package/dist/src/mcp-tools/monoswarm-tools.d.ts.map +1 -0
  588. package/dist/src/mcp-tools/monoswarm-tools.js +1289 -0
  589. package/dist/src/mcp-tools/monoswarm-tools.js.map +1 -0
  590. package/dist/src/mcp-tools/performance-tools.d.ts.map +1 -1
  591. package/dist/src/mcp-tools/performance-tools.js +305 -101
  592. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  593. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts.map +1 -1
  594. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +9 -4
  595. package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js.map +1 -1
  596. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +1 -1
  597. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -1
  598. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +36 -14
  599. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js.map +1 -1
  600. package/dist/src/mcp-tools/quality-tools.d.ts.map +1 -1
  601. package/dist/src/mcp-tools/quality-tools.js.map +1 -1
  602. package/dist/src/mcp-tools/request-tracker.d.ts.map +1 -1
  603. package/dist/src/mcp-tools/request-tracker.js +2 -1
  604. package/dist/src/mcp-tools/request-tracker.js.map +1 -1
  605. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  606. package/dist/src/mcp-tools/security-tools.js +117 -53
  607. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  608. package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
  609. package/dist/src/mcp-tools/session-tools.js +22 -13
  610. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  611. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  612. package/dist/src/mcp-tools/system-tools.js +37 -20
  613. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  614. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  615. package/dist/src/mcp-tools/task-tools.js +59 -22
  616. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  617. package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
  618. package/dist/src/mcp-tools/terminal-tools.js +43 -16
  619. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  620. package/dist/src/mcp-tools/transfer-tools.d.ts +8 -12
  621. package/dist/src/mcp-tools/transfer-tools.d.ts.map +1 -1
  622. package/dist/src/mcp-tools/transfer-tools.js +11 -14
  623. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  624. package/dist/src/mcp-tools/types.d.ts +1 -1
  625. package/dist/src/mcp-tools/types.d.ts.map +1 -1
  626. package/dist/src/mcp-tools/types.js +1 -1
  627. package/dist/src/mcp-tools/types.js.map +1 -1
  628. package/dist/src/memory/bm25-index.d.ts.map +1 -1
  629. package/dist/src/memory/bm25-index.js.map +1 -1
  630. package/dist/src/memory/embedding-operations.d.ts.map +1 -1
  631. package/dist/src/memory/embedding-operations.js +23 -56
  632. package/dist/src/memory/embedding-operations.js.map +1 -1
  633. package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
  634. package/dist/src/memory/ewc-consolidation.js +31 -27
  635. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  636. package/dist/src/memory/hnsw-operations.d.ts +15 -75
  637. package/dist/src/memory/hnsw-operations.d.ts.map +1 -1
  638. package/dist/src/memory/hnsw-operations.js +27 -268
  639. package/dist/src/memory/hnsw-operations.js.map +1 -1
  640. package/dist/src/memory/intelligence.d.ts +2 -2
  641. package/dist/src/memory/intelligence.d.ts.map +1 -1
  642. package/dist/src/memory/intelligence.js +130 -91
  643. package/dist/src/memory/intelligence.js.map +1 -1
  644. package/dist/src/memory/memory-bridge.d.ts +24 -24
  645. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  646. package/dist/src/memory/memory-bridge.js +40 -41
  647. package/dist/src/memory/memory-bridge.js.map +1 -1
  648. package/dist/src/memory/memory-crud.d.ts +1 -1
  649. package/dist/src/memory/memory-crud.d.ts.map +1 -1
  650. package/dist/src/memory/memory-crud.js +82 -67
  651. package/dist/src/memory/memory-crud.js.map +1 -1
  652. package/dist/src/memory/memory-initializer.d.ts +7 -8
  653. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  654. package/dist/src/memory/memory-initializer.js +38 -35
  655. package/dist/src/memory/memory-initializer.js.map +1 -1
  656. package/dist/src/memory/memory-kg.d.ts.map +1 -1
  657. package/dist/src/memory/memory-kg.js +173 -41
  658. package/dist/src/memory/memory-kg.js.map +1 -1
  659. package/dist/src/memory/memory-migrations.d.ts.map +1 -1
  660. package/dist/src/memory/memory-migrations.js +11 -7
  661. package/dist/src/memory/memory-migrations.js.map +1 -1
  662. package/dist/src/memory/memory-read.d.ts.map +1 -1
  663. package/dist/src/memory/memory-read.js +50 -35
  664. package/dist/src/memory/memory-read.js.map +1 -1
  665. package/dist/src/memory/query-router.d.ts.map +1 -1
  666. package/dist/src/memory/query-router.js +29 -12
  667. package/dist/src/memory/query-router.js.map +1 -1
  668. package/dist/src/memory/sona-optimizer.d.ts +1 -1
  669. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  670. package/dist/src/memory/sona-optimizer.js +164 -42
  671. package/dist/src/memory/sona-optimizer.js.map +1 -1
  672. package/dist/src/memory/text-tokens.d.ts.map +1 -1
  673. package/dist/src/memory/text-tokens.js +78 -8
  674. package/dist/src/memory/text-tokens.js.map +1 -1
  675. package/dist/src/monovector/command-outcomes.d.ts.map +1 -1
  676. package/dist/src/monovector/command-outcomes.js +23 -8
  677. package/dist/src/monovector/command-outcomes.js.map +1 -1
  678. package/dist/src/monovector/coverage-router.d.ts.map +1 -1
  679. package/dist/src/monovector/coverage-router.js +29 -14
  680. package/dist/src/monovector/coverage-router.js.map +1 -1
  681. package/dist/src/monovector/coverage-tools.d.ts.map +1 -1
  682. package/dist/src/monovector/coverage-tools.js +21 -6
  683. package/dist/src/monovector/coverage-tools.js.map +1 -1
  684. package/dist/src/monovector/diff-classifier.d.ts +1 -1
  685. package/dist/src/monovector/diff-classifier.d.ts.map +1 -1
  686. package/dist/src/monovector/diff-classifier.js +100 -45
  687. package/dist/src/monovector/diff-classifier.js.map +1 -1
  688. package/dist/src/monovector/index.d.ts +3 -4
  689. package/dist/src/monovector/index.d.ts.map +1 -1
  690. package/dist/src/monovector/index.js +18 -6
  691. package/dist/src/monovector/index.js.map +1 -1
  692. package/dist/src/monovector/init-state.d.ts.map +1 -1
  693. package/dist/src/monovector/init-state.js +15 -5
  694. package/dist/src/monovector/init-state.js.map +1 -1
  695. package/dist/src/monovector/model-outcomes.d.ts +25 -0
  696. package/dist/src/monovector/model-outcomes.d.ts.map +1 -0
  697. package/dist/src/monovector/model-outcomes.js +113 -0
  698. package/dist/src/monovector/model-outcomes.js.map +1 -0
  699. package/dist/src/monovector/route-outcomes.d.ts.map +1 -1
  700. package/dist/src/monovector/route-outcomes.js +40 -21
  701. package/dist/src/monovector/route-outcomes.js.map +1 -1
  702. package/dist/src/observability/replay-reader.d.ts.map +1 -1
  703. package/dist/src/observability/replay-reader.js +6 -8
  704. package/dist/src/observability/replay-reader.js.map +1 -1
  705. package/dist/src/orgrt/agent-runner.d.ts +9 -3
  706. package/dist/src/orgrt/agent-runner.d.ts.map +1 -1
  707. package/dist/src/orgrt/agent-runner.js +1 -1
  708. package/dist/src/orgrt/agent-runner.js.map +1 -1
  709. package/dist/src/orgrt/antigravity-runner.d.ts +26 -3
  710. package/dist/src/orgrt/antigravity-runner.d.ts.map +1 -1
  711. package/dist/src/orgrt/antigravity-runner.js +295 -125
  712. package/dist/src/orgrt/antigravity-runner.js.map +1 -1
  713. package/dist/src/orgrt/approvals.d.ts.map +1 -1
  714. package/dist/src/orgrt/approvals.js +32 -8
  715. package/dist/src/orgrt/approvals.js.map +1 -1
  716. package/dist/src/orgrt/broker.d.ts.map +1 -1
  717. package/dist/src/orgrt/broker.js +11 -4
  718. package/dist/src/orgrt/broker.js.map +1 -1
  719. package/dist/src/orgrt/bus.d.ts.map +1 -1
  720. package/dist/src/orgrt/bus.js +28 -15
  721. package/dist/src/orgrt/bus.js.map +1 -1
  722. package/dist/src/orgrt/checkpoint-ops.d.ts +10 -16
  723. package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -1
  724. package/dist/src/orgrt/checkpoint-ops.js +47 -36
  725. package/dist/src/orgrt/checkpoint-ops.js.map +1 -1
  726. package/dist/src/orgrt/checkpoint.d.ts +12 -1
  727. package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
  728. package/dist/src/orgrt/checkpoint.js +22 -4
  729. package/dist/src/orgrt/checkpoint.js.map +1 -1
  730. package/dist/src/orgrt/codex-runner.d.ts +27 -3
  731. package/dist/src/orgrt/codex-runner.d.ts.map +1 -1
  732. package/dist/src/orgrt/codex-runner.js +387 -129
  733. package/dist/src/orgrt/codex-runner.js.map +1 -1
  734. package/dist/src/orgrt/copilot-runner.d.ts +1 -1
  735. package/dist/src/orgrt/copilot-runner.d.ts.map +1 -1
  736. package/dist/src/orgrt/copilot-runner.js +60 -18
  737. package/dist/src/orgrt/copilot-runner.js.map +1 -1
  738. package/dist/src/orgrt/cross-org.d.ts.map +1 -1
  739. package/dist/src/orgrt/cross-org.js +224 -41
  740. package/dist/src/orgrt/cross-org.js.map +1 -1
  741. package/dist/src/orgrt/crush-runner.d.ts +5 -2
  742. package/dist/src/orgrt/crush-runner.d.ts.map +1 -1
  743. package/dist/src/orgrt/crush-runner.js +93 -47
  744. package/dist/src/orgrt/crush-runner.js.map +1 -1
  745. package/dist/src/orgrt/daemon.d.ts +42 -30
  746. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  747. package/dist/src/orgrt/daemon.js +199 -69
  748. package/dist/src/orgrt/daemon.js.map +1 -1
  749. package/dist/src/orgrt/decisions.d.ts +3 -2
  750. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  751. package/dist/src/orgrt/decisions.js +101 -32
  752. package/dist/src/orgrt/decisions.js.map +1 -1
  753. package/dist/src/orgrt/fence.d.ts +2 -2
  754. package/dist/src/orgrt/fence.d.ts.map +1 -1
  755. package/dist/src/orgrt/fence.js +13 -5
  756. package/dist/src/orgrt/fence.js.map +1 -1
  757. package/dist/src/orgrt/forwarder.js +1 -1
  758. package/dist/src/orgrt/forwarder.js.map +1 -1
  759. package/dist/src/orgrt/grok-runner.d.ts +1 -1
  760. package/dist/src/orgrt/grok-runner.d.ts.map +1 -1
  761. package/dist/src/orgrt/grok-runner.js +75 -30
  762. package/dist/src/orgrt/grok-runner.js.map +1 -1
  763. package/dist/src/orgrt/inbox.d.ts.map +1 -1
  764. package/dist/src/orgrt/inbox.js +5 -3
  765. package/dist/src/orgrt/inbox.js.map +1 -1
  766. package/dist/src/orgrt/kimicode-runner.d.ts +54 -8
  767. package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
  768. package/dist/src/orgrt/kimicode-runner.js +278 -151
  769. package/dist/src/orgrt/kimicode-runner.js.map +1 -1
  770. package/dist/src/orgrt/mailbox.d.ts +26 -1
  771. package/dist/src/orgrt/mailbox.d.ts.map +1 -1
  772. package/dist/src/orgrt/mailbox.js +88 -6
  773. package/dist/src/orgrt/mailbox.js.map +1 -1
  774. package/dist/src/orgrt/migrate.d.ts.map +1 -1
  775. package/dist/src/orgrt/migrate.js +38 -25
  776. package/dist/src/orgrt/migrate.js.map +1 -1
  777. package/dist/src/orgrt/opencode-runner.d.ts +1 -1
  778. package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
  779. package/dist/src/orgrt/opencode-runner.js +16 -5
  780. package/dist/src/orgrt/opencode-runner.js.map +1 -1
  781. package/dist/src/orgrt/org-memory.d.ts +2 -2
  782. package/dist/src/orgrt/org-memory.d.ts.map +1 -1
  783. package/dist/src/orgrt/org-memory.js +66 -26
  784. package/dist/src/orgrt/org-memory.js.map +1 -1
  785. package/dist/src/orgrt/pi-rpc-runner.d.ts +1 -1
  786. package/dist/src/orgrt/pi-rpc-runner.d.ts.map +1 -1
  787. package/dist/src/orgrt/pi-rpc-runner.js +134 -114
  788. package/dist/src/orgrt/pi-rpc-runner.js.map +1 -1
  789. package/dist/src/orgrt/pi-runner.d.ts +1 -1
  790. package/dist/src/orgrt/pi-runner.d.ts.map +1 -1
  791. package/dist/src/orgrt/pi-runner.js +35 -16
  792. package/dist/src/orgrt/pi-runner.js.map +1 -1
  793. package/dist/src/orgrt/policy.d.ts +11 -0
  794. package/dist/src/orgrt/policy.d.ts.map +1 -1
  795. package/dist/src/orgrt/policy.js +86 -18
  796. package/dist/src/orgrt/policy.js.map +1 -1
  797. package/dist/src/orgrt/prechecks.d.ts.map +1 -1
  798. package/dist/src/orgrt/prechecks.js +9 -4
  799. package/dist/src/orgrt/prechecks.js.map +1 -1
  800. package/dist/src/orgrt/provider.d.ts +29 -1
  801. package/dist/src/orgrt/provider.d.ts.map +1 -1
  802. package/dist/src/orgrt/provider.js +62 -2
  803. package/dist/src/orgrt/provider.js.map +1 -1
  804. package/dist/src/orgrt/questions.d.ts.map +1 -1
  805. package/dist/src/orgrt/questions.js +34 -10
  806. package/dist/src/orgrt/questions.js.map +1 -1
  807. package/dist/src/orgrt/qwen-rpc-runner.d.ts +56 -0
  808. package/dist/src/orgrt/qwen-rpc-runner.d.ts.map +1 -0
  809. package/dist/src/orgrt/qwen-rpc-runner.js +381 -0
  810. package/dist/src/orgrt/qwen-rpc-runner.js.map +1 -0
  811. package/dist/src/orgrt/qwen-runner.d.ts +1 -1
  812. package/dist/src/orgrt/qwen-runner.d.ts.map +1 -1
  813. package/dist/src/orgrt/qwen-runner.js +42 -23
  814. package/dist/src/orgrt/qwen-runner.js.map +1 -1
  815. package/dist/src/orgrt/remote.js +1 -1
  816. package/dist/src/orgrt/remote.js.map +1 -1
  817. package/dist/src/orgrt/reporting.d.ts.map +1 -1
  818. package/dist/src/orgrt/reporting.js +61 -27
  819. package/dist/src/orgrt/reporting.js.map +1 -1
  820. package/dist/src/orgrt/scheduler-integration.d.ts.map +1 -1
  821. package/dist/src/orgrt/scheduler-integration.js +63 -19
  822. package/dist/src/orgrt/scheduler-integration.js.map +1 -1
  823. package/dist/src/orgrt/scheduler.d.ts.map +1 -1
  824. package/dist/src/orgrt/scheduler.js +7 -3
  825. package/dist/src/orgrt/scheduler.js.map +1 -1
  826. package/dist/src/orgrt/server.js +1 -1
  827. package/dist/src/orgrt/server.js.map +1 -1
  828. package/dist/src/orgrt/session.d.ts +32 -4
  829. package/dist/src/orgrt/session.d.ts.map +1 -1
  830. package/dist/src/orgrt/session.js +242 -74
  831. package/dist/src/orgrt/session.js.map +1 -1
  832. package/dist/src/orgrt/state-detector.d.ts.map +1 -1
  833. package/dist/src/orgrt/state-detector.js +6 -2
  834. package/dist/src/orgrt/state-detector.js.map +1 -1
  835. package/dist/src/orgrt/task-dag.d.ts +29 -1
  836. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  837. package/dist/src/orgrt/task-dag.js +76 -12
  838. package/dist/src/orgrt/task-dag.js.map +1 -1
  839. package/dist/src/orgrt/templates.d.ts.map +1 -1
  840. package/dist/src/orgrt/templates.js +198 -36
  841. package/dist/src/orgrt/templates.js.map +1 -1
  842. package/dist/src/orgrt/test-loop.d.ts.map +1 -1
  843. package/dist/src/orgrt/test-loop.js +139 -35
  844. package/dist/src/orgrt/test-loop.js.map +1 -1
  845. package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
  846. package/dist/src/orgrt/tool-fence.js +21 -3
  847. package/dist/src/orgrt/tool-fence.js.map +1 -1
  848. package/dist/src/orgrt/types.d.ts +32 -1
  849. package/dist/src/orgrt/types.d.ts.map +1 -1
  850. package/dist/src/orgrt/types.js +192 -39
  851. package/dist/src/orgrt/types.js.map +1 -1
  852. package/dist/src/orgrt/usage-proxy.d.ts +20 -0
  853. package/dist/src/orgrt/usage-proxy.d.ts.map +1 -1
  854. package/dist/src/orgrt/usage-proxy.js +25 -15
  855. package/dist/src/orgrt/usage-proxy.js.map +1 -1
  856. package/dist/src/orgrt/vercel-providers.d.ts.map +1 -1
  857. package/dist/src/orgrt/vercel-providers.js +11 -1
  858. package/dist/src/orgrt/vercel-providers.js.map +1 -1
  859. package/dist/src/orgrt/vercel-runner.d.ts +1 -1
  860. package/dist/src/orgrt/vercel-runner.d.ts.map +1 -1
  861. package/dist/src/orgrt/vercel-runner.js +3 -5
  862. package/dist/src/orgrt/vercel-runner.js.map +1 -1
  863. package/dist/src/orgrt/vercel-session-store.d.ts +14 -0
  864. package/dist/src/orgrt/vercel-session-store.d.ts.map +1 -1
  865. package/dist/src/orgrt/vercel-session-store.js +3 -3
  866. package/dist/src/orgrt/vercel-session-store.js.map +1 -1
  867. package/dist/src/orgrt/visualization.js +3 -4
  868. package/dist/src/orgrt/visualization.js.map +1 -1
  869. package/dist/src/output.d.ts +1 -1
  870. package/dist/src/output.d.ts.map +1 -1
  871. package/dist/src/output.js +68 -39
  872. package/dist/src/output.js.map +1 -1
  873. package/dist/src/parser.d.ts.map +1 -1
  874. package/dist/src/parser.js +35 -24
  875. package/dist/src/parser.js.map +1 -1
  876. package/dist/src/pricing/model-pricing.d.ts.map +1 -1
  877. package/dist/src/pricing/model-pricing.js +3 -7
  878. package/dist/src/pricing/model-pricing.js.map +1 -1
  879. package/dist/src/prompt.d.ts +2 -2
  880. package/dist/src/prompt.d.ts.map +1 -1
  881. package/dist/src/prompt.js +49 -41
  882. package/dist/src/prompt.js.map +1 -1
  883. package/dist/src/routing/embedder.d.ts.map +1 -1
  884. package/dist/src/routing/embedder.js +0 -0
  885. package/dist/src/routing/embedder.js.map +1 -1
  886. package/dist/src/routing/llm-caller.d.ts.map +1 -1
  887. package/dist/src/routing/llm-caller.js +27 -8
  888. package/dist/src/routing/llm-caller.js.map +1 -1
  889. package/dist/src/routing/model-download.d.ts.map +1 -1
  890. package/dist/src/routing/model-download.js +3 -3
  891. package/dist/src/routing/model-download.js.map +1 -1
  892. package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
  893. package/dist/src/routing/route-layer-factory.js +22 -14
  894. package/dist/src/routing/route-layer-factory.js.map +1 -1
  895. package/dist/src/security/audit-log.d.ts +47 -0
  896. package/dist/src/security/audit-log.d.ts.map +1 -0
  897. package/dist/src/security/audit-log.js +88 -0
  898. package/dist/src/security/audit-log.js.map +1 -0
  899. package/dist/src/services/config-file-manager.d.ts +2 -2
  900. package/dist/src/services/config-file-manager.d.ts.map +1 -1
  901. package/dist/src/services/config-file-manager.js +44 -20
  902. package/dist/src/services/config-file-manager.js.map +1 -1
  903. package/dist/src/services/crash-reporter.d.ts.map +1 -1
  904. package/dist/src/services/crash-reporter.js +44 -16
  905. package/dist/src/services/crash-reporter.js.map +1 -1
  906. package/dist/src/suggest.d.ts +1 -1
  907. package/dist/src/suggest.d.ts.map +1 -1
  908. package/dist/src/suggest.js +57 -57
  909. package/dist/src/suggest.js.map +1 -1
  910. package/dist/src/sync/checker.d.ts.map +1 -1
  911. package/dist/src/sync/checker.js +7 -8
  912. package/dist/src/sync/checker.js.map +1 -1
  913. package/dist/src/transfer/anonymization/index.d.ts +1 -1
  914. package/dist/src/transfer/anonymization/index.js +3 -3
  915. package/dist/src/transfer/anonymization/index.js.map +1 -1
  916. package/dist/src/types.d.ts +4 -4
  917. package/dist/src/types.d.ts.map +1 -1
  918. package/dist/src/ui/collector.mjs +275 -159
  919. package/dist/src/ui/dashboard.html +761 -742
  920. package/dist/src/ui/data/agent-avatars.html +3 -15
  921. package/dist/src/ui/data/agent-avatars.json +11 -27
  922. package/dist/src/ui/markdown.js +243 -62
  923. package/dist/src/ui/mastermind-diagram-fallback.html +29 -29
  924. package/dist/src/ui/orgs-files.js +99 -46
  925. package/dist/src/ui/orgs.html +54 -54
  926. package/dist/src/ui/routes-monograph.mjs +918 -246
  927. package/dist/src/ui/routes-org.mjs +4234 -2369
  928. package/dist/src/ui/server.mjs +142 -106
  929. package/dist/src/update/checker.d.ts.map +1 -1
  930. package/dist/src/update/checker.js +17 -12
  931. package/dist/src/update/checker.js.map +1 -1
  932. package/dist/src/update/executor.d.ts +2 -2
  933. package/dist/src/update/executor.d.ts.map +1 -1
  934. package/dist/src/update/executor.js +21 -11
  935. package/dist/src/update/executor.js.map +1 -1
  936. package/dist/src/update/index.d.ts +6 -6
  937. package/dist/src/update/index.d.ts.map +1 -1
  938. package/dist/src/update/index.js +9 -9
  939. package/dist/src/update/index.js.map +1 -1
  940. package/dist/src/update/rate-limiter.d.ts.map +1 -1
  941. package/dist/src/update/rate-limiter.js +11 -7
  942. package/dist/src/update/rate-limiter.js.map +1 -1
  943. package/dist/src/update/validator.d.ts.map +1 -1
  944. package/dist/src/update/validator.js +8 -12
  945. package/dist/src/update/validator.js.map +1 -1
  946. package/dist/src/utils/cosine-similarity.d.ts.map +1 -1
  947. package/dist/src/utils/cosine-similarity.js.map +1 -1
  948. package/dist/src/utils/input-guards.d.ts +1 -1
  949. package/dist/src/utils/input-guards.d.ts.map +1 -1
  950. package/dist/src/utils/input-guards.js +24 -9
  951. package/dist/src/utils/input-guards.js.map +1 -1
  952. package/dist/src/utils/json-file.d.ts +12 -0
  953. package/dist/src/utils/json-file.d.ts.map +1 -1
  954. package/dist/src/utils/json-file.js +14 -3
  955. package/dist/src/utils/json-file.js.map +1 -1
  956. package/dist/src/utils/parse-jsonl.d.ts.map +1 -1
  957. package/dist/src/utils/parse-jsonl.js +1 -3
  958. package/dist/src/utils/parse-jsonl.js.map +1 -1
  959. package/dist/src/utils/paths.d.ts.map +1 -1
  960. package/dist/src/utils/paths.js +2 -2
  961. package/dist/src/utils/paths.js.map +1 -1
  962. package/dist/src/utils/redaction.d.ts.map +1 -1
  963. package/dist/src/utils/redaction.js +1 -1
  964. package/dist/src/utils/redaction.js.map +1 -1
  965. package/dist/src/utils/resource-governor.d.ts.map +1 -1
  966. package/dist/src/utils/resource-governor.js +38 -14
  967. package/dist/src/utils/resource-governor.js.map +1 -1
  968. package/dist/tsconfig.tsbuildinfo +1 -1
  969. package/package.json +7 -7
  970. package/.claude/agents/consensus/crdt-synchronizer.md +0 -977
  971. package/.claude/commands/hive-mind/README.md +0 -42
  972. package/.claude/commands/hive-mind/hive-mind-consensus.md +0 -72
  973. package/.claude/commands/hive-mind/hive-mind-init.md +0 -68
  974. package/.claude/commands/hive-mind/hive-mind-memory.md +0 -73
  975. package/.claude/commands/hive-mind/hive-mind-spawn.md +0 -82
  976. package/.claude/commands/hive-mind/hive-mind-status.md +0 -56
  977. package/.claude/commands/hive-mind/hive-mind-stop.md +0 -55
  978. package/.claude/commands/hive-mind/hive-mind.md +0 -87
  979. package/.claude/commands/swarm/README.md +0 -40
  980. package/.claude/commands/swarm/swarm.md +0 -79
  981. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -347
  982. package/.claude/skills/swarm-advanced/SKILL.md +0 -936
  983. package/dist/src/commands/swarm.d.ts +0 -8
  984. package/dist/src/commands/swarm.d.ts.map +0 -1
  985. package/dist/src/commands/swarm.js.map +0 -1
  986. package/dist/src/mcp-tools/hive-mind-tools.d.ts +0 -17
  987. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +0 -1
  988. package/dist/src/mcp-tools/hive-mind-tools.js +0 -1239
  989. package/dist/src/mcp-tools/hive-mind-tools.js.map +0 -1
  990. package/dist/src/mcp-tools/swarm-tools.d.ts +0 -9
  991. package/dist/src/mcp-tools/swarm-tools.d.ts.map +0 -1
  992. package/dist/src/mcp-tools/swarm-tools.js +0 -411
  993. package/dist/src/mcp-tools/swarm-tools.js.map +0 -1
  994. package/dist/src/ui/data/avatars/crdt-synchronizer.svg +0 -53
  995. package/dist/src/ui/data/avatars/gossip-coordinator.svg +0 -54
  996. package/scripts/deploy-ipfs-node.sh +0 -153
  997. package/scripts/setup-ipfs-registry.md +0 -365
  998. /package/.claude/agents/{hive-mind → monoswarm}/scout-explorer.md +0 -0
  999. /package/.claude/agents/{hive-mind → monoswarm}/worker-specialist.md +0 -0
  1000. /package/.claude/commands/{swarm → monoswarm}/analysis.md +0 -0
  1001. /package/.claude/commands/{swarm → monoswarm}/development.md +0 -0
  1002. /package/.claude/commands/{swarm → monoswarm}/examples.md +0 -0
  1003. /package/.claude/commands/{swarm → monoswarm}/maintenance.md +0 -0
  1004. /package/.claude/commands/{swarm → monoswarm}/optimization.md +0 -0
  1005. /package/.claude/commands/{swarm → monoswarm}/testing.md +0 -0
  1006. /package/dist/src/ui/data/avatars/{code-review-swarm.svg → monoswarm-code-review.svg} +0 -0
@@ -1,1239 +0,0 @@
1
- /**
2
- * Hive-Mind MCP Tools for CLI
3
- *
4
- * Tool definitions for multi-agent coordination and voting.
5
- *
6
- * Honest scope note: the "consensus strategies" here are vote-count thresholds
7
- * applied to a single in-process tally — NOT distributed consensus protocols.
8
- * There is no log replication, leader election, network partitioning, or
9
- * adversarial fault model. 'bft' = require 2f+1 votes, 'raft' = require
10
- * majority, 'quorum' = configurable preset (majority/supermajority/unanimous).
11
- * The names are kept for CLI/API compatibility.
12
- */
13
- import { existsSync, readFileSync, statSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
14
- import { randomBytes } from 'node:crypto';
15
- import { join } from 'node:path';
16
- import { getProjectCwd, getMonomindDataRoot, migrateLegacyStoreFile } from './types.js';
17
- import { weightedTally } from '../consensus/tally.js';
18
- // Reuse agent-tools.ts's hardened store loader (50MB size cap + __proto__
19
- // rejection) instead of maintaining a second, weaker copy that reads the
20
- // same physical file — see loadAgentStore export note there.
21
- import { loadAgentStore, loadAgentStoreOrNull } from './agent-tools.js';
22
- // Storage paths
23
- const STORAGE_DIR = '.monomind';
24
- const HIVE_DIR = 'hive-mind';
25
- const HIVE_FILE = 'state.json';
26
- /**
27
- * Calculate required votes for a given strategy and total node count.
28
- */
29
- function calculateRequiredVotes(strategy, totalNodes, quorumPreset = 'majority') {
30
- if (totalNodes <= 0)
31
- return 1;
32
- switch (strategy) {
33
- case 'bft':
34
- // BFT: requires 2/3 + 1 of total nodes
35
- return Math.floor((totalNodes * 2) / 3) + 1;
36
- case 'raft':
37
- // Raft: simple majority
38
- return Math.floor(totalNodes / 2) + 1;
39
- case 'quorum':
40
- switch (quorumPreset) {
41
- case 'unanimous':
42
- return totalNodes;
43
- case 'supermajority':
44
- return Math.floor((totalNodes * 2) / 3) + 1;
45
- case 'majority':
46
- default:
47
- return Math.floor(totalNodes / 2) + 1;
48
- }
49
- default:
50
- return Math.floor(totalNodes / 2) + 1;
51
- }
52
- }
53
- /**
54
- * Detect Byzantine behavior: a voter who has cast conflicting votes
55
- * across proposals in the same round (same type, overlapping time).
56
- * Here we check if the voter already voted differently on this proposal
57
- * (which shouldn't happen if we block double-votes, so this checks
58
- * cross-proposal conflicting votes for same type within the pending set).
59
- */
60
- function detectByzantineVoters(pending, currentProposal, voterId, newVote) {
61
- // Check if voter cast opposite votes on proposals of the same type
62
- for (const p of pending) {
63
- if (p.proposalId === currentProposal.proposalId)
64
- continue;
65
- if (p.type !== currentProposal.type)
66
- continue;
67
- if (voterId in p.votes && p.votes[voterId] !== newVote) {
68
- return true; // Conflicting vote detected
69
- }
70
- }
71
- return false;
72
- }
73
- /**
74
- * Try to resolve a proposal based on its strategy.
75
- * Returns 'approved', 'rejected', or null if still pending.
76
- */
77
- function tryResolveProposal(proposal, totalNodes) {
78
- const votesFor = Object.values(proposal.votes).filter(v => v).length;
79
- const votesAgainst = Object.values(proposal.votes).filter(v => !v).length;
80
- const required = calculateRequiredVotes(proposal.strategy, totalNodes, proposal.quorumPreset);
81
- if (votesFor >= required)
82
- return 'approved';
83
- if (votesAgainst >= required)
84
- return 'rejected';
85
- // For quorum with 'unanimous', also reject if any vote is against
86
- if (proposal.strategy === 'quorum' && proposal.quorumPreset === 'unanimous' && votesAgainst > 0) {
87
- return 'rejected';
88
- }
89
- // Check if it's impossible to reach quorum (remaining potential votes can't tip it)
90
- const totalVotes = Object.keys(proposal.votes).length;
91
- const remaining = totalNodes - totalVotes;
92
- if (votesFor + remaining < required && votesAgainst + remaining < required) {
93
- // Deadlock: neither side can win -- reject
94
- return 'rejected';
95
- }
96
- return null;
97
- }
98
- function getHiveDir() {
99
- return join(getMonomindDataRoot(), HIVE_DIR);
100
- }
101
- function getHivePath() {
102
- return join(getHiveDir(), HIVE_FILE);
103
- }
104
- function ensureHiveDir() {
105
- const dir = getHiveDir();
106
- if (!existsSync(dir)) {
107
- mkdirSync(dir, { recursive: true });
108
- }
109
- }
110
- const MAX_HIVE_STATE_BYTES = 10 * 1024 * 1024; // 10 MB
111
- function loadHiveState() {
112
- try {
113
- const path = getHivePath();
114
- migrateLegacyStoreFile(path, join(HIVE_DIR, HIVE_FILE));
115
- if (existsSync(path) && statSync(path).size <= MAX_HIVE_STATE_BYTES) {
116
- const data = readFileSync(path, 'utf-8');
117
- return JSON.parse(data);
118
- }
119
- }
120
- catch (e) {
121
- if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
122
- console.error('[hive-mind-tools] failed to parse hive state.json — resetting to default state:', e);
123
- }
124
- return {
125
- initialized: false,
126
- topology: 'mesh',
127
- workers: [],
128
- consensus: { pending: [], history: [] },
129
- sharedMemory: {},
130
- createdAt: new Date().toISOString(),
131
- updatedAt: new Date().toISOString(),
132
- };
133
- }
134
- function saveHiveState(state) {
135
- ensureHiveDir();
136
- state.updatedAt = new Date().toISOString();
137
- const dest = getHivePath();
138
- const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
139
- writeFileSync(tmp, JSON.stringify(state, null, 2), 'utf-8');
140
- renameSync(tmp, dest);
141
- }
142
- const SESSION_SECRET_FILE = 'session-secret';
143
- /**
144
- * Resolve the HMAC signing secret used for consensus vote/audit records.
145
- *
146
- * Previously this was read exclusively from MONOMIND_SESSION_SECRET, which
147
- * nothing in `init`/`doctor`/docs ever sets — so by default every consensus
148
- * decision silently produced zero audit records (writes were skipped, and
149
- * hive-mind_audit_verify refused to run at all). To make the audit trail
150
- * work out of the box, fall back to a per-project secret generated once and
151
- * persisted alongside the hive state (0600-equivalent: kept out of state.json
152
- * and never returned by any tool). MONOMIND_SESSION_SECRET still takes
153
- * precedence for callers that want to manage/rotate the secret themselves.
154
- */
155
- function getOrCreateSessionSecret() {
156
- const envSecret = process.env.MONOMIND_SESSION_SECRET;
157
- if (envSecret)
158
- return envSecret;
159
- const path = join(getHiveDir(), SESSION_SECRET_FILE);
160
- try {
161
- if (existsSync(path)) {
162
- const existing = readFileSync(path, 'utf-8').trim();
163
- if (existing)
164
- return existing;
165
- }
166
- }
167
- catch { /* fall through to regeneration */ }
168
- try {
169
- ensureHiveDir();
170
- // eslint-disable-next-line @typescript-eslint/no-var-requires
171
- const secret = randomBytes(32).toString('hex');
172
- const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
173
- writeFileSync(tmp, secret, 'utf-8');
174
- renameSync(tmp, path);
175
- return secret;
176
- }
177
- catch {
178
- // Filesystem unavailable — fall back to an ephemeral in-process secret.
179
- // Audit records signed with this won't verify across process restarts,
180
- // but propose/vote/resolve still function.
181
- return randomBytes(32).toString('hex');
182
- }
183
- }
184
- // Import agent store helpers for spawn functionality
185
- import { existsSync as agentStoreExists, writeFileSync as writeAgentStore, mkdirSync as mkdirAgentStore } from 'node:fs';
186
- const HIVE_RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
187
- function saveAgentStore(store) {
188
- const storeDir = join(getMonomindDataRoot(), 'agents');
189
- if (!agentStoreExists(storeDir)) {
190
- mkdirAgentStore(storeDir, { recursive: true });
191
- }
192
- const dest = join(storeDir, 'store.json');
193
- const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
194
- writeAgentStore(tmp, JSON.stringify(store, null, 2), 'utf-8');
195
- renameSync(tmp, dest);
196
- }
197
- // Every hive-mind_* tool operates on a single JSON state file in one process —
198
- // "consensus"/"spawn"/"broadcast" etc. are vote-threshold bookkeeping and
199
- // record-keeping, not real distributed coordination (see CLAUDE.md's Hive-Mind
200
- // Consensus section and hive-mind_consensus's own description). Only status/join
201
- // are legitimate no-drama primitives (read state / register into it) and stay
202
- // visible by default; everything else is gated behind MONOMIND_MCP_SPECULATIVE=1.
203
- /** Ungated — internal/test use only. MCP clients get `hiveMindTools` below. */
204
- export const allHiveMindTools = [
205
- {
206
- name: 'hive-mind_spawn',
207
- description: 'Write worker agent records into the agent store and register their ids on the hive state file (combines agent_spawn + hive-mind_join). Creates bookkeeping entries only — no process, thread, or agent is started. Real concurrency comes from Claude Code\'s Task tool.',
208
- category: 'hive-mind',
209
- inputSchema: {
210
- type: 'object',
211
- properties: {
212
- count: { type: 'number', description: 'Number of workers to spawn (default: 1)', default: 1 },
213
- role: { type: 'string', enum: ['worker', 'specialist', 'scout'], description: 'Worker role in hive', default: 'worker' },
214
- agentType: { type: 'string', description: 'Agent type for spawned workers', default: 'worker' },
215
- prefix: { type: 'string', description: 'Prefix for worker IDs', default: 'hive-worker' },
216
- },
217
- },
218
- handler: async (input) => {
219
- const state = loadHiveState();
220
- if (!state.initialized) {
221
- return { success: false, error: 'Hive-mind not initialized. Run hive-mind/init first.' };
222
- }
223
- const count = Math.min(Math.max(1, input.count || 1), 20); // Cap at 20
224
- // Cap role/agentType/prefix: used as JSON keys and stored values in agentStore
225
- // on disk; an oversized prefix inflates the generated agentId key and config.
226
- const MAX_HIVE_ROLE_LEN = 256;
227
- const MAX_HIVE_PREFIX_LEN = 128;
228
- const rawRole = input.role || 'worker';
229
- const role = typeof rawRole === 'string' && rawRole.length > MAX_HIVE_ROLE_LEN
230
- ? rawRole.slice(0, MAX_HIVE_ROLE_LEN) : rawRole;
231
- const rawAgentType = input.agentType || 'worker';
232
- const agentType = typeof rawAgentType === 'string' && rawAgentType.length > MAX_HIVE_ROLE_LEN
233
- ? rawAgentType.slice(0, MAX_HIVE_ROLE_LEN) : rawAgentType;
234
- const rawPrefix = input.prefix || 'hive-worker';
235
- const prefix = typeof rawPrefix === 'string' && rawPrefix.length > MAX_HIVE_PREFIX_LEN
236
- ? rawPrefix.slice(0, MAX_HIVE_PREFIX_LEN) : rawPrefix;
237
- // Must use the null-aware loader here (this handler mutates and saves)
238
- // — loadAgentStore() on a corrupt/oversized store.json now returns the
239
- // empty default, and saving that back would wipe every real agent.
240
- const agentStore = loadAgentStoreOrNull();
241
- if (!agentStore) {
242
- return { success: false, error: 'Agent store is unreadable/corrupt — refusing to spawn hive workers to avoid overwriting real agent data.' };
243
- }
244
- const spawnedWorkers = [];
245
- for (let i = 0; i < count; i++) {
246
- const agentId = `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
247
- if (HIVE_RESERVED_KEYS.has(agentId))
248
- continue;
249
- // Create agent record (like agent/spawn)
250
- agentStore.agents[agentId] = {
251
- agentId,
252
- agentType,
253
- status: 'idle',
254
- health: 1.0,
255
- taskCount: 0,
256
- config: { role, hiveRole: role },
257
- createdAt: new Date().toISOString(),
258
- domain: 'hive-mind',
259
- };
260
- // Join to hive-mind (like hive-mind/join)
261
- const MAX_HIVE_AGENTS = 100;
262
- if (!state.workers.includes(agentId)) {
263
- if (state.workers.length >= MAX_HIVE_AGENTS) {
264
- return { success: false, error: `Hive has reached max agent capacity (${MAX_HIVE_AGENTS})` };
265
- }
266
- state.workers.push(agentId);
267
- }
268
- spawnedWorkers.push({
269
- agentId,
270
- role,
271
- joinedAt: new Date().toISOString(),
272
- });
273
- }
274
- saveAgentStore(agentStore);
275
- saveHiveState(state);
276
- return {
277
- success: true,
278
- spawned: count,
279
- workers: spawnedWorkers,
280
- totalWorkers: state.workers.length,
281
- hiveStatus: 'active',
282
- message: `Spawned ${count} worker(s) and joined them to the hive-mind`,
283
- };
284
- },
285
- },
286
- {
287
- name: 'hive-mind_init',
288
- description: 'Create the hive state file recording topology, consensus strategy, and an empty worker list. Writes JSON state only — nothing is started, and no collective process exists. Supported consensus strategies: byzantine, bft, raft, quorum. The gossip and crdt strategies are not implemented and will be rejected with an error.',
289
- category: 'hive-mind',
290
- inputSchema: {
291
- type: 'object',
292
- properties: {
293
- topology: { type: 'string', enum: ['mesh', 'hierarchical', 'ring', 'star'], description: 'Network topology' },
294
- queenId: { type: 'string', description: 'Initial queen agent ID' },
295
- consensus: { type: 'string', enum: ['byzantine', 'bft', 'raft', 'quorum'], description: 'Consensus strategy to govern hive-mind_consensus propose/vote. Supported: byzantine, bft, raft, quorum. The values gossip and crdt are not implemented and will be rejected with an error. Default: byzantine.' },
296
- maxAgents: { type: 'number', description: 'Maximum number of agents in the hive. Default: 15.' },
297
- persist: { type: 'boolean', description: 'Whether to persist hive state to disk. Default: true.' },
298
- memoryBackend: { type: 'string', description: 'Shared memory backend for the hive. Default: hybrid.' },
299
- },
300
- },
301
- handler: async (input) => {
302
- const hiveId = `hive-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
303
- // Cap queenId: stored in hive state JSON as the queen's agentId field.
304
- const MAX_QUEEN_ID_LEN = 256;
305
- const rawQueenId = input.queenId || `queen-${Date.now()}`;
306
- const queenId = typeof rawQueenId === 'string' && rawQueenId.length > MAX_QUEEN_ID_LEN
307
- ? rawQueenId.slice(0, MAX_QUEEN_ID_LEN) : rawQueenId;
308
- const now = new Date().toISOString();
309
- // Validate consensus strategy: gossip and crdt are not implemented.
310
- // Reject (do not silently substitute) so callers learn the supported set.
311
- const SUPPORTED_CONSENSUS = ['byzantine', 'bft', 'raft', 'quorum'];
312
- const REJECTED_CONSENSUS = ['gossip', 'crdt'];
313
- const requestedConsensus = input.consensus || 'byzantine';
314
- if (REJECTED_CONSENSUS.includes(requestedConsensus)) {
315
- return {
316
- success: false,
317
- error: `Consensus strategy "${requestedConsensus}" is not implemented. Supported: byzantine | bft | raft | quorum.`,
318
- supported: SUPPORTED_CONSENSUS,
319
- };
320
- }
321
- const effectiveConsensus = SUPPORTED_CONSENSUS.includes(requestedConsensus) ? requestedConsensus : 'byzantine';
322
- const state = {
323
- initialized: true,
324
- hiveId,
325
- topology: input.topology || 'mesh',
326
- queen: { agentId: queenId, electedAt: now, term: 1 },
327
- workers: [],
328
- // Persist the chosen strategy on the hive state so hive-mind_consensus
329
- // propose/vote default to it instead of silently using 'raft'.
330
- // 'byzantine' is the CLI-facing name; the internal ConsensusStrategy type uses 'bft'.
331
- consensusStrategy: (effectiveConsensus === 'byzantine' ? 'bft' : effectiveConsensus),
332
- consensus: { pending: [], history: [] },
333
- sharedMemory: {},
334
- createdAt: now,
335
- updatedAt: now,
336
- };
337
- // Single write — a prior version of this handler saved state twice
338
- // (once before setting consensusStrategy, once after), which was
339
- // redundant.
340
- saveHiveState(state);
341
- return {
342
- success: true,
343
- hiveId,
344
- topology: state.topology,
345
- consensus: effectiveConsensus,
346
- queenId,
347
- neuralLearning: 'unavailable',
348
- status: 'initialized',
349
- config: {
350
- topology: state.topology,
351
- consensus: effectiveConsensus,
352
- maxAgents: input.maxAgents || 15,
353
- persist: input.persist !== false,
354
- memoryBackend: input.memoryBackend || 'hybrid',
355
- },
356
- createdAt: state.createdAt,
357
- };
358
- },
359
- },
360
- {
361
- name: 'hive-mind_status',
362
- description: 'Get hive-mind status',
363
- category: 'hive-mind',
364
- inputSchema: {
365
- type: 'object',
366
- properties: {
367
- verbose: { type: 'boolean', description: 'Include detailed information' },
368
- },
369
- },
370
- handler: async (input) => {
371
- const state = loadHiveState();
372
- const uptime = state.createdAt ? Date.now() - new Date(state.createdAt).getTime() : 0;
373
- // Load agent store once for all workers
374
- const agentStore = loadAgentStore();
375
- // Compute real task metrics from task store
376
- const taskStorePath = join(getMonomindDataRoot(), 'tasks', 'store.json');
377
- migrateLegacyStoreFile(taskStorePath, join('tasks', 'store.json'));
378
- let pendingTaskCount = 0;
379
- let activeTaskCount = 0;
380
- let completedTaskCount = 0;
381
- try {
382
- if (existsSync(taskStorePath) && statSync(taskStorePath).size <= MAX_HIVE_STATE_BYTES) {
383
- const taskStore = JSON.parse(readFileSync(taskStorePath, 'utf-8'));
384
- for (const task of Object.values(taskStore.tasks || {})) {
385
- if (task.status === 'pending')
386
- pendingTaskCount++;
387
- else if (task.status === 'in_progress')
388
- activeTaskCount++;
389
- else if (task.status === 'completed')
390
- completedTaskCount++;
391
- }
392
- }
393
- }
394
- catch (e) {
395
- if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
396
- console.error('[hive-mind-tools] failed to parse task store — task counts default to 0:', e);
397
- }
398
- const workerCount = Math.max(1, state.workers.length);
399
- const realLoad = activeTaskCount / workerCount;
400
- const status = {
401
- // CLI expected fields
402
- hiveId: state.hiveId ?? `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
403
- status: state.initialized ? 'active' : 'offline',
404
- topology: state.topology,
405
- // Reflect the strategy actually chosen at hive-mind_init (persisted
406
- // as state.consensusStrategy so it "actually governs voting" — see
407
- // the field's doc comment) instead of hardcoding a default that
408
- // ignored what was configured. 'bft' is the internal name for the
409
- // CLI-facing 'byzantine' strategy.
410
- consensus: state.consensusStrategy
411
- ? (state.consensusStrategy === 'bft' ? 'byzantine' : state.consensusStrategy)
412
- : 'byzantine',
413
- queen: state.queen ? {
414
- id: state.queen.agentId,
415
- agentId: state.queen.agentId,
416
- status: 'active',
417
- load: Math.round(realLoad * 1000) / 1000,
418
- tasksQueued: pendingTaskCount,
419
- electedAt: state.queen.electedAt,
420
- term: state.queen.term,
421
- } : { id: 'N/A', status: 'offline', load: 0, tasksQueued: 0 },
422
- workers: state.workers.map(w => {
423
- const agent = agentStore.agents[w];
424
- return {
425
- id: w,
426
- type: agent?.agentType || 'worker',
427
- status: agent?.status || 'unknown',
428
- // AgentRecord has no currentTask field — always null. Kept in the
429
- // response shape for API stability; was already dead before this
430
- // (the previous `as unknown as Record<string, unknown>` cast hid
431
- // that `agent?.currentTask` never matched a real field).
432
- currentTask: null,
433
- tasksCompleted: agent?.taskCount || 0,
434
- };
435
- }),
436
- metrics: {
437
- totalTasks: pendingTaskCount + activeTaskCount + completedTaskCount,
438
- completedTasks: completedTaskCount,
439
- activeTasks: activeTaskCount,
440
- pendingTasks: pendingTaskCount,
441
- failedTasks: 0,
442
- consensusRounds: state.consensus.history.length,
443
- memoryUsage: `${Object.keys(state.sharedMemory).length * 2} KB`,
444
- },
445
- health: {
446
- overall: 'healthy',
447
- queen: state.queen ? 'healthy' : 'unhealthy',
448
- workers: state.workers.length > 0 ? 'healthy' : 'degraded',
449
- consensus: 'healthy',
450
- memory: 'healthy',
451
- },
452
- // Additional fields
453
- id: state.hiveId ?? `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
454
- initialized: state.initialized,
455
- workerCount: state.workers.length,
456
- pendingConsensus: state.consensus.pending.length,
457
- sharedMemoryKeys: Object.keys(state.sharedMemory).length,
458
- uptime,
459
- createdAt: state.createdAt,
460
- updatedAt: state.updatedAt,
461
- };
462
- if (input.verbose) {
463
- return {
464
- ...status,
465
- workerDetails: state.workers,
466
- consensusHistory: state.consensus.history.slice(-10),
467
- sharedMemory: state.sharedMemory,
468
- };
469
- }
470
- return status;
471
- },
472
- },
473
- {
474
- name: 'hive-mind_join',
475
- description: 'Join an agent to the hive-mind',
476
- category: 'hive-mind',
477
- inputSchema: {
478
- type: 'object',
479
- properties: {
480
- agentId: { type: 'string', description: 'Agent ID to join' },
481
- role: { type: 'string', enum: ['worker', 'specialist', 'scout'], description: 'Agent role in hive' },
482
- },
483
- required: ['agentId'],
484
- },
485
- handler: async (input) => {
486
- const state = loadHiveState();
487
- const agentId = input.agentId;
488
- // Reject IDs that would mutate Object.prototype when used as a key on the
489
- // JSON-loaded plain object `agentStore.agents` (read in hive-mind_status).
490
- if (typeof agentId !== 'string' || agentId.length === 0 || agentId.length > 128 ||
491
- HIVE_RESERVED_KEYS.has(agentId) || !/^[a-zA-Z0-9_-]+$/.test(agentId)) {
492
- return { success: false, error: 'Invalid agentId' };
493
- }
494
- if (!state.initialized) {
495
- return { success: false, error: 'Hive-mind not initialized' };
496
- }
497
- const MAX_HIVE_AGENTS = 100;
498
- if (!state.workers.includes(agentId)) {
499
- if (state.workers.length >= MAX_HIVE_AGENTS) {
500
- return { success: false, error: `Hive has reached max agent capacity (${MAX_HIVE_AGENTS})` };
501
- }
502
- state.workers.push(agentId);
503
- saveHiveState(state);
504
- }
505
- return {
506
- success: true,
507
- agentId,
508
- role: input.role || 'worker',
509
- totalWorkers: state.workers.length,
510
- joinedAt: new Date().toISOString(),
511
- };
512
- },
513
- },
514
- {
515
- name: 'hive-mind_leave',
516
- description: 'Remove an agent from the hive-mind',
517
- category: 'hive-mind',
518
- inputSchema: {
519
- type: 'object',
520
- properties: {
521
- agentId: { type: 'string', description: 'Agent ID to remove' },
522
- },
523
- required: ['agentId'],
524
- },
525
- handler: async (input) => {
526
- const state = loadHiveState();
527
- const agentId = input.agentId;
528
- if (typeof agentId !== 'string' || agentId.length === 0 || agentId.length > 128 ||
529
- HIVE_RESERVED_KEYS.has(agentId) || !/^[a-zA-Z0-9_-]+$/.test(agentId)) {
530
- return { success: false, error: 'Invalid agentId' };
531
- }
532
- const index = state.workers.indexOf(agentId);
533
- if (index > -1) {
534
- state.workers.splice(index, 1);
535
- saveHiveState(state);
536
- return {
537
- success: true,
538
- agentId,
539
- leftAt: new Date().toISOString(),
540
- remainingWorkers: state.workers.length,
541
- };
542
- }
543
- return { success: false, agentId, error: 'Agent not in hive' };
544
- },
545
- },
546
- {
547
- name: 'hive-mind_consensus',
548
- description: 'Propose or vote on a threshold-based decision, single-process only. "bft"/"raft"/"quorum" are vote-count thresholds (2f+1 / majority / configurable preset) over one JSON state file — NOT real distributed consensus protocols (no leader election, log replication, or network model). Names kept for CLI/API compatibility.',
549
- category: 'hive-mind',
550
- inputSchema: {
551
- type: 'object',
552
- properties: {
553
- action: { type: 'string', enum: ['propose', 'vote', 'status', 'list'], description: 'Consensus action' },
554
- proposalId: { type: 'string', description: 'Proposal ID (for vote/status)' },
555
- type: { type: 'string', description: 'Proposal type (for propose)' },
556
- value: { description: 'Proposal value (for propose)' },
557
- vote: { type: 'boolean', description: 'Vote (true=for, false=against)' },
558
- voterId: { type: 'string', description: 'Voter agent ID' },
559
- strategy: { type: 'string', enum: ['bft', 'raft', 'quorum'], description: 'Consensus strategy (default: raft)' },
560
- quorumPreset: { type: 'string', enum: ['unanimous', 'majority', 'supermajority'], description: 'Quorum threshold preset (for quorum strategy, default: majority)' },
561
- term: { type: 'number', description: 'Term number (for raft strategy)' },
562
- timeoutMs: { type: 'number', description: 'Timeout in ms for raft re-proposal (default: 30000)' },
563
- minDivergenceRounds: { type: 'number', description: 'O-Information anti-groupthink gate: minimum rounds with divergent votes required before resolution (arXiv:2510.05174). Default: 0 (disabled).' },
564
- },
565
- required: ['action'],
566
- },
567
- handler: async (input) => {
568
- const state = loadHiveState();
569
- const action = input.action;
570
- // Default to the strategy chosen at hive-mind_init (state.consensusStrategy);
571
- // fall back to 'raft' only when the hive hasn't been initialized with one.
572
- const rawStrategy = input.strategy || state.consensusStrategy || 'raft';
573
- // Gossip and CRDT are planned but not yet implemented -- reject early
574
- // with an honest message instead of silently falling through.
575
- const UNIMPLEMENTED_STRATEGIES = ['gossip', 'crdt'];
576
- if (UNIMPLEMENTED_STRATEGIES.includes(rawStrategy)) {
577
- return {
578
- action,
579
- error: `Strategy "${rawStrategy}" is planned but not yet implemented. Available strategies: bft, raft, quorum.`,
580
- availableStrategies: ['bft', 'raft', 'quorum'],
581
- };
582
- }
583
- const strategy = rawStrategy;
584
- const totalNodes = state.workers.length;
585
- if (action === 'propose') {
586
- const proposalId = `proposal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
587
- const quorumPreset = input.quorumPreset || 'majority';
588
- const term = input.term || (state.queen?.term ?? 1);
589
- const timeoutMs = input.timeoutMs || 30000;
590
- // Raft: check if there's already a pending proposal for this term
591
- if (strategy === 'raft') {
592
- const existingTermProposal = state.consensus.pending.find(p => p.strategy === 'raft' && p.term === term && p.status === 'pending');
593
- if (existingTermProposal) {
594
- return {
595
- action,
596
- error: `Raft term ${term} already has a pending proposal: ${existingTermProposal.proposalId}. Wait for resolution or use a higher term.`,
597
- existingProposalId: existingTermProposal.proposalId,
598
- term,
599
- };
600
- }
601
- }
602
- const required = calculateRequiredVotes(strategy, totalNodes, quorumPreset);
603
- const minDivergenceRounds = typeof input.minDivergenceRounds === 'number'
604
- ? Math.max(0, input.minDivergenceRounds)
605
- : 0;
606
- // Cap proposal fields: stored in state.consensus.pending and then
607
- // state.consensus.history (up to 1000 entries). An unbounded value
608
- // inflates the on-disk hive state by up to 1000 × value size.
609
- const MAX_PROPOSAL_TYPE_LEN = 128;
610
- const MAX_PROPOSAL_VOTER_ID_LEN = 256;
611
- const MAX_PROPOSAL_VALUE_BYTES = 64 * 1024; // 64 KB
612
- const rawProposalType = input.type || 'general';
613
- const proposalType = typeof rawProposalType === 'string' && rawProposalType.length > MAX_PROPOSAL_TYPE_LEN
614
- ? rawProposalType.slice(0, MAX_PROPOSAL_TYPE_LEN) : rawProposalType;
615
- const rawVoterId = input.voterId || 'system';
616
- const proposedBy = typeof rawVoterId === 'string' && rawVoterId.length > MAX_PROPOSAL_VOTER_ID_LEN
617
- ? rawVoterId.slice(0, MAX_PROPOSAL_VOTER_ID_LEN) : rawVoterId;
618
- // Cap value if it's a string; leave non-string values as-is (they are
619
- // JSON-serialised by saveHiveState which uses JSON.stringify — bounded
620
- // objects are fine).
621
- const rawValue = input.value;
622
- const cappedValue = typeof rawValue === 'string' && rawValue.length > MAX_PROPOSAL_VALUE_BYTES
623
- ? rawValue.slice(0, MAX_PROPOSAL_VALUE_BYTES) : rawValue;
624
- const proposal = {
625
- proposalId,
626
- type: proposalType,
627
- value: cappedValue,
628
- proposedBy,
629
- proposedAt: new Date().toISOString(),
630
- votes: {},
631
- status: 'pending',
632
- strategy,
633
- term: strategy === 'raft' ? term : undefined,
634
- quorumPreset: strategy === 'quorum' ? quorumPreset : undefined,
635
- byzantineVoters: strategy === 'bft' ? [] : undefined,
636
- timeoutAt: strategy === 'raft' ? new Date(Date.now() + timeoutMs).toISOString() : undefined,
637
- minDivergenceRounds: minDivergenceRounds > 0 ? minDivergenceRounds : undefined,
638
- divergenceRoundsSeen: 0,
639
- };
640
- state.consensus.pending.push(proposal);
641
- saveHiveState(state);
642
- return {
643
- action,
644
- proposalId,
645
- type: proposal.type,
646
- strategy,
647
- status: 'pending',
648
- required,
649
- totalNodes,
650
- term: proposal.term,
651
- quorumPreset: proposal.quorumPreset,
652
- timeoutAt: proposal.timeoutAt,
653
- minDivergenceRounds: proposal.minDivergenceRounds,
654
- };
655
- }
656
- if (action === 'vote') {
657
- const proposal = state.consensus.pending.find(p => p.proposalId === input.proposalId);
658
- if (!proposal) {
659
- return { action, error: 'Proposal not found or already resolved' };
660
- }
661
- const voterId = input.voterId;
662
- if (!voterId) {
663
- return { action, error: 'voterId is required for voting' };
664
- }
665
- if (totalNodes === 0) {
666
- return { action, error: 'No workers in hive — cannot vote' };
667
- }
668
- if (!state.workers.includes(voterId)) {
669
- return { action, error: `Voter ${voterId} is not a member of this hive` };
670
- }
671
- const voteValue = input.vote;
672
- const proposalStrategy = proposal.strategy || 'raft';
673
- const required = calculateRequiredVotes(proposalStrategy, totalNodes, proposal.quorumPreset);
674
- // Prevent double-voting
675
- if (voterId in proposal.votes) {
676
- const previousVote = proposal.votes[voterId];
677
- if (previousVote === voteValue) {
678
- return {
679
- action,
680
- error: `Voter ${voterId} has already cast the same vote on this proposal`,
681
- proposalId: proposal.proposalId,
682
- existingVote: previousVote,
683
- };
684
- }
685
- // Conflicting vote from same voter
686
- if (proposalStrategy === 'bft') {
687
- // BFT: detect as Byzantine behavior
688
- if (!proposal.byzantineVoters)
689
- proposal.byzantineVoters = [];
690
- if (!proposal.byzantineVoters.includes(voterId)) {
691
- proposal.byzantineVoters.push(voterId);
692
- }
693
- // Remove their vote entirely -- Byzantine voter is excluded
694
- delete proposal.votes[voterId];
695
- saveHiveState(state);
696
- return {
697
- action,
698
- proposalId: proposal.proposalId,
699
- voterId,
700
- byzantineDetected: true,
701
- message: `Byzantine behavior detected: voter ${voterId} attempted conflicting vote. Vote invalidated.`,
702
- byzantineVoters: proposal.byzantineVoters,
703
- status: proposal.status,
704
- };
705
- }
706
- if (proposalStrategy === 'raft') {
707
- // Raft: only one vote per node per term, reject the change
708
- return {
709
- action,
710
- error: `Raft: voter ${voterId} already voted in term ${proposal.term}. Cannot change vote.`,
711
- proposalId: proposal.proposalId,
712
- term: proposal.term,
713
- };
714
- }
715
- // Quorum: reject double-vote
716
- return {
717
- action,
718
- error: `Voter ${voterId} has already voted on this proposal`,
719
- proposalId: proposal.proposalId,
720
- };
721
- }
722
- // BFT: check for cross-proposal Byzantine behavior
723
- if (proposalStrategy === 'bft') {
724
- const isByzantine = detectByzantineVoters(state.consensus.pending, proposal, voterId, voteValue);
725
- if (isByzantine) {
726
- if (!proposal.byzantineVoters)
727
- proposal.byzantineVoters = [];
728
- if (!proposal.byzantineVoters.includes(voterId)) {
729
- proposal.byzantineVoters.push(voterId);
730
- }
731
- saveHiveState(state);
732
- return {
733
- action,
734
- proposalId: proposal.proposalId,
735
- voterId,
736
- byzantineDetected: true,
737
- message: `Byzantine behavior detected: voter ${voterId} cast conflicting votes across proposals of same type. Vote rejected.`,
738
- byzantineVoters: proposal.byzantineVoters,
739
- status: proposal.status,
740
- };
741
- }
742
- }
743
- // Record the vote
744
- proposal.votes[voterId] = voteValue;
745
- const votesFor = Object.values(proposal.votes).filter(v => v).length;
746
- const votesAgainst = Object.values(proposal.votes).filter(v => !v).length;
747
- // O-Information divergence tracking (arXiv:2510.05174)
748
- // Count this voting round as divergent if not all votes are the same direction.
749
- // A divergent round signals synergy is still "in play" among agents.
750
- const allVotes = Object.values(proposal.votes);
751
- const isUnanimous = allVotes.every(v => v) || allVotes.every(v => !v);
752
- if (!isUnanimous && allVotes.length >= 2) {
753
- proposal.divergenceRoundsSeen = (proposal.divergenceRoundsSeen ?? 0) + 1;
754
- }
755
- // CP-WBFT: weighted tally using uniform confidence (1.0) until probe scores available
756
- // Source: https://arxiv.org/abs/2511.10400
757
- const weightedVotes = Object.entries(proposal.votes).map(([aid, v]) => ({
758
- agentId: aid,
759
- vote: v,
760
- confidence: 1.0, // uniform until confidence-probe is wired
761
- }));
762
- const cpwbftTally = weightedTally(weightedVotes);
763
- // O-Information gate: defer resolution if we haven't seen enough divergent rounds.
764
- // BUT: if every expected voter has already cast a vote (electorate
765
- // exhausted), no more votes can ever arrive to produce a divergent
766
- // round — a unanimous first-round vote would otherwise deadlock the
767
- // proposal permanently since divergenceRoundsSeen only increments on
768
- // disagreement. Treat electorate exhaustion as a terminal condition
769
- // that opens the gate regardless of divergence.
770
- const totalVotesCast = Object.keys(proposal.votes).length;
771
- const electorateExhausted = totalNodes > 0 && totalVotesCast >= totalNodes;
772
- const divergenceGateOpen = !proposal.minDivergenceRounds
773
- || (proposal.divergenceRoundsSeen ?? 0) >= proposal.minDivergenceRounds
774
- || electorateExhausted;
775
- // Try to resolve
776
- const resolution = divergenceGateOpen ? tryResolveProposal(proposal, totalNodes) : null;
777
- let resolved = false;
778
- if (resolution !== null) {
779
- resolved = true;
780
- proposal.status = resolution;
781
- state.consensus.history.push({
782
- proposalId: proposal.proposalId,
783
- type: proposal.type,
784
- result: resolution,
785
- votes: { for: votesFor, against: votesAgainst },
786
- decidedAt: new Date().toISOString(),
787
- strategy: proposalStrategy,
788
- term: proposal.term,
789
- byzantineDetected: proposal.byzantineVoters?.length ? proposal.byzantineVoters : undefined,
790
- });
791
- if (state.consensus.history.length > 1000) {
792
- state.consensus.history = state.consensus.history.slice(-1000);
793
- }
794
- state.consensus.pending = state.consensus.pending.filter(p => p.proposalId !== proposal.proposalId);
795
- }
796
- saveHiveState(state);
797
- // Persist consensus result for searchable history
798
- if (resolved) {
799
- try {
800
- const bridge = await import('../memory/memory-bridge.js');
801
- await bridge.bridgeStoreEntry({
802
- key: `consensus-${proposal.proposalId}`,
803
- value: JSON.stringify({
804
- proposalId: proposal.proposalId,
805
- type: proposal.type,
806
- strategy: proposalStrategy,
807
- status: proposal.status,
808
- votes: proposal.votes,
809
- resolvedAt: new Date().toISOString(),
810
- }),
811
- namespace: 'hive-consensus',
812
- tags: [proposal.type, proposalStrategy || 'raft', proposal.status],
813
- });
814
- }
815
- catch { /* SQLite memory backend not available — JSON store is primary */ }
816
- // Persist consensus audit record — uses MONOMIND_SESSION_SECRET when
817
- // set, otherwise a per-project generated-and-persisted secret so the
818
- // audit trail is populated by default (see getOrCreateSessionSecret).
819
- const sessionSecret = getOrCreateSessionSecret();
820
- try {
821
- const { AuditWriter } = await import('../consensus/audit-writer.js');
822
- const auditDir = join(getProjectCwd(), STORAGE_DIR, 'consensus');
823
- const writer = new AuditWriter(auditDir);
824
- const now = new Date().toISOString();
825
- const voteEntries = Object.entries(proposal.votes).map(([agentId, vote]) => ({
826
- agentId,
827
- agentSlug: agentId,
828
- vote,
829
- votedAt: now,
830
- }));
831
- writer.record({
832
- decisionId: proposal.proposalId,
833
- swarmId: `hive-${state.createdAt ? new Date(state.createdAt).getTime() : Date.now()}`,
834
- protocol: (proposalStrategy === 'bft' ? 'byzantine' : proposalStrategy === 'raft' ? 'raft' : 'quorum'),
835
- topic: proposal.type,
836
- decision: resolution,
837
- votes: voteEntries,
838
- quorumRequired: required,
839
- quorumThreshold: required / Math.max(totalNodes, 1),
840
- round: (proposal.divergenceRoundsSeen ?? 0) + 1,
841
- startedAt: proposal.proposedAt,
842
- completedAt: now,
843
- sessionSecret,
844
- });
845
- }
846
- catch (e) {
847
- if (process.env.MONOMIND_LOG_LEVEL === 'debug') {
848
- process.stderr.write(`[hive-consensus] Audit write failed: ${e.message}\n`);
849
- }
850
- }
851
- }
852
- return {
853
- action,
854
- proposalId: proposal.proposalId,
855
- voterId,
856
- vote: voteValue,
857
- strategy: proposalStrategy,
858
- votesFor,
859
- votesAgainst,
860
- required,
861
- totalNodes,
862
- resolved,
863
- result: resolved ? resolution : undefined,
864
- status: proposal.status,
865
- term: proposal.term,
866
- byzantineVoters: proposal.byzantineVoters?.length ? proposal.byzantineVoters : undefined,
867
- cpwbft: cpwbftTally,
868
- // O-Information divergence gate status
869
- divergenceGateOpen,
870
- divergenceRoundsSeen: proposal.divergenceRoundsSeen ?? 0,
871
- minDivergenceRounds: proposal.minDivergenceRounds,
872
- divergenceHint: !divergenceGateOpen
873
- ? `O-Information gate: ${proposal.divergenceRoundsSeen ?? 0}/${proposal.minDivergenceRounds} divergent rounds seen. Resolution deferred to prevent groupthink.`
874
- : undefined,
875
- };
876
- }
877
- if (action === 'status') {
878
- const proposal = state.consensus.pending.find(p => p.proposalId === input.proposalId);
879
- if (!proposal) {
880
- // Check history
881
- const historical = state.consensus.history.find(h => h.proposalId === input.proposalId);
882
- if (historical) {
883
- return { action, ...historical, historical: true, resolved: true };
884
- }
885
- return { action, error: 'Proposal not found' };
886
- }
887
- const votesFor = Object.values(proposal.votes).filter(v => v).length;
888
- const votesAgainst = Object.values(proposal.votes).filter(v => !v).length;
889
- const proposalStrategy = proposal.strategy || 'raft';
890
- const required = calculateRequiredVotes(proposalStrategy, totalNodes, proposal.quorumPreset);
891
- // Raft: check timeout
892
- let timedOut = false;
893
- if (proposalStrategy === 'raft' && proposal.timeoutAt) {
894
- timedOut = new Date().getTime() > new Date(proposal.timeoutAt).getTime();
895
- }
896
- return {
897
- action,
898
- proposalId: proposal.proposalId,
899
- type: proposal.type,
900
- strategy: proposalStrategy,
901
- status: proposal.status,
902
- votesFor,
903
- votesAgainst,
904
- totalVotes: Object.keys(proposal.votes).length,
905
- required,
906
- totalNodes,
907
- resolved: false,
908
- term: proposal.term,
909
- quorumPreset: proposal.quorumPreset,
910
- byzantineVoters: proposal.byzantineVoters?.length ? proposal.byzantineVoters : undefined,
911
- timedOut,
912
- timeoutAt: proposal.timeoutAt,
913
- hint: timedOut ? `Raft timeout reached. Re-propose with term ${(proposal.term || 1) + 1}.` : undefined,
914
- };
915
- }
916
- if (action === 'list') {
917
- return {
918
- action,
919
- pending: state.consensus.pending.map(p => ({
920
- proposalId: p.proposalId,
921
- type: p.type,
922
- strategy: p.strategy || 'raft',
923
- proposedAt: p.proposedAt,
924
- totalVotes: Object.keys(p.votes).length,
925
- required: calculateRequiredVotes(p.strategy || 'raft', totalNodes, p.quorumPreset),
926
- term: p.term,
927
- status: p.status,
928
- })),
929
- recentHistory: state.consensus.history.slice(-5),
930
- };
931
- }
932
- return { action, error: 'Unknown action' };
933
- },
934
- },
935
- {
936
- name: 'hive-mind_broadcast',
937
- description: 'Append a message to a shared array on the hive state file (capped at 100 entries). This is a noticeboard, not message delivery — there are no live listeners, and a worker only sees it if something later reads that state. The reported recipient count is just the number of ids in the worker list.',
938
- category: 'hive-mind',
939
- inputSchema: {
940
- type: 'object',
941
- properties: {
942
- message: { type: 'string', description: 'Message to broadcast' },
943
- priority: { type: 'string', enum: ['low', 'normal', 'high', 'critical'], description: 'Message priority' },
944
- fromId: { type: 'string', description: 'Sender agent ID' },
945
- },
946
- required: ['message'],
947
- },
948
- handler: async (input) => {
949
- const state = loadHiveState();
950
- if (!state.initialized) {
951
- return { success: false, error: 'Hive-mind not initialized' };
952
- }
953
- // Cap inputs: message/fromId are stored directly in the shared-memory JSON
954
- // state (up to 100 broadcasts kept). An uncapped message lets an attacker
955
- // inflate the on-disk hive state by up to 100 × message size per call.
956
- const MAX_BROADCAST_MSG_LEN = 1024 * 1024; // 1 MB
957
- const MAX_FROM_ID_LEN = 256;
958
- const MAX_PRIORITY_LEN = 16;
959
- const rawMessage = input.message;
960
- const message = typeof rawMessage === 'string' && rawMessage.length > MAX_BROADCAST_MSG_LEN
961
- ? rawMessage.slice(0, MAX_BROADCAST_MSG_LEN)
962
- : rawMessage;
963
- const rawFromId = input.fromId || 'system';
964
- const fromId = typeof rawFromId === 'string' && rawFromId.length > MAX_FROM_ID_LEN
965
- ? rawFromId.slice(0, MAX_FROM_ID_LEN)
966
- : rawFromId;
967
- const rawPriority = input.priority || 'normal';
968
- const priority = typeof rawPriority === 'string' && rawPriority.length > MAX_PRIORITY_LEN
969
- ? rawPriority.slice(0, MAX_PRIORITY_LEN)
970
- : rawPriority;
971
- const messageId = `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
972
- // Store in shared memory
973
- const messages = state.sharedMemory.broadcasts || [];
974
- messages.push({
975
- messageId,
976
- message,
977
- priority,
978
- fromId,
979
- timestamp: new Date().toISOString(),
980
- });
981
- // Keep only last 100 broadcasts
982
- state.sharedMemory.broadcasts = messages.slice(-100);
983
- saveHiveState(state);
984
- return {
985
- success: true,
986
- messageId,
987
- recipients: state.workers.length,
988
- priority,
989
- broadcastAt: new Date().toISOString(),
990
- };
991
- },
992
- },
993
- {
994
- name: 'hive-mind_shutdown',
995
- description: 'Shutdown the hive-mind and terminate all workers',
996
- category: 'hive-mind',
997
- inputSchema: {
998
- type: 'object',
999
- properties: {
1000
- graceful: { type: 'boolean', description: 'Graceful shutdown (wait for pending tasks)', default: true },
1001
- force: { type: 'boolean', description: 'Force immediate shutdown', default: false },
1002
- },
1003
- },
1004
- handler: async (input) => {
1005
- const state = loadHiveState();
1006
- if (!state.initialized) {
1007
- return { success: false, error: 'Hive-mind not initialized or already shut down' };
1008
- }
1009
- const graceful = input.graceful !== false;
1010
- const force = input.force === true;
1011
- const workerCount = state.workers.length;
1012
- const pendingConsensus = state.consensus.pending.length;
1013
- // If graceful and there are pending consensus items, warn (unless forced)
1014
- if (graceful && pendingConsensus > 0 && !force) {
1015
- return {
1016
- success: false,
1017
- error: `Cannot gracefully shutdown with ${pendingConsensus} pending consensus items. Use force: true to override.`,
1018
- pendingConsensus,
1019
- workerCount,
1020
- };
1021
- }
1022
- // Clear workers from agent store. Must use the null-aware loader here
1023
- // (this handler mutates and saves) — loadAgentStore() on a corrupt/
1024
- // oversized store.json now returns the empty default, and deleting
1025
- // from + saving that back would wipe every real agent, not just the
1026
- // hive workers being shut down.
1027
- const agentStore = loadAgentStoreOrNull();
1028
- if (!agentStore) {
1029
- return { success: false, error: 'Agent store is unreadable/corrupt — refusing to shut down to avoid overwriting real agent data.', pendingConsensus, workerCount };
1030
- }
1031
- for (const workerId of state.workers) {
1032
- if (agentStore.agents[workerId]) {
1033
- delete agentStore.agents[workerId];
1034
- }
1035
- }
1036
- saveAgentStore(agentStore);
1037
- // Reset hive state
1038
- const shutdownTime = new Date().toISOString();
1039
- const previousQueen = state.queen?.agentId;
1040
- state.initialized = false;
1041
- state.queen = undefined;
1042
- state.workers = [];
1043
- state.consensus.pending = [];
1044
- // Keep history for reference
1045
- state.sharedMemory = {};
1046
- saveHiveState(state);
1047
- return {
1048
- success: true,
1049
- shutdownAt: shutdownTime,
1050
- graceful,
1051
- workersTerminated: workerCount,
1052
- previousQueen,
1053
- consensusCleared: pendingConsensus,
1054
- message: `Hive-mind shutdown complete. ${workerCount} workers terminated.`,
1055
- };
1056
- },
1057
- },
1058
- {
1059
- name: 'hive-mind_memory',
1060
- description: 'Read or write a shared JSON blob on the hive state file. Plain key/value bookkeeping in a single local file — not a distributed or replicated store.',
1061
- category: 'hive-mind',
1062
- inputSchema: {
1063
- type: 'object',
1064
- properties: {
1065
- action: { type: 'string', enum: ['get', 'set', 'delete', 'list'], description: 'Memory action' },
1066
- key: { type: 'string', description: 'Memory key' },
1067
- value: { description: 'Value to store (for set)' },
1068
- },
1069
- required: ['action'],
1070
- },
1071
- handler: async (input) => {
1072
- const state = loadHiveState();
1073
- const action = input.action;
1074
- const key = input.key;
1075
- const MAX_HIVE_MEMORY_KEY_LEN = 256;
1076
- const MAX_HIVE_MEMORY_VALUE_BYTES = 1024 * 1024; // 1 MB
1077
- const MAX_HIVE_MEMORY_KEYS = 1000;
1078
- if (action === 'get') {
1079
- if (!key)
1080
- return { action, error: 'Key required' };
1081
- if (typeof key !== 'string' || key.length > MAX_HIVE_MEMORY_KEY_LEN || HIVE_RESERVED_KEYS.has(key)) {
1082
- return { action, error: 'Invalid key' };
1083
- }
1084
- return {
1085
- action,
1086
- key,
1087
- value: Object.hasOwn(state.sharedMemory, key) ? state.sharedMemory[key] : undefined,
1088
- exists: Object.hasOwn(state.sharedMemory, key),
1089
- };
1090
- }
1091
- if (action === 'set') {
1092
- if (!key)
1093
- return { action, error: 'Key required' };
1094
- if (typeof key !== 'string' || key.length > MAX_HIVE_MEMORY_KEY_LEN || HIVE_RESERVED_KEYS.has(key)) {
1095
- return { action, error: 'Invalid key' };
1096
- }
1097
- // Cap value if it's a string; otherwise serialize and check byte size
1098
- const rawValue = input.value;
1099
- const cappedValue = typeof rawValue === 'string' && rawValue.length > MAX_HIVE_MEMORY_VALUE_BYTES
1100
- ? rawValue.slice(0, MAX_HIVE_MEMORY_VALUE_BYTES)
1101
- : rawValue;
1102
- // Enforce max number of distinct keys to prevent unbounded growth
1103
- const keyCount = Object.keys(state.sharedMemory).length;
1104
- if (!Object.hasOwn(state.sharedMemory, key) && keyCount >= MAX_HIVE_MEMORY_KEYS) {
1105
- return { action, error: `Shared memory full (max ${MAX_HIVE_MEMORY_KEYS} keys)` };
1106
- }
1107
- state.sharedMemory[key] = cappedValue;
1108
- saveHiveState(state);
1109
- // Also store for searchable hive memory
1110
- try {
1111
- const bridge = await import('../memory/memory-bridge.js');
1112
- await bridge.bridgeStoreEntry({
1113
- key: `hive-memory-${key}`,
1114
- value: JSON.stringify(input.value),
1115
- namespace: 'hive-memory',
1116
- });
1117
- }
1118
- catch { /* SQLite memory backend not available */ }
1119
- return {
1120
- action,
1121
- key,
1122
- success: true,
1123
- updatedAt: new Date().toISOString(),
1124
- };
1125
- }
1126
- if (action === 'delete') {
1127
- if (!key)
1128
- return { action, error: 'Key required' };
1129
- if (typeof key !== 'string' || key.length > MAX_HIVE_MEMORY_KEY_LEN || HIVE_RESERVED_KEYS.has(key)) {
1130
- return { action, error: 'Invalid key' };
1131
- }
1132
- const existed = Object.hasOwn(state.sharedMemory, key);
1133
- delete state.sharedMemory[key];
1134
- saveHiveState(state);
1135
- return {
1136
- action,
1137
- key,
1138
- deleted: existed,
1139
- };
1140
- }
1141
- if (action === 'list') {
1142
- return {
1143
- action,
1144
- keys: Object.keys(state.sharedMemory),
1145
- count: Object.keys(state.sharedMemory).length,
1146
- };
1147
- }
1148
- return { action, error: 'Unknown action' };
1149
- },
1150
- },
1151
- {
1152
- name: 'hive-mind_audit_list',
1153
- description: 'List tamper-evident consensus audit records (HMAC-signed JSONL trail)',
1154
- category: 'hive-mind',
1155
- inputSchema: {
1156
- type: 'object',
1157
- properties: {
1158
- swarmId: { type: 'string', description: 'Filter by swarm ID (optional)' },
1159
- limit: { type: 'number', description: 'Max records to return (default: 50, max: 500)' },
1160
- },
1161
- },
1162
- handler: async (input) => {
1163
- try {
1164
- const { AuditWriter } = await import('../consensus/audit-writer.js');
1165
- const auditDir = join(getProjectCwd(), STORAGE_DIR, 'consensus');
1166
- const writer = new AuditWriter(auditDir);
1167
- const limit = Math.min(Math.max(1, input.limit || 50), 500);
1168
- const swarmId = input.swarmId;
1169
- const records = writer.listDecisions(swarmId, limit);
1170
- return {
1171
- success: true,
1172
- count: records.length,
1173
- records: records.map(r => ({
1174
- decisionId: r.decisionId,
1175
- swarmId: r.swarmId,
1176
- protocol: r.protocol,
1177
- topic: r.topic,
1178
- decision: r.decision,
1179
- voteCount: r.votes.length,
1180
- quorumAchieved: r.quorumAchieved,
1181
- round: r.round,
1182
- durationMs: r.durationMs,
1183
- completedAt: r.completedAt,
1184
- signed: !!r.recordSignature,
1185
- })),
1186
- };
1187
- }
1188
- catch (e) {
1189
- return { success: false, error: `Audit trail unavailable: ${e.message}` };
1190
- }
1191
- },
1192
- },
1193
- {
1194
- name: 'hive-mind_audit_verify',
1195
- description: 'Verify tamper-evidence of a consensus decision (checks HMAC signatures on all votes and the record itself)',
1196
- category: 'hive-mind',
1197
- inputSchema: {
1198
- type: 'object',
1199
- properties: {
1200
- decisionId: { type: 'string', description: 'Decision/proposal ID to verify' },
1201
- },
1202
- required: ['decisionId'],
1203
- },
1204
- handler: async (input) => {
1205
- // Uses MONOMIND_SESSION_SECRET when set, otherwise the same
1206
- // per-project generated-and-persisted secret used to sign records
1207
- // in hive-mind_consensus (see getOrCreateSessionSecret).
1208
- const sessionSecret = getOrCreateSessionSecret();
1209
- const decisionId = input.decisionId;
1210
- if (typeof decisionId !== 'string' || decisionId.length === 0 || decisionId.length > 256) {
1211
- return { success: false, error: 'Invalid decisionId' };
1212
- }
1213
- try {
1214
- const { AuditWriter } = await import('../consensus/audit-writer.js');
1215
- const auditDir = join(getProjectCwd(), STORAGE_DIR, 'consensus');
1216
- const writer = new AuditWriter(auditDir);
1217
- const result = writer.verifyDecision(decisionId, sessionSecret);
1218
- return {
1219
- success: true,
1220
- decisionId,
1221
- valid: result.valid,
1222
- invalidVotes: result.invalidVotes,
1223
- message: result.valid
1224
- ? 'All vote signatures and record signature verified — no tampering detected.'
1225
- : `Verification failed: ${result.invalidVotes.length} invalid vote(s) or record signature mismatch.`,
1226
- };
1227
- }
1228
- catch (e) {
1229
- return { success: false, error: `Audit verification failed: ${e.message}` };
1230
- }
1231
- },
1232
- },
1233
- ];
1234
- const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
1235
- const CORE_HIVE_MIND_NAMES = new Set(['hive-mind_status', 'hive-mind_join']);
1236
- export const hiveMindTools = SPECULATIVE
1237
- ? allHiveMindTools
1238
- : allHiveMindTools.filter(t => CORE_HIVE_MIND_NAMES.has(t.name));
1239
- //# sourceMappingURL=hive-mind-tools.js.map