monomind 1.14.6 → 1.15.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 (314) hide show
  1. package/.claude/agents/reengineer-squad/boss.md +113 -0
  2. package/.claude/agents/reengineer-squad/critic-architect.md +132 -0
  3. package/.claude/agents/reengineer-squad/git-manager.md +145 -0
  4. package/.claude/agents/reengineer-squad/idea-generator.md +95 -0
  5. package/.claude/agents/reengineer-squad/implementer.md +112 -0
  6. package/.claude/agents/reengineer-squad/integration-planner.md +112 -0
  7. package/.claude/agents/reengineer-squad/source-analyst.md +103 -0
  8. package/.claude/agents/reengineer-squad/target-analyst.md +118 -0
  9. package/.claude/agents/reengineer-squad/tester.md +105 -0
  10. package/.claude/commands/mastermind/master.md +35 -14
  11. package/.claude/helpers/handlers/capture-handler.cjs +155 -18
  12. package/.claude/helpers/monolean-activate.cjs +20 -0
  13. package/.claude/helpers/monolean-config.cjs +76 -0
  14. package/.claude/helpers/monolean-instructions.cjs +109 -0
  15. package/.claude/helpers/monolean-propagate.cjs +9 -0
  16. package/.claude/helpers/monolean-tracker.cjs +18 -0
  17. package/.claude/helpers/skill-registry.json +2 -2
  18. package/.claude/settings.json +34 -2
  19. package/.claude/skills/agent-browser-testing/SKILL.md +301 -18
  20. package/.claude/skills/mastermind/runorg.md +69 -23
  21. package/.claude/skills/monodesign/SKILL.md +32 -1
  22. package/.claude/skills/monodesign/adapt.md +53 -0
  23. package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
  24. package/.claude/skills/monodesign/animate.md +65 -0
  25. package/.claude/skills/monodesign/audit.md +89 -0
  26. package/.claude/skills/monodesign/bolder.md +50 -0
  27. package/.claude/skills/monodesign/clarify.md +64 -0
  28. package/.claude/skills/monodesign/colorize.md +68 -0
  29. package/.claude/skills/monodesign/craft.md +51 -0
  30. package/.claude/skills/monodesign/critique.md +66 -0
  31. package/.claude/skills/monodesign/delight.md +47 -0
  32. package/.claude/skills/monodesign/distill.md +56 -0
  33. package/.claude/skills/monodesign/document.md +80 -0
  34. package/.claude/skills/monodesign/extract.md +74 -0
  35. package/.claude/skills/monodesign/harden.md +65 -0
  36. package/.claude/skills/monodesign/live.md +59 -0
  37. package/.claude/skills/monodesign/onboard.md +50 -0
  38. package/.claude/skills/monodesign/optimize.md +64 -0
  39. package/.claude/skills/monodesign/overdrive.md +56 -0
  40. package/.claude/skills/monodesign/polish.md +68 -0
  41. package/.claude/skills/monodesign/quieter.md +57 -0
  42. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +248 -76
  43. package/.claude/skills/monodesign/reference/codex.md +107 -0
  44. package/.claude/skills/monodesign/reference/craft.md +3 -0
  45. package/.claude/skills/monodesign/reference/hooks.md +99 -0
  46. package/.claude/skills/monodesign/reference/image-prompts.md +12 -0
  47. package/.claude/skills/monodesign/shape.md +71 -0
  48. package/.claude/skills/monodesign/teach.md +69 -0
  49. package/.claude/skills/monodesign/typeset.md +59 -0
  50. package/.claude/skills/monolean/SKILL.md +118 -0
  51. package/.claude/skills/monolean-audit/SKILL.md +41 -0
  52. package/.claude/skills/monolean-debt/SKILL.md +46 -0
  53. package/.claude/skills/monolean-help/SKILL.md +60 -0
  54. package/.claude/skills/monolean-review/SKILL.md +57 -0
  55. package/package.json +8 -2
  56. package/packages/@monomind/cli/bin/cli.js +3 -1
  57. package/packages/@monomind/cli/dist/dashboard/server.js +137 -0
  58. package/packages/@monomind/cli/dist/src/__tests__/browse-adapters.test.d.ts +2 -0
  59. package/packages/@monomind/cli/dist/src/__tests__/browse-adapters.test.js +51 -0
  60. package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.d.ts +2 -0
  61. package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.js +68 -0
  62. package/packages/@monomind/cli/dist/src/__tests__/browse-builtin-handlers.test.d.ts +2 -0
  63. package/packages/@monomind/cli/dist/src/__tests__/browse-builtin-handlers.test.js +139 -0
  64. package/packages/@monomind/cli/dist/src/__tests__/browse-cdp.test.d.ts +2 -0
  65. package/packages/@monomind/cli/dist/src/__tests__/browse-cdp.test.js +169 -0
  66. package/packages/@monomind/cli/dist/src/__tests__/browse-dashboard.test.d.ts +2 -0
  67. package/packages/@monomind/cli/dist/src/__tests__/browse-dashboard.test.js +179 -0
  68. package/packages/@monomind/cli/dist/src/__tests__/browse-engine.test.d.ts +2 -0
  69. package/packages/@monomind/cli/dist/src/__tests__/browse-engine.test.js +122 -0
  70. package/packages/@monomind/cli/dist/src/__tests__/browse-expression.test.d.ts +2 -0
  71. package/packages/@monomind/cli/dist/src/__tests__/browse-expression.test.js +54 -0
  72. package/packages/@monomind/cli/dist/src/__tests__/browse-store.test.d.ts +2 -0
  73. package/packages/@monomind/cli/dist/src/__tests__/browse-store.test.js +99 -0
  74. package/packages/@monomind/cli/dist/src/__tests__/browse-workflow-types.test.d.ts +2 -0
  75. package/packages/@monomind/cli/dist/src/__tests__/browse-workflow-types.test.js +33 -0
  76. package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.d.ts +11 -0
  77. package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.js +71 -0
  78. package/packages/@monomind/cli/dist/src/browser/action-builder/types.d.ts +47 -0
  79. package/packages/@monomind/cli/dist/src/browser/action-builder/types.js +2 -0
  80. package/packages/@monomind/cli/dist/src/browser/adapters/gemini.d.ts +3 -0
  81. package/packages/@monomind/cli/dist/src/browser/adapters/gemini.js +16 -0
  82. package/packages/@monomind/cli/dist/src/browser/adapters/google.d.ts +3 -0
  83. package/packages/@monomind/cli/dist/src/browser/adapters/google.js +17 -0
  84. package/packages/@monomind/cli/dist/src/browser/adapters/index.d.ts +19 -0
  85. package/packages/@monomind/cli/dist/src/browser/adapters/index.js +23 -0
  86. package/packages/@monomind/cli/dist/src/browser/adapters/instagram.d.ts +3 -0
  87. package/packages/@monomind/cli/dist/src/browser/adapters/instagram.js +17 -0
  88. package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.d.ts +3 -0
  89. package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.js +19 -0
  90. package/packages/@monomind/cli/dist/src/browser/adapters/microsoft.d.ts +3 -0
  91. package/packages/@monomind/cli/dist/src/browser/adapters/microsoft.js +16 -0
  92. package/packages/@monomind/cli/dist/src/browser/adapters/x.d.ts +3 -0
  93. package/packages/@monomind/cli/dist/src/browser/adapters/x.js +19 -0
  94. package/packages/@monomind/cli/dist/src/browser/dashboard/api-types.d.ts +50 -0
  95. package/packages/@monomind/cli/dist/src/browser/dashboard/api-types.js +14 -0
  96. package/packages/@monomind/cli/dist/src/browser/dashboard/server.d.ts +9 -0
  97. package/packages/@monomind/cli/dist/src/browser/dashboard/server.js +62 -0
  98. package/packages/@monomind/cli/dist/src/browser/dashboard/ui.html +1811 -0
  99. package/packages/@monomind/cli/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
  100. package/packages/@monomind/cli/dist/src/browser/workflow/builtin-handlers.js +343 -0
  101. package/packages/@monomind/cli/dist/src/browser/workflow/engine.d.ts +15 -0
  102. package/packages/@monomind/cli/dist/src/browser/workflow/engine.js +127 -0
  103. package/packages/@monomind/cli/dist/src/browser/workflow/expression.d.ts +4 -0
  104. package/packages/@monomind/cli/dist/src/browser/workflow/expression.js +64 -0
  105. package/packages/@monomind/cli/dist/src/browser/workflow/store.d.ts +24 -0
  106. package/packages/@monomind/cli/dist/src/browser/workflow/store.js +145 -0
  107. package/packages/@monomind/cli/dist/src/browser/workflow/types.d.ts +48 -0
  108. package/packages/@monomind/cli/dist/src/browser/workflow/types.js +2 -0
  109. package/packages/@monomind/cli/dist/src/commands/browse-action.d.ts +4 -0
  110. package/packages/@monomind/cli/dist/src/commands/browse-action.js +151 -0
  111. package/packages/@monomind/cli/dist/src/commands/browse-platform.d.ts +4 -0
  112. package/packages/@monomind/cli/dist/src/commands/browse-platform.js +117 -0
  113. package/packages/@monomind/cli/dist/src/commands/browse-workflow.d.ts +4 -0
  114. package/packages/@monomind/cli/dist/src/commands/browse-workflow.js +153 -0
  115. package/packages/@monomind/cli/dist/src/commands/browse.d.ts +10 -6
  116. package/packages/@monomind/cli/dist/src/commands/browse.js +11 -2154
  117. package/packages/@monomind/cli/dist/src/commands/design-detect.d.ts +21 -0
  118. package/packages/@monomind/cli/dist/src/commands/design-detect.js +127 -0
  119. package/packages/@monomind/cli/dist/src/commands/design-palette.d.ts +22 -0
  120. package/packages/@monomind/cli/dist/src/commands/design-palette.js +539 -0
  121. package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.d.ts +10 -0
  122. package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.js +377 -0
  123. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.d.ts +12 -0
  124. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +1217 -0
  125. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.d.ts +42 -0
  126. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.js +220 -0
  127. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.d.ts +14 -0
  128. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.js +579 -0
  129. package/packages/@monomind/cli/dist/src/commands/hooks-formatting.d.ts +13 -0
  130. package/packages/@monomind/cli/dist/src/commands/hooks-formatting.js +42 -0
  131. package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.d.ts +15 -0
  132. package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.js +723 -0
  133. package/packages/@monomind/cli/dist/src/commands/hooks-workers.d.ts +9 -0
  134. package/packages/@monomind/cli/dist/src/commands/hooks-workers.js +782 -0
  135. package/packages/@monomind/cli/dist/src/commands/hooks.d.ts +8 -0
  136. package/packages/@monomind/cli/dist/src/commands/hooks.js +179 -4103
  137. package/packages/@monomind/cli/dist/src/commands/index.d.ts +1 -0
  138. package/packages/@monomind/cli/dist/src/commands/index.js +6 -0
  139. package/packages/@monomind/cli/dist/src/commands/org.js +14 -15
  140. package/packages/@monomind/cli/dist/src/commands/tokens.js +77 -1
  141. package/packages/@monomind/cli/dist/src/graph/enrich.mjs +362 -0
  142. package/packages/@monomind/cli/dist/src/init/executor.js +18 -8
  143. package/packages/@monomind/cli/dist/src/init/settings-generator.js +39 -5
  144. package/packages/@monomind/cli/dist/src/init/statusline-generator.js +25 -5
  145. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.d.ts +3 -5
  146. package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +619 -326
  147. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.d.ts +161 -0
  148. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.js +506 -0
  149. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.d.ts +26 -0
  150. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +1328 -0
  151. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.d.ts +27 -0
  152. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +1591 -0
  153. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.d.ts +3 -38
  154. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +5 -3393
  155. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +24 -14
  156. package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +54 -1
  157. package/packages/@monomind/cli/dist/src/memory/embedding-operations.d.ts +58 -0
  158. package/packages/@monomind/cli/dist/src/memory/embedding-operations.js +299 -0
  159. package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +37 -3
  160. package/packages/@monomind/cli/dist/src/memory/hnsw-operations.d.ts +130 -0
  161. package/packages/@monomind/cli/dist/src/memory/hnsw-operations.js +400 -0
  162. package/packages/@monomind/cli/dist/src/memory/intelligence.js +42 -23
  163. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +52 -8
  164. package/packages/@monomind/cli/dist/src/memory/memory-crud.d.ts +67 -0
  165. package/packages/@monomind/cli/dist/src/memory/memory-crud.js +415 -0
  166. package/packages/@monomind/cli/dist/src/memory/memory-initializer.d.ts +9 -322
  167. package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +17 -1794
  168. package/packages/@monomind/cli/dist/src/memory/memory-migrations.d.ts +30 -0
  169. package/packages/@monomind/cli/dist/src/memory/memory-migrations.js +134 -0
  170. package/packages/@monomind/cli/dist/src/memory/memory-read.d.ts +78 -0
  171. package/packages/@monomind/cli/dist/src/memory/memory-read.js +331 -0
  172. package/packages/@monomind/cli/dist/src/memory/memory-schema.d.ts +13 -0
  173. package/packages/@monomind/cli/dist/src/memory/memory-schema.js +167 -0
  174. package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +37 -4
  175. package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +16 -6
  176. package/packages/@monomind/cli/dist/src/pricing/model-pricing.d.ts +41 -0
  177. package/packages/@monomind/cli/dist/src/pricing/model-pricing.js +61 -0
  178. package/packages/@monomind/cli/dist/src/ui/.monomind/capture/active-run.json +1 -0
  179. package/packages/@monomind/cli/dist/src/ui/collector.mjs +799 -0
  180. package/packages/@monomind/cli/dist/src/ui/dashboard.html +13986 -0
  181. package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.html +763 -0
  182. package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.json +966 -0
  183. package/packages/@monomind/cli/dist/src/ui/data/avatars/account-strategist.svg +58 -0
  184. package/packages/@monomind/cli/dist/src/ui/data/avatars/accounts-payable.svg +54 -0
  185. package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator.svg +55 -0
  186. package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator2.svg +54 -0
  187. package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-citation.svg +57 -0
  188. package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-engineer.svg +61 -0
  189. package/packages/@monomind/cli/dist/src/ui/data/avatars/analytics-reporter.svg +53 -0
  190. package/packages/@monomind/cli/dist/src/ui/data/avatars/api-tester.svg +53 -0
  191. package/packages/@monomind/cli/dist/src/ui/data/avatars/architecture.svg +54 -0
  192. package/packages/@monomind/cli/dist/src/ui/data/avatars/automation-governance.svg +55 -0
  193. package/packages/@monomind/cli/dist/src/ui/data/avatars/backend-dev.svg +53 -0
  194. package/packages/@monomind/cli/dist/src/ui/data/avatars/benchmarker.svg +54 -0
  195. package/packages/@monomind/cli/dist/src/ui/data/avatars/blockchain-auditor.svg +53 -0
  196. package/packages/@monomind/cli/dist/src/ui/data/avatars/byzantine-coord.svg +57 -0
  197. package/packages/@monomind/cli/dist/src/ui/data/avatars/case-analyst.svg +57 -0
  198. package/packages/@monomind/cli/dist/src/ui/data/avatars/cicd-engineer.svg +55 -0
  199. package/packages/@monomind/cli/dist/src/ui/data/avatars/cloud-architect.svg +54 -0
  200. package/packages/@monomind/cli/dist/src/ui/data/avatars/code-review-swarm.svg +57 -0
  201. package/packages/@monomind/cli/dist/src/ui/data/avatars/coder-v119.svg +57 -0
  202. package/packages/@monomind/cli/dist/src/ui/data/avatars/coder.svg +58 -0
  203. package/packages/@monomind/cli/dist/src/ui/data/avatars/collective-coord.svg +54 -0
  204. package/packages/@monomind/cli/dist/src/ui/data/avatars/compliance-auditor.svg +58 -0
  205. package/packages/@monomind/cli/dist/src/ui/data/avatars/consensus-coordinator.svg +54 -0
  206. package/packages/@monomind/cli/dist/src/ui/data/avatars/content-creator.svg +54 -0
  207. package/packages/@monomind/cli/dist/src/ui/data/avatars/crdt-synchronizer.svg +53 -0
  208. package/packages/@monomind/cli/dist/src/ui/data/avatars/cro-specialist.svg +58 -0
  209. package/packages/@monomind/cli/dist/src/ui/data/avatars/data-consolidator.svg +54 -0
  210. package/packages/@monomind/cli/dist/src/ui/data/avatars/data-engineer.svg +53 -0
  211. package/packages/@monomind/cli/dist/src/ui/data/avatars/database-optimizer.svg +61 -0
  212. package/packages/@monomind/cli/dist/src/ui/data/avatars/deal-strategist.svg +54 -0
  213. package/packages/@monomind/cli/dist/src/ui/data/avatars/defender.svg +53 -0
  214. package/packages/@monomind/cli/dist/src/ui/data/avatars/devops-automator.svg +56 -0
  215. package/packages/@monomind/cli/dist/src/ui/data/avatars/discovery-coach.svg +54 -0
  216. package/packages/@monomind/cli/dist/src/ui/data/avatars/email-marketing.svg +57 -0
  217. package/packages/@monomind/cli/dist/src/ui/data/avatars/embedded-firmware.svg +61 -0
  218. package/packages/@monomind/cli/dist/src/ui/data/avatars/evidence-collector.svg +57 -0
  219. package/packages/@monomind/cli/dist/src/ui/data/avatars/experiment-tracker.svg +53 -0
  220. package/packages/@monomind/cli/dist/src/ui/data/avatars/feedback-synthesizer.svg +54 -0
  221. package/packages/@monomind/cli/dist/src/ui/data/avatars/finance-tracker.svg +54 -0
  222. package/packages/@monomind/cli/dist/src/ui/data/avatars/frontend-developer.svg +54 -0
  223. package/packages/@monomind/cli/dist/src/ui/data/avatars/game-audio-engineer.svg +59 -0
  224. package/packages/@monomind/cli/dist/src/ui/data/avatars/game-designer.svg +54 -0
  225. package/packages/@monomind/cli/dist/src/ui/data/avatars/gossip-coordinator.svg +54 -0
  226. package/packages/@monomind/cli/dist/src/ui/data/avatars/hierarchical-coord.svg +54 -0
  227. package/packages/@monomind/cli/dist/src/ui/data/avatars/incident-commander.svg +57 -0
  228. package/packages/@monomind/cli/dist/src/ui/data/avatars/infrastructure.svg +54 -0
  229. package/packages/@monomind/cli/dist/src/ui/data/avatars/input-validator.svg +53 -0
  230. package/packages/@monomind/cli/dist/src/ui/data/avatars/ios-developer.svg +54 -0
  231. package/packages/@monomind/cli/dist/src/ui/data/avatars/issue-tracker.svg +53 -0
  232. package/packages/@monomind/cli/dist/src/ui/data/avatars/judge.svg +55 -0
  233. package/packages/@monomind/cli/dist/src/ui/data/avatars/launch-strategist.svg +54 -0
  234. package/packages/@monomind/cli/dist/src/ui/data/avatars/legal-compliance.svg +53 -0
  235. package/packages/@monomind/cli/dist/src/ui/data/avatars/level-designer.svg +53 -0
  236. package/packages/@monomind/cli/dist/src/ui/data/avatars/load-balancer.svg +57 -0
  237. package/packages/@monomind/cli/dist/src/ui/data/avatars/mcp-builder.svg +53 -0
  238. package/packages/@monomind/cli/dist/src/ui/data/avatars/memory-coordinator.svg +55 -0
  239. package/packages/@monomind/cli/dist/src/ui/data/avatars/mesh-coordinator.svg +55 -0
  240. package/packages/@monomind/cli/dist/src/ui/data/avatars/ml-developer.svg +58 -0
  241. package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-app-builder.svg +53 -0
  242. package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-dev.svg +54 -0
  243. package/packages/@monomind/cli/dist/src/ui/data/avatars/model-qa.svg +58 -0
  244. package/packages/@monomind/cli/dist/src/ui/data/avatars/narrative-designer.svg +58 -0
  245. package/packages/@monomind/cli/dist/src/ui/data/avatars/outbound-strategist.svg +55 -0
  246. package/packages/@monomind/cli/dist/src/ui/data/avatars/path-validator.svg +54 -0
  247. package/packages/@monomind/cli/dist/src/ui/data/avatars/payment-agent.svg +53 -0
  248. package/packages/@monomind/cli/dist/src/ui/data/avatars/perf-analyzer.svg +58 -0
  249. package/packages/@monomind/cli/dist/src/ui/data/avatars/pipeline-analyst.svg +54 -0
  250. package/packages/@monomind/cli/dist/src/ui/data/avatars/planner.svg +55 -0
  251. package/packages/@monomind/cli/dist/src/ui/data/avatars/pr-manager.svg +54 -0
  252. package/packages/@monomind/cli/dist/src/ui/data/avatars/pricing-strategist.svg +54 -0
  253. package/packages/@monomind/cli/dist/src/ui/data/avatars/product-manager.svg +54 -0
  254. package/packages/@monomind/cli/dist/src/ui/data/avatars/production-validator.svg +54 -0
  255. package/packages/@monomind/cli/dist/src/ui/data/avatars/project-shepherd.svg +54 -0
  256. package/packages/@monomind/cli/dist/src/ui/data/avatars/proposal-strategist.svg +54 -0
  257. package/packages/@monomind/cli/dist/src/ui/data/avatars/prosecutor.svg +57 -0
  258. package/packages/@monomind/cli/dist/src/ui/data/avatars/pseudocode.svg +53 -0
  259. package/packages/@monomind/cli/dist/src/ui/data/avatars/queen-coordinator.svg +55 -0
  260. package/packages/@monomind/cli/dist/src/ui/data/avatars/quorum-manager.svg +53 -0
  261. package/packages/@monomind/cli/dist/src/ui/data/avatars/raft-manager.svg +53 -0
  262. package/packages/@monomind/cli/dist/src/ui/data/avatars/reality-checker.svg +58 -0
  263. package/packages/@monomind/cli/dist/src/ui/data/avatars/recruitment.svg +58 -0
  264. package/packages/@monomind/cli/dist/src/ui/data/avatars/refinement.svg +53 -0
  265. package/packages/@monomind/cli/dist/src/ui/data/avatars/release-manager.svg +54 -0
  266. package/packages/@monomind/cli/dist/src/ui/data/avatars/repo-architect.svg +54 -0
  267. package/packages/@monomind/cli/dist/src/ui/data/avatars/researcher.svg +58 -0
  268. package/packages/@monomind/cli/dist/src/ui/data/avatars/resource-allocator.svg +53 -0
  269. package/packages/@monomind/cli/dist/src/ui/data/avatars/reviewer.svg +53 -0
  270. package/packages/@monomind/cli/dist/src/ui/data/avatars/safe-executor.svg +53 -0
  271. package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-coach.svg +53 -0
  272. package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-engineer.svg +58 -0
  273. package/packages/@monomind/cli/dist/src/ui/data/avatars/scout-explorer.svg +58 -0
  274. package/packages/@monomind/cli/dist/src/ui/data/avatars/security-architect.svg +54 -0
  275. package/packages/@monomind/cli/dist/src/ui/data/avatars/security-auditor.svg +55 -0
  276. package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-developer.svg +58 -0
  277. package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-pm.svg +58 -0
  278. package/packages/@monomind/cli/dist/src/ui/data/avatars/seo-specialist.svg +57 -0
  279. package/packages/@monomind/cli/dist/src/ui/data/avatars/social-media.svg +54 -0
  280. package/packages/@monomind/cli/dist/src/ui/data/avatars/solidity-engineer.svg +58 -0
  281. package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coder.svg +58 -0
  282. package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coord.svg +56 -0
  283. package/packages/@monomind/cli/dist/src/ui/data/avatars/specification.svg +57 -0
  284. package/packages/@monomind/cli/dist/src/ui/data/avatars/sprint-prioritizer.svg +53 -0
  285. package/packages/@monomind/cli/dist/src/ui/data/avatars/sre.svg +54 -0
  286. package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-operations.svg +53 -0
  287. package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-producer.svg +55 -0
  288. package/packages/@monomind/cli/dist/src/ui/data/avatars/support-responder.svg +56 -0
  289. package/packages/@monomind/cli/dist/src/ui/data/avatars/system-architect.svg +54 -0
  290. package/packages/@monomind/cli/dist/src/ui/data/avatars/task-orchestrator.svg +56 -0
  291. package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-artist.svg +53 -0
  292. package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-writer.svg +59 -0
  293. package/packages/@monomind/cli/dist/src/ui/data/avatars/tester.svg +53 -0
  294. package/packages/@monomind/cli/dist/src/ui/data/avatars/threat-detection.svg +61 -0
  295. package/packages/@monomind/cli/dist/src/ui/data/avatars/trend-researcher.svg +54 -0
  296. package/packages/@monomind/cli/dist/src/ui/data/avatars/trial-director.svg +55 -0
  297. package/packages/@monomind/cli/dist/src/ui/data/avatars/unity-architect.svg +54 -0
  298. package/packages/@monomind/cli/dist/src/ui/data/avatars/visionos-engineer.svg +57 -0
  299. package/packages/@monomind/cli/dist/src/ui/data/avatars/worker-specialist.svg +55 -0
  300. package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-architect.svg +57 -0
  301. package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-automation.svg +54 -0
  302. package/packages/@monomind/cli/dist/src/ui/data/avatars/zk-steward.svg +54 -0
  303. package/packages/@monomind/cli/dist/src/ui/data/known-projects.json +1 -0
  304. package/packages/@monomind/cli/dist/src/ui/data/mastermind-sessions.json +1 -0
  305. package/packages/@monomind/cli/dist/src/ui/data/sessions/_index.json +1 -0
  306. package/packages/@monomind/cli/dist/src/ui/orgs.html +2215 -0
  307. package/packages/@monomind/cli/dist/src/ui/server.mjs +6175 -0
  308. package/packages/@monomind/cli/dist/src/ui/sse-manager.mjs +119 -0
  309. package/packages/@monomind/cli/dist/src/update/checker.js +1 -1
  310. package/packages/@monomind/cli/dist/workflow/builtin-handlers.js +321 -0
  311. package/packages/@monomind/cli/dist/workflow/engine.js +253 -0
  312. package/packages/@monomind/cli/dist/workflow/expression.js +98 -0
  313. package/packages/@monomind/cli/dist/workflow/types.js +2 -0
  314. package/packages/@monomind/cli/package.json +8 -5
