@monoes/monomindcli 2.15.7 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/.claude/helpers/build-skill-registry.cjs +23 -2
  2. package/.claude/helpers/handlers/route-handler.cjs +102 -3
  3. package/.claude/helpers/handlers/session-restore-handler.cjs +1 -1
  4. package/.claude/helpers/hook-handler.cjs +17 -2
  5. package/.claude/helpers/jev-picker.cjs +499 -0
  6. package/.claude/helpers/redact-secrets.cjs +69 -0
  7. package/.claude/skills/mastermind-agent-select/SKILL.md +28 -0
  8. package/.claude/skills/monodesign/SKILL.md +257 -0
  9. package/.claude/skills/monodesign/adapt.md +53 -0
  10. package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
  11. package/.claude/skills/monodesign/agents/monodesign-manual-edit-applier.md +103 -0
  12. package/.claude/skills/monodesign/animate.md +65 -0
  13. package/.claude/skills/monodesign/audit.md +89 -0
  14. package/.claude/skills/monodesign/bolder.md +50 -0
  15. package/.claude/skills/monodesign/clarify.md +64 -0
  16. package/.claude/skills/monodesign/colorize.md +68 -0
  17. package/.claude/skills/monodesign/craft.md +51 -0
  18. package/.claude/skills/monodesign/critique.md +66 -0
  19. package/.claude/skills/monodesign/delight.md +47 -0
  20. package/.claude/skills/monodesign/distill.md +56 -0
  21. package/.claude/skills/monodesign/document.md +83 -0
  22. package/.claude/skills/monodesign/extract.md +74 -0
  23. package/.claude/skills/monodesign/harden.md +65 -0
  24. package/.claude/skills/monodesign/init.md +30 -0
  25. package/.claude/skills/monodesign/layout.md +36 -0
  26. package/.claude/skills/monodesign/live.md +34 -0
  27. package/.claude/skills/monodesign/onboard.md +50 -0
  28. package/.claude/skills/monodesign/optimize.md +64 -0
  29. package/.claude/skills/monodesign/overdrive.md +56 -0
  30. package/.claude/skills/monodesign/polish.md +68 -0
  31. package/.claude/skills/monodesign/quieter.md +57 -0
  32. package/.claude/skills/monodesign/reference/adapt.md +312 -0
  33. package/.claude/skills/monodesign/reference/adapt.native.md +58 -0
  34. package/.claude/skills/monodesign/reference/android.md +40 -0
  35. package/.claude/skills/monodesign/reference/animate.md +203 -0
  36. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +410 -0
  37. package/.claude/skills/monodesign/reference/audit.md +135 -0
  38. package/.claude/skills/monodesign/reference/audit.native.md +139 -0
  39. package/.claude/skills/monodesign/reference/bolder.md +120 -0
  40. package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
  41. package/.claude/skills/monodesign/reference/brand.md +108 -0
  42. package/.claude/skills/monodesign/reference/clarify.md +288 -0
  43. package/.claude/skills/monodesign/reference/codex.md +105 -0
  44. package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
  45. package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
  46. package/.claude/skills/monodesign/reference/colorize.md +257 -0
  47. package/.claude/skills/monodesign/reference/component-specs.md +260 -0
  48. package/.claude/skills/monodesign/reference/component-states.md +274 -0
  49. package/.claude/skills/monodesign/reference/component-system.md +358 -0
  50. package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
  51. package/.claude/skills/monodesign/reference/craft.md +123 -0
  52. package/.claude/skills/monodesign/reference/critique.md +780 -0
  53. package/.claude/skills/monodesign/reference/delight.md +302 -0
  54. package/.claude/skills/monodesign/reference/design-principles.md +246 -0
  55. package/.claude/skills/monodesign/reference/distill.md +111 -0
  56. package/.claude/skills/monodesign/reference/document.md +429 -0
  57. package/.claude/skills/monodesign/reference/extract.md +69 -0
  58. package/.claude/skills/monodesign/reference/harden.md +347 -0
  59. package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
  60. package/.claude/skills/monodesign/reference/hooks.md +92 -0
  61. package/.claude/skills/monodesign/reference/image-prompts.md +130 -0
  62. package/.claude/skills/monodesign/reference/init.md +221 -0
  63. package/.claude/skills/monodesign/reference/interaction-design.md +189 -0
  64. package/.claude/skills/monodesign/reference/ios.md +45 -0
  65. package/.claude/skills/monodesign/reference/layout.md +185 -0
  66. package/.claude/skills/monodesign/reference/live.md +710 -0
  67. package/.claude/skills/monodesign/reference/motion-design.md +109 -0
  68. package/.claude/skills/monodesign/reference/onboard.md +234 -0
  69. package/.claude/skills/monodesign/reference/optimize.md +258 -0
  70. package/.claude/skills/monodesign/reference/overdrive.md +130 -0
  71. package/.claude/skills/monodesign/reference/personas.md +179 -0
  72. package/.claude/skills/monodesign/reference/polish.md +241 -0
  73. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
  74. package/.claude/skills/monodesign/reference/product.md +60 -0
  75. package/.claude/skills/monodesign/reference/quieter.md +99 -0
  76. package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
  77. package/.claude/skills/monodesign/reference/shape.md +165 -0
  78. package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
  79. package/.claude/skills/monodesign/reference/teach.md +10 -0
  80. package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
  81. package/.claude/skills/monodesign/reference/typeset.md +301 -0
  82. package/.claude/skills/monodesign/reference/typography.md +159 -0
  83. package/.claude/skills/monodesign/reference/ux-research.md +143 -0
  84. package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
  85. package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
  86. package/.claude/skills/monodesign/scripts/command-metadata.json +94 -0
  87. package/.claude/skills/monodesign/scripts/context-signals.mjs +260 -0
  88. package/.claude/skills/monodesign/scripts/context.mjs +1065 -0
  89. package/.claude/skills/monodesign/scripts/critique-storage.mjs +416 -0
  90. package/.claude/skills/monodesign/scripts/detect-csp.mjs +193 -0
  91. package/.claude/skills/monodesign/scripts/detect.mjs +33 -0
  92. package/.claude/skills/monodesign/scripts/detector/browser/injected/index.mjs +1960 -0
  93. package/.claude/skills/monodesign/scripts/detector/cli/main.mjs +321 -0
  94. package/.claude/skills/monodesign/scripts/detector/design-system.mjs +814 -0
  95. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns-browser.js +5628 -0
  96. package/.claude/skills/monodesign/scripts/detector/detect-antipatterns.mjs +50 -0
  97. package/.claude/skills/monodesign/scripts/detector/engines/browser/detect-url.mjs +259 -0
  98. package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +339 -0
  99. package/.claude/skills/monodesign/scripts/detector/engines/regex/detect-text.mjs +636 -0
  100. package/.claude/skills/monodesign/scripts/detector/engines/static-html/css-cascade.mjs +1016 -0
  101. package/.claude/skills/monodesign/scripts/detector/engines/static-html/detect-html.mjs +253 -0
  102. package/.claude/skills/monodesign/scripts/detector/engines/visual/screenshot-contrast.mjs +198 -0
  103. package/.claude/skills/monodesign/scripts/detector/findings.mjs +12 -0
  104. package/.claude/skills/monodesign/scripts/detector/fix/css-regions.mjs +181 -0
  105. package/.claude/skills/monodesign/scripts/detector/fix/fixers.mjs +373 -0
  106. package/.claude/skills/monodesign/scripts/detector/fix/index.mjs +426 -0
  107. package/.claude/skills/monodesign/scripts/detector/node/file-system.mjs +198 -0
  108. package/.claude/skills/monodesign/scripts/detector/profile/profiler.mjs +166 -0
  109. package/.claude/skills/monodesign/scripts/detector/registry/antipatterns.mjs +563 -0
  110. package/.claude/skills/monodesign/scripts/detector/rules/checks.mjs +3024 -0
  111. package/.claude/skills/monodesign/scripts/detector/shared/color.mjs +124 -0
  112. package/.claude/skills/monodesign/scripts/detector/shared/constants.mjs +101 -0
  113. package/.claude/skills/monodesign/scripts/detector/shared/fonts.mjs +30 -0
  114. package/.claude/skills/monodesign/scripts/detector/shared/inline-ignores.mjs +148 -0
  115. package/.claude/skills/monodesign/scripts/detector/shared/page.mjs +7 -0
  116. package/.claude/skills/monodesign/scripts/hook-admin.mjs +694 -0
  117. package/.claude/skills/monodesign/scripts/hook-before-edit.mjs +516 -0
  118. package/.claude/skills/monodesign/scripts/hook-lib.mjs +1785 -0
  119. package/.claude/skills/monodesign/scripts/hook.mjs +61 -0
  120. package/.claude/skills/monodesign/scripts/lib/design-parser.mjs +809 -0
  121. package/.claude/skills/monodesign/scripts/lib/is-generated.mjs +69 -0
  122. package/.claude/skills/monodesign/scripts/lib/monodesign-config.mjs +640 -0
  123. package/.claude/skills/monodesign/scripts/lib/monodesign-paths.mjs +129 -0
  124. package/.claude/skills/monodesign/scripts/lib/provider.mjs +4 -0
  125. package/.claude/skills/monodesign/scripts/lib/target-args.mjs +42 -0
  126. package/.claude/skills/monodesign/scripts/live/browser-script-parts.mjs +50 -0
  127. package/.claude/skills/monodesign/scripts/live/completion.mjs +19 -0
  128. package/.claude/skills/monodesign/scripts/live/event-validation.mjs +137 -0
  129. package/.claude/skills/monodesign/scripts/live/insert-ui.mjs +458 -0
  130. package/.claude/skills/monodesign/scripts/live/manual-apply.mjs +939 -0
  131. package/.claude/skills/monodesign/scripts/live/manual-edit-routes.mjs +357 -0
  132. package/.claude/skills/monodesign/scripts/live/manual-edits-buffer.mjs +152 -0
  133. package/.claude/skills/monodesign/scripts/live/session-store.mjs +293 -0
  134. package/.claude/skills/monodesign/scripts/live/svelte-component.mjs +826 -0
  135. package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +279 -0
  136. package/.claude/skills/monodesign/scripts/live/ui-core.mjs +180 -0
  137. package/.claude/skills/monodesign/scripts/live/vocabulary.mjs +36 -0
  138. package/.claude/skills/monodesign/scripts/live-accept.mjs +812 -0
  139. package/.claude/skills/monodesign/scripts/live-browser-dom.js +147 -0
  140. package/.claude/skills/monodesign/scripts/live-browser-session.js +124 -0
  141. package/.claude/skills/monodesign/scripts/live-browser.js +11213 -0
  142. package/.claude/skills/monodesign/scripts/live-commit-manual-edits.mjs +1241 -0
  143. package/.claude/skills/monodesign/scripts/live-complete.mjs +75 -0
  144. package/.claude/skills/monodesign/scripts/live-copy-edit-agent.mjs +683 -0
  145. package/.claude/skills/monodesign/scripts/live-discard-manual-edits.mjs +51 -0
  146. package/.claude/skills/monodesign/scripts/live-inject.mjs +596 -0
  147. package/.claude/skills/monodesign/scripts/live-insert.mjs +272 -0
  148. package/.claude/skills/monodesign/scripts/live-manual-edit-evidence.mjs +363 -0
  149. package/.claude/skills/monodesign/scripts/live-poll.mjs +384 -0
  150. package/.claude/skills/monodesign/scripts/live-resume.mjs +94 -0
  151. package/.claude/skills/monodesign/scripts/live-server.mjs +1210 -0
  152. package/.claude/skills/monodesign/scripts/live-status.mjs +61 -0
  153. package/.claude/skills/monodesign/scripts/live-target.mjs +30 -0
  154. package/.claude/skills/monodesign/scripts/live-wrap.mjs +884 -0
  155. package/.claude/skills/monodesign/scripts/live.mjs +297 -0
  156. package/.claude/skills/monodesign/scripts/modern-screenshot.umd.js +14 -0
  157. package/.claude/skills/monodesign/scripts/palette.mjs +635 -0
  158. package/.claude/skills/monodesign/scripts/pin.mjs +221 -0
  159. package/.claude/skills/monodesign/shape.md +71 -0
  160. package/.claude/skills/monodesign/teach.md +18 -0
  161. package/.claude/skills/monodesign/typeset.md +59 -0
  162. package/README.md +1 -1
  163. package/dist/src/capabilities/cap-code.d.ts.map +1 -1
  164. package/dist/src/capabilities/cap-code.js +10 -5
  165. package/dist/src/capabilities/cap-code.js.map +1 -1
  166. package/dist/src/capabilities/manager.d.ts +2 -1
  167. package/dist/src/capabilities/manager.d.ts.map +1 -1
  168. package/dist/src/capabilities/manager.js +4 -1
  169. package/dist/src/capabilities/manager.js.map +1 -1
  170. package/dist/src/catalog/blueprints.d.ts +39 -0
  171. package/dist/src/catalog/blueprints.d.ts.map +1 -0
  172. package/dist/src/catalog/blueprints.js +78 -0
  173. package/dist/src/catalog/blueprints.js.map +1 -0
  174. package/dist/src/catalog/digest.d.ts +16 -0
  175. package/dist/src/catalog/digest.d.ts.map +1 -0
  176. package/dist/src/catalog/digest.js +62 -0
  177. package/dist/src/catalog/digest.js.map +1 -0
  178. package/dist/src/catalog/frontmatter.d.ts +23 -0
  179. package/dist/src/catalog/frontmatter.d.ts.map +1 -0
  180. package/dist/src/catalog/frontmatter.js +80 -0
  181. package/dist/src/catalog/frontmatter.js.map +1 -0
  182. package/dist/src/catalog/lifecycle.d.ts +31 -0
  183. package/dist/src/catalog/lifecycle.d.ts.map +1 -0
  184. package/dist/src/catalog/lifecycle.js +78 -0
  185. package/dist/src/catalog/lifecycle.js.map +1 -0
  186. package/dist/src/catalog/projection.d.ts +57 -0
  187. package/dist/src/catalog/projection.d.ts.map +1 -0
  188. package/dist/src/catalog/projection.js +272 -0
  189. package/dist/src/catalog/projection.js.map +1 -0
  190. package/dist/src/catalog/scan.d.ts +37 -0
  191. package/dist/src/catalog/scan.d.ts.map +1 -0
  192. package/dist/src/catalog/scan.js +214 -0
  193. package/dist/src/catalog/scan.js.map +1 -0
  194. package/dist/src/catalog/snapshot.d.ts +62 -0
  195. package/dist/src/catalog/snapshot.d.ts.map +1 -0
  196. package/dist/src/catalog/snapshot.js +183 -0
  197. package/dist/src/catalog/snapshot.js.map +1 -0
  198. package/dist/src/catalog/stage.d.ts +26 -0
  199. package/dist/src/catalog/stage.d.ts.map +1 -0
  200. package/dist/src/catalog/stage.js +316 -0
  201. package/dist/src/catalog/stage.js.map +1 -0
  202. package/dist/src/catalog/state.d.ts +23 -0
  203. package/dist/src/catalog/state.d.ts.map +1 -0
  204. package/dist/src/catalog/state.js +102 -0
  205. package/dist/src/catalog/state.js.map +1 -0
  206. package/dist/src/catalog/types.d.ts +289 -0
  207. package/dist/src/catalog/types.d.ts.map +1 -0
  208. package/dist/src/catalog/types.js +118 -0
  209. package/dist/src/catalog/types.js.map +1 -0
  210. package/dist/src/commands/catalog.d.ts +14 -0
  211. package/dist/src/commands/catalog.d.ts.map +1 -0
  212. package/dist/src/commands/catalog.js +392 -0
  213. package/dist/src/commands/catalog.js.map +1 -0
  214. package/dist/src/commands/doctor-catalog-checks.d.ts +3 -0
  215. package/dist/src/commands/doctor-catalog-checks.d.ts.map +1 -0
  216. package/dist/src/commands/doctor-catalog-checks.js +69 -0
  217. package/dist/src/commands/doctor-catalog-checks.js.map +1 -0
  218. package/dist/src/commands/doctor-decision-checks.d.ts +10 -0
  219. package/dist/src/commands/doctor-decision-checks.d.ts.map +1 -0
  220. package/dist/src/commands/doctor-decision-checks.js +82 -0
  221. package/dist/src/commands/doctor-decision-checks.js.map +1 -0
  222. package/dist/src/commands/doctor-project-checks.js +1 -1
  223. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  224. package/dist/src/commands/doctor.d.ts.map +1 -1
  225. package/dist/src/commands/doctor.js +9 -1
  226. package/dist/src/commands/doctor.js.map +1 -1
  227. package/dist/src/commands/index.d.ts +2 -2
  228. package/dist/src/commands/index.d.ts.map +1 -1
  229. package/dist/src/commands/index.js +4 -1
  230. package/dist/src/commands/index.js.map +1 -1
  231. package/dist/src/commands/init-wizard.d.ts.map +1 -1
  232. package/dist/src/commands/init-wizard.js +2 -0
  233. package/dist/src/commands/init-wizard.js.map +1 -1
  234. package/dist/src/commands/init.d.ts.map +1 -1
  235. package/dist/src/commands/init.js +25 -26
  236. package/dist/src/commands/init.js.map +1 -1
  237. package/dist/src/commands/org-observe.d.ts.map +1 -1
  238. package/dist/src/commands/org-observe.js +12 -10
  239. package/dist/src/commands/org-observe.js.map +1 -1
  240. package/dist/src/commands/org-run-end.d.ts +26 -0
  241. package/dist/src/commands/org-run-end.d.ts.map +1 -0
  242. package/dist/src/commands/org-run-end.js +40 -0
  243. package/dist/src/commands/org-run-end.js.map +1 -0
  244. package/dist/src/commands/org-skills.d.ts.map +1 -1
  245. package/dist/src/commands/org-skills.js +14 -4
  246. package/dist/src/commands/org-skills.js.map +1 -1
  247. package/dist/src/commands/org.d.ts +2 -1
  248. package/dist/src/commands/org.d.ts.map +1 -1
  249. package/dist/src/commands/org.js +44 -16
  250. package/dist/src/commands/org.js.map +1 -1
  251. package/dist/src/commands/pick.d.ts +4 -0
  252. package/dist/src/commands/pick.d.ts.map +1 -0
  253. package/dist/src/commands/pick.js +77 -0
  254. package/dist/src/commands/pick.js.map +1 -0
  255. package/dist/src/commands/route.js +1 -1
  256. package/dist/src/commands/route.js.map +1 -1
  257. package/dist/src/commands/search-universal.d.ts.map +1 -1
  258. package/dist/src/commands/search-universal.js +1 -2
  259. package/dist/src/commands/search-universal.js.map +1 -1
  260. package/dist/src/decision/catalogs.d.ts +20 -0
  261. package/dist/src/decision/catalogs.d.ts.map +1 -0
  262. package/dist/src/decision/catalogs.js +64 -0
  263. package/dist/src/decision/catalogs.js.map +1 -0
  264. package/dist/src/decision/jev.d.ts +85 -0
  265. package/dist/src/decision/jev.d.ts.map +1 -0
  266. package/dist/src/decision/jev.js +72 -0
  267. package/dist/src/decision/jev.js.map +1 -0
  268. package/dist/src/decision/picks.d.ts +50 -0
  269. package/dist/src/decision/picks.d.ts.map +1 -0
  270. package/dist/src/decision/picks.js +100 -0
  271. package/dist/src/decision/picks.js.map +1 -0
  272. package/dist/src/init/executor.d.ts.map +1 -1
  273. package/dist/src/init/executor.js +7 -0
  274. package/dist/src/init/executor.js.map +1 -1
  275. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  276. package/dist/src/init/helpers-generator.js +7 -0
  277. package/dist/src/init/helpers-generator.js.map +1 -1
  278. package/dist/src/init/init-memory.d.ts +14 -0
  279. package/dist/src/init/init-memory.d.ts.map +1 -0
  280. package/dist/src/init/init-memory.js +44 -0
  281. package/dist/src/init/init-memory.js.map +1 -0
  282. package/dist/src/init/types.d.ts +13 -0
  283. package/dist/src/init/types.d.ts.map +1 -1
  284. package/dist/src/init/types.js.map +1 -1
  285. package/dist/src/init/upgrade.d.ts.map +1 -1
  286. package/dist/src/init/upgrade.js +9 -0
  287. package/dist/src/init/upgrade.js.map +1 -1
  288. package/dist/src/orgrt/agent-runner.d.ts +7 -0
  289. package/dist/src/orgrt/agent-runner.d.ts.map +1 -1
  290. package/dist/src/orgrt/agent-runner.js +5 -1
  291. package/dist/src/orgrt/agent-runner.js.map +1 -1
  292. package/dist/src/orgrt/antigravity-runner.d.ts.map +1 -1
  293. package/dist/src/orgrt/antigravity-runner.js +8 -14
  294. package/dist/src/orgrt/antigravity-runner.js.map +1 -1
  295. package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -1
  296. package/dist/src/orgrt/checkpoint-ops.js +7 -1
  297. package/dist/src/orgrt/checkpoint-ops.js.map +1 -1
  298. package/dist/src/orgrt/checkpoint.d.ts +10 -2
  299. package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
  300. package/dist/src/orgrt/checkpoint.js +8 -2
  301. package/dist/src/orgrt/checkpoint.js.map +1 -1
  302. package/dist/src/orgrt/codex-runner.d.ts.map +1 -1
  303. package/dist/src/orgrt/codex-runner.js +8 -14
  304. package/dist/src/orgrt/codex-runner.js.map +1 -1
  305. package/dist/src/orgrt/completion-gate.d.ts +6 -0
  306. package/dist/src/orgrt/completion-gate.d.ts.map +1 -1
  307. package/dist/src/orgrt/completion-gate.js +18 -0
  308. package/dist/src/orgrt/completion-gate.js.map +1 -1
  309. package/dist/src/orgrt/copilot-runner.d.ts.map +1 -1
  310. package/dist/src/orgrt/copilot-runner.js +7 -10
  311. package/dist/src/orgrt/copilot-runner.js.map +1 -1
  312. package/dist/src/orgrt/crush-runner.d.ts.map +1 -1
  313. package/dist/src/orgrt/crush-runner.js +7 -10
  314. package/dist/src/orgrt/crush-runner.js.map +1 -1
  315. package/dist/src/orgrt/cumulative-meter.d.ts +26 -0
  316. package/dist/src/orgrt/cumulative-meter.d.ts.map +1 -0
  317. package/dist/src/orgrt/cumulative-meter.js +46 -0
  318. package/dist/src/orgrt/cumulative-meter.js.map +1 -0
  319. package/dist/src/orgrt/daemon.d.ts +20 -3
  320. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  321. package/dist/src/orgrt/daemon.js +55 -28
  322. package/dist/src/orgrt/daemon.js.map +1 -1
  323. package/dist/src/orgrt/dashboard-health.d.ts +54 -0
  324. package/dist/src/orgrt/dashboard-health.d.ts.map +1 -0
  325. package/dist/src/orgrt/dashboard-health.js +143 -0
  326. package/dist/src/orgrt/dashboard-health.js.map +1 -0
  327. package/dist/src/orgrt/decisions.d.ts +13 -1
  328. package/dist/src/orgrt/decisions.d.ts.map +1 -1
  329. package/dist/src/orgrt/decisions.js +92 -18
  330. package/dist/src/orgrt/decisions.js.map +1 -1
  331. package/dist/src/orgrt/forwarder.d.ts +2 -1
  332. package/dist/src/orgrt/forwarder.d.ts.map +1 -1
  333. package/dist/src/orgrt/forwarder.js +87 -27
  334. package/dist/src/orgrt/forwarder.js.map +1 -1
  335. package/dist/src/orgrt/grok-runner.d.ts.map +1 -1
  336. package/dist/src/orgrt/grok-runner.js +7 -12
  337. package/dist/src/orgrt/grok-runner.js.map +1 -1
  338. package/dist/src/orgrt/hermes-runner.d.ts.map +1 -1
  339. package/dist/src/orgrt/hermes-runner.js +9 -15
  340. package/dist/src/orgrt/hermes-runner.js.map +1 -1
  341. package/dist/src/orgrt/kimicode-runner.d.ts +1 -1
  342. package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
  343. package/dist/src/orgrt/kimicode-runner.js +9 -15
  344. package/dist/src/orgrt/kimicode-runner.js.map +1 -1
  345. package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
  346. package/dist/src/orgrt/opencode-runner.js +7 -13
  347. package/dist/src/orgrt/opencode-runner.js.map +1 -1
  348. package/dist/src/orgrt/org-harness-tools.d.ts +8 -0
  349. package/dist/src/orgrt/org-harness-tools.d.ts.map +1 -0
  350. package/dist/src/orgrt/org-harness-tools.js +21 -0
  351. package/dist/src/orgrt/org-harness-tools.js.map +1 -0
  352. package/dist/src/orgrt/pi-rpc-runner.d.ts.map +1 -1
  353. package/dist/src/orgrt/pi-rpc-runner.js +9 -13
  354. package/dist/src/orgrt/pi-rpc-runner.js.map +1 -1
  355. package/dist/src/orgrt/pi-runner.d.ts.map +1 -1
  356. package/dist/src/orgrt/pi-runner.js +7 -11
  357. package/dist/src/orgrt/pi-runner.js.map +1 -1
  358. package/dist/src/orgrt/policy-git.d.ts +5 -1
  359. package/dist/src/orgrt/policy-git.d.ts.map +1 -1
  360. package/dist/src/orgrt/policy-git.js +56 -29
  361. package/dist/src/orgrt/policy-git.js.map +1 -1
  362. package/dist/src/orgrt/policy.d.ts +7 -0
  363. package/dist/src/orgrt/policy.d.ts.map +1 -1
  364. package/dist/src/orgrt/policy.js +10 -1
  365. package/dist/src/orgrt/policy.js.map +1 -1
  366. package/dist/src/orgrt/prompt-vars.d.ts +8 -1
  367. package/dist/src/orgrt/prompt-vars.d.ts.map +1 -1
  368. package/dist/src/orgrt/prompt-vars.js +60 -11
  369. package/dist/src/orgrt/prompt-vars.js.map +1 -1
  370. package/dist/src/orgrt/qwen-rpc-runner.d.ts.map +1 -1
  371. package/dist/src/orgrt/qwen-rpc-runner.js +9 -14
  372. package/dist/src/orgrt/qwen-rpc-runner.js.map +1 -1
  373. package/dist/src/orgrt/qwen-runner.d.ts.map +1 -1
  374. package/dist/src/orgrt/qwen-runner.js +7 -12
  375. package/dist/src/orgrt/qwen-runner.js.map +1 -1
  376. package/dist/src/orgrt/report-budget.d.ts +4 -0
  377. package/dist/src/orgrt/report-budget.d.ts.map +1 -0
  378. package/dist/src/orgrt/report-budget.js +12 -0
  379. package/dist/src/orgrt/report-budget.js.map +1 -0
  380. package/dist/src/orgrt/reporting.d.ts +4 -0
  381. package/dist/src/orgrt/reporting.d.ts.map +1 -1
  382. package/dist/src/orgrt/reporting.js +8 -2
  383. package/dist/src/orgrt/reporting.js.map +1 -1
  384. package/dist/src/orgrt/role-sandbox.d.ts +4 -1
  385. package/dist/src/orgrt/role-sandbox.d.ts.map +1 -1
  386. package/dist/src/orgrt/role-sandbox.js +24 -10
  387. package/dist/src/orgrt/role-sandbox.js.map +1 -1
  388. package/dist/src/orgrt/role-trace.d.ts +27 -0
  389. package/dist/src/orgrt/role-trace.d.ts.map +1 -0
  390. package/dist/src/orgrt/role-trace.js +28 -0
  391. package/dist/src/orgrt/role-trace.js.map +1 -0
  392. package/dist/src/orgrt/sandbox-deny-write.d.ts +52 -0
  393. package/dist/src/orgrt/sandbox-deny-write.d.ts.map +1 -0
  394. package/dist/src/orgrt/sandbox-deny-write.js +89 -0
  395. package/dist/src/orgrt/sandbox-deny-write.js.map +1 -0
  396. package/dist/src/orgrt/sandbox-fault.d.ts +40 -0
  397. package/dist/src/orgrt/sandbox-fault.d.ts.map +1 -0
  398. package/dist/src/orgrt/sandbox-fault.js +94 -0
  399. package/dist/src/orgrt/sandbox-fault.js.map +1 -0
  400. package/dist/src/orgrt/session.d.ts +10 -3
  401. package/dist/src/orgrt/session.d.ts.map +1 -1
  402. package/dist/src/orgrt/session.js +124 -64
  403. package/dist/src/orgrt/session.js.map +1 -1
  404. package/dist/src/orgrt/skill-library.d.ts +10 -1
  405. package/dist/src/orgrt/skill-library.d.ts.map +1 -1
  406. package/dist/src/orgrt/skill-library.js +53 -4
  407. package/dist/src/orgrt/skill-library.js.map +1 -1
  408. package/dist/src/orgrt/task-dag.d.ts +9 -1
  409. package/dist/src/orgrt/task-dag.d.ts.map +1 -1
  410. package/dist/src/orgrt/task-dag.js +6 -1
  411. package/dist/src/orgrt/task-dag.js.map +1 -1
  412. package/dist/src/orgrt/tool-fence.d.ts +21 -3
  413. package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
  414. package/dist/src/orgrt/tool-fence.js +45 -7
  415. package/dist/src/orgrt/tool-fence.js.map +1 -1
  416. package/dist/src/orgrt/tool-providers.d.ts +4 -0
  417. package/dist/src/orgrt/tool-providers.d.ts.map +1 -1
  418. package/dist/src/orgrt/tool-providers.js +10 -0
  419. package/dist/src/orgrt/tool-providers.js.map +1 -1
  420. package/dist/src/orgrt/types.d.ts +10 -0
  421. package/dist/src/orgrt/types.d.ts.map +1 -1
  422. package/dist/src/orgrt/types.js +15 -0
  423. package/dist/src/orgrt/types.js.map +1 -1
  424. package/dist/src/orgrt/vercel-runner.d.ts +23 -0
  425. package/dist/src/orgrt/vercel-runner.d.ts.map +1 -1
  426. package/dist/src/orgrt/vercel-runner.js +2 -26
  427. package/dist/src/orgrt/vercel-runner.js.map +1 -1
  428. package/dist/src/platform-adapters/merge.d.ts +11 -0
  429. package/dist/src/platform-adapters/merge.d.ts.map +1 -1
  430. package/dist/src/platform-adapters/merge.js +28 -0
  431. package/dist/src/platform-adapters/merge.js.map +1 -1
  432. package/dist/src/platform-adapters/mutation.d.ts +37 -0
  433. package/dist/src/platform-adapters/mutation.d.ts.map +1 -0
  434. package/dist/src/platform-adapters/mutation.js +231 -0
  435. package/dist/src/platform-adapters/mutation.js.map +1 -0
  436. package/dist/src/platform-adapters/operations.d.ts +8 -1
  437. package/dist/src/platform-adapters/operations.d.ts.map +1 -1
  438. package/dist/src/platform-adapters/operations.js +41 -83
  439. package/dist/src/platform-adapters/operations.js.map +1 -1
  440. package/dist/src/platform-adapters/renderers/skills.d.ts.map +1 -1
  441. package/dist/src/platform-adapters/renderers/skills.js +11 -2
  442. package/dist/src/platform-adapters/renderers/skills.js.map +1 -1
  443. package/dist/src/platform-adapters/shared-surface.d.ts +34 -0
  444. package/dist/src/platform-adapters/shared-surface.d.ts.map +1 -0
  445. package/dist/src/platform-adapters/shared-surface.js +89 -0
  446. package/dist/src/platform-adapters/shared-surface.js.map +1 -0
  447. package/dist/src/platform-adapters/types.d.ts +7 -0
  448. package/dist/src/platform-adapters/types.d.ts.map +1 -1
  449. package/dist/src/routing/jev-step.d.ts +17 -0
  450. package/dist/src/routing/jev-step.d.ts.map +1 -0
  451. package/dist/src/routing/jev-step.js +27 -0
  452. package/dist/src/routing/jev-step.js.map +1 -0
  453. package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
  454. package/dist/src/routing/route-layer-factory.js +16 -1
  455. package/dist/src/routing/route-layer-factory.js.map +1 -1
  456. package/dist/src/utils/redaction.d.ts.map +1 -1
  457. package/dist/src/utils/redaction.js +19 -4
  458. package/dist/src/utils/redaction.js.map +1 -1
  459. package/dist/tsconfig.tsbuildinfo +1 -1
  460. package/package.json +7 -7
