@iowarp/clio-coder 0.3.6 → 0.3.8

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 (323) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +22 -6
  3. package/dist/{acp-2BEHC4DL.js → acp-U67UHUK2.js} +14 -14
  4. package/dist/{agents-LNNFTM53.js → agents-YU6SGALZ.js} +42 -35
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-KXXFI2VS.js → auth-5ZPJOIVG.js} +32 -24
  7. package/dist/builtins-C6JMZVV6.js +17 -0
  8. package/dist/{chunk-E25LMLRW.js → chunk-26LEYJZH.js} +2 -2
  9. package/dist/{chunk-TSHXZTOQ.js → chunk-2HEJ2F35.js} +5 -5
  10. package/dist/{chunk-PBTHKCPN.js → chunk-2HFZQUHL.js} +7 -7
  11. package/dist/{chunk-FO5ZOVUY.js → chunk-3BINW3FP.js} +5 -5
  12. package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
  13. package/dist/{chunk-CKXWIANG.js → chunk-4SPRNWDE.js} +18 -16
  14. package/dist/{chunk-E2ER4LJF.js → chunk-5C3AQNDW.js} +25 -1
  15. package/dist/{chunk-XF5N4U5A.js → chunk-5DHKRSMQ.js} +9 -8
  16. package/dist/{chunk-43AOLP7E.js → chunk-5FR74PWO.js} +2 -1
  17. package/dist/{chunk-EKY57CSP.js → chunk-5H3GB5BO.js} +68 -772
  18. package/dist/{chunk-6XXKFVSN.js → chunk-5Q2VVUKB.js} +4 -4
  19. package/dist/{chunk-DJVECN66.js → chunk-7RFXX52T.js} +295 -3705
  20. package/dist/{chunk-ZXF4XRKW.js → chunk-7RGZWPB6.js} +158 -8
  21. package/dist/{chunk-FYYLNIL5.js → chunk-A2NJGIB3.js} +2 -2
  22. package/dist/{chunk-XXQNGV4M.js → chunk-A3WNZD3P.js} +548 -72
  23. package/dist/{chunk-VEZEGCGW.js → chunk-B5CSFE7B.js} +23 -21
  24. package/dist/{chunk-2SFS6XQE.js → chunk-DGSYXYMX.js} +3 -2
  25. package/dist/chunk-DR52UMZW.js +21 -0
  26. package/dist/{chunk-ZWLZP4ZT.js → chunk-DYIM5TJT.js} +98 -12
  27. package/dist/{chunk-QKMUKYO7.js → chunk-E77JEWSD.js} +270 -125
  28. package/dist/{chunk-LYF7OHWH.js → chunk-EMYUUSFG.js} +12 -467
  29. package/dist/{chunk-4VP4KH3K.js → chunk-EQ63NRB7.js} +8 -8
  30. package/dist/chunk-FBVTI2TJ.js +518 -0
  31. package/dist/{chunk-R46L2BIR.js → chunk-FHJEP5SW.js} +19 -25
  32. package/dist/{chunk-WR67VIZY.js → chunk-GN57SG4G.js} +66 -8
  33. package/dist/{chunk-RD5U66HV.js → chunk-GPIEI3LY.js} +9 -9
  34. package/dist/{chunk-PCZJO5TI.js → chunk-GU2UIAFZ.js} +13 -178
  35. package/dist/chunk-GWS3VEIW.js +195 -0
  36. package/dist/chunk-H7IXIC72.js +103 -0
  37. package/dist/{chunk-3BPUFZDL.js → chunk-HLE42MG7.js} +3 -3
  38. package/dist/{chunk-24I7BN55.js → chunk-IFBNV6H6.js} +3 -3
  39. package/dist/{chunk-QNQHSOLF.js → chunk-IGWKHNIQ.js} +114 -55
  40. package/dist/chunk-IIZWH4XA.js +172 -0
  41. package/dist/{chunk-AD2SYQYC.js → chunk-IJ7RPIYJ.js} +124 -6
  42. package/dist/chunk-J3YUBZWY.js +382 -0
  43. package/dist/{chunk-5JGRAMKL.js → chunk-JOZYP4GM.js} +8 -6
  44. package/dist/{chunk-OH3TOQTB.js → chunk-K4XHGFR5.js} +751 -15
  45. package/dist/{chunk-EYPA3EGJ.js → chunk-KTYTFRMB.js} +178 -14
  46. package/dist/chunk-LU7P4LHA.js +33 -0
  47. package/dist/chunk-ME6CCNFO.js +108 -0
  48. package/dist/chunk-MXKJU4JB.js +1100 -0
  49. package/dist/{chunk-RY3LY4J5.js → chunk-N22QMJKY.js} +21 -18
  50. package/dist/chunk-NMPKI6XL.js +3006 -0
  51. package/dist/chunk-NUGM5KR6.js +165 -0
  52. package/dist/{chunk-22NAGB7X.js → chunk-P43ETTHK.js} +5 -94
  53. package/dist/{chunk-NILBFAPG.js → chunk-PMDBGQSJ.js} +2 -2
  54. package/dist/chunk-PT7HYKEM.js +165 -0
  55. package/dist/chunk-RVG5JXAL.js +41 -0
  56. package/dist/{chunk-GEYXPTRF.js → chunk-RWSI4YD7.js} +2 -2
  57. package/dist/{chunk-4BPJXDWC.js → chunk-TANS5ZJS.js} +35 -19
  58. package/dist/{verifiers-NCBTHHN2.js → chunk-TB5666IT.js} +67 -324
  59. package/dist/{chunk-QM3F2GKX.js → chunk-TLQJPP24.js} +7927 -8088
  60. package/dist/{chunk-G7MUEIGA.js → chunk-TT36MB5S.js} +2 -1
  61. package/dist/chunk-TTHACPOM.js +961 -0
  62. package/dist/{chunk-6US73PDB.js → chunk-TYPGUK6W.js} +7 -7
  63. package/dist/{chunk-MFFY33HR.js → chunk-U6MBIEMB.js} +554 -209
  64. package/dist/chunk-VAWNZU7Z.js +242 -0
  65. package/dist/{chunk-IR4CFBFN.js → chunk-VCBR6CU7.js} +12 -12
  66. package/dist/{chunk-WHJYKASB.js → chunk-VHN4MY6O.js} +2 -2
  67. package/dist/{chunk-XYDYPRZI.js → chunk-VWZOAB7K.js} +10 -10
  68. package/dist/{chunk-ZRGEBJ4T.js → chunk-WLFILSD5.js} +48 -48
  69. package/dist/{chunk-K7T3E2SR.js → chunk-WNIJTQQK.js} +12 -11
  70. package/dist/{chunk-CYQKWTG3.js → chunk-WSB3FPX7.js} +68 -20
  71. package/dist/{chunk-KHSFENX2.js → chunk-WWCZ5F23.js} +116 -14
  72. package/dist/{chunk-XE2VEJHX.js → chunk-WXY7KU3G.js} +2 -2
  73. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  74. package/dist/{chunk-KOHPCX4K.js → chunk-XWSF374K.js} +5 -5
  75. package/dist/{chunk-CJUB2JJ2.js → chunk-YS5VLNH5.js} +10 -10
  76. package/dist/{chunk-ZZMN5OM4.js → chunk-ZNLWCMVZ.js} +2 -2
  77. package/dist/{chunk-WHGPSPT5.js → chunk-ZVJ5BLO2.js} +2 -2
  78. package/dist/cli/index.js +33 -31
  79. package/dist/{clio-M2KGYUFZ.js → clio-QVTYJ57A.js} +10 -10
  80. package/dist/{code-nav-GQNL7XA6.js → code-nav-FGGFIE7L.js} +5 -5
  81. package/dist/codewiki/build-worker.js +4 -4
  82. package/dist/{components-5TTYYX6G.js → components-ZFA3SAER.js} +9 -9
  83. package/dist/{config-XUUYQIWO.js → config-LW5IJFQN.js} +65 -55
  84. package/dist/{configure-IHJ7YOMV.js → configure-7XIZCOU4.js} +29 -24
  85. package/dist/{context-75MIWW3U.js → context-L3WL3X7K.js} +54 -43
  86. package/dist/{context-ZQ7SIFJV.js → context-N52ZA626.js} +30 -14
  87. package/dist/{context-74JLXAWD.js → context-Y6Y7QPR6.js} +12 -12
  88. package/dist/{context-clear-GYKWNUML.js → context-clear-MBQRLSDQ.js} +54 -43
  89. package/dist/{context-index-SSR5ECNE.js → context-index-HVMFQHK3.js} +5 -5
  90. package/dist/{context-working-set-UX5KEP4J.js → context-working-set-GS6DSO7F.js} +18 -18
  91. package/dist/{dispatch-runner-GIJBHNFL.js → dispatch-runner-22ZCNOM3.js} +367 -79
  92. package/dist/{docs-6FZSCG5B.js → docs-7LQ23DLM.js} +9 -9
  93. package/dist/{doctor-SVJ5BZCW.js → doctor-M7YEDGAE.js} +27 -23
  94. package/dist/{eval-CG6LLBLD.js → eval-BEC2WHDA.js} +73 -20
  95. package/dist/{evidence-ZYFIEN42.js → evidence-REJUMSKM.js} +70 -59
  96. package/dist/{evolve-QGEXEMDW.js → evolve-PY5ZBA5K.js} +50 -39
  97. package/dist/{extensions-ADGNCJJD.js → extensions-HVKU65YU.js} +7 -7
  98. package/dist/{fleet-S5R4ZOQY.js → fleet-7WZEWRFA.js} +236 -377
  99. package/dist/fleet-commands-UVHWM76J.js +70 -0
  100. package/dist/fleet-graph-6ULH7PES.js +125 -0
  101. package/dist/fleet-new-RDVJLHHH.js +48 -0
  102. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-J53T6CCE.js} +5 -5
  103. package/dist/fleet-validate-72PC4SLA.js +79 -0
  104. package/dist/{init-5DRU55YR.js → init-OG3TPGQG.js} +69 -57
  105. package/dist/library-CNTMPLRF.js +217 -0
  106. package/dist/{memory-7YKKR6UC.js → memory-6IS7F275.js} +52 -41
  107. package/dist/{models-ZPOLRU2C.js → models-ENRJDA5W.js} +37 -31
  108. package/dist/{monitor-US5F5YGZ.js → monitor-XLDVO7TN.js} +79 -42
  109. package/dist/{orchestrator-E2AL4T5N.js → orchestrator-6KSPYRHA.js} +4126 -762
  110. package/dist/{paths-E7KYAQWE.js → paths-DBXMZMDU.js} +6 -6
  111. package/dist/registry-LG64LTF4.js +11 -0
  112. package/dist/{reset-KZ652EK6.js → reset-RZ4ER727.js} +12 -12
  113. package/dist/{run-SRNBKDWD.js → run-Y2CNK5RU.js} +89 -76
  114. package/dist/{share-CGZE33UP.js → share-A55GYP6Z.js} +37 -13
  115. package/dist/{skills-S2X4DLY5.js → skills-ALC5J6AT.js} +29 -13
  116. package/dist/{skills-eval-W2GGIC4R.js → skills-eval-JPBEBYQU.js} +60 -48
  117. package/dist/support-MIETYA5E.js +38 -0
  118. package/dist/{targets-54SWINWB.js → targets-VGNXIR3S.js} +46 -36
  119. package/dist/{terminal-lease-SAIF2OGY.js → terminal-lease-WOBR64YA.js} +4 -4
  120. package/dist/{uninstall-BVLWXKBT.js → uninstall-ZJF5H5ZN.js} +9 -9
  121. package/dist/{upgrade-JKAR27XC.js → upgrade-FUSUAGHR.js} +31 -28
  122. package/dist/{usage-MSAWCLX4.js → usage-N4MKVHKD.js} +140 -68
  123. package/dist/verifiers-YAWOJ3H2.js +336 -0
  124. package/dist/{verify-X5HDROLA.js → verify-LTDHYBGY.js} +10 -9
  125. package/dist/{wiki-generate-GUSOQ6ZP.js → wiki-generate-6M7GHTBJ.js} +75 -62
  126. package/dist/worker/entry.js +67 -57
  127. package/docs/README.md +3 -2
  128. package/docs/acp.md +1 -1
  129. package/docs/alcf-provider.md +1 -1
  130. package/docs/architecture.md +2 -2
  131. package/docs/artifact-versions.md +11 -6
  132. package/docs/built-in-agents.md +26 -2
  133. package/docs/capacity-and-scheduling.md +1 -1
  134. package/docs/commands-and-modes.md +83 -3
  135. package/docs/configuration-and-targets.md +86 -4
  136. package/docs/context-engine.md +1 -1
  137. package/docs/development-pipeline.md +1 -1
  138. package/docs/dispatch-architecture-rationale.md +1 -1
  139. package/docs/documentation-coverage.md +3 -3
  140. package/docs/documentation-guide.md +3 -3
  141. package/docs/eval-runner.md +1 -1
  142. package/docs/evals-internal.md +1 -1
  143. package/docs/evidence-and-memory.md +74 -10
  144. package/docs/evolution.md +1 -1
  145. package/docs/exit-codes-and-output.md +4 -1
  146. package/docs/extensions-and-sharing.md +6 -2
  147. package/docs/fleet-demo-runbook.md +2 -2
  148. package/docs/fleet-dispatch.md +228 -16
  149. package/docs/git-commit-provenance.md +2 -2
  150. package/docs/glossary.md +22 -2
  151. package/docs/installation-and-lifecycle.md +2 -2
  152. package/docs/middleware-and-components.md +2 -1
  153. package/docs/model-catalog.md +1 -1
  154. package/docs/observability.md +56 -9
  155. package/docs/proactive-memory.md +1 -1
  156. package/docs/prompt-envelope-and-tools.md +4 -2
  157. package/docs/provider-adapter-cookbook.md +1 -1
  158. package/docs/release-cut-checklist.md +83 -65
  159. package/docs/resource-library.md +59 -0
  160. package/docs/safety-model.md +2 -2
  161. package/docs/scientific-validation.md +3 -3
  162. package/docs/session-lifecycle.md +37 -1
  163. package/docs/skills-marketplace.md +16 -3
  164. package/docs/tool-usage.md +14 -7
  165. package/docs/trace-store.md +1 -1
  166. package/docs/troubleshooting.md +1 -1
  167. package/docs/tui-design.md +1 -1
  168. package/docs/worker-dispatch-mechanics.md +3 -3
  169. package/package.json +1 -2
  170. package/src/cli/argv.ts +5 -0
  171. package/src/cli/configure.ts +107 -23
  172. package/src/cli/doctor.ts +5 -1
  173. package/src/cli/evidence.ts +30 -25
  174. package/src/cli/fleet-commands.ts +37 -0
  175. package/src/cli/fleet-graph.ts +102 -0
  176. package/src/cli/fleet-new.ts +36 -0
  177. package/src/cli/fleet-preflight.ts +111 -0
  178. package/src/cli/fleet-validate.ts +30 -0
  179. package/src/cli/fleet.ts +173 -335
  180. package/src/cli/index.ts +3 -1
  181. package/src/cli/library.ts +190 -0
  182. package/src/cli/share.ts +13 -1
  183. package/src/cli/shared.ts +1 -0
  184. package/src/cli/targets.ts +4 -1
  185. package/src/cli/usage.ts +111 -19
  186. package/src/cli/validate-model.ts +60 -5
  187. package/src/core/bus-events.ts +29 -0
  188. package/src/core/commit-attribution.ts +4 -4
  189. package/src/core/config.ts +130 -0
  190. package/src/core/defaults.ts +81 -0
  191. package/src/core/path-boundary.ts +100 -0
  192. package/src/domains/agents/builtins/architect.md +1 -0
  193. package/src/domains/agents/builtins/oracle.md +33 -0
  194. package/src/domains/agents/catalog.ts +13 -1
  195. package/src/domains/agents/extension.ts +2 -11
  196. package/src/domains/agents/fleet-contract.ts +304 -24
  197. package/src/domains/agents/index.ts +14 -0
  198. package/src/domains/agents/recipe.ts +7 -1
  199. package/src/domains/agents/registry.ts +73 -5
  200. package/src/domains/agents/result-contract.ts +360 -15
  201. package/src/domains/agents/write-boundary.ts +15 -50
  202. package/src/domains/config/classify.ts +4 -0
  203. package/src/domains/context/project-rules.ts +51 -1
  204. package/src/domains/dispatch/active-route-planner.ts +14 -0
  205. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  206. package/src/domains/dispatch/assignment-store.ts +151 -14
  207. package/src/domains/dispatch/backoff.ts +2 -1
  208. package/src/domains/dispatch/capability-match.ts +1 -0
  209. package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
  210. package/src/domains/dispatch/contract.ts +48 -0
  211. package/src/domains/dispatch/delegation-plan.ts +164 -0
  212. package/src/domains/dispatch/execution-plan.ts +76 -5
  213. package/src/domains/dispatch/execution-role.ts +12 -2
  214. package/src/domains/dispatch/execution-scheduler.ts +183 -67
  215. package/src/domains/dispatch/extension.ts +412 -74
  216. package/src/domains/dispatch/fleet-gate.ts +14 -0
  217. package/src/domains/dispatch/fleet-plan.ts +63 -3
  218. package/src/domains/dispatch/fleet-run.ts +791 -0
  219. package/src/domains/dispatch/gate-role-prompts.ts +47 -0
  220. package/src/domains/dispatch/host-verification.ts +178 -0
  221. package/src/domains/dispatch/index.ts +41 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +235 -0
  224. package/src/domains/dispatch/path-scope.ts +370 -0
  225. package/src/domains/dispatch/receipt-integrity.ts +9 -4
  226. package/src/domains/dispatch/state.ts +36 -3
  227. package/src/domains/dispatch/types.ts +64 -12
  228. package/src/domains/dispatch/validation.ts +69 -6
  229. package/src/domains/dispatch/write-boundary-enforcer.ts +45 -0
  230. package/src/domains/dispatch/write-boundary.ts +201 -22
  231. package/src/domains/eval/metrics/evidence.ts +79 -2
  232. package/src/domains/eval/runners/clio-run.ts +12 -2
  233. package/src/domains/evidence/build.ts +69 -11
  234. package/src/domains/evidence/index.ts +21 -0
  235. package/src/domains/evidence/provenance.ts +46 -11
  236. package/src/domains/evidence/trust-projection.ts +274 -0
  237. package/src/domains/evidence/trust-status.ts +155 -18
  238. package/src/domains/evidence/types.ts +4 -0
  239. package/src/domains/extensions/discovery.ts +88 -1
  240. package/src/domains/extensions/resources.ts +20 -8
  241. package/src/domains/extensions/state.ts +6 -2
  242. package/src/domains/extensions/types.ts +4 -1
  243. package/src/domains/lifecycle/doctor.ts +140 -1
  244. package/src/domains/middleware/index.ts +15 -0
  245. package/src/domains/middleware/watchdog.ts +281 -0
  246. package/src/domains/observability/contract.ts +3 -1
  247. package/src/domains/observability/cost.ts +12 -1
  248. package/src/domains/observability/extension.ts +2 -2
  249. package/src/domains/observability/index.ts +10 -0
  250. package/src/domains/observability/out-of-turn-usage.ts +223 -0
  251. package/src/domains/prompts/contract.ts +3 -5
  252. package/src/domains/providers/extension.ts +30 -2
  253. package/src/domains/resources/common-loader.ts +3 -0
  254. package/src/domains/resources/index.ts +20 -0
  255. package/src/domains/resources/library.ts +326 -0
  256. package/src/domains/resources/prompts/loader.ts +119 -14
  257. package/src/domains/resources/skills/marketplace.ts +37 -12
  258. package/src/domains/safety/policy-engine.ts +5 -5
  259. package/src/domains/safety/run-effects.ts +64 -1
  260. package/src/domains/safety/scope.ts +7 -12
  261. package/src/domains/session/handoff.ts +629 -0
  262. package/src/domains/share/archive.ts +67 -2
  263. package/src/engine/acp/server.ts +4 -1
  264. package/src/engine/prompt-templates.ts +18 -1
  265. package/src/engine/worker-runtime.ts +6 -3
  266. package/src/entry/orchestrator.ts +37 -0
  267. package/src/interactive/bus-notices.ts +26 -0
  268. package/src/interactive/chat-loop.ts +235 -1
  269. package/src/interactive/chat-renderer.ts +22 -0
  270. package/src/interactive/cost-overlay.ts +31 -3
  271. package/src/interactive/council-dispatch.ts +30 -0
  272. package/src/interactive/council-grid.ts +213 -0
  273. package/src/interactive/council.ts +99 -0
  274. package/src/interactive/dispatch-board.ts +311 -17
  275. package/src/interactive/fleet-run-preview.ts +307 -0
  276. package/src/interactive/footer/notifications.ts +219 -0
  277. package/src/interactive/handoff-round.ts +56 -0
  278. package/src/interactive/interactive-application.ts +43 -1
  279. package/src/interactive/interactive-event-projection.ts +23 -1
  280. package/src/interactive/interactive-slash-runtime.ts +52 -2
  281. package/src/interactive/interactive-subscriptions.ts +14 -2
  282. package/src/interactive/oracle.ts +179 -0
  283. package/src/interactive/overlay-ask-user-lifecycle.ts +6 -0
  284. package/src/interactive/overlay-general-openers.ts +190 -1
  285. package/src/interactive/overlay-key-routing.ts +17 -1
  286. package/src/interactive/overlay-lifecycle.ts +41 -1
  287. package/src/interactive/overlay-permission-lifecycle.ts +10 -0
  288. package/src/interactive/overlay-resource-openers.ts +11 -3
  289. package/src/interactive/overlay-session-lifecycle.ts +234 -2
  290. package/src/interactive/overlays/fleet-run-approval.ts +208 -0
  291. package/src/interactive/overlays/handoff-review.ts +185 -0
  292. package/src/interactive/overlays/library-install-confirm.ts +151 -0
  293. package/src/interactive/overlays/list-overlay.ts +168 -2
  294. package/src/interactive/overlays/settings.ts +221 -30
  295. package/src/interactive/overlays/side-question.ts +139 -0
  296. package/src/interactive/overlays/skills-hub.ts +401 -15
  297. package/src/interactive/side-question.ts +171 -0
  298. package/src/interactive/slash-commands.ts +439 -7
  299. package/src/interactive/slash-spec.ts +19 -6
  300. package/src/interactive/theme/tokens.ts +30 -0
  301. package/src/interactive/turn-middleware.ts +15 -1
  302. package/src/interactive/view/artifacts.ts +42 -9
  303. package/src/interactive/view/view-overlay.ts +15 -3
  304. package/src/interactive/watchdog-run.ts +75 -0
  305. package/src/interactive/worker-receipts.ts +14 -2
  306. package/src/interactive/worker-share.ts +56 -1
  307. package/src/interactive/worker-stream.ts +15 -0
  308. package/src/tools/bootstrap.ts +3 -0
  309. package/src/tools/compete-worktrees.ts +13 -79
  310. package/src/tools/dispatch-admission.ts +251 -18
  311. package/src/tools/dispatch-arguments.ts +84 -1
  312. package/src/tools/dispatch-plan.ts +165 -6
  313. package/src/tools/dispatch-runner.ts +364 -23
  314. package/src/tools/dispatch-types.ts +20 -1
  315. package/src/tools/dispatch.ts +72 -2
  316. package/src/tools/monitor.ts +29 -0
  317. package/src/tools/profiles.ts +18 -4
  318. package/src/tools/task-worktree.ts +238 -0
  319. package/src/tools/verify/authoring.ts +61 -1
  320. package/src/tools/verify/scripts.ts +62 -0
  321. package/src/tools/worker-evidence.ts +21 -14
  322. package/src/worker/spec-contract.ts +3 -1
  323. package/dist/chunk-HC4CLZ2Y.js +0 -68
