@monoes/monomindcli 1.11.14 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.claude/agents/generated/channel-intelligence-director.md +87 -0
  2. package/.claude/agents/generated/chief-growth-officer.md +88 -0
  3. package/.claude/agents/generated/content-seo-strategist.md +90 -0
  4. package/.claude/agents/generated/developer-community-strategist.md +91 -0
  5. package/.claude/agents/generated/outreach-partnership-strategist.md +90 -0
  6. package/.claude/agents/generated/social-media-strategist.md +91 -0
  7. package/.claude/agents/generated/video-visual-strategist.md +90 -0
  8. package/.claude/commands/mastermind/master.md +1 -1
  9. package/.claude/helpers/auto-memory-hook.mjs +13 -4
  10. package/.claude/helpers/control-start.cjs +5 -0
  11. package/.claude/helpers/event-logger.cjs +114 -0
  12. package/.claude/helpers/handlers/adr-draft-handler.cjs +19 -5
  13. package/.claude/helpers/handlers/agent-start-handler.cjs +13 -4
  14. package/.claude/helpers/handlers/compact-handler.cjs +2 -0
  15. package/.claude/helpers/handlers/edit-handler.cjs +1 -1
  16. package/.claude/helpers/handlers/gates-handler.cjs +3 -0
  17. package/.claude/helpers/handlers/graph-status-handler.cjs +14 -8
  18. package/.claude/helpers/handlers/loops-status-handler.cjs +5 -2
  19. package/.claude/helpers/handlers/route-handler.cjs +24 -10
  20. package/.claude/helpers/handlers/session-handler.cjs +11 -4
  21. package/.claude/helpers/handlers/session-restore-handler.cjs +35 -19
  22. package/.claude/helpers/handlers/task-handler.cjs +13 -5
  23. package/.claude/helpers/hook-handler.cjs +40 -0
  24. package/.claude/helpers/intelligence.cjs +130 -53
  25. package/.claude/helpers/loop-tracker.cjs +15 -3
  26. package/.claude/helpers/memory-palace.cjs +461 -0
  27. package/.claude/helpers/memory.cjs +138 -14
  28. package/.claude/helpers/metrics-db.mjs +87 -0
  29. package/.claude/helpers/router.cjs +300 -42
  30. package/.claude/helpers/session.cjs +89 -30
  31. package/.claude/helpers/statusline.cjs +148 -4
  32. package/.claude/helpers/toggle-statusline.cjs +73 -0
  33. package/.claude/helpers/token-tracker.cjs +934 -0
  34. package/.claude/helpers/utils/micro-agents.cjs +20 -4
  35. package/.claude/helpers/utils/monograph.cjs +39 -4
  36. package/.claude/helpers/utils/telemetry.cjs +3 -3
  37. package/.claude/skills/mastermind/_protocol.md +25 -15
  38. package/.claude/skills/mastermind/architect.md +3 -3
  39. package/.claude/skills/mastermind/autodev.md +4 -2
  40. package/.claude/skills/mastermind/idea.md +10 -0
  41. package/.claude/skills/mastermind/ops.md +3 -3
  42. package/.claude/skills/mastermind/runorg.md +153 -86
  43. package/dist/src/agents/registry-builder.d.ts.map +1 -1
  44. package/dist/src/agents/registry-builder.js +2 -0
  45. package/dist/src/agents/registry-builder.js.map +1 -1
  46. package/dist/src/autopilot-state.d.ts.map +1 -1
  47. package/dist/src/autopilot-state.js +10 -5
  48. package/dist/src/autopilot-state.js.map +1 -1
  49. package/dist/src/benchmarks/benchmark-runner.d.ts.map +1 -1
  50. package/dist/src/benchmarks/benchmark-runner.js +13 -0
  51. package/dist/src/benchmarks/benchmark-runner.js.map +1 -1
  52. package/dist/src/benchmarks/metric-evaluators.d.ts.map +1 -1
  53. package/dist/src/benchmarks/metric-evaluators.js +20 -9
  54. package/dist/src/benchmarks/metric-evaluators.js.map +1 -1
  55. package/dist/src/browser/actions.d.ts.map +1 -1
  56. package/dist/src/browser/actions.js +10 -3
  57. package/dist/src/browser/actions.js.map +1 -1
  58. package/dist/src/browser/browser.d.ts.map +1 -1
  59. package/dist/src/browser/browser.js +12 -2
  60. package/dist/src/browser/browser.js.map +1 -1
  61. package/dist/src/browser/cdp.d.ts.map +1 -1
  62. package/dist/src/browser/cdp.js +21 -3
  63. package/dist/src/browser/cdp.js.map +1 -1
  64. package/dist/src/browser/har.d.ts.map +1 -1
  65. package/dist/src/browser/har.js +27 -5
  66. package/dist/src/browser/har.js.map +1 -1
  67. package/dist/src/commands/agent.d.ts.map +1 -1
  68. package/dist/src/commands/agent.js +11 -8
  69. package/dist/src/commands/agent.js.map +1 -1
  70. package/dist/src/commands/analyze.d.ts.map +1 -1
  71. package/dist/src/commands/analyze.js +36 -21
  72. package/dist/src/commands/analyze.js.map +1 -1
  73. package/dist/src/commands/autopilot.d.ts.map +1 -1
  74. package/dist/src/commands/autopilot.js +12 -4
  75. package/dist/src/commands/autopilot.js.map +1 -1
  76. package/dist/src/commands/benchmark.d.ts.map +1 -1
  77. package/dist/src/commands/benchmark.js +51 -8
  78. package/dist/src/commands/benchmark.js.map +1 -1
  79. package/dist/src/commands/browse.d.ts.map +1 -1
  80. package/dist/src/commands/browse.js +5 -2
  81. package/dist/src/commands/browse.js.map +1 -1
  82. package/dist/src/commands/claims.d.ts.map +1 -1
  83. package/dist/src/commands/claims.js +29 -11
  84. package/dist/src/commands/claims.js.map +1 -1
  85. package/dist/src/commands/cleanup.d.ts.map +1 -1
  86. package/dist/src/commands/cleanup.js +25 -5
  87. package/dist/src/commands/cleanup.js.map +1 -1
  88. package/dist/src/commands/config.d.ts.map +1 -1
  89. package/dist/src/commands/config.js +15 -7
  90. package/dist/src/commands/config.js.map +1 -1
  91. package/dist/src/commands/daemon.d.ts.map +1 -1
  92. package/dist/src/commands/daemon.js +6 -0
  93. package/dist/src/commands/daemon.js.map +1 -1
  94. package/dist/src/commands/deployment.d.ts.map +1 -1
  95. package/dist/src/commands/deployment.js +34 -19
  96. package/dist/src/commands/deployment.js.map +1 -1
  97. package/dist/src/commands/doctor.d.ts.map +1 -1
  98. package/dist/src/commands/doctor.js +133 -15
  99. package/dist/src/commands/doctor.js.map +1 -1
  100. package/dist/src/commands/guidance.d.ts.map +1 -1
  101. package/dist/src/commands/guidance.js +15 -2
  102. package/dist/src/commands/guidance.js.map +1 -1
  103. package/dist/src/commands/hive-mind.d.ts.map +1 -1
  104. package/dist/src/commands/hive-mind.js +37 -14
  105. package/dist/src/commands/hive-mind.js.map +1 -1
  106. package/dist/src/commands/hooks.d.ts.map +1 -1
  107. package/dist/src/commands/hooks.js +42 -25
  108. package/dist/src/commands/hooks.js.map +1 -1
  109. package/dist/src/commands/init.d.ts.map +1 -1
  110. package/dist/src/commands/init.js +9 -4
  111. package/dist/src/commands/init.js.map +1 -1
  112. package/dist/src/commands/issues.d.ts.map +1 -1
  113. package/dist/src/commands/issues.js +29 -26
  114. package/dist/src/commands/issues.js.map +1 -1
  115. package/dist/src/commands/mcp.d.ts.map +1 -1
  116. package/dist/src/commands/mcp.js +11 -5
  117. package/dist/src/commands/mcp.js.map +1 -1
  118. package/dist/src/commands/memory.d.ts.map +1 -1
  119. package/dist/src/commands/memory.js +10 -0
  120. package/dist/src/commands/memory.js.map +1 -1
  121. package/dist/src/commands/migrate.js +5 -5
  122. package/dist/src/commands/migrate.js.map +1 -1
  123. package/dist/src/commands/monograph.d.ts.map +1 -1
  124. package/dist/src/commands/monograph.js +18 -5
  125. package/dist/src/commands/monograph.js.map +1 -1
  126. package/dist/src/commands/monovector/backup.d.ts.map +1 -1
  127. package/dist/src/commands/monovector/backup.js +8 -2
  128. package/dist/src/commands/monovector/backup.js.map +1 -1
  129. package/dist/src/commands/monovector/benchmark.d.ts.map +1 -1
  130. package/dist/src/commands/monovector/benchmark.js +20 -7
  131. package/dist/src/commands/monovector/benchmark.js.map +1 -1
  132. package/dist/src/commands/monovector/import.d.ts.map +1 -1
  133. package/dist/src/commands/monovector/import.js +15 -0
  134. package/dist/src/commands/monovector/import.js.map +1 -1
  135. package/dist/src/commands/monovector/migrate.d.ts.map +1 -1
  136. package/dist/src/commands/monovector/migrate.js +4 -1
  137. package/dist/src/commands/monovector/migrate.js.map +1 -1
  138. package/dist/src/commands/monovector/optimize.d.ts.map +1 -1
  139. package/dist/src/commands/monovector/optimize.js +11 -0
  140. package/dist/src/commands/monovector/optimize.js.map +1 -1
  141. package/dist/src/commands/monovector/setup.d.ts.map +1 -1
  142. package/dist/src/commands/monovector/setup.js +11 -1
  143. package/dist/src/commands/monovector/setup.js.map +1 -1
  144. package/dist/src/commands/neural.js +1 -1
  145. package/dist/src/commands/neural.js.map +1 -1
  146. package/dist/src/commands/performance.d.ts.map +1 -1
  147. package/dist/src/commands/performance.js +20 -7
  148. package/dist/src/commands/performance.js.map +1 -1
  149. package/dist/src/commands/platforms.d.ts.map +1 -1
  150. package/dist/src/commands/platforms.js +90 -8
  151. package/dist/src/commands/platforms.js.map +1 -1
  152. package/dist/src/commands/plugins.d.ts.map +1 -1
  153. package/dist/src/commands/plugins.js +12 -5
  154. package/dist/src/commands/plugins.js.map +1 -1
  155. package/dist/src/commands/process.d.ts.map +1 -1
  156. package/dist/src/commands/process.js +33 -10
  157. package/dist/src/commands/process.js.map +1 -1
  158. package/dist/src/commands/progress.d.ts.map +1 -1
  159. package/dist/src/commands/progress.js +5 -3
  160. package/dist/src/commands/progress.js.map +1 -1
  161. package/dist/src/commands/providers.js +5 -5
  162. package/dist/src/commands/providers.js.map +1 -1
  163. package/dist/src/commands/replay.d.ts.map +1 -1
  164. package/dist/src/commands/replay.js +8 -2
  165. package/dist/src/commands/replay.js.map +1 -1
  166. package/dist/src/commands/route.d.ts.map +1 -1
  167. package/dist/src/commands/route.js +27 -7
  168. package/dist/src/commands/route.js.map +1 -1
  169. package/dist/src/commands/security.d.ts.map +1 -1
  170. package/dist/src/commands/security.js +4 -0
  171. package/dist/src/commands/security.js.map +1 -1
  172. package/dist/src/commands/session.d.ts.map +1 -1
  173. package/dist/src/commands/session.js +12 -1
  174. package/dist/src/commands/session.js.map +1 -1
  175. package/dist/src/commands/start.d.ts.map +1 -1
  176. package/dist/src/commands/start.js +11 -4
  177. package/dist/src/commands/start.js.map +1 -1
  178. package/dist/src/commands/status.d.ts.map +1 -1
  179. package/dist/src/commands/status.js +7 -4
  180. package/dist/src/commands/status.js.map +1 -1
  181. package/dist/src/commands/swarm.d.ts.map +1 -1
  182. package/dist/src/commands/swarm.js +27 -13
  183. package/dist/src/commands/swarm.js.map +1 -1
  184. package/dist/src/commands/task.d.ts.map +1 -1
  185. package/dist/src/commands/task.js +26 -11
  186. package/dist/src/commands/task.js.map +1 -1
  187. package/dist/src/commands/tokens.d.ts.map +1 -1
  188. package/dist/src/commands/tokens.js +7 -2
  189. package/dist/src/commands/tokens.js.map +1 -1
  190. package/dist/src/commands/transfer-store.d.ts.map +1 -1
  191. package/dist/src/commands/transfer-store.js +36 -22
  192. package/dist/src/commands/transfer-store.js.map +1 -1
  193. package/dist/src/commands/update.d.ts.map +1 -1
  194. package/dist/src/commands/update.js +15 -3
  195. package/dist/src/commands/update.js.map +1 -1
  196. package/dist/src/commands/workflow.d.ts.map +1 -1
  197. package/dist/src/commands/workflow.js +39 -6
  198. package/dist/src/commands/workflow.js.map +1 -1
  199. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  200. package/dist/src/consensus/audit-writer.js +18 -7
  201. package/dist/src/consensus/audit-writer.js.map +1 -1
  202. package/dist/src/consensus/vote-signer.d.ts.map +1 -1
  203. package/dist/src/consensus/vote-signer.js +25 -8
  204. package/dist/src/consensus/vote-signer.js.map +1 -1
  205. package/dist/src/index.d.ts.map +1 -1
  206. package/dist/src/index.js +7 -3
  207. package/dist/src/index.js.map +1 -1
  208. package/dist/src/init/executor.d.ts.map +1 -1
  209. package/dist/src/init/executor.js +14 -11
  210. package/dist/src/init/executor.js.map +1 -1
  211. package/dist/src/init/shared-instructions-generator.d.ts.map +1 -1
  212. package/dist/src/init/shared-instructions-generator.js +20 -4
  213. package/dist/src/init/shared-instructions-generator.js.map +1 -1
  214. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  215. package/dist/src/init/statusline-generator.js +36 -15
  216. package/dist/src/init/statusline-generator.js.map +1 -1
  217. package/dist/src/mcp-tools/a2a-tools.d.ts.map +1 -1
  218. package/dist/src/mcp-tools/a2a-tools.js +98 -13
  219. package/dist/src/mcp-tools/a2a-tools.js.map +1 -1
  220. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  221. package/dist/src/mcp-tools/agent-tools.js +16 -3
  222. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  223. package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
  224. package/dist/src/mcp-tools/analyze-tools.js +80 -17
  225. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  226. package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
  227. package/dist/src/mcp-tools/browser-tools.js +84 -22
  228. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  229. package/dist/src/mcp-tools/claims-tools.d.ts.map +1 -1
  230. package/dist/src/mcp-tools/claims-tools.js +35 -7
  231. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  232. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  233. package/dist/src/mcp-tools/config-tools.js +82 -17
  234. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  235. package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
  236. package/dist/src/mcp-tools/coordination-tools.js +37 -4
  237. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  238. package/dist/src/mcp-tools/daa-tools.d.ts.map +1 -1
  239. package/dist/src/mcp-tools/daa-tools.js +49 -7
  240. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  241. package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
  242. package/dist/src/mcp-tools/embeddings-tools.js +45 -18
  243. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  244. package/dist/src/mcp-tools/github-tools.d.ts.map +1 -1
  245. package/dist/src/mcp-tools/github-tools.js +75 -25
  246. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  247. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  248. package/dist/src/mcp-tools/guidance-tools.js +32 -10
  249. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  250. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  251. package/dist/src/mcp-tools/hive-mind-tools.js +91 -20
  252. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  253. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  254. package/dist/src/mcp-tools/hooks-tools.js +188 -29
  255. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  256. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  257. package/dist/src/mcp-tools/memory-tools.js +25 -7
  258. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  259. package/dist/src/mcp-tools/monograph-compat.d.ts.map +1 -1
  260. package/dist/src/mcp-tools/monograph-compat.js +11 -2
  261. package/dist/src/mcp-tools/monograph-compat.js.map +1 -1
  262. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  263. package/dist/src/mcp-tools/monograph-tools.js +476 -62
  264. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  265. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  266. package/dist/src/mcp-tools/neural-tools.js +44 -9
  267. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  268. package/dist/src/mcp-tools/performance-tools.d.ts.map +1 -1
  269. package/dist/src/mcp-tools/performance-tools.js +45 -10
  270. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  271. package/dist/src/mcp-tools/progress-tools.d.ts.map +1 -1
  272. package/dist/src/mcp-tools/progress-tools.js +7 -4
  273. package/dist/src/mcp-tools/progress-tools.js.map +1 -1
  274. package/dist/src/mcp-tools/request-tracker.d.ts.map +1 -1
  275. package/dist/src/mcp-tools/request-tracker.js +15 -1
  276. package/dist/src/mcp-tools/request-tracker.js.map +1 -1
  277. package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
  278. package/dist/src/mcp-tools/security-tools.js +61 -9
  279. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  280. package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
  281. package/dist/src/mcp-tools/session-tools.js +45 -14
  282. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  283. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  284. package/dist/src/mcp-tools/swarm-tools.js +15 -3
  285. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  286. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  287. package/dist/src/mcp-tools/system-tools.js +14 -7
  288. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  289. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  290. package/dist/src/mcp-tools/task-tools.js +52 -10
  291. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  292. package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
  293. package/dist/src/mcp-tools/terminal-tools.js +40 -6
  294. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  295. package/dist/src/mcp-tools/transfer-tools.d.ts.map +1 -1
  296. package/dist/src/mcp-tools/transfer-tools.js +37 -4
  297. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  298. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
  299. package/dist/src/mcp-tools/workflow-tools.js +29 -6
  300. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  301. package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
  302. package/dist/src/memory/ewc-consolidation.js +26 -10
  303. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  304. package/dist/src/memory/intelligence.d.ts.map +1 -1
  305. package/dist/src/memory/intelligence.js +80 -19
  306. package/dist/src/memory/intelligence.js.map +1 -1
  307. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  308. package/dist/src/memory/memory-bridge.js +21 -2
  309. package/dist/src/memory/memory-bridge.js.map +1 -1
  310. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  311. package/dist/src/memory/memory-initializer.js +67 -3
  312. package/dist/src/memory/memory-initializer.js.map +1 -1
  313. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  314. package/dist/src/memory/sona-optimizer.js +14 -4
  315. package/dist/src/memory/sona-optimizer.js.map +1 -1
  316. package/dist/src/monovector/command-outcomes.d.ts.map +1 -1
  317. package/dist/src/monovector/command-outcomes.js +43 -7
  318. package/dist/src/monovector/command-outcomes.js.map +1 -1
  319. package/dist/src/monovector/coverage-router.d.ts.map +1 -1
  320. package/dist/src/monovector/coverage-router.js +8 -4
  321. package/dist/src/monovector/coverage-router.js.map +1 -1
  322. package/dist/src/monovector/coverage-tools.d.ts.map +1 -1
  323. package/dist/src/monovector/coverage-tools.js +6 -3
  324. package/dist/src/monovector/coverage-tools.js.map +1 -1
  325. package/dist/src/monovector/diff-classifier.d.ts.map +1 -1
  326. package/dist/src/monovector/diff-classifier.js +13 -0
  327. package/dist/src/monovector/diff-classifier.js.map +1 -1
  328. package/dist/src/monovector/route-outcomes.d.ts +2 -1
  329. package/dist/src/monovector/route-outcomes.d.ts.map +1 -1
  330. package/dist/src/monovector/route-outcomes.js +46 -4
  331. package/dist/src/monovector/route-outcomes.js.map +1 -1
  332. package/dist/src/plugins/manager.d.ts.map +1 -1
  333. package/dist/src/plugins/manager.js +8 -3
  334. package/dist/src/plugins/manager.js.map +1 -1
  335. package/dist/src/plugins/store/discovery.d.ts.map +1 -1
  336. package/dist/src/plugins/store/discovery.js +46 -2
  337. package/dist/src/plugins/store/discovery.js.map +1 -1
  338. package/dist/src/plugins/store/search.d.ts.map +1 -1
  339. package/dist/src/plugins/store/search.js +5 -4
  340. package/dist/src/plugins/store/search.js.map +1 -1
  341. package/dist/src/production/circuit-breaker.d.ts.map +1 -1
  342. package/dist/src/production/circuit-breaker.js +17 -3
  343. package/dist/src/production/circuit-breaker.js.map +1 -1
  344. package/dist/src/production/error-handler.d.ts.map +1 -1
  345. package/dist/src/production/error-handler.js +3 -0
  346. package/dist/src/production/error-handler.js.map +1 -1
  347. package/dist/src/production/monitoring.d.ts.map +1 -1
  348. package/dist/src/production/monitoring.js +20 -3
  349. package/dist/src/production/monitoring.js.map +1 -1
  350. package/dist/src/production/rate-limiter.d.ts.map +1 -1
  351. package/dist/src/production/rate-limiter.js +13 -4
  352. package/dist/src/production/rate-limiter.js.map +1 -1
  353. package/dist/src/production/retry.d.ts.map +1 -1
  354. package/dist/src/production/retry.js +17 -9
  355. package/dist/src/production/retry.js.map +1 -1
  356. package/dist/src/routing/embed-worker.js +6 -2
  357. package/dist/src/routing/embed-worker.js.map +1 -1
  358. package/dist/src/routing/embedder.d.ts.map +1 -1
  359. package/dist/src/routing/embedder.js +0 -0
  360. package/dist/src/routing/embedder.js.map +1 -1
  361. package/dist/src/routing/llm-caller.d.ts.map +1 -1
  362. package/dist/src/routing/llm-caller.js +13 -2
  363. package/dist/src/routing/llm-caller.js.map +1 -1
  364. package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
  365. package/dist/src/routing/route-layer-factory.js +18 -3
  366. package/dist/src/routing/route-layer-factory.js.map +1 -1
  367. package/dist/src/services/claim-service.d.ts +1 -0
  368. package/dist/src/services/claim-service.d.ts.map +1 -1
  369. package/dist/src/services/claim-service.js +8 -0
  370. package/dist/src/services/claim-service.js.map +1 -1
  371. package/dist/src/services/config-file-manager.d.ts.map +1 -1
  372. package/dist/src/services/config-file-manager.js +14 -2
  373. package/dist/src/services/config-file-manager.js.map +1 -1
  374. package/dist/src/services/headless-worker-executor.d.ts.map +1 -1
  375. package/dist/src/services/headless-worker-executor.js +18 -2
  376. package/dist/src/services/headless-worker-executor.js.map +1 -1
  377. package/dist/src/services/worker-daemon.d.ts.map +1 -1
  378. package/dist/src/services/worker-daemon.js +348 -17
  379. package/dist/src/services/worker-daemon.js.map +1 -1
  380. package/dist/src/transfer/anonymization/index.d.ts +0 -3
  381. package/dist/src/transfer/anonymization/index.d.ts.map +1 -1
  382. package/dist/src/transfer/anonymization/index.js +16 -1
  383. package/dist/src/transfer/anonymization/index.js.map +1 -1
  384. package/dist/src/transfer/export.d.ts.map +1 -1
  385. package/dist/src/transfer/export.js +8 -0
  386. package/dist/src/transfer/export.js.map +1 -1
  387. package/dist/src/transfer/ipfs/upload.d.ts.map +1 -1
  388. package/dist/src/transfer/ipfs/upload.js +33 -3
  389. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  390. package/dist/src/transfer/serialization/cfp.d.ts.map +1 -1
  391. package/dist/src/transfer/serialization/cfp.js +8 -2
  392. package/dist/src/transfer/serialization/cfp.js.map +1 -1
  393. package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
  394. package/dist/src/transfer/storage/gcs.js +37 -3
  395. package/dist/src/transfer/storage/gcs.js.map +1 -1
  396. package/dist/src/transfer/store/discovery.d.ts.map +1 -1
  397. package/dist/src/transfer/store/discovery.js +45 -3
  398. package/dist/src/transfer/store/discovery.js.map +1 -1
  399. package/dist/src/transfer/store/download.d.ts.map +1 -1
  400. package/dist/src/transfer/store/download.js +5 -0
  401. package/dist/src/transfer/store/download.js.map +1 -1
  402. package/dist/src/transfer/store/publish.d.ts.map +1 -1
  403. package/dist/src/transfer/store/publish.js +13 -1
  404. package/dist/src/transfer/store/publish.js.map +1 -1
  405. package/dist/src/transfer/store/registry.d.ts +8 -0
  406. package/dist/src/transfer/store/registry.d.ts.map +1 -1
  407. package/dist/src/transfer/store/registry.js +30 -5
  408. package/dist/src/transfer/store/registry.js.map +1 -1
  409. package/dist/src/transfer/store/search.d.ts.map +1 -1
  410. package/dist/src/transfer/store/search.js +20 -5
  411. package/dist/src/transfer/store/search.js.map +1 -1
  412. package/dist/src/ui/collector.mjs +39 -5
  413. package/dist/src/ui/dashboard.html +1603 -1284
  414. package/dist/src/ui/orgs.html +722 -12
  415. package/dist/src/ui/server.mjs +717 -136
  416. package/dist/src/update/checker.d.ts.map +1 -1
  417. package/dist/src/update/checker.js +59 -7
  418. package/dist/src/update/checker.js.map +1 -1
  419. package/dist/src/update/executor.d.ts.map +1 -1
  420. package/dist/src/update/executor.js +50 -3
  421. package/dist/src/update/executor.js.map +1 -1
  422. package/dist/src/update/index.d.ts.map +1 -1
  423. package/dist/src/update/index.js +18 -1
  424. package/dist/src/update/index.js.map +1 -1
  425. package/dist/src/update/rate-limiter.d.ts +6 -0
  426. package/dist/src/update/rate-limiter.d.ts.map +1 -1
  427. package/dist/src/update/rate-limiter.js +79 -7
  428. package/dist/src/update/rate-limiter.js.map +1 -1
  429. package/dist/src/update/validator.d.ts.map +1 -1
  430. package/dist/src/update/validator.js +52 -1
  431. package/dist/src/update/validator.js.map +1 -1
  432. package/dist/tsconfig.tsbuildinfo +1 -1
  433. package/package.json +2 -3
  434. package/dist/src/ui/data/mastermind-events.jsonl +0 -59