@@ -0,0 +1,499 @@
1
+ 'use strict';
2
+ /**
3
+ * Jev decision-model picker. This is the ONE implementation, shared by the prompt
4
+ * hook (handlers/route-handler.cjs) and the CLI (src/decision/jev.ts requires
5
+ * this file from the package's .claude/helpers).
6
+ *
7
+ * Speaks POST /v1/systemone, which hosted Jev (api.typesafe.ai) and the OpenJev
8
+ * helper shim share. Providers are tried in order (MONOMIND_JEV_URL, then
9
+ * TYPESAFE_API_KEY) inside ONE total window (MONOMIND_JEV_TIMEOUT_MS, default
10
+ * 3000). Nothing configured → no network, and pick() resolves null so every
11
+ * caller keeps its existing routing.
12
+ */
13
+ var fs = require('fs');
14
+ var path = require('path');
15
+ var redaction = require('./redact-secrets.cjs');
16
+
17
+ var TYPESAFE_BASE_URL = 'https://api.typesafe.ai';
18
+ var DEFAULT_MODEL = 'jev-latest';
19
+ var DEFAULT_TIMEOUT_MS = 3000;
20
+ var MIN_TIMEOUT_MS = 100;
21
+ var MAX_TIMEOUT_MS = 30000;
22
+ var MIN_PROVIDER_WINDOW_MS = 50;
23
+ var DEFAULT_MIN_CONFIDENCE = 0.6;
24
+ var MIN_EXTRA_SKILL_PROBABILITY = 0.2;
25
+ var DEFAULT_MAX_SKILLS = 3;
26
+ // OpenJev scores up to 52 options per pass; 30 (+ "none") keeps one pass.
27
+ var DEFAULT_MAX_CANDIDATES = 30;
28
+ var MAX_DESCRIPTION_CHARS = 160;
29
+ var MAX_STATE_CHARS = 8000;
30
+ var MAX_RESPONSE_CHARS = 1024 * 1024;
31
+ var MAX_CATALOG_BYTES = 5 * 1024 * 1024;
32
+ var NONE_ID = '__none__';
33
+ var OFF_VALUES = ['0', 'off', 'false', 'no'];
34
+ var ON_VALUES = ['1', 'on', 'true', 'yes'];
35
+ var DEFAULT_HOOK_TIMEOUT_MS = 1500;
36
+ var MAX_HOOK_TIMEOUT_MS = 10000;
37
+
38
+ class JevError extends Error {
39
+ constructor(message, provider, status) {
40
+ super(message);
41
+ this.name = 'JevError';
42
+ this.provider = provider;
43
+ this.status = status;
44
+ }
45
+ }
46
+
47
+ // ── Configuration ──────────────────────────────────────────────────────────
48
+
49
+ function readEnvValue(env, name) {
50
+ var value = env[name];
51
+ if (typeof value !== 'string') return undefined;
52
+ value = value.trim();
53
+ return value ? value : undefined;
54
+ }
55
+
56
+ function isDisabled(env) {
57
+ var value = readEnvValue(env || process.env, 'MONOMIND_JEV');
58
+ return value !== undefined && OFF_VALUES.indexOf(value.toLowerCase()) !== -1;
59
+ }
60
+
61
+ /** http(s) origin + path, trailing slashes and a trailing /v1 removed; null if unusable. */
62
+ function normalizeBaseUrl(value) {
63
+ var raw = typeof value === 'string' ? value.trim() : '';
64
+ if (!raw) return null;
65
+ var url;
66
+ try {
67
+ url = new URL(raw);
68
+ } catch (e) {
69
+ return null;
70
+ }
71
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') return null;
72
+ if (url.username || url.password) return null;
73
+ return url.origin + url.pathname.replace(/\/+$/, '').replace(/\/v1$/, '');
74
+ }
75
+
76
+ function resolveTimeoutMs(env) {
77
+ var n = Number((env || process.env).MONOMIND_JEV_TIMEOUT_MS);
78
+ return Number.isInteger(n) && n >= MIN_TIMEOUT_MS && n <= MAX_TIMEOUT_MS ? n : DEFAULT_TIMEOUT_MS;
79
+ }
80
+
81
+ /** The per-prompt hook's window: short, because every prompt waits on it. */
82
+ function resolveHookTimeoutMs(env) {
83
+ var n = Number((env || process.env).MONOMIND_JEV_HOOK_TIMEOUT_MS);
84
+ return Number.isInteger(n) && n >= MIN_TIMEOUT_MS && n <= MAX_HOOK_TIMEOUT_MS ? n : DEFAULT_HOOK_TIMEOUT_MS;
85
+ }
86
+
87
+ function resolveMinConfidence(env) {
88
+ var n = Number((env || process.env).MONOMIND_JEV_MIN_CONFIDENCE);
89
+ return n > 0 && n <= 1 ? n : DEFAULT_MIN_CONFIDENCE;
90
+ }
91
+
92
+ /** Shorthand properties keep a key variable out of `apiKey: <expr>` shapes,
93
+ * which the repo's git pre-commit secret gate rejects. */
94
+ function makeProvider(name, baseUrl, apiKey, model) {
95
+ return { name: name, baseUrl: baseUrl, apiKey, model: model };
96
+ }
97
+
98
+ function resolveProviders(env) {
99
+ env = env || process.env;
100
+ if (isDisabled(env)) return [];
101
+ var model = readEnvValue(env, 'MONOMIND_JEV_MODEL') || DEFAULT_MODEL;
102
+ var providers = [];
103
+ var customUrl = normalizeBaseUrl(env.MONOMIND_JEV_URL);
104
+ if (customUrl) {
105
+ var customKey = readEnvValue(env, 'MONOMIND_JEV_API_KEY');
106
+ providers.push(makeProvider('custom', customUrl, customKey, model));
107
+ }
108
+ // TYPESAFE_API_KEY alone never sends anything: it may be set for unrelated
109
+ // TypeSafe use, and every prompt would silently leave the machine.
110
+ var typesafeKey = readEnvValue(env, 'TYPESAFE_API_KEY');
111
+ var hosted = (readEnvValue(env, 'MONOMIND_JEV_HOSTED') || '').toLowerCase();
112
+ if (typesafeKey && ON_VALUES.indexOf(hosted) !== -1) {
113
+ providers.push(makeProvider('typesafe', TYPESAFE_BASE_URL, typesafeKey, model));
114
+ }
115
+ return providers;
116
+ }
117
+
118
+ // ── Protocol ───────────────────────────────────────────────────────────────
119
+
120
+ async function postSystemOne(provider, request, timeoutMs, fetchImpl) {
121
+ var doFetch = fetchImpl || globalThis.fetch;
122
+ var headers = { 'content-type': 'application/json' };
123
+ if (provider.apiKey) headers.authorization = 'Bearer ' + provider.apiKey;
124
+ var text;
125
+ try {
126
+ var res = await doFetch(provider.baseUrl + '/v1/systemone', {
127
+ method: 'POST',
128
+ headers: headers,
129
+ body: JSON.stringify(request),
130
+ // A redirect would re-send the bearer key to wherever it points.
131
+ redirect: 'error',
132
+ signal: AbortSignal.timeout(timeoutMs),
133
+ });
134
+ if (!res.ok) throw new JevError('HTTP ' + res.status, provider.name, res.status);
135
+ text = await res.text();
136
+ } catch (err) {
137
+ if (err instanceof JevError) throw err;
138
+ throw new JevError('request failed: ' + (err && err.message ? err.message : String(err)), provider.name);
139
+ }
140
+ if (text.length > MAX_RESPONSE_CHARS) throw new JevError('response too large', provider.name);
141
+ var body;
142
+ try {
143
+ body = JSON.parse(text);
144
+ } catch (e) {
145
+ throw new JevError('response is not JSON', provider.name);
146
+ }
147
+ if (!body || typeof body !== 'object' || !body.answers || typeof body.answers !== 'object') {
148
+ throw new JevError('response has no answers', provider.name);
149
+ }
150
+ return body;
151
+ }
152
+
153
+ function isValidAnswer(answer, question) {
154
+ if (!answer || typeof answer !== 'object' || answer.type !== question.type) return false;
155
+ if (question.type === 'noul') return Number.isFinite(answer.noul);
156
+ return (
157
+ typeof answer.choice === 'string' &&
158
+ Object.prototype.hasOwnProperty.call(question.criteria, answer.choice) &&
159
+ Number.isFinite(answer.confidence) &&
160
+ answer.confidence >= 0 &&
161
+ answer.confidence <= 1
162
+ );
163
+ }
164
+
165
+ function report(onError, err) {
166
+ if (typeof onError !== 'function') return;
167
+ try {
168
+ onError(err);
169
+ } catch (e) {
170
+ /* a logger must never break routing */
171
+ }
172
+ }
173
+
174
+ /** Ask every question in one request; first provider with a usable answer wins. */
175
+ async function ask(state, questions, opts) {
176
+ opts = opts || {};
177
+ var env = opts.env || process.env;
178
+ var providers = opts.providers || resolveProviders(env);
179
+ var ids = Object.keys(questions);
180
+ if (providers.length === 0 || ids.length === 0) return null;
181
+ var deadline = Date.now() + (opts.timeoutMs || resolveTimeoutMs(env));
182
+ for (var i = 0; i < providers.length; i++) {
183
+ var provider = providers[i];
184
+ var remaining = deadline - Date.now();
185
+ if (remaining < MIN_PROVIDER_WINDOW_MS) break;
186
+ try {
187
+ var body = await postSystemOne(
188
+ provider,
189
+ { state: state, model: provider.model, questions: questions },
190
+ remaining,
191
+ opts.fetchImpl,
192
+ );
193
+ var answers = {};
194
+ var usable = 0;
195
+ for (var j = 0; j < ids.length; j++) {
196
+ var answer = body.answers[ids[j]];
197
+ if (isValidAnswer(answer, questions[ids[j]])) {
198
+ answers[ids[j]] = answer;
199
+ usable++;
200
+ }
201
+ }
202
+ if (usable > 0) return { provider: provider.name, answers: answers };
203
+ report(opts.onError, new JevError('no usable answer', provider.name));
204
+ } catch (err) {
205
+ report(opts.onError, err instanceof JevError ? err : new JevError(String(err), provider.name));
206
+ }
207
+ }
208
+ return null;
209
+ }
210
+
211
+ /** One tiny noul round-trip; resolves to elapsed ms or throws JevError. */
212
+ async function probe(provider, opts) {
213
+ opts = opts || {};
214
+ var started = Date.now();
215
+ var body = await postSystemOne(
216
+ provider,
217
+ {
218
+ state: 'The sky is blue.',
219
+ model: provider.model,
220
+ questions: { probe: { type: 'noul', instructions: 'Does the text mention a colour?' } },
221
+ },
222
+ resolveTimeoutMs(opts.env || process.env),
223
+ opts.fetchImpl,
224
+ );
225
+ var answer = body.answers.probe;
226
+ if (!answer || answer.type !== 'noul' || !Number.isFinite(answer.noul)) {
227
+ throw new JevError('probe answer is malformed', provider.name);
228
+ }
229
+ return Date.now() - started;
230
+ }
231
+
232
+ // ── Candidate shortlist ────────────────────────────────────────────────────
233
+
234
+ function stem(tok) {
235
+ if (tok.length > 4 && tok.slice(-3) === 'ies') return tok.slice(0, -3) + 'y';
236
+ if (tok.length > 3 && tok.slice(-1) === 's' && tok.slice(-2) !== 'ss') return tok.slice(0, -1);
237
+ return tok;
238
+ }
239
+
240
+ function tokens(text) {
241
+ return (String(text || '').toLowerCase().match(/[a-z0-9]+/g) || []).map(stem);
242
+ }
243
+
244
+ /** Items ranked by word overlap with the query (id/name words count 3, other
245
+ * text 1), forced ids first, capped at `limit`. Stable for equal scores. */
246
+ function shortlist(query, items, limit, include) {
247
+ var q = Array.from(new Set(tokens(query)));
248
+ var scored = items.map(function (item, index) {
249
+ var strong = new Set(tokens(item.id + ' ' + (item.name || '')));
250
+ var weak = new Set(tokens((item.description || '') + ' ' + (item.text || '')));
251
+ var score = 0;
252
+ for (var i = 0; i < q.length; i++) {
253
+ if (strong.has(q[i])) score += 3;
254
+ else if (weak.has(q[i])) score += 1;
255
+ }
256
+ return { item: item, index: index, score: score };
257
+ });
258
+ scored.sort(function (a, b) {
259
+ return b.score - a.score || a.index - b.index;
260
+ });
261
+ var out = [];
262
+ var seen = new Set();
263
+ function take(entry) {
264
+ if (seen.has(entry.item.id) || out.length >= limit) return;
265
+ seen.add(entry.item.id);
266
+ out.push(Object.assign({}, entry.item, { score: entry.score }));
267
+ }
268
+ (include || []).forEach(function (id) {
269
+ var hit = scored.find(function (s) {
270
+ return s.item.id === id;
271
+ });
272
+ if (hit) take(hit);
273
+ });
274
+ scored.forEach(take);
275
+ return out;
276
+ }
277
+
278
+ // ── Picking ────────────────────────────────────────────────────────────────
279
+
280
+ function describeItem(item) {
281
+ var text = redaction.redactHead(item.description || item.name || item.id).replace(/\s+/g, ' ').trim();
282
+ return text.length > MAX_DESCRIPTION_CHARS ? text.slice(0, MAX_DESCRIPTION_CHARS - 1) + '…' : text;
283
+ }
284
+
285
+ function criteriaFor(items) {
286
+ var criteria = {};
287
+ items.forEach(function (item) {
288
+ criteria[item.id] = describeItem(item);
289
+ });
290
+ return criteria;
291
+ }
292
+
293
+ /** Only options that were sent, with probabilities in [0, 1]: an id the model
294
+ * invents (or an injection payload) must never reach a caller. */
295
+ function rankedFrom(answer, criteria) {
296
+ var probs = answer.probabilities;
297
+ if (!probs || typeof probs !== 'object') return [{ id: answer.choice, probability: answer.confidence }];
298
+ return Object.keys(probs)
299
+ .filter(function (id) {
300
+ var p = probs[id];
301
+ return Object.prototype.hasOwnProperty.call(criteria, id) && Number.isFinite(p) && p >= 0 && p <= 1;
302
+ })
303
+ .map(function (id) {
304
+ return { id: id, probability: probs[id] };
305
+ })
306
+ .sort(function (a, b) {
307
+ return b.probability - a.probability;
308
+ });
309
+ }
310
+
311
+ function toAnswer(answer, criteria) {
312
+ return { choice: answer.choice, confidence: answer.confidence, ranked: rankedFrom(answer, criteria) };
313
+ }
314
+
315
+ /** Pick an agent and/or a skill for `task` in ONE request. null = no decision. */
316
+ async function pick(task, catalogs, opts) {
317
+ opts = opts || {};
318
+ var env = opts.env || process.env;
319
+ var providers = resolveProviders(env);
320
+ if (providers.length === 0) return null;
321
+ var text = redaction.redactHead(task).slice(0, MAX_STATE_CHARS);
322
+ if (!text.trim()) return null;
323
+ var max = opts.maxCandidates || DEFAULT_MAX_CANDIDATES;
324
+ var include = opts.include || {};
325
+ var agents = catalogs && Array.isArray(catalogs.agents) ? catalogs.agents : [];
326
+ var skills = catalogs && Array.isArray(catalogs.skills) ? catalogs.skills : [];
327
+ var questions = {};
328
+ if (agents.length >= 2) {
329
+ questions.agent = {
330
+ type: 'choice',
331
+ instructions: opts.agentInstructions || 'Which specialist agent should handle this task?',
332
+ criteria: criteriaFor(shortlist(text, agents, max, include.agents)),
333
+ };
334
+ }
335
+ if (skills.length >= 1) {
336
+ var skillCriteria = criteriaFor(shortlist(text, skills, max, include.skills));
337
+ skillCriteria[NONE_ID] = 'None of these skills fits the task';
338
+ questions.skill = {
339
+ type: 'choice',
340
+ instructions: opts.skillInstructions || 'Which skill best fits this task?',
341
+ criteria: skillCriteria,
342
+ };
343
+ }
344
+ if (!questions.agent && !questions.skill) return null;
345
+ var res = await ask(text, questions, {
346
+ env: env,
347
+ providers: providers,
348
+ fetchImpl: opts.fetchImpl,
349
+ onError: opts.onError,
350
+ timeoutMs: opts.timeoutMs,
351
+ });
352
+ if (!res) return null;
353
+ var out = { provider: res.provider };
354
+ if (res.answers.agent) out.agent = toAnswer(res.answers.agent, questions.agent.criteria);
355
+ if (res.answers.skill) out.skill = toAnswer(res.answers.skill, questions.skill.criteria);
356
+ return out;
357
+ }
358
+
359
+ function acceptAgent(answer, env) {
360
+ if (!answer) return null;
361
+ return answer.confidence >= resolveMinConfidence(env) ? answer.choice : null;
362
+ }
363
+
364
+ function acceptSkills(answer, env, max) {
365
+ if (!answer || answer.choice === NONE_ID || answer.confidence < resolveMinConfidence(env)) return [];
366
+ var limit = max || DEFAULT_MAX_SKILLS;
367
+ var out = [answer.choice];
368
+ for (var i = 0; i < answer.ranked.length && out.length < limit; i++) {
369
+ var r = answer.ranked[i];
370
+ if (r.id !== NONE_ID && out.indexOf(r.id) === -1 && r.probability >= MIN_EXTRA_SKILL_PROBABILITY) {
371
+ out.push(r.id);
372
+ }
373
+ }
374
+ return out.slice(0, limit);
375
+ }
376
+
377
+ // ── Catalogs ───────────────────────────────────────────────────────────────
378
+
379
+ function readJsonFile(file) {
380
+ try {
381
+ if (!fs.existsSync(file) || fs.statSync(file).size > MAX_CATALOG_BYTES) return null;
382
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
383
+ } catch (e) {
384
+ return null;
385
+ }
386
+ }
387
+
388
+ function strings(list) {
389
+ return (Array.isArray(list) ? list : []).filter(function (s) {
390
+ return typeof s === 'string';
391
+ });
392
+ }
393
+
394
+ /** Agents from .monomind/registry.json (built by registry-builder.ts). */
395
+ function loadAgentCatalog(root) {
396
+ var reg = readJsonFile(path.join(root, '.monomind', 'registry.json'));
397
+ var list = reg && Array.isArray(reg.agents) ? reg.agents : [];
398
+ var out = [];
399
+ var seen = new Set();
400
+ list.forEach(function (a) {
401
+ if (!a || typeof a.slug !== 'string' || a.deprecated === true || seen.has(a.slug)) return;
402
+ seen.add(a.slug);
403
+ var category = typeof a.category === 'string' ? a.category : '';
404
+ out.push({
405
+ id: a.slug,
406
+ name: typeof a.name === 'string' ? a.name : a.slug,
407
+ category: category,
408
+ description: typeof a.description === 'string' ? a.description : '',
409
+ text: [category].concat(strings(a.capabilities), strings(a.taskTypes)).filter(Boolean).join(' '),
410
+ });
411
+ });
412
+ return out;
413
+ }
414
+
415
+ /** .monomind/catalog/state.json as { ok, known, allowed } skill-name sets, where
416
+ * allowed = active with the jev target; null when there is no state file. */
417
+ function catalogJevGate(root) {
418
+ var file = path.join(root, '.monomind', 'catalog', 'state.json');
419
+ if (!fs.existsSync(file)) return null;
420
+ var state = readJsonFile(file);
421
+ var gate = { ok: !!state && Array.isArray(state.entries), known: new Set(), allowed: new Set() };
422
+ (gate.ok ? state.entries : []).forEach(function (e) {
423
+ if (!e || typeof e.id !== 'string' || e.id.indexOf('skill:') !== 0) return;
424
+ gate.known.add(e.id.slice(6));
425
+ if (e.status === 'active' && Array.isArray(e.targets) && e.targets.indexOf('jev') !== -1) {
426
+ gate.allowed.add(e.id.slice(6));
427
+ }
428
+ });
429
+ return gate;
430
+ }
431
+
432
+ function isProjectedCopy(root, source) {
433
+ var file = typeof source === 'string' ? path.resolve(root, source) : '';
434
+ if (file.indexOf(path.resolve(root) + path.sep) !== 0) return false;
435
+ try {
436
+ if (fs.statSync(file).size > MAX_CATALOG_BYTES) return false;
437
+ return fs.readFileSync(file, 'utf-8').indexOf('monomind:start catalog:skill:') !== -1;
438
+ } catch (e) {
439
+ return false;
440
+ }
441
+ }
442
+
443
+ /** The catalog state decides, not the (possibly stale) projection marker: a
444
+ * disabled, revoked or no-jev entry drops out before re-projection, and an
445
+ * unreadable state drops every marked skill (fail closed). A hand-written
446
+ * namesake passes; an unmarked projected copy (old builder) does not. */
447
+ function jevAllowed(gate, s, root) {
448
+ if (s.catalog && (!gate.ok || !gate.allowed.has(String(s.catalog.id).replace(/^skill:/, '')))) return false;
449
+ return !gate.known.has(s.skill) || gate.allowed.has(s.skill) || (!s.catalog && !isProjectedCopy(root, s.source));
450
+ }
451
+
452
+ /** Skills/commands from .claude/helpers/skill-registry.json (build-skill-registry.cjs).
453
+ * Command/skill mirrors of one capability collapse, preferring the slash form. */
454
+ function loadSkillCatalog(root) {
455
+ var reg = readJsonFile(path.join(root, '.claude', 'helpers', 'skill-registry.json'));
456
+ var list = reg && Array.isArray(reg.skills) ? reg.skills : [];
457
+ var gate = catalogJevGate(root);
458
+ var byKey = new Map();
459
+ list.forEach(function (s) {
460
+ if (!s || typeof s.skill !== 'string' || typeof s.invoke !== 'string') return;
461
+ // A catalog projection reaches the decision model only when approved with
462
+ // the jev target; ordinary skills carry no catalog field and are unaffected.
463
+ if (s.catalog && s.catalog.jev !== true) return;
464
+ if (gate && !jevAllowed(gate, s, root)) return;
465
+ var key = s.skill.toLowerCase().replace(/[:_]/g, '-');
466
+ var prev = byKey.get(key);
467
+ if (prev && !(s.invoke.charAt(0) === '/' && prev.invoke.charAt(0) !== '/')) return;
468
+ byKey.set(key, {
469
+ id: s.skill,
470
+ invoke: s.invoke,
471
+ description: typeof s.description === 'string' ? s.description : '',
472
+ text: strings(s.nameTerms).concat(strings(s.keywords)).join(' '),
473
+ });
474
+ });
475
+ return Array.from(byKey.values());
476
+ }
477
+
478
+ module.exports = {
479
+ JevError: JevError,
480
+ NONE_ID: NONE_ID,
481
+ TYPESAFE_BASE_URL: TYPESAFE_BASE_URL,
482
+ isDisabled: isDisabled,
483
+ normalizeBaseUrl: normalizeBaseUrl,
484
+ resolveTimeoutMs: resolveTimeoutMs,
485
+ resolveMinConfidence: resolveMinConfidence,
486
+ resolveHookTimeoutMs: resolveHookTimeoutMs,
487
+ redactSecrets: redaction.redactSecrets,
488
+ SECRET_PATTERNS: redaction.SECRET_PATTERNS,
489
+ resolveProviders: resolveProviders,
490
+ postSystemOne: postSystemOne,
491
+ ask: ask,
492
+ probe: probe,
493
+ shortlist: shortlist,
494
+ pick: pick,
495
+ acceptAgent: acceptAgent,
496
+ acceptSkills: acceptSkills,
497
+ loadAgentCatalog: loadAgentCatalog,
498
+ loadSkillCatalog: loadSkillCatalog,
499
+ };
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+ /**
3
+ * Secret redaction for text that leaves the machine (jev-picker.cjs masks the
4
+ * task and candidate descriptions with it before a decision-model request).
5
+ */
6
+ // Ported VERBATIM from packages/@monomind/cli/src/utils/redaction.ts SECRET_PATTERNS
7
+ // (the maintained redactor: JSON keys, header bearer tokens, fine-grained GitHub,
8
+ // GitLab, Slack, Stripe, JWT, credentialed URLs, AWS/Google keys, Basic auth,
9
+ // env passwords). A test compares the two lists source-for-source, so an edit to
10
+ // one without the other fails CI.
11
+ var SECRET_PATTERNS = [
12
+ /(?:api[_-]?key|apikey)['"]?\s*[:=]\s*['"]?[^\s'"]{8,}['"]?/gi,
13
+ /(?:secret|password|passwd|pwd)['"]?\s*[:=]\s*['"]?[^\s'"]{8,}['"]?/gi,
14
+ /(?:token|bearer)['"]?\s*[:=]\s*['"]?[^\s'"]{10,}['"]?/gi,
15
+ /\bbearer\s+['"]?[^\s'"]{10,}['"]?/gi,
16
+ /-----BEGIN (?:RSA |EC |DSA |OPENSSH |ENCRYPTED |PGP )?PRIVATE KEY(?: BLOCK)?-----(?:[^-]|-(?!----))*-----END (?:RSA |EC |DSA |OPENSSH |ENCRYPTED |PGP )?PRIVATE KEY(?: BLOCK)?-----/g,
17
+ /sk-ant-[a-zA-Z0-9_-]{20,}/g,
18
+ /sk-[a-zA-Z0-9_-]{20,}/g,
19
+ /gh[pousr]_[A-Za-z0-9]{20,}/g,
20
+ /github_pat_[A-Za-z0-9_]{20,}/g,
21
+ /glpat-[A-Za-z0-9_-]{16,}/g,
22
+ /xox[abprs]-[A-Za-z0-9-]{10,}/g,
23
+ /xapp-[A-Za-z0-9-]{10,}/g,
24
+ /hf_[A-Za-z0-9]{30,}/g,
25
+ /ya29\.[A-Za-z0-9_-]{20,}/g,
26
+ /[rs]k_(?:live|test)_[A-Za-z0-9]{16,}/g,
27
+ /npm_[A-Za-z0-9]{20,}/g,
28
+ /AKIA[0-9A-Z]{16}/g,
29
+ /(?<![a-zA-Z0-9_-])eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g,
30
+ /[a-zA-Z][a-zA-Z0-9+.-]{0,31}:\/\/[^:\s]{1,256}:[^@\s]{1,256}@[^\s'"]+/g,
31
+ /aws_?secret_?access_?key['"]?\s*[:=]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/gi,
32
+ /AIza[0-9A-Za-z_-]{35}/g,
33
+ /\bauthorization['"]?\s*[:=]\s*['"]?basic\s+[A-Za-z0-9+/]+={0,2}/gi,
34
+ /\b(?:[A-Z0-9]+_)*(?:PASS|PASSWORD|PASSWD|PWD)\s*=\s*['"]?[^\s'"]+['"]?/g,
35
+ ];
36
+
37
+ /** Mask credential-shaped text before it leaves the machine — same output as redaction.ts redactSecrets. */
38
+ function redactSecrets(text) {
39
+ var out = String(text || '');
40
+ SECRET_PATTERNS.forEach(function (re) {
41
+ out = out.replace(re, '[redacted]');
42
+ });
43
+ return out;
44
+ }
45
+
46
+ // Text is cut to this before redaction, so the synchronous regex pass stays short;
47
+ // the margin over the 8000-char Jev state keeps a secret straddling that final
48
+ // cut (a PEM block is a few KB) whole.
49
+ var REDACT_WINDOW_CHARS = 16000;
50
+
51
+ /** redactSecrets over the first REDACT_WINDOW_CHARS of `text` only. */
52
+ function redactHead(text) {
53
+ var s = String(text || '');
54
+ var head = s.slice(0, REDACT_WINDOW_CHARS);
55
+ if (s.length > REDACT_WINDOW_CHARS) {
56
+ // A secret cut at the window edge no longer matches its pattern, and earlier
57
+ // secrets shrinking to "[redacted]" pull it into the sent text: drop the cut
58
+ // token (a scan, not /\S+$/, which is quadratic) and a key block without a whole
59
+ // END line (a cut `-----END RSA ` does not close it).
60
+ var end = head.length;
61
+ while (end > 0 && !/\s/.test(head.charAt(end - 1))) end--;
62
+ head = head.slice(0, end);
63
+ var begin = head.lastIndexOf('-----BEGIN ');
64
+ if (begin !== -1 && !/-----END [^-\r\n]*-----/.test(head.slice(begin))) head = head.slice(0, begin);
65
+ }
66
+ return redactSecrets(head);
67
+ }
68
+
69
+ module.exports = { SECRET_PATTERNS: SECRET_PATTERNS, redactSecrets: redactSecrets, redactHead: redactHead };
@@ -22,6 +22,22 @@ Use this pattern whenever a mastermind skill needs to select specialist agents.
22
22
 
23
23
  REGISTRY="${REGISTRY:-.monomind/registry.json}"
24
24
 
25
+ # 0. Decision model first. `monomind pick` asks Jev/OpenJev when configured
26
+ # (MONOMIND_JEV_URL, or TYPESAFE_API_KEY + MONOMIND_JEV_HOSTED=1) and
27
+ # otherwise ranks by keywords.
28
+ # Local only — never npx (no registry egress). A globally installed monomind may
29
+ # predate `pick`, so each candidate must prove it supports the command.
30
+ mm() { for c in monomind ./node_modules/.bin/monomind; do
31
+ command -v "$c" >/dev/null 2>&1 || [ -x "$c" ] || continue
32
+ "$c" pick --help >/dev/null 2>&1 && { "$c" "$@"; return $?; }
33
+ done; return 127; }
34
+ selected_agents=$(mm pick -t "$PROMPT" --agents --categories "$CATEGORIES" \
35
+ --top "$TOP_N" --json 2>/dev/null \
36
+ | jq -c '[.agents.ranked[] | {name: (.name // .id), slug: .id, category}]' 2>/dev/null)
37
+
38
+ # Fallback when the CLI is unavailable: the registry keyword scorer below.
39
+ if [ -z "$selected_agents" ] || [ "$selected_agents" = "[]" ]; then
40
+
25
41
  # 1. Extract candidates from the registry filtered by category
26
42
  candidates=$(jq -r \
27
43
  --arg cats "$CATEGORIES" \
@@ -58,6 +74,7 @@ selected_agents=$(echo "$candidates" | jq -Rs \
58
74
  .[0:$n] |
59
75
  map(.agent)
60
76
  ')
77
+ fi
61
78
 
62
79
  echo "$selected_agents"
63
80
  ```
@@ -92,6 +109,16 @@ The output is a JSON array of `{name, slug, category}` objects. Use `.name` as t
92
109
  TASK_DESC="<one-line description of what this agent must do>"
93
110
  CATS="engineering development"
94
111
 
112
+ # Local only — never npx (no registry egress). A globally installed monomind may
113
+ # predate `pick`, so each candidate must prove it supports the command.
114
+ mm() { for c in monomind ./node_modules/.bin/monomind; do
115
+ command -v "$c" >/dev/null 2>&1 || [ -x "$c" ] || continue
116
+ "$c" pick --help >/dev/null 2>&1 && { "$c" "$@"; return $?; }
117
+ done; return 127; }
118
+ best_agent=$(mm pick -t "$TASK_DESC" --agents --categories "$CATS" --top 1 --json 2>/dev/null \
119
+ | jq -r '.agents.ranked[0].name // .agents.ranked[0].id // empty' 2>/dev/null)
120
+
121
+ if [ -z "$best_agent" ]; then
95
122
  best_agent=$(jq -r \
96
123
  --arg cats "$CATS" \
97
124
  --arg task "$(echo "$TASK_DESC" | tr '[:upper:]' '[:lower:]')" \
@@ -104,6 +131,7 @@ best_agent=$(jq -r \
104
131
  | sort_by(-.score)
105
132
  | .[0].name // "coder"' \
106
133
  "$REGISTRY")
134
+ fi
107
135
  ```
108
136
 
109
137
  ---