@@ -1,14 +1,16 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ MAX_TIMER_DELAY_MS
4
+ } from "./chunk-FQ4SKYE4.js";
2
5
  import {
3
6
  ACTIVE_AGENT_AUTOMATION_ROLES,
4
7
  ACTIVE_ROUTING_POSTURES,
5
8
  ACTIVE_ROUTING_ROLES,
9
+ COUNCIL_MEMBER_LABEL_PATTERN,
6
10
  DEFAULT_SETTINGS,
11
+ THEME_NAMED_COLORS,
7
12
  THINKING_LEVELS
8
- } from "./chunk-4OC57DA6.js";
9
- import {
10
- MAX_TIMER_DELAY_MS
11
- } from "./chunk-FQ4SKYE4.js";
13
+ } from "./chunk-4DGYLA73.js";
12
14
  import {
13
15
  withStateFileLockSync
14
16
  } from "./chunk-IKCO5N3L.js";
@@ -731,6 +733,30 @@ function validateMemorySettings(issues, value) {
731
733
  }
732
734
  return out;
733
735
  }
736
+ function validateWatchdogSettings(issues, value) {
737
+ const out = cloneValue(DEFAULT_SETTINGS.watchdog);
738
+ if (!isPlainObject(value)) {
739
+ issues.add("watchdog", `expected a map, got ${describe(value)}`);
740
+ return out;
741
+ }
742
+ issues.unknownKeys("watchdog", value, ["enabled", "target", "cadenceToolCalls"]);
743
+ if ("enabled" in value) {
744
+ const enabled = expectBoolean(issues, "watchdog.enabled", value.enabled);
745
+ if (enabled !== void 0) out.enabled = enabled;
746
+ }
747
+ if ("target" in value && value.target !== null) {
748
+ const target = expectString(issues, "watchdog.target", value.target);
749
+ if (target !== void 0) {
750
+ if (target.trim().length === 0) issues.add("watchdog.target", "expected a non-empty target id");
751
+ else out.target = target.trim();
752
+ }
753
+ }
754
+ if ("cadenceToolCalls" in value && value.cadenceToolCalls !== null) {
755
+ const cadence = expectInteger(issues, "watchdog.cadenceToolCalls", value.cadenceToolCalls, { min: 1 });
756
+ if (cadence !== void 0) out.cadenceToolCalls = cadence;
757
+ }
758
+ return out;
759
+ }
734
760
  function validateKeybindings(issues, value) {
735
761
  if (!isPlainObject(value)) {
736
762
  issues.add("keybindings", `expected a map, got ${describe(value)}`);
@@ -769,6 +795,7 @@ var TOP_LEVEL_KEYS = [
769
795
  "orchestrator",
770
796
  "background",
771
797
  "memory",
798
+ "watchdog",
772
799
  "workers",
773
800
  "fleet",
774
801
  "routing",
@@ -779,6 +806,7 @@ var TOP_LEVEL_KEYS = [
779
806
  "theme",
780
807
  "terminal",
781
808
  "skills",
809
+ "library",
782
810
  "attribution",
783
811
  "delegation",
784
812
  "keybindings",
@@ -825,6 +853,25 @@ function validateSettings(raw) {
825
853
  const v = expectStringArray(issues, "runtimePlugins", raw.runtimePlugins);
826
854
  if (v !== void 0) settings.runtimePlugins = v;
827
855
  }
856
+ if ("library" in raw) {
857
+ if (!isPlainObject(raw.library)) {
858
+ issues.add("library", `expected a map, got ${describe(raw.library)}`);
859
+ } else {
860
+ issues.unknownKeys("library", raw.library, ["catalog", "remote", "confirmedRemote", "sync"]);
861
+ for (const key of ["catalog", "remote", "confirmedRemote"]) {
862
+ const value = raw.library[key];
863
+ if (value === void 0) continue;
864
+ if (value !== null && typeof value !== "string")
865
+ issues.add(`library.${key}`, `expected a string or null, got ${describe(value)}`);
866
+ else settings.library[key] = value;
867
+ }
868
+ if (raw.library.sync !== void 0) {
869
+ if (typeof raw.library.sync !== "boolean")
870
+ issues.add("library.sync", `expected a boolean, got ${describe(raw.library.sync)}`);
871
+ else settings.library.sync = raw.library.sync;
872
+ }
873
+ }
874
+ }
828
875
  if ("orchestrator" in raw) {
829
876
  settings.orchestrator = validateWorkerTarget(
830
877
  issues,
@@ -844,6 +891,7 @@ function validateSettings(raw) {
844
891
  );
845
892
  }
846
893
  if ("memory" in raw) settings.memory = validateMemorySettings(issues, raw.memory);
894
+ if ("watchdog" in raw) settings.watchdog = validateWatchdogSettings(issues, raw.watchdog);
847
895
  if ("fleet" in raw) {
848
896
  settings.fleet = validateFleet(issues, raw.fleet);
849
897
  }
@@ -935,6 +983,7 @@ function validateSettings(raw) {
935
983
  issues.unknownKeys("workers", raw.workers, [
936
984
  "default",
937
985
  "profiles",
986
+ "rosters",
938
987
  "agentBindings",
939
988
  "maxRetries",
940
989
  "onPermission",
@@ -976,6 +1025,70 @@ function validateSettings(raw) {
976
1025
  settings.workers.profiles = profiles;
977
1026
  }
978
1027
  }
1028
+ if ("rosters" in raw.workers) {
1029
+ if (!isPlainObject(raw.workers.rosters)) {
1030
+ issues.add("workers.rosters", `expected a map, got ${describe(raw.workers.rosters)}`);
1031
+ } else {
1032
+ const rosters = {};
1033
+ for (const [rawName, rawRoster] of Object.entries(raw.workers.rosters)) {
1034
+ const name = rawName.trim();
1035
+ const path = `workers.rosters.${name}`;
1036
+ if (!name) {
1037
+ issues.add("workers.rosters", "empty roster name");
1038
+ continue;
1039
+ }
1040
+ if (!isPlainObject(rawRoster)) {
1041
+ issues.add(path, `expected a map, got ${describe(rawRoster)}`);
1042
+ continue;
1043
+ }
1044
+ issues.unknownKeys(path, rawRoster, ["members"]);
1045
+ if (!Array.isArray(rawRoster.members)) {
1046
+ issues.add(`${path}.members`, "expected a list");
1047
+ continue;
1048
+ }
1049
+ if (rawRoster.members.length < 2 || rawRoster.members.length > 5) {
1050
+ issues.add(`${path}.members`, "expected 2 to 5 members");
1051
+ }
1052
+ const members = [];
1053
+ const labels = /* @__PURE__ */ new Set();
1054
+ for (const [index, rawMember] of rawRoster.members.entries()) {
1055
+ const memberPath = `${path}.members[${index}]`;
1056
+ if (!isPlainObject(rawMember)) {
1057
+ issues.add(memberPath, `expected a map, got ${describe(rawMember)}`);
1058
+ continue;
1059
+ }
1060
+ issues.unknownKeys(memberPath, rawMember, ["label", "target", "model", "thinking", "color"]);
1061
+ const label = expectString(issues, `${memberPath}.label`, rawMember.label);
1062
+ const target = expectString(issues, `${memberPath}.target`, rawMember.target);
1063
+ if (label !== void 0 && !COUNCIL_MEMBER_LABEL_PATTERN.test(label)) {
1064
+ issues.add(`${memberPath}.label`, "expected [a-z][a-z0-9_-]{0,31}");
1065
+ }
1066
+ if (label !== void 0 && labels.has(label)) issues.add(`${memberPath}.label`, "duplicate label");
1067
+ if (label !== void 0) labels.add(label);
1068
+ if (target !== void 0 && !settings.targets.some((entry) => entry.id === target)) {
1069
+ issues.add(`${memberPath}.target`, `unknown target '${target}'`);
1070
+ }
1071
+ const model = rawMember.model === void 0 ? void 0 : expectString(issues, `${memberPath}.model`, rawMember.model);
1072
+ const thinking = rawMember.thinking === void 0 ? void 0 : expectEnum(issues, `${memberPath}.thinking`, rawMember.thinking, THINKING_LEVELS);
1073
+ const color = rawMember.color === void 0 ? void 0 : expectString(issues, `${memberPath}.color`, rawMember.color);
1074
+ if (color !== void 0 && !THEME_NAMED_COLORS.includes(color) && !/^#[0-9a-fA-F]{6}$/u.test(color)) {
1075
+ issues.add(`${memberPath}.color`, "expected a theme named color or 6-digit hex color");
1076
+ }
1077
+ if (label === void 0 || target === void 0) continue;
1078
+ members.push({
1079
+ label,
1080
+ target,
1081
+ ...model ? { model } : {},
1082
+ ...thinking ? { thinking } : {},
1083
+ ...color ? { color } : {}
1084
+ });
1085
+ }
1086
+ if (rawRoster.members.length >= 2 && rawRoster.members.length <= 5 && members.length === rawRoster.members.length)
1087
+ rosters[name] = { members };
1088
+ }
1089
+ settings.workers.rosters = rosters;
1090
+ }
1091
+ }
979
1092
  if ("agentBindings" in raw.workers) {
980
1093
  if (!isPlainObject(raw.workers.agentBindings)) {
981
1094
  issues.add("workers.agentBindings", `expected a map, got ${describe(raw.workers.agentBindings)}`);
@@ -1100,7 +1213,8 @@ function validateSettings(raw) {
1100
1213
  "outputVerbosity",
1101
1214
  "tuiMode",
1102
1215
  "fullscreenScrollbar",
1103
- "smoothStreaming"
1216
+ "smoothStreaming",
1217
+ "notify"
1104
1218
  ]);
1105
1219
  if ("showTerminalProgress" in raw.terminal) {
1106
1220
  const v = expectBoolean(issues, "terminal.showTerminalProgress", raw.terminal.showTerminalProgress);
@@ -1126,6 +1240,10 @@ function validateSettings(raw) {
1126
1240
  if (v === "off" || v === "auto" || v === "on") settings.terminal.smoothStreaming = v;
1127
1241
  else if (v !== void 0) issues.add("terminal.smoothStreaming", "expected off, auto, or on");
1128
1242
  }
1243
+ if ("notify" in raw.terminal) {
1244
+ const v = expectBoolean(issues, "terminal.notify", raw.terminal.notify);
1245
+ if (v !== void 0) settings.terminal.notify = v;
1246
+ }
1129
1247
  }
1130
1248
  }
1131
1249
  if ("skills" in raw) {
@@ -1443,4 +1561,4 @@ export {
1443
1561
  removeFleetProfileFromSettings,
1444
1562
  bindAgentProfileInSettings
1445
1563
  };
1446
- //# sourceMappingURL=chunk-AD2SYQYC.js.map
1564
+ //# sourceMappingURL=chunk-IJ7RPIYJ.js.map
@@ -0,0 +1,382 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ fleetLoopCheckStepId,
4
+ fleetLoopRepairStepId,
5
+ fleetStepWriteBoundary
6
+ } from "./chunk-E77JEWSD.js";
7
+ import {
8
+ init_esm_shims
9
+ } from "./chunk-3R73A4XB.js";
10
+
11
+ // src/domains/dispatch/execution-plan.ts
12
+ init_esm_shims();
13
+ import { createHash } from "node:crypto";
14
+ function requireAgentSteps(steps) {
15
+ return steps.map((step) => {
16
+ if (step.kind === "code") throw new Error(`execution plan: step '${step.id}' is a code step and has no route`);
17
+ return step;
18
+ });
19
+ }
20
+ function canonicalSteps(steps) {
21
+ return steps.map(
22
+ (step) => step.kind === "code" ? { ...step, kind: "code", dependencies: [...step.dependencies].sort() } : { ...step, kind: "agent", dependencies: [...step.dependencies].sort() }
23
+ );
24
+ }
25
+ function executionPlanWaves(steps, maxWorkers) {
26
+ if (!Number.isInteger(maxWorkers) || maxWorkers < 1)
27
+ throw new Error("execution plan: maxWorkers must be a positive integer");
28
+ if (steps.length === 0) throw new Error("execution plan: plan must contain at least one step");
29
+ const ids = /* @__PURE__ */ new Set();
30
+ for (const step of steps) {
31
+ if (step.id.trim().length === 0) throw new Error("execution plan: step id must be non-empty");
32
+ if (ids.has(step.id)) throw new Error(`execution plan: duplicate step id '${step.id}'`);
33
+ ids.add(step.id);
34
+ }
35
+ for (const step of steps)
36
+ for (const dependency of step.dependencies) {
37
+ if (!ids.has(dependency))
38
+ throw new Error(`execution plan: step '${step.id}' has missing dependency '${dependency}'`);
39
+ if (dependency === step.id) throw new Error(`execution plan: cycle includes '${step.id}'`);
40
+ }
41
+ const remaining = new Set(steps.map((step) => step.id));
42
+ const completed = /* @__PURE__ */ new Set();
43
+ const waves = [];
44
+ while (remaining.size > 0) {
45
+ const ready = steps.filter((step) => remaining.has(step.id) && step.dependencies.every((id) => completed.has(id)));
46
+ if (ready.length === 0) throw new Error("execution plan: dependency cycle detected");
47
+ const codeReady = ready.filter((step) => step.kind === "code").map((step) => step.id);
48
+ const agentReady = ready.filter((step) => step.kind !== "code").map((step) => step.id);
49
+ const chunks = [];
50
+ for (let offset = 0; offset < agentReady.length; offset += maxWorkers) {
51
+ chunks.push(agentReady.slice(offset, offset + maxWorkers));
52
+ }
53
+ if (chunks.length === 0) chunks.push([]);
54
+ chunks[0] = [...codeReady, ...chunks[0] ?? []];
55
+ for (const wave of chunks) {
56
+ waves.push(wave);
57
+ for (const id of wave) {
58
+ remaining.delete(id);
59
+ completed.add(id);
60
+ }
61
+ }
62
+ }
63
+ return waves;
64
+ }
65
+ function checkLoops(steps, loops) {
66
+ const byId = new Map(steps.map((step) => [step.id, step]));
67
+ const seen = /* @__PURE__ */ new Set();
68
+ for (const loop of loops) {
69
+ if (seen.has(loop.id)) throw new Error(`execution plan: duplicate loop id '${loop.id}'`);
70
+ seen.add(loop.id);
71
+ if (!Number.isInteger(loop.maxAttempts) || loop.maxAttempts < 1) {
72
+ throw new Error(`execution plan: loop '${loop.id}' must declare a positive attempt bound`);
73
+ }
74
+ if (loop.checkStepIds.length !== loop.maxAttempts || loop.repairStepIds.length !== loop.maxAttempts - 1) {
75
+ throw new Error(`execution plan: loop '${loop.id}' membership does not match its bound of ${loop.maxAttempts}`);
76
+ }
77
+ for (const id of [...loop.checkStepIds, ...loop.repairStepIds]) {
78
+ const step = byId.get(id);
79
+ if (step === void 0) throw new Error(`execution plan: loop '${loop.id}' names unknown step '${id}'`);
80
+ if (step.loop?.loopId !== loop.id) {
81
+ throw new Error(`execution plan: step '${id}' is not a member of loop '${loop.id}'`);
82
+ }
83
+ }
84
+ }
85
+ for (const step of steps) {
86
+ if (step.loop !== void 0 && !seen.has(step.loop.loopId)) {
87
+ throw new Error(`execution plan: step '${step.id}' belongs to undeclared loop '${step.loop.loopId}'`);
88
+ }
89
+ }
90
+ }
91
+ function checkWriteBoundaryWaves(steps, waves, writerLimit) {
92
+ const byId = new Map(steps.map((step) => [step.id, step]));
93
+ for (const [index, wave] of waves.entries()) {
94
+ const members = wave.flatMap((id) => {
95
+ const step = byId.get(id);
96
+ return step === void 0 ? [] : [step];
97
+ });
98
+ const declared = members.filter((step) => step.writes !== void 0);
99
+ if (declared.length === 0) continue;
100
+ const undeclared = members.filter((step) => step.writes === void 0);
101
+ if (undeclared.length > 0 && writerLimit !== 1) {
102
+ throw new Error(
103
+ `execution plan: wave ${index} mixes boundary-enforced steps (${declared.map((step) => step.id).join(", ")}) with steps that declare no boundary (${undeclared.map((step) => step.id).join(", ")}); they share one checkout, so the undeclared step's writes cannot be told from a violation`
104
+ );
105
+ }
106
+ const writers = declared.filter((step) => (step.writes?.length ?? 0) > 0);
107
+ if (writers.length > 1 && writerLimit !== 1) {
108
+ throw new Error(
109
+ `execution plan: wave ${index} schedules ${writers.length} steps that may write (${writers.map((step) => step.id).join(
110
+ ", "
111
+ )}); a write boundary is verified by diffing one shared checkout, so concurrent writers cannot be attributed. Order them with dependencies or lower maxWorkers`
112
+ );
113
+ }
114
+ }
115
+ }
116
+ function compileExecutionPlan(input) {
117
+ if (input.writers !== void 0 && input.writers !== 1) {
118
+ throw new Error("execution plan: writers must be 1 when present");
119
+ }
120
+ const steps = canonicalSteps(input.steps);
121
+ const loops = (input.loops ?? []).map((loop) => ({
122
+ ...loop,
123
+ checkStepIds: [...loop.checkStepIds],
124
+ repairStepIds: [...loop.repairStepIds]
125
+ }));
126
+ checkLoops(steps, loops);
127
+ const waves = executionPlanWaves(steps, input.maxWorkers);
128
+ checkWriteBoundaryWaves(steps, waves, input.writers);
129
+ const canonical = {
130
+ version: 4,
131
+ topology: input.topology,
132
+ rootTask: input.rootTask,
133
+ maxWorkers: input.maxWorkers,
134
+ ...input.writers === 1 ? { writers: 1 } : {},
135
+ onFailure: input.onFailure,
136
+ steps,
137
+ loops,
138
+ waves
139
+ };
140
+ return { ...canonical, hash: createHash("sha256").update(JSON.stringify(canonical)).digest("hex") };
141
+ }
142
+ function executionPlanAncestors(plan, stepId) {
143
+ const byId = new Map(plan.steps.map((step) => [step.id, step]));
144
+ const ancestors = /* @__PURE__ */ new Set();
145
+ const pending = [...byId.get(stepId)?.dependencies ?? []];
146
+ while (pending.length > 0) {
147
+ const next = pending.pop();
148
+ if (next === void 0 || ancestors.has(next)) continue;
149
+ ancestors.add(next);
150
+ pending.push(...byId.get(next)?.dependencies ?? []);
151
+ }
152
+ return ancestors;
153
+ }
154
+ function spliceExecutionPlan(plan, parentId, tasks) {
155
+ const parent = plan.steps.find((step) => step.id === parentId);
156
+ if (parent?.kind !== "agent" || parent.plan === void 0) {
157
+ throw new Error(`execution plan: '${parentId}' is not a plan step`);
158
+ }
159
+ const inserted = tasks.map((task) => ({
160
+ kind: "agent",
161
+ id: task.id,
162
+ agentId: task.agentId,
163
+ executionRole: task.executionRole,
164
+ scope: task.writes.length > 0 ? "workspace" : "readonly",
165
+ expectedResultContract: task.expectedResultContract,
166
+ requestedAuthority: task.requestedAuthority,
167
+ approvedAuthority: task.approvedAuthority,
168
+ dependencies: [parentId, ...task.dependencies],
169
+ task: task.task,
170
+ writes: [...task.writes],
171
+ ...task.target !== void 0 ? { target: task.target } : {},
172
+ ...task.profile !== void 0 ? { profile: task.profile } : {},
173
+ planParentId: parentId
174
+ }));
175
+ return compileExecutionPlan({
176
+ topology: plan.topology,
177
+ rootTask: plan.rootTask,
178
+ maxWorkers: plan.maxWorkers,
179
+ ...plan.writers === 1 ? { writers: 1 } : {},
180
+ onFailure: plan.onFailure,
181
+ steps: [...plan.steps, ...inserted],
182
+ loops: plan.loops
183
+ });
184
+ }
185
+
186
+ // src/domains/dispatch/fleet-plan.ts
187
+ init_esm_shims();
188
+ function expandDependencies(dependencies, loopMembers) {
189
+ return dependencies.flatMap((id) => {
190
+ const loop = loopMembers.get(id);
191
+ return loop === void 0 ? [id] : [...loop.checkStepIds];
192
+ });
193
+ }
194
+ function expandCommitSources(sources, loopMembers) {
195
+ return sources.flatMap((id) => {
196
+ const loop = loopMembers.get(id);
197
+ return loop === void 0 ? [id] : [...loop.repairStepIds].reverse();
198
+ });
199
+ }
200
+ function declaredLoops(steps) {
201
+ const loops = /* @__PURE__ */ new Map();
202
+ for (const step of steps) {
203
+ if (step.kind !== "loop") continue;
204
+ const checkStepIds = [];
205
+ const repairStepIds = [];
206
+ for (let attempt = 1; attempt <= step.maxAttempts; attempt++) {
207
+ checkStepIds.push(fleetLoopCheckStepId(step.id, attempt));
208
+ if (attempt < step.maxAttempts) repairStepIds.push(fleetLoopRepairStepId(step.id, attempt));
209
+ }
210
+ loops.set(step.id, {
211
+ id: step.id,
212
+ checkKind: step.check.kind === "gate" ? "code" : step.check.kind,
213
+ maxAttempts: step.maxAttempts,
214
+ checkStepIds,
215
+ repairStepIds
216
+ });
217
+ }
218
+ return loops;
219
+ }
220
+ function compileFleetExecutionPlan(input) {
221
+ const { contract, task, resolveAgent } = input;
222
+ const loops = declaredLoops(contract.steps);
223
+ const steps = [];
224
+ const boundary = (scope, writes) => {
225
+ const resolved = fleetStepWriteBoundary(contract.version, scope, writes);
226
+ return resolved === void 0 ? {} : { writes: [...resolved] };
227
+ };
228
+ const agentNode = (context, dependencies, writes, loop, extra) => {
229
+ const resolved = resolveAgent(context);
230
+ return {
231
+ kind: "agent",
232
+ id: context.stepId,
233
+ agentId: context.agentId,
234
+ scope: context.scope,
235
+ dependencies: [...dependencies],
236
+ task,
237
+ expectedResultContract: resolved.expectedResultContract,
238
+ requestedAuthority: resolved.requestedAuthority,
239
+ approvedAuthority: resolved.approvedAuthority,
240
+ executionRole: resolved.executionRole,
241
+ ...boundary(context.scope, writes),
242
+ ...loop !== void 0 ? { loop } : {},
243
+ ...context.target !== void 0 ? { target: context.target } : {},
244
+ ...context.profile !== void 0 ? { profile: context.profile } : {},
245
+ ...extra
246
+ };
247
+ };
248
+ const routeOf = (value) => ({
249
+ ...value.target !== void 0 ? { target: value.target } : {},
250
+ ...value.profile !== void 0 ? { profile: value.profile } : {}
251
+ });
252
+ for (const step of contract.steps) {
253
+ const dependencies = expandDependencies(step.dependencies, loops);
254
+ if (step.kind === "agent") {
255
+ steps.push(
256
+ agentNode(
257
+ { stepId: step.id, agentId: step.agent, scope: step.scope, attempt: 0, ...routeOf(step) },
258
+ dependencies,
259
+ step.writes
260
+ )
261
+ );
262
+ continue;
263
+ }
264
+ if (step.kind === "gate") {
265
+ steps.push(
266
+ agentNode(
267
+ { stepId: step.id, agentId: step.agent, scope: "workspace", attempt: 0, gateAuthorRole: true, ...routeOf(step) },
268
+ dependencies,
269
+ [step.path],
270
+ void 0,
271
+ { gate: { path: step.path, commandId: step.run } }
272
+ )
273
+ );
274
+ continue;
275
+ }
276
+ if (step.kind === "plan") {
277
+ steps.push(
278
+ agentNode(
279
+ { stepId: step.id, agentId: step.agent, scope: step.scope, attempt: 0, planRole: true, ...routeOf(step) },
280
+ dependencies,
281
+ step.writes,
282
+ void 0,
283
+ { plan: { roster: [...step.roster], maxTasks: step.maxTasks, proposals: step.proposals } }
284
+ )
285
+ );
286
+ continue;
287
+ }
288
+ if (step.kind === "code") {
289
+ steps.push({
290
+ kind: "code",
291
+ id: step.id,
292
+ commandId: step.command,
293
+ scope: step.scope,
294
+ dependencies,
295
+ ...boundary(step.scope, step.writes),
296
+ ...step.commitFrom !== void 0 ? { commitFrom: expandCommitSources(step.commitFrom, loops) } : {}
297
+ });
298
+ continue;
299
+ }
300
+ const loop = loops.get(step.id);
301
+ if (loop === void 0) throw new Error(`fleet plan: loop '${step.id}' failed to compile`);
302
+ for (let attempt = 1; attempt <= step.maxAttempts; attempt++) {
303
+ const checkId = loop.checkStepIds[attempt - 1] ?? "";
304
+ const previousRepair = attempt === 1 ? null : loop.repairStepIds[attempt - 2] ?? "";
305
+ const checkDependencies = previousRepair === null ? dependencies : [previousRepair];
306
+ const membership = { loopId: loop.id, role: "check", attempt };
307
+ if (step.check.kind === "code") {
308
+ steps.push({
309
+ kind: "code",
310
+ id: checkId,
311
+ commandId: step.check.command,
312
+ scope: step.check.scope,
313
+ dependencies: checkDependencies,
314
+ ...boundary(step.check.scope, step.check.writes),
315
+ loop: membership,
316
+ // The green a later step may rely on; the scheduler re-runs it
317
+ // when a workspace step lands after it.
318
+ verification: true
319
+ });
320
+ } else if (step.check.kind === "gate") {
321
+ const gateId = step.check.gate;
322
+ const gate = contract.steps.find((candidate) => candidate.id === gateId);
323
+ if (gate?.kind !== "gate") throw new Error(`fleet plan: gate '${gateId}' failed to resolve`);
324
+ steps.push({
325
+ kind: "code",
326
+ id: checkId,
327
+ commandId: gate.run,
328
+ scope: "readonly",
329
+ dependencies: checkDependencies,
330
+ writes: [],
331
+ loop: membership,
332
+ verification: true,
333
+ gate: { gateId: gate.id, path: gate.path }
334
+ });
335
+ } else {
336
+ steps.push(
337
+ agentNode(
338
+ {
339
+ stepId: checkId,
340
+ agentId: step.check.agent,
341
+ scope: step.check.scope,
342
+ attempt: 0,
343
+ gateRole: "reviewer",
344
+ ...routeOf(step.check)
345
+ },
346
+ checkDependencies,
347
+ step.check.writes,
348
+ membership
349
+ )
350
+ );
351
+ }
352
+ if (attempt >= step.maxAttempts) continue;
353
+ const repairId = loop.repairStepIds[attempt - 1] ?? "";
354
+ steps.push(
355
+ agentNode(
356
+ { stepId: repairId, agentId: step.repair.agent, scope: step.repair.scope, attempt, ...routeOf(step.repair) },
357
+ [checkId],
358
+ step.repair.writes,
359
+ { loopId: loop.id, role: "repair", attempt }
360
+ )
361
+ );
362
+ }
363
+ }
364
+ return compileExecutionPlan({
365
+ topology: "fleet",
366
+ rootTask: task,
367
+ maxWorkers: contract.maxWorkers,
368
+ ...contract.writers === 1 ? { writers: 1 } : {},
369
+ onFailure: contract.onFailure,
370
+ steps,
371
+ loops: [...loops.values()]
372
+ });
373
+ }
374
+
375
+ export {
376
+ requireAgentSteps,
377
+ compileExecutionPlan,
378
+ executionPlanAncestors,
379
+ spliceExecutionPlan,
380
+ compileFleetExecutionPlan
381
+ };
382
+ //# sourceMappingURL=chunk-J3YUBZWY.js.map
@@ -1,20 +1,22 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  assistantTextFromEvent
4
- } from "./chunk-3BPUFZDL.js";
4
+ } from "./chunk-HLE42MG7.js";
5
5
  import {
6
- compileExecutionPlan,
7
6
  durableAssistantTextFromEvent
8
- } from "./chunk-QM3F2GKX.js";
7
+ } from "./chunk-TLQJPP24.js";
8
+ import {
9
+ compileExecutionPlan
10
+ } from "./chunk-J3YUBZWY.js";
9
11
  import {
10
12
  deriveExecutionRole
11
- } from "./chunk-22NAGB7X.js";
13
+ } from "./chunk-H7IXIC72.js";
12
14
  import {
13
15
  truncateUtf8
14
16
  } from "./chunk-6XLNIQDB.js";
15
17
  import {
16
18
  BusChannels
17
- } from "./chunk-G7MUEIGA.js";
19
+ } from "./chunk-TT36MB5S.js";
18
20
  import {
19
21
  init_esm_shims
20
22
  } from "./chunk-3R73A4XB.js";
@@ -274,4 +276,4 @@ export {
274
276
  compileScoutTransition,
275
277
  createDispatchRunEventRegistry
276
278
  };
277
- //# sourceMappingURL=chunk-5JGRAMKL.js.map
279
+ //# sourceMappingURL=chunk-JOZYP4GM.js.map