@@ -575,12 +575,18 @@ async function computeCommitsBehind(repoPath) {
575
575
  closeDb(db);
576
576
  }
577
577
  }
578
+ /**
579
+ * Shared staleness threshold: both monograph_staleness and monograph_suggest_auto
580
+ * trigger a background rebuild only when the index is more than this many commits behind HEAD.
581
+ * Using a shared constant prevents conflicting rebuild pressure during active dev sessions.
582
+ */
583
+ const STALENESS_THRESHOLD = 10;
578
584
  /**
579
585
  * Fire-and-forget background rebuild. Uses a module-level guard so concurrent
580
586
  * MCP tool calls (e.g. repeated monograph_suggest_auto) don't pile up builds.
581
- * threshold: minimum commitsBehind to trigger (default 1, Task 2 uses 10).
587
+ * threshold: minimum commitsBehind to trigger (default STALENESS_THRESHOLD + 1).
582
588
  */
583
- function triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, threshold = 1) {
589
+ function triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, threshold = STALENESS_THRESHOLD + 1) {
584
590
  if (commitsBehind < threshold)
585
591
  return false;
586
592
  if (_buildInProgress)
@@ -609,8 +615,7 @@ const monographStalenessTool = {
609
615
  return text(JSON.stringify({ commitsBehind: 0, status: 'unknown', triggered: false }));
610
616
  }
611
617
  const { commitsBehind } = result;
612
- const AUTO_BUILD_THRESHOLD = 10;
613
- const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, AUTO_BUILD_THRESHOLD + 1);
618
+ const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, STALENESS_THRESHOLD + 1);
614
619
  const status = triggered ? 'building' : commitsBehind === 0 ? 'fresh' : 'stale';