@@ -88,7 +88,8 @@ module.exports = {
88
88
  var neuralEnabled = true;
89
89
  try {
90
90
  var settingsPath = path.join(CWD, '.claude', 'settings.json');
91
- if (fs.existsSync(settingsPath)) {
91
+ var MAX_SETTINGS = 256 * 1024; // 256 KiB
92
+ if (fs.existsSync(settingsPath) && (function() { try { return fs.statSync(settingsPath).size <= MAX_SETTINGS; } catch(_) { return false; } }())) {
92
93
  var settingsData = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
93
94
  if (settingsData.monomind && settingsData.monomind.neural && settingsData.monomind.neural.enabled === false) {
94
95
  neuralEnabled = false;
@@ -215,7 +216,8 @@ module.exports = {
215
216
  fs.writeFileSync(updateCheckFile, JSON.stringify({ timestamp: new Date().toISOString() }), 'utf-8');
216
217
  try {
217
218
  var localPkg = path.join(CWD, 'packages/@monomind/cli/package.json');
218
- if (fs.existsSync(localPkg)) {
219
+ var MAX_PKG = 64 * 1024; // 64 KiB
220
+ if (fs.existsSync(localPkg) && (function() { try { return fs.statSync(localPkg).size <= MAX_PKG; } catch(_) { return false; } }())) {
219
221
  var localVer = JSON.parse(fs.readFileSync(localPkg, 'utf-8')).version;
220
222
  if (localVer) {
221
223
  var spawnFn = require('child_process').spawn;
@@ -225,9 +227,9 @@ module.exports = {
225
227
  });
226
228
  child.on('error', function() {});
227
229
  var out = '';
228
- child.stdout.on('data', function(d) { out += d; });
230
+ child.stdout.on('data', function(d) { if (out.length < 256) out += d; });
229
231
  child.on('close', function() {
230
- var current = out.trim();
232
+ var current = out.trim().slice(0, 64);
231
233
  var pendingUpdatePath = path.join(CWD, '.monomind', 'pending-update.json');
232
234
  if (current && current !== localVer) {
233
235
  try {
@@ -248,7 +250,8 @@ module.exports = {
248
250
  }
249
251
  try {
250
252
  var pendingUpdate = path.join(CWD, '.monomind', 'pending-update.json');
251
- if (fs.existsSync(pendingUpdate)) {
253
+ var MAX_UPD = 4096; // 4 KiB
254
+ if (fs.existsSync(pendingUpdate) && (function() { try { return fs.statSync(pendingUpdate).size <= MAX_UPD; } catch(_) { return false; } }())) {
252
255
  var upd = JSON.parse(fs.readFileSync(pendingUpdate, 'utf-8'));
253
256
  if (upd && upd.from && upd.to && upd.from !== upd.to) {
254
257
  console.log('[UPDATE_AVAILABLE] @monomind/cli ' + upd.from + ' → ' + upd.to + ' (run: npx monomind update)');
@@ -263,16 +266,22 @@ module.exports = {
263
266
  var daemonRunning = false;
264
267
  if (fs.existsSync(daemonPid)) {
265
268
  try {
266
- var pid = parseInt(fs.readFileSync(daemonPid, 'utf-8').trim(), 10);
267
- process.kill(pid, 0);
268
- daemonRunning = true;
269
+ var MAX_PID = 32; // 32 bytes — enough for any pid
270
+ if (fs.statSync(daemonPid).size <= MAX_PID) {
271
+ var pid = parseInt(fs.readFileSync(daemonPid, 'utf-8').trim(), 10);
272
+ if (Number.isInteger(pid) && pid > 0 && pid < 4194304) {
273
+ process.kill(pid, 0);
274
+ daemonRunning = true;
275
+ }
276
+ }
269
277
  } catch (e) { /* pid stale */ }
270
278
  }
271
279
  if (!daemonRunning) {
272
280
  var daemonCfg = {};
273
281
  try {
274
282
  var cfgPath = path.join(CWD, 'monomind.config.json');
275
- if (fs.existsSync(cfgPath)) daemonCfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8')).daemon || {};
283
+ var MAX_CFG = 256 * 1024; // 256 KiB
284
+ if (fs.existsSync(cfgPath) && fs.statSync(cfgPath).size <= MAX_CFG) daemonCfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8')).daemon || {};
276
285
  } catch (e) {}
277
286
  if (daemonCfg.autoStart) {
278
287
  var spawn = require('child_process').spawn;
@@ -282,8 +291,11 @@ module.exports = {
282
291
  daemonChild.on('error', function() {});
283
292
  daemonChild.unref();
284
293
  console.log('[DAEMON_AUTOSTART] Background daemon started (pid ' + daemonChild.pid + ')');
285
- } else {
286
- console.log('[DAEMON_STOPPED] Background daemon is not running. To auto-start, set daemon.autoStart=true in monomind.config.json or run: npx monomind daemon start');
294
+ }
295
+ // Daemon not running + no autoStart: emit only if this project has a config
296
+ // (i.e. daemon was intentionally set up). Avoids noisy output in daemon-less projects.
297
+ else if (fs.existsSync(path.join(CWD, 'monomind.config.json'))) {
298
+ console.log('[DAEMON_STOPPED] Run `npx monomind daemon start` to enable background workers');
287
299
  }
288
300
  }
289
301
  } catch (e) { /* non-fatal */ }
@@ -309,7 +321,8 @@ module.exports = {
309
321
  // Registry Surfacing (SR-001) — show agent count.
310
322
  try {
311
323
  var regPath = path.join(CWD, '.monomind', 'registry.json');
312
- if (fs.existsSync(regPath)) {
324
+ var MAX_REG = 512 * 1024; // 512 KiB
325
+ if (fs.existsSync(regPath) && (function() { try { return fs.statSync(regPath).size <= MAX_REG; } catch(_) { return false; } }())) {
313
326
  var reg = JSON.parse(fs.readFileSync(regPath, 'utf-8'));
314
327
  var agentCount = (reg.agents || []).length;
315
328
  if (agentCount > 0) {
@@ -318,11 +331,13 @@ module.exports = {
318
331
  }
319
332
  } catch (e) { /* non-fatal */ }
320
333
 
321
- // Monomind Control UI Status — only probe when a daemon has previously run
322
- // (indicated by daemon.pid or monomind.config.json). Skips silently in fresh
323
- // environments and test fixtures that have no daemon history.
324
- var _controlUiShouldProbe = fs.existsSync(path.join(CWD, '.monomind', 'daemon.pid'))
325
- || fs.existsSync(path.join(CWD, 'monomind.config.json'));
334
+ // Monomind Control UI Status — only probe when a daemon.pid file exists,
335
+ // meaning the daemon was intentionally started in this project. This avoids
336
+ // printing "[CONTROL_UI] offline" noise on every session in projects that
337
+ // never run the daemon. The broader "monomind.config.json" check is dropped
338
+ // because that file is present in the dev repo itself and in any initialized
339
+ // project, making the old condition nearly always true.
340
+ var _controlUiShouldProbe = fs.existsSync(path.join(CWD, '.monomind', 'daemon.pid'));
326
341
  if (_controlUiShouldProbe) {
327
342
  try {
328
343
  var http = require('http');
@@ -334,7 +349,8 @@ module.exports = {
334
349
  res.resume();
335
350
  });
336
351
  req.on('error', function() {
337
- console.log('[CONTROL_UI] offline run: npx monomind mcp start');
352
+ // Only warn when daemon was previously running (pid file exists but server is gone)
353
+ console.log('[CONTROL_UI] offline — restart with: npx monomind mcp start');
338
354
  });
339
355
  req.setTimeout(800, function() { req.destroy(); });
340
356
  } catch (e) { /* non-fatal */ }
@@ -344,7 +360,7 @@ module.exports = {
344
360
  try {
345
361
  var dispatchDir = path.join(CWD, '.monomind', 'worker-dispatch');
346
362
  if (fs.existsSync(dispatchDir)) {
347
- var pendingFiles = fs.readdirSync(dispatchDir).filter(function(f) { return f.startsWith('pending-'); });
363
+ var pendingFiles = fs.readdirSync(dispatchDir).filter(function(f) { return f.startsWith('pending-'); }).slice(0, 500);
348
364
  if (pendingFiles.length > 0) {
349
365
  console.log('[WORKER_RESUME] ' + pendingFiles.length + ' worker dispatch(es) pending from prior session');
350
366
  }
@@ -172,7 +172,7 @@ module.exports = {
172
172
  const remaining = fs.readdirSync(regDir).filter(f => f.endsWith('.json')).length;
173
173
  const _actPath = path.join(CWD, '.monomind', 'metrics', 'swarm-activity.json');
174
174
  let _prevLastActive = 0;
175
- try { _prevLastActive = (JSON.parse(fs.readFileSync(_actPath, 'utf-8'))?.swarm?.lastActive) || 0; } catch { /* ignore */ }
175
+ try { var _actSt = fs.statSync(_actPath); if (_actSt.size < 65536) { _prevLastActive = (JSON.parse(fs.readFileSync(_actPath, 'utf-8'))?.swarm?.lastActive) || 0; } } catch { /* ignore */ }
176
176
  fs.writeFileSync(_actPath, JSON.stringify({
177
177
  timestamp: new Date().toISOString(),
178
178
  swarm: {
@@ -217,7 +217,8 @@ module.exports = {
217
217
  try {
218
218
  var haltFile = path.join(CWD, 'data', 'halt-signals.jsonl');
219
219
  if (fs.existsSync(haltFile)) {
220
- var haltLines = fs.readFileSync(haltFile, 'utf-8').trim().split('\n').filter(Boolean);
220
+ var haltSt = fs.statSync(haltFile);
221
+ var haltLines = haltSt.size < 1048576 ? fs.readFileSync(haltFile, 'utf-8').trim().split('\n').filter(Boolean) : [];
221
222
  if (haltLines.length > 0) {
222
223
  console.warn('[HALT_DETECTED] ' + haltLines.length + ' halt signal(s) present');
223
224
  }
@@ -298,8 +299,11 @@ module.exports = {
298
299
  var settingsPath = path.join(CWD, '.claude', 'settings.json');
299
300
  var adrCfg = {};
300
301
  if (fs.existsSync(settingsPath)) {
301
- var s = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
302
- adrCfg = (s.monomind && s.monomind.adr) || {};
302
+ var settingsSt = fs.statSync(settingsPath);
303
+ if (settingsSt.size < 524288) {
304
+ var s = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
305
+ adrCfg = (s.monomind && s.monomind.adr) || {};
306
+ }
303
307
  }
304
308
  if (adrCfg.autoGenerate) {
305
309
  var taskAgent = hookInput.agentSlug || hookInput.agent_slug || '';
@@ -307,7 +311,11 @@ module.exports = {
307
311
  var isArchitectLevel = ['architect', 'system-architect', 'software-architect'].includes(taskAgent)
308
312
  || /\b(architecture|design decision|adr|trade-?off|migration strategy)\b/.test(taskDescAdr);
309
313
  if (isArchitectLevel && taskDescAdr.length > 30) {
310
- var adrDir = path.join(CWD, adrCfg.directory || 'docs/adrs');
314
+ // Guard adrCfg.directory against path traversal outside CWD
315
+ var rawAdrDir = typeof adrCfg.directory === 'string' ? adrCfg.directory : 'docs/adrs';
316
+ var resolvedAdrDir = path.resolve(CWD, rawAdrDir);
317
+ if (!resolvedAdrDir.startsWith(CWD + path.sep) && resolvedAdrDir !== CWD) { throw new Error('adr.directory outside project'); }
318
+ var adrDir = resolvedAdrDir;
311
319
  fs.mkdirSync(adrDir, { recursive: true });
312
320
  var adrNum = (fs.readdirSync(adrDir).filter(function(f) { return f.endsWith('.md'); }).length + 1)
313
321
  .toString().padStart(4, '0');
@@ -288,6 +288,46 @@ const handlers = {
288
288
  var tool = hCtx.toolName || '';
289
289
  if (tool === 'Grep') _recordGraphTelemetry('grep_call');
290
290
  else if (tool === 'Glob') _recordGraphTelemetry('glob_call');
291
+
292
+ // Monograph symbol hint: when the Grep pattern looks like a plain symbol name
293
+ // (no regex metacharacters), look it up directly in the graph index and print
294
+ // the file:line so the LLM may skip or narrow the Grep.
295
+ // Session-level cache prevents repeated identical DB lookups across Grep bursts.
296
+ try {
297
+ var grepPattern = (typeof toolInput === 'object' && toolInput !== null)
298
+ ? (toolInput.pattern || toolInput.query || '')
299
+ : '';
300
+ // Only attempt lookup for clean identifiers — skip regexes and paths
301
+ var isCleanSymbol = grepPattern.length >= 3 && grepPattern.length <= 80
302
+ && /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(grepPattern);
303
+ if (isCleanSymbol) {
304
+ if (!hCtx._preSearchCache) hCtx._preSearchCache = {};
305
+ var cacheKey = 'presearch:' + grepPattern;
306
+ if (!(cacheKey in hCtx._preSearchCache)) {
307
+ var db = _openMonographDb();
308
+ var hint = null;
309
+ if (db) {
310
+ try {
311
+ var row = db.prepare(
312
+ 'SELECT n.name, n.label, n.file_path, n.start_line FROM nodes n ' +
313
+ 'WHERE n.name = ? AND n.label NOT IN (\'Concept\',\'Community\',\'Folder\') ' +
314
+ 'AND n.file_path IS NOT NULL LIMIT 1'
315
+ ).get(grepPattern);
316
+ if (row) {
317
+ hint = row.file_path + (row.start_line != null ? ':' + row.start_line : '');
318
+ }
319
+ } catch (e) { /* non-fatal */ }
320
+ }
321
+ hCtx._preSearchCache[cacheKey] = hint;
322
+ }
323
+ var cachedHint = hCtx._preSearchCache[cacheKey];
324
+ if (cachedHint) {
325
+ // Use the correct MCP tool name — monograph_context does not exist;
326
+ // the callable tool is mcp__monomind__monograph_query
327
+ console.log('[MONOGRAPH_HINT] ' + grepPattern + ' found at ' + cachedHint + ' — use mcp__monomind__monograph_query instead of Grep for better results');
328
+ }
329
+ }
330
+ } catch (e) { /* non-fatal — telemetry always proceeds */ }
291
331
  },
292
332
 
293
333
  'post-graph-tool': () => {
@@ -1,87 +1,164 @@
1
1
  'use strict';
2
2
  /**
3
3
  * Intelligence context module for hook-handler.cjs
4
- * Provides context injection, trajectory logging, and feedback recording.
4
+ * Provides context injection, trajectory logging, feedback recording,
5
+ * edit tracking, consolidation, and stats.
6
+ *
7
+ * Data directory: $CLAUDE_PROJECT_DIR/.monomind/data/
8
+ * auto-memory-store.json — persisted memory entries
9
+ * ranked-context.json — ranked view written by init()
10
+ * pending-insights.jsonl — pending entries to consolidate
11
+ * intelligence-outcomes.jsonl — feedback records
5
12
  */
6
13
 
7
14
  const path = require('path');
8
15
  const fs = require('fs');
9
16
 
17
+ // Resolve base dir at require-time so tests can inject CLAUDE_PROJECT_DIR
18
+ // per fresh require() call.
10
19
  const CWD = process.env.CLAUDE_PROJECT_DIR || process.cwd();
11
- const INTEL_DIR = path.join(CWD, '.monomind', 'intelligence');
12
- const PATTERNS_FILE = path.join(INTEL_DIR, 'patterns.json');
13
- const TRAJECTORY_FILE = path.join(INTEL_DIR, 'trajectory.json');
20
+ const DATA_DIR = path.join(CWD, '.monomind', 'data');
21
+ const STORE_FILE = path.join(DATA_DIR, 'auto-memory-store.json');
22
+ const RANKED_FILE = path.join(DATA_DIR, 'ranked-context.json');
23
+ const PENDING_FILE = path.join(DATA_DIR, 'pending-insights.jsonl');
24
+ const OUTCOMES_FILE = path.join(DATA_DIR, 'intelligence-outcomes.jsonl');
14
25
 
15
- var _initialized = false;
16
- var _patterns = [];
17
- var _trajectory = [];
26
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MiB guard
27
+ const RING_BUFFER_MAX = 50;
18
28
 
19
- function ensureDir() {
20
- try { fs.mkdirSync(INTEL_DIR, { recursive: true }); } catch (_) {}
29
+ var _entries = []; // deduplicated memory entries loaded from store
30
+ var _recentEdits = []; // ring buffer of recently edited paths
31
+
32
+ function ensureDataDir() {
33
+ try { fs.mkdirSync(DATA_DIR, { recursive: true }); } catch (_) {}
21
34
  }
22
35
 
23
- function loadPatterns() {
36
+ function safeReadJson(filePath) {
24
37
  try {
25
- if (fs.existsSync(PATTERNS_FILE)) {
26
- _patterns = JSON.parse(fs.readFileSync(PATTERNS_FILE, 'utf-8'));
27
- }
28
- } catch (_) { _patterns = []; }
38
+ if (!fs.existsSync(filePath)) return null;
39
+ var st = fs.statSync(filePath);
40
+ if (st.size > MAX_FILE_SIZE) return null;
41
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
42
+ } catch (_) { return null; }
29
43
  }
30
44
 
45
+ function safeReadLines(filePath) {
46
+ try {
47
+ if (!fs.existsSync(filePath)) return [];
48
+ var st = fs.statSync(filePath);
49
+ if (st.size > MAX_FILE_SIZE) return [];
50
+ return fs.readFileSync(filePath, 'utf-8')
51
+ .split('\n')
52
+ .filter(function(l) { return l.trim().length > 0; });
53
+ } catch (_) { return []; }
54
+ }
55
+
56
+ // ── init ───────────────────────────────────────────────────────────────────────
57
+
31
58
  function init() {
32
- if (_initialized) return { ok: true, patternCount: _patterns.length };
33
- ensureDir();
34
- loadPatterns();
35
- _initialized = true;
36
- return { ok: true, patternCount: _patterns.length };
59
+ ensureDataDir();
60
+
61
+ // Load entries from store, deduplicate by id
62
+ var raw = safeReadJson(STORE_FILE);
63
+ var arr = Array.isArray(raw) ? raw : [];
64
+ var seen = new Set();
65
+ _entries = arr.filter(function(e) {
66
+ var key = e && e.id ? String(e.id) : null;
67
+ if (!key) return true;
68
+ if (seen.has(key)) return false;
69
+ seen.add(key);
70
+ return true;
71
+ });
72
+
73
+ // Write ranked-context.json (sorted by confidence desc) with version envelope
74
+ var ranked = _entries.slice().sort(function(a, b) {
75
+ return (b.confidence || 0) - (a.confidence || 0);
76
+ });
77
+ try {
78
+ fs.writeFileSync(RANKED_FILE, JSON.stringify({ version: 1, entries: ranked }, null, 2), 'utf-8');
79
+ } catch (_) {}
80
+
81
+ return { nodes: _entries.length, edges: 0 };
37
82
  }
38
83
 
84
+ // ── getContext ─────────────────────────────────────────────────────────────────
85
+
39
86
  function getContext(prompt) {
40
- if (!prompt || typeof prompt !== 'string') return null;
41
- if (!_initialized) init();
42
- // Match patterns against prompt
43
- var matches = _patterns.filter(function(p) {
44
- return p.keywords && p.keywords.some(function(kw) {
45
- return prompt.toLowerCase().includes(kw.toLowerCase());
46
- });
87
+ if (!prompt || typeof prompt !== 'string' || prompt.trim() === '') return null;
88
+ if (_entries.length === 0) return null;
89
+
90
+ var promptWords = prompt.toLowerCase().split(/\W+/).filter(Boolean);
91
+ var promptSet = new Set(promptWords);
92
+
93
+ var matches = _entries.filter(function(e) {
94
+ var content = ((e.content || '') + ' ' + (e.summary || '')).toLowerCase();
95
+ var words = content.split(/\W+/).filter(Boolean);
96
+ return words.some(function(w) { return promptSet.has(w); });
47
97
  });
98
+
48
99
  if (matches.length === 0) return null;
100
+
49
101
  var top = matches[0];
50
- return '[INTELLIGENCE] Pattern match: ' + (top.name || top.id || 'pattern') +
51
- (top.suggestion ? ' — ' + top.suggestion : '');
102
+ return '[INTELLIGENCE] ' + (top.summary || top.content || top.id || 'context match');
52
103
  }
53
104
 
54
- function logTrajectory(step) {
55
- ensureDir();
56
- _trajectory.push(Object.assign({ ts: new Date().toISOString() }, step || {}));
57
- // Flush every 10 steps to avoid excessive writes
58
- if (_trajectory.length % 10 === 0) {
59
- try {
60
- fs.writeFileSync(TRAJECTORY_FILE, JSON.stringify(_trajectory.slice(-200), null, 2), 'utf-8');
61
- } catch (_) {}
105
+ // ── recordEdit ────────────────────────────────────────────────────────────────
106
+
107
+ function recordEdit(filePath) {
108
+ _recentEdits.push({ path: String(filePath || ''), ts: Date.now() });
109
+ if (_recentEdits.length > RING_BUFFER_MAX) {
110
+ _recentEdits = _recentEdits.slice(-RING_BUFFER_MAX);
62
111
  }
63
112
  }
64
113
 
114
+ // ── consolidate ───────────────────────────────────────────────────────────────
115
+
116
+ function consolidate() {
117
+ ensureDataDir();
118
+ var lines = safeReadLines(PENDING_FILE);
119
+ var count = lines.length;
120
+
121
+ // Clear the pending file
122
+ try { fs.writeFileSync(PENDING_FILE, '', 'utf-8'); } catch (_) {}
123
+
124
+ return { entries: count, edges: 0, newEntries: count };
125
+ }
126
+
127
+ // ── feedback ──────────────────────────────────────────────────────────────────
128
+
65
129
  function feedback(success) {
66
- // Record outcome for last trajectory step
67
- if (_trajectory.length > 0) {
68
- _trajectory[_trajectory.length - 1].outcome = success ? 'success' : 'failure';
69
- }
70
- // Persist
71
- ensureDir();
72
- try {
73
- fs.writeFileSync(TRAJECTORY_FILE, JSON.stringify(_trajectory.slice(-200), null, 2), 'utf-8');
74
- } catch (_) {}
130
+ ensureDataDir();
131
+ var record = JSON.stringify({
132
+ ts: Date.now(),
133
+ success: !!success,
134
+ context: null,
135
+ recentEdits: _recentEdits.slice(),
136
+ }) + '\n';
137
+ try { fs.appendFileSync(OUTCOMES_FILE, record, 'utf-8'); } catch (_) {}
138
+ }
139
+
140
+ // ── stats ─────────────────────────────────────────────────────────────────────
141
+
142
+ function stats(asJson) {
143
+ var result = {
144
+ entries: _entries.length,
145
+ recentEdits: _recentEdits.length,
146
+ pending: safeReadLines(PENDING_FILE).length,
147
+ };
148
+ if (asJson) return JSON.stringify(result);
149
+ return result;
150
+ }
151
+
152
+ // ── legacy ────────────────────────────────────────────────────────────────────
153
+
154
+ function logTrajectory(step) {
155
+ // no-op stub for backward compatibility
156
+ void step;
75
157
  }
76
158
 
77
159
  function storePattern(pattern) {
78
- ensureDir();
79
- loadPatterns();
80
- _patterns = _patterns.filter(function(p) { return p.id !== pattern.id; });
81
- _patterns.push(Object.assign({ storedAt: new Date().toISOString() }, pattern));
82
- try {
83
- fs.writeFileSync(PATTERNS_FILE, JSON.stringify(_patterns.slice(-500), null, 2), 'utf-8');
84
- } catch (_) {}
160
+ // no-op stub for backward compatibility
161
+ void pattern;
85
162
  }
86
163
 
87
- module.exports = { init, getContext, logTrajectory, feedback, storePattern };
164
+ module.exports = { init, getContext, recordEdit, consolidate, feedback, stats, logTrajectory, storePattern };
@@ -15,13 +15,20 @@ const path = require('path');
15
15
  const CWD = process.env.CLAUDE_PROJECT_DIR || process.cwd();
16
16
  const LOOPS_DIR = path.join(CWD, '.monomind', 'loops');
17
17
 
18
+ const STDIN_MAX_BYTES = 1 * 1024 * 1024; // 1 MiB cap to prevent OOM
19
+
18
20
  async function readStdin() {
19
21
  if (process.stdin.isTTY) return '';
20
22
  return new Promise((resolve) => {
21
23
  let data = '';
24
+ let bytesRead = 0;
22
25
  const timer = setTimeout(() => { process.stdin.removeAllListeners(); resolve(data); }, 3000);
23
26
  process.stdin.setEncoding('utf8');
24
- process.stdin.on('data', chunk => { data += chunk; });
27
+ process.stdin.on('data', chunk => {
28
+ bytesRead += Buffer.byteLength(chunk, 'utf8');
29
+ if (bytesRead > STDIN_MAX_BYTES) { clearTimeout(timer); resolve(''); return; }
30
+ data += chunk;
31
+ });
25
32
  process.stdin.on('end', () => { clearTimeout(timer); resolve(data); });
26
33
  process.stdin.on('error', () => { clearTimeout(timer); resolve(data); });
27
34
  process.stdin.resume();
@@ -60,7 +67,9 @@ async function main() {
60
67
  try { hookInput = JSON.parse(raw); } catch { process.exit(0); }
61
68
 
62
69
  const toolInput = hookInput.tool_input || hookInput.toolInput || {};
63
- const sessionId = hookInput.session_id || hookInput.sessionId || hookInput.id || '';
70
+ const rawSessionId = hookInput.session_id || hookInput.sessionId || hookInput.id || '';
71
+ // Sanitize sessionId to prevent path traversal — allow only alphanumeric, dash, underscore, dot
72
+ const sessionId = String(rawSessionId).replace(/[^a-zA-Z0-9_.\-]/g, '').slice(0, 128);
64
73
 
65
74
  if (!sessionId) { process.exit(0); }
66
75
 
@@ -75,7 +84,10 @@ async function main() {
75
84
  let existing = {};
76
85
  try {
77
86
  if (fs.existsSync(loopFile)) {
78
- existing = JSON.parse(fs.readFileSync(loopFile, 'utf-8'));
87
+ const stat = fs.statSync(loopFile);
88
+ if (stat.size <= 512 * 1024) { // 512 KiB guard to prevent OOM
89
+ existing = JSON.parse(fs.readFileSync(loopFile, 'utf-8'));
90
+ }
79
91
  }
80
92
  } catch { /* start fresh */ }
81
93