615
620
  return text(JSON.stringify({ commitsBehind, status, triggered }));
616
621
  },
@@ -895,22 +900,25 @@ const monographImpactTool = {
895
900
  filePath: impactPath,
896
901
  depth,
897
902
  });
898
- if (!result || !result.root)
903
+ if (!result || !result.node)
899
904
  return text(`No symbol found: ${impactName}`);
900
905
  // Format impact as structured text for direct LLM consumption
901
- const root = result.root;
906
+ const root = result.node;
902
907
  const rootLoc = root.filePath ? (root.startLine != null ? `${root.filePath}:${root.startLine}` : root.filePath) : '';
903
908
  const lines = [
904
909
  `[${root.label ?? '?'}] ${root.name} ${rootLoc}`,
905
910
  '',
906
- `Blast radius: ${result.totalAffected ?? 0} symbols affected`,
911
+ `Blast radius: ${result.affectedFiles?.length ?? 0} symbols affected`,
907
912
  ];
908
913
  if (result.riskScore != null) {
909
914
  const riskLabel = result.riskScore >= 0.8 ? 'HIGH' : result.riskScore >= 0.5 ? 'MEDIUM' : 'LOW';
910
915
  lines.push(`Risk score: ${result.riskScore.toFixed(2)} (${riskLabel})`);
911
916
  }
912
917
  lines.push('');
913
- const affected = (result.affected ?? result.callers ?? []);
918
+ const affected = [
919
+ ...(result.directCallers ?? []),
920
+ ...(result.transitiveCallers ?? []).flatMap(t => t.nodes ?? []),
921
+ ];
914
922
  if (affected.length > 0) {
915
923
  lines.push(`Affected callers (${affected.length}):`);
916
924
  for (const sym of affected.slice(0, 20)) {
@@ -1210,11 +1218,13 @@ const monographGroupListTool = {
1210
1218
  const { getGroupList } = await import('@monoes/monograph');
1211
1219
  const configPath = input.configPath ?? join(getProjectCwd(), 'group.yaml');
1212
1220
  const result = await getGroupList(configPath);
1213
- if (!result.repos || result.repos.length === 0) {
1214
- return text(`Group: ${result.group?.name ?? 'unknown'}\nNo repos configured. Check ${configPath}`);
1221
+ const firstGroup = result.groups?.[0];
1222
+ const allRepos = result.groups?.flatMap((g) => g.repos ?? []) ?? [];
1223
+ if (!allRepos.length) {
1224
+ return text(`Group: ${firstGroup?.name ?? 'unknown'}\nNo repos configured. Check ${configPath}`);
1215
1225
  }
1216
- const lines = [`Group: ${result.group?.name ?? 'unknown'} (${result.repos.length} repos)`];
1217
- for (const r of result.repos) {
1226
+ const lines = [`Group: ${firstGroup?.name ?? 'unknown'} (${allRepos.length} repos)`];
1227
+ for (const r of allRepos) {
1218
1228
  const indexed = r.indexedAt ? r.indexedAt.slice(0, 10) : 'never';
1219
1229
  lines.push(` ${r.name} nodes=${r.nodeCount} indexed=${indexed} ${r.path}`);
1220
1230
  }
@@ -1786,10 +1796,10 @@ const monographSuggestAutoTool = {
1786
1796
  },
1787
1797
  handler: async (input) => {
1788
1798
  const repoPath = getProjectCwd();
1789
- // Check staleness and trigger rebuild if needed (threshold: any staleness).
1799
+ // Check staleness and trigger rebuild if needed (threshold: STALENESS_THRESHOLD commits).
1790
1800
  const stalenessResult = await computeCommitsBehind(repoPath);
1791
1801
  const commitsBehind = stalenessResult?.commitsBehind ?? 0;
1792
- const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, 1);
1802
+ const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, STALENESS_THRESHOLD + 1);
1793
1803
  const stalenessStatus = triggered ? 'building' : commitsBehind === 0 ? 'fresh' : 'stale';
1794
1804
  // Delegate to the base suggest tool — no logic duplication.
1795
1805
  const baseResult = await monographSuggestTool.handler(input);
@@ -75,7 +75,7 @@ const FORBIDDEN_WORKFLOW_IDS = new Set(['__proto__', 'constructor', 'prototype']
75
75
  export const workflowTools = [
76
76
  {
77
77
  name: 'workflow_run',
78
- description: 'Run a workflow from a template or file',
78
+ description: 'Create a swarm workflow stage record from a template (feature/bugfix/refactor/security). This tracks multi-agent orchestration stages — it does NOT execute a browser automation playbook. To run a playbook use `playbook_run`.',
79
79
  category: 'workflow',
80
80
  inputSchema: {
81
81
  type: 'object',
@@ -650,5 +650,58 @@ export const workflowTools = [
650
650
  return { action, error: 'Unknown action' };
651
651
  },
652
652
  },
653
+ {
654
+ name: 'playbook_run',
655
+ description: 'Run a browser automation playbook (JSON file with browser/service/HTTP nodes) via @monoes/monobrowse. Executes the full playbook engine with all handlers: browser CDP nodes (browser.open, browser.click, etc.), service nodes (gmail, github, google_drive, google_sheets), and builtins (action.http, action.log, action.save_file, action.gemini_image).',
656
+ category: 'workflow',
657
+ inputSchema: {
658
+ type: 'object',
659
+ properties: {
660
+ file: { type: 'string', description: 'Absolute or CWD-relative path to a playbook JSON file' },
661
+ params: {
662
+ type: 'object',
663
+ description: 'Key/value pairs substituted as {{params.key}} in playbook node configs',
664
+ additionalProperties: { type: 'string' },
665
+ },
666
+ port: { type: 'number', description: 'CDP port for browser automation (default 9222)' },
667
+ timeoutSeconds: { type: 'number', description: 'Max run duration in seconds (default 300)' },
668
+ },
669
+ required: ['file'],
670
+ },
671
+ handler: async (input) => {
672
+ const filePath = input.file;
673
+ if (typeof filePath !== 'string' || !filePath)
674
+ throw new Error('playbook_run: file is required');
675
+ if (filePath.startsWith('-'))
676
+ throw new Error('playbook_run: file path must not start with "-"');
677
+ const { resolve } = await import('node:path');
678
+ const absPath = resolve(process.cwd(), filePath);
679
+ const timeoutMs = (input.timeoutSeconds ?? 300) * 1000;
680
+ const rawParams = input.params ?? {};
681
+ // Sanitize params — string values only
682
+ const params = Object.fromEntries(Object.entries(rawParams).map(([k, v]) => [k, String(v)]));
683
+ if (input.port !== undefined) {
684
+ process.env['GEMINI_CDP_PORT'] = String(input.port);
685
+ }
686
+ const { readPlaybook, runPlaybook, createDefaultHandlers } = await import('@monoes/monobrowse');
687
+ const def = await readPlaybook(absPath);
688
+ const record = await runPlaybook(def, {
689
+ handlers: createDefaultHandlers(),
690
+ signal: AbortSignal.timeout(timeoutMs),
691
+ params,
692
+ });
693
+ return {
694
+ playbookId: record.playbookId,
695
+ playbookName: record.playbookName,
696
+ status: record.status,
697
+ itemsProcessed: record.itemsProcessed,
698
+ itemsTotal: record.itemsTotal,
699
+ durationMs: record.completedAt && record.startedAt
700
+ ? record.completedAt - record.startedAt
701
+ : undefined,
702
+ error: record.error,
703
+ };
704
+ },
705
+ },
653
706
  ];
654
707
  //# sourceMappingURL=workflow-tools.js.map
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Embedding Operations
3
+ * ONNX model loading, embedding generation, and hash-based fallback.
4
+ * Extracted from memory-initializer.ts (ARCH-4)
5
+ *
6
+ * @module v1/cli/embedding-operations
7
+ */
8
+ /**
9
+ * Lazy load ONNX embedding model
10
+ * Only loads when first embedding is requested
11
+ */
12
+ export declare function loadEmbeddingModel(options?: {
13
+ modelPath?: string;
14
+ verbose?: boolean;
15
+ }): Promise<{
16
+ success: boolean;
17
+ dimensions: number;
18
+ modelName: string;
19
+ loadTime?: number;
20
+ error?: string;
21
+ }>;
22
+ /**
23
+ * Generate real embedding for text
24
+ * Uses ONNX model if available, falls back to deterministic hash
25
+ */
26
+ export declare function generateEmbedding(text: string): Promise<{
27
+ embedding: number[];
28
+ dimensions: number;
29
+ model: string;
30
+ }>;
31
+ /**
32
+ * Generate embeddings for multiple texts
33
+ * Uses parallel execution for API-based providers (2-4x faster)
34
+ * Note: Local ONNX inference is CPU-bound, so parallelism has limited benefit
35
+ *
36
+ * @param texts - Array of texts to embed
37
+ * @param options - Batch options
38
+ * @returns Array of embedding results with timing info
39
+ */
40
+ export declare function generateBatchEmbeddings(texts: string[], options?: {
41
+ concurrency?: number;
42
+ onProgress?: (completed: number, total: number) => void;
43
+ }): Promise<{
44
+ results: Array<{
45
+ text: string;
46
+ embedding: number[];
47
+ dimensions: number;
48
+ model: string;
49
+ }>;
50
+ totalTime: number;
51
+ avgTime: number;
52
+ }>;
53
+ /**
54
+ * Generate deterministic hash-based embedding
55
+ * Not semantic, but deterministic and useful for testing
56
+ */
57
+ export declare function generateHashEmbedding(text: string, dimensions: number): number[];
58
+ //# sourceMappingURL=embedding-operations.d.ts.map
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Embedding Operations
3
+ * ONNX model loading, embedding generation, and hash-based fallback.
4
+ * Extracted from memory-initializer.ts (ARCH-4)
5
+ *
6
+ * @module v1/cli/embedding-operations
7
+ */
8
+ // ADR-053: Lazy import of AgentDB v1 bridge
9
+ let _bridge;
10
+ async function getBridge() {
11
+ if (_bridge === null)
12
+ return null;
13
+ if (_bridge)
14
+ return _bridge;
15
+ try {
16
+ _bridge = await import('./memory-bridge.js');
17
+ return _bridge;
18
+ }
19
+ catch {
20
+ _bridge = null;
21
+ return null;
22
+ }
23
+ }
24
+ let embeddingModelState = null;
25
+ /**
26
+ * Lazy load ONNX embedding model
27
+ * Only loads when first embedding is requested
28
+ */
29
+ export async function loadEmbeddingModel(options) {
30
+ const { verbose = false } = options || {};
31
+ const startTime = Date.now();
32
+ // Already loaded
33
+ if (embeddingModelState?.loaded) {
34
+ return {
35
+ success: true,
36
+ dimensions: embeddingModelState.dimensions,
37
+ modelName: 'cached',
38
+ loadTime: 0
39
+ };
40
+ }
41
+ // ADR-053: Try AgentDB v1 bridge first
42
+ const bridge = await getBridge();
43
+ if (bridge) {
44
+ const bridgeResult = await bridge.bridgeLoadEmbeddingModel();
45
+ if (bridgeResult && bridgeResult.success) {
46
+ // Mark local state as loaded too so subsequent calls use cache
47
+ embeddingModelState = {
48
+ loaded: true,
49
+ model: null, // Bridge handles embedding
50
+ tokenizer: null,
51
+ dimensions: bridgeResult.dimensions
52
+ };
53
+ return bridgeResult;
54
+ }
55
+ }
56
+ try {
57
+ // Try to import @xenova/transformers for ONNX embeddings
58
+ const transformers = await import('@xenova/transformers').catch(() => null);
59
+ if (transformers) {
60
+ if (verbose) {
61
+ console.log('Loading ONNX embedding model (all-MiniLM-L6-v2)...');
62
+ }
63
+ // Use small, fast model for local embeddings
64
+ const { pipeline } = transformers;
65
+ const embedder = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
66
+ embeddingModelState = {
67
+ loaded: true,
68
+ model: embedder,
69
+ tokenizer: null,
70
+ dimensions: 384 // MiniLM-L6 produces 384-dim vectors
71
+ };
72
+ return {
73
+ success: true,
74
+ dimensions: 384,
75
+ modelName: 'Xenova/all-MiniLM-L6-v2',
76
+ loadTime: Date.now() - startTime
77
+ };
78
+ }
79
+ // Fallback: Check for agentic-flow ReasoningBank embeddings (v1)
80
+ const reasoningBank = await import('agentic-flow/reasoningbank').catch(() => null);
81
+ if (reasoningBank?.computeEmbedding) {
82
+ if (verbose) {
83
+ console.log('Loading agentic-flow ReasoningBank embedding model...');
84
+ }
85
+ embeddingModelState = {
86
+ loaded: true,
87
+ model: { embed: reasoningBank.computeEmbedding },
88
+ tokenizer: null,
89
+ dimensions: 768
90
+ };
91
+ return {
92
+ success: true,
93
+ dimensions: 768,
94
+ modelName: 'agentic-flow/reasoningbank',
95
+ loadTime: Date.now() - startTime
96
+ };
97
+ }
98
+ // Fallback: Check for monovector ONNX embedder (bundled MiniLM-L6-v2 since v0.2.15)
99
+ // v0.2.16: LoRA B=0 fix makes AdaptiveEmbedder safe (identity when untrained)
100
+ // Note: isReady() returns false until first embed() call (lazy init), so we
101
+ // skip the isReady() gate and verify with a probe embed instead.
102
+ const monovector = await import('monovector').catch(() => null);
103
+ if (monovector?.initOnnxEmbedder) {
104
+ try {
105
+ await monovector.initOnnxEmbedder();
106
+ // Fallback: OptimizedOnnxEmbedder (raw ONNX, lazy-inits on first embed)
107
+ const onnxEmb = monovector.getOptimizedOnnxEmbedder?.();
108
+ if (onnxEmb?.embed) {
109
+ // Probe embed to trigger lazy ONNX init and verify it works
110
+ const probe = await onnxEmb.embed('test');
111
+ if (probe && probe.length > 0 && (Array.isArray(probe) ? probe.some((v) => v !== 0) : true)) {
112
+ if (verbose) {
113
+ console.log(`Loading monovector ONNX embedder (all-MiniLM-L6-v2, ${probe.length}d)...`);
114
+ }
115
+ embeddingModelState = {
116
+ loaded: true,
117
+ model: (text) => onnxEmb.embed(text),
118
+ tokenizer: null,
119
+ dimensions: probe.length || 384
120
+ };
121
+ return {
122
+ success: true,
123
+ dimensions: probe.length || 384,
124
+ modelName: 'monovector/onnx',
125
+ loadTime: Date.now() - startTime
126
+ };
127
+ }
128
+ }
129
+ }
130
+ catch {
131
+ // monovector ONNX init failed, continue to next fallback
132
+ }
133
+ }
134
+ // Legacy fallback: Check for agentic-flow core embeddings
135
+ const agenticFlow = await import('agentic-flow').catch(() => null);
136
+ if (agenticFlow && agenticFlow.embeddings) {
137
+ if (verbose) {
138
+ console.log('Loading agentic-flow embedding model...');
139
+ }
140
+ embeddingModelState = {
141
+ loaded: true,
142
+ model: agenticFlow.embeddings,
143
+ tokenizer: null,
144
+ dimensions: 768
145
+ };
146
+ return {
147
+ success: true,
148
+ dimensions: 768,
149
+ modelName: 'agentic-flow',
150
+ loadTime: Date.now() - startTime
151
+ };
152
+ }
153
+ // No ONNX model available - use fallback
154
+ embeddingModelState = {
155
+ loaded: true,
156
+ model: null, // Will use simple hash-based fallback
157
+ tokenizer: null,
158
+ dimensions: 128 // Smaller fallback dimensions
159
+ };
160
+ return {
161
+ success: true,
162
+ dimensions: 128,
163
+ modelName: 'hash-fallback',
164
+ loadTime: Date.now() - startTime
165
+ };
166
+ }
167
+ catch (error) {
168
+ return {
169
+ success: false,
170
+ dimensions: 0,
171
+ modelName: 'none',
172
+ error: error instanceof Error ? error.message : String(error)
173
+ };
174
+ }
175
+ }
176
+ /**
177
+ * Generate real embedding for text
178
+ * Uses ONNX model if available, falls back to deterministic hash
179
+ */
180
+ export async function generateEmbedding(text) {
181
+ // Cap input text — caller may pass arbitrarily large content. Without this
182
+ // cap, the hash-fallback below burns O(text.length × dimension) sin() calls
183
+ // per call, and ONNX tokenization can saturate memory on multi-MB inputs.
184
+ if (typeof text !== 'string')
185
+ text = String(text ?? '');
186
+ if (text.length > 16 * 1024)
187
+ text = text.slice(0, 16 * 1024);
188
+ // ADR-053: Try AgentDB v1 bridge first
189
+ const bridge = await getBridge();
190
+ if (bridge) {
191
+ const bridgeResult = await bridge.bridgeGenerateEmbedding(text);
192
+ if (bridgeResult)
193
+ return bridgeResult;
194
+ }
195
+ // Ensure model is loaded
196
+ if (!embeddingModelState?.loaded) {
197
+ await loadEmbeddingModel();
198
+ }
199
+ const state = embeddingModelState;
200
+ // Use ONNX model if available
201
+ if (state.model && typeof state.model === 'function') {
202
+ try {
203
+ const output = await state.model(text, { pooling: 'mean', normalize: true });
204
+ // Handle both @xenova/transformers (output.data) and monovector (plain array) formats
205
+ const embedding = output?.data
206
+ ? Array.from(output.data)
207
+ : Array.isArray(output) ? output : null;
208
+ if (embedding) {
209
+ return {
210
+ embedding,
211
+ dimensions: embedding.length,
212
+ model: 'onnx'
213
+ };
214
+ }
215
+ }
216
+ catch {
217
+ // Fall through to fallback
218
+ }
219
+ }
220
+ // Deterministic hash-based fallback (for testing/demo without ONNX)
221
+ const embedding = generateHashEmbedding(text, state.dimensions);
222
+ return {
223
+ embedding,
224
+ dimensions: state.dimensions,
225
+ model: 'hash-fallback'
226
+ };
227
+ }
228
+ /**
229
+ * Generate embeddings for multiple texts
230
+ * Uses parallel execution for API-based providers (2-4x faster)
231
+ * Note: Local ONNX inference is CPU-bound, so parallelism has limited benefit
232
+ *
233
+ * @param texts - Array of texts to embed
234
+ * @param options - Batch options
235
+ * @returns Array of embedding results with timing info
236
+ */
237
+ export async function generateBatchEmbeddings(texts, options) {
238
+ const { concurrency = texts.length, onProgress } = options || {};
239
+ const startTime = Date.now();
240
+ // Ensure model is loaded first (prevents cold start in parallel)
241
+ if (!embeddingModelState?.loaded) {
242
+ await loadEmbeddingModel();
243
+ }
244
+ // Process in parallel with optional concurrency limit
245
+ if (concurrency >= texts.length) {
246
+ // Full parallelism
247
+ const embeddings = await Promise.all(texts.map(async (text, i) => {
248
+ const result = await generateEmbedding(text);
249
+ onProgress?.(i + 1, texts.length);
250
+ return { text, ...result };
251
+ }));
252
+ const totalTime = Date.now() - startTime;
253
+ return {
254
+ results: embeddings,
255
+ totalTime,
256
+ avgTime: totalTime / texts.length
257
+ };
258
+ }
259
+ // Limited concurrency using chunking
260
+ const results = [];
261
+ let completed = 0;
262
+ for (let i = 0; i < texts.length; i += concurrency) {
263
+ const chunk = texts.slice(i, i + concurrency);
264
+ const chunkResults = await Promise.all(chunk.map(async (text) => {
265
+ const result = await generateEmbedding(text);
266
+ completed++;
267
+ onProgress?.(completed, texts.length);
268
+ return { text, ...result };
269
+ }));
270
+ results.push(...chunkResults);
271
+ }
272
+ const totalTime = Date.now() - startTime;
273
+ return {
274
+ results,
275
+ totalTime,
276
+ avgTime: totalTime / texts.length
277
+ };
278
+ }
279
+ /**
280
+ * Generate deterministic hash-based embedding
281
+ * Not semantic, but deterministic and useful for testing
282
+ */
283
+ export function generateHashEmbedding(text, dimensions) {
284
+ const embedding = new Array(dimensions).fill(0);
285
+ // Simple hash-based approach for reproducibility
286
+ const words = text.toLowerCase().split(/\s+/);
287
+ for (let i = 0; i < words.length; i++) {
288
+ const word = words[i];
289
+ for (let j = 0; j < word.length; j++) {
290
+ const charCode = word.charCodeAt(j);
291
+ const idx = (charCode * (i + 1) * (j + 1)) % dimensions;
292
+ embedding[idx] += Math.sin(charCode * 0.1) * 0.1;
293
+ }
294
+ }
295
+ // Normalize to unit vector
296
+ const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
297
+ return embedding.map(v => v / magnitude);
298
+ }
299
+ //# sourceMappingURL=embedding-operations.js.map
@@ -49,6 +49,12 @@ export class EWCConsolidator {
49
49
  globalFisher = [];
50
50
  consolidationHistory = [];
51
51
  initialized = false;
52
+ /** Dirty flag: true when in-memory state diverges from disk */
53
+ dirty = false;
54
+ /** Pending debounced write timer */
55
+ saveTimer = null;
56
+ /** Debounce window for disk writes (ms) */
57
+ static SAVE_DEBOUNCE_MS = 2_000;
52
58
  constructor(config) {
53
59
  this.config = { ...DEFAULT_EWC_CONFIG, ...config };
54
60
  this.globalFisher = new Array(this.config.dimensions).fill(0);
@@ -207,8 +213,8 @@ export class EWCConsolidator {
207
213
  if (this.consolidationHistory.length > 100) {
208
214
  this.consolidationHistory = this.consolidationHistory.slice(-100);
209
215
  }
210
- // Persist to disk
211
- this.saveToDisk();
216
+ // Schedule debounced disk flush
217
+ this.scheduleSave();
212
218
  result.success = true;
213
219
  result.duration = performance.now() - startTime;
214
220
  return result;
@@ -322,6 +328,8 @@ export class EWCConsolidator {
322
328
  this.globalFisher[i] = (1 - decay) * this.globalFisher[i] + decay * gradients[i] * gradients[i];
323
329
  }
324
330
  }
331
+ // Schedule debounced flush so importance/Fisher updates are persisted
332
+ this.scheduleSave();
325
333
  }
326
334
  /**
327
335
  * Get pattern weights by ID
@@ -391,7 +399,7 @@ export class EWCConsolidator {
391
399
  for (let i = 0; i < this.config.dimensions; i++) {
392
400
  this.globalFisher[i] = alpha * this.globalFisher[i] + (1 - alpha) * currentFisher[i];
393
401
  }
394
- this.saveToDisk();
402
+ this.scheduleSave();
395
403
  }
396
404
  /**
397
405
  * Compute consolidation penalty for a proposed confidence update.
@@ -416,6 +424,12 @@ export class EWCConsolidator {
416
424
  * Clear all patterns and history (full reset)
417
425
  */
418
426
  clear() {
427
+ // Cancel any pending debounced write before clearing
428
+ if (this.saveTimer) {
429
+ clearTimeout(this.saveTimer);
430
+ this.saveTimer = null;
431
+ }
432
+ this.dirty = false;
419
433
  this.patterns.clear();
420
434
  this.gradientHistory = [];
421
435
  this.globalFisher = new Array(this.config.dimensions).fill(0);
@@ -485,6 +499,26 @@ export class EWCConsolidator {
485
499
  this.patterns.delete(sortedPatterns[i].id);
486
500
  }
487
501
  }
502
+ /**
503
+ * Schedule a debounced disk flush.
504
+ * Multiple calls within SAVE_DEBOUNCE_MS coalesce into one write,
505
+ * preventing blocking I/O on every consolidation or gradient event.
506
+ */
507
+ scheduleSave() {
508
+ this.dirty = true;
509
+ if (this.saveTimer)
510
+ return; // already scheduled
511
+ this.saveTimer = setTimeout(() => {
512
+ this.saveTimer = null;
513
+ if (this.dirty) {
514
+ this.dirty = false;
515
+ this.saveToDisk();
516
+ }
517
+ }, EWCConsolidator.SAVE_DEBOUNCE_MS);
518
+ // Allow the process to exit without waiting for the timer
519
+ if (this.saveTimer.unref)
520
+ this.saveTimer.unref();
521
+ }
488
522
  /**
489
523
  * Save state to disk
490
524
  */