@iowarp/clio-coder 0.3.4 → 0.3.7

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 (376) hide show
  1. package/CHANGELOG.md +65 -2
  2. package/CONTRIBUTING.md +6 -6
  3. package/README.md +16 -5
  4. package/dist/{acp-S5R4RR5B.js → acp-SK4MD6MM.js} +11 -11
  5. package/dist/{agents-P6DMMVZY.js → agents-2FN2K6ME.js} +33 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-2XCZLPKS.js → auth-QIYZWM5I.js} +15 -15
  8. package/dist/{chunk-EKMEHE4H.js → chunk-33YXPOE3.js} +2 -3
  9. package/dist/{chunk-VAWWTKDP.js → chunk-3HAPLH5M.js} +11 -11
  10. package/dist/{chunk-YCWGATWI.js → chunk-465YSENW.js} +3 -3
  11. package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
  12. package/dist/{chunk-UZHIZC5S.js → chunk-4DWFMQDR.js} +61 -76
  13. package/dist/{chunk-ZWMF7253.js → chunk-5C3AQNDW.js} +328 -9
  14. package/dist/{chunk-22NAGB7X.js → chunk-5C77SEEY.js} +5 -94
  15. package/dist/{chunk-WPQLXFOZ.js → chunk-5FR74PWO.js} +3 -2
  16. package/dist/{chunk-35MKKU5R.js → chunk-5UJ6ECTS.js} +18 -10
  17. package/dist/{chunk-BRXQQJFP.js → chunk-6M7VS3J3.js} +571 -50
  18. package/dist/{chunk-QQK64KLB.js → chunk-6TUKSZVF.js} +141 -23
  19. package/dist/{chunk-N4CZJQRK.js → chunk-AB4XIIVB.js} +8 -6
  20. package/dist/{chunk-KRPY7NTG.js → chunk-BMWK7ZIZ.js} +14 -20
  21. package/dist/{chunk-4BPJXDWC.js → chunk-C4JBQ5SR.js} +30 -14
  22. package/dist/{chunk-ZYKPLLNQ.js → chunk-CEYBNUGC.js} +821 -83
  23. package/dist/{chunk-VEZEGCGW.js → chunk-D4MDIG46.js} +20 -18
  24. package/dist/chunk-DJNLUABN.js +843 -0
  25. package/dist/{chunk-BP4OYD6A.js → chunk-DMD2AGVS.js} +21 -2
  26. package/dist/{chunk-KOHPCX4K.js → chunk-DOOEX22V.js} +2 -2
  27. package/dist/chunk-DQA7QLMD.js +123 -0
  28. package/dist/chunk-DR52UMZW.js +21 -0
  29. package/dist/{chunk-3HZ5RWN2.js → chunk-EBEFWSGL.js} +9 -7
  30. package/dist/{chunk-EDRHSCIE.js → chunk-EELBMBT6.js} +128 -13
  31. package/dist/{chunk-HV5X7OR2.js → chunk-EOOQZZDE.js} +16 -14
  32. package/dist/{chunk-WR67VIZY.js → chunk-FOT2FX5J.js} +63 -5
  33. package/dist/{chunk-BPGS2WCQ.js → chunk-GEYXPTRF.js} +2 -1
  34. package/dist/{chunk-FYYLNIL5.js → chunk-GH5622CP.js} +2 -2
  35. package/dist/{chunk-BEY543CS.js → chunk-GOXNB3AO.js} +5 -2
  36. package/dist/chunk-GWS3VEIW.js +195 -0
  37. package/dist/{chunk-G4BMMOKF.js → chunk-HVDIIIQW.js} +2 -2
  38. package/dist/chunk-HWUFFB6L.js +83 -0
  39. package/dist/{chunk-X6COSD2O.js → chunk-J7PIKKWC.js} +8 -436
  40. package/dist/{chunk-NILBFAPG.js → chunk-JNXPYBB4.js} +2 -2
  41. package/dist/{chunk-4VP4KH3K.js → chunk-JRIO5UD2.js} +4 -4
  42. package/dist/{chunk-K6WL7QZT.js → chunk-JTSEDYVQ.js} +7 -7
  43. package/dist/{chunk-QKMUKYO7.js → chunk-KCMKRQX4.js} +236 -84
  44. package/dist/chunk-KZ2H5X4G.js +1026 -0
  45. package/dist/{chunk-A2GZF7DC.js → chunk-LADCF22A.js} +13 -13
  46. package/dist/chunk-LCGCVYZ4.js +57 -0
  47. package/dist/chunk-M4AKACEO.js +382 -0
  48. package/dist/{chunk-POHLU5DW.js → chunk-M6L6IDJG.js} +3 -3
  49. package/dist/{chunk-4JUF2NNX.js → chunk-MXI6J5JF.js} +7 -7
  50. package/dist/{chunk-X4RCMKVQ.js → chunk-NDINPTJ4.js} +2 -2
  51. package/dist/{chunk-TTNYS3EA.js → chunk-OB5HIGJY.js} +1 -1
  52. package/dist/{chunk-7RXG6QRZ.js → chunk-OBMAI2DP.js} +61 -840
  53. package/dist/{chunk-5M54SPOL.js → chunk-ODFEOB4F.js} +161 -5
  54. package/dist/chunk-PD3MESLB.js +242 -0
  55. package/dist/{chunk-ED4KHGC3.js → chunk-PPAMZ32Z.js} +9 -2
  56. package/dist/{chunk-VMNQ6OZA.js → chunk-QCTRSGHQ.js} +963 -786
  57. package/dist/chunk-RVG5JXAL.js +41 -0
  58. package/dist/{chunk-RD5U66HV.js → chunk-SROCI7ZU.js} +7 -7
  59. package/dist/{chunk-MFFY33HR.js → chunk-THKY7CD7.js} +466 -205
  60. package/dist/{chunk-34475P3I.js → chunk-TSHXZTOQ.js} +5 -4
  61. package/dist/{chunk-PCZJO5TI.js → chunk-UFQ3F4FW.js} +13 -178
  62. package/dist/{chunk-AD2SYQYC.js → chunk-UHXRNZ2J.js} +121 -3
  63. package/dist/chunk-UND3GU2L.js +103 -0
  64. package/dist/{chunk-QQL5RT5M.js → chunk-UUANF5CR.js} +2323 -2114
  65. package/dist/{chunk-VJWL6YS5.js → chunk-UUVG37B4.js} +2 -2
  66. package/dist/chunk-UVDSQ6LW.js +472 -0
  67. package/dist/{chunk-QWU7ZBO7.js → chunk-VQNODYQ4.js} +215 -56
  68. package/dist/chunk-VREKEFLL.js +37 -0
  69. package/dist/{chunk-2TZWSW76.js → chunk-WHGPSPT5.js} +2 -2
  70. package/dist/{chunk-TW3WDMVS.js → chunk-WHJYKASB.js} +2 -2
  71. package/dist/{chunk-MEQ45TQ4.js → chunk-WJHBC77E.js} +21 -7
  72. package/dist/{chunk-HXG4IURW.js → chunk-X2KV5FXT.js} +2 -2
  73. package/dist/{chunk-YHZX5GEU.js → chunk-XAKHZX5N.js} +2 -2
  74. package/dist/{chunk-2LZI5CAG.js → chunk-XEGB6BCN.js} +228 -36
  75. package/dist/{chunk-E25LMLRW.js → chunk-YD734TPH.js} +2 -2
  76. package/dist/{verifiers-4UUM6TEE.js → chunk-YTYFXUI3.js} +121 -372
  77. package/dist/{chunk-3JLKSKD7.js → chunk-ZGH7FGS5.js} +17 -7
  78. package/dist/{chunk-VSNATDE6.js → chunk-ZZMN5OM4.js} +2 -2
  79. package/dist/cli/index.js +34 -32
  80. package/dist/{clio-J5JIOIDS.js → clio-WBVQEBKO.js} +7 -7
  81. package/dist/{code-nav-AXCXSBHX.js → code-nav-FGGFIE7L.js} +7 -7
  82. package/dist/codewiki/build-worker.js +4 -4
  83. package/dist/{components-KELWS457.js → components-F7OEATSO.js} +5 -5
  84. package/dist/{config-OEBMIN2U.js → config-TRBL3RCF.js} +48 -41
  85. package/dist/{configure-PUQOSIXQ.js → configure-OLCVPHNM.js} +17 -17
  86. package/dist/{context-URSXPBCK.js → context-MJIJ6GOX.js} +12 -12
  87. package/dist/{context-EKDCKUUZ.js → context-WFPKQSM6.js} +26 -9
  88. package/dist/{context-MGSE4Z2T.js → context-XEWE3MOJ.js} +44 -37
  89. package/dist/{context-clear-KDAJRNUK.js → context-clear-KNOS2JPB.js} +44 -37
  90. package/dist/{context-index-BZ4UYMTC.js → context-index-SSR5ECNE.js} +3 -3
  91. package/dist/{context-working-set-SBKMPPI2.js → context-working-set-EUXAZI6N.js} +14 -13
  92. package/dist/{dispatch-runner-MSWN72NK.js → dispatch-runner-B7MTOVKL.js} +321 -60
  93. package/dist/{docs-2C2LTVT2.js → docs-FLJTIDSE.js} +5 -5
  94. package/dist/{doctor-7BSE27PJ.js → doctor-RN4YKO2X.js} +15 -15
  95. package/dist/{eval-IZGDOO4H.js → eval-RUBJVSNQ.js} +52 -236
  96. package/dist/{evidence-SR7WXB5B.js → evidence-JZNBUOQZ.js} +39 -33
  97. package/dist/{evolve-K7VE2CBX.js → evolve-FJVC4KKI.js} +39 -33
  98. package/dist/{extensions-QVDOHDGJ.js → extensions-IQL36S7K.js} +5 -5
  99. package/dist/{fleet-7XMJNQNF.js → fleet-BDKYJFCP.js} +243 -370
  100. package/dist/fleet-commands-ZFIWZSB3.js +70 -0
  101. package/dist/fleet-graph-Y6HPXIVF.js +125 -0
  102. package/dist/fleet-new-RDVJLHHH.js +48 -0
  103. package/dist/{fleet-preflight-AQNAH644.js → fleet-preflight-BHSNPBMH.js} +2 -2
  104. package/dist/fleet-validate-BIYREGIK.js +79 -0
  105. package/dist/{init-JGNPAYXT.js → init-LQUB5COQ.js} +57 -48
  106. package/dist/library-NJAHIGG4.js +217 -0
  107. package/dist/memory-OG6HOYKM.js +472 -0
  108. package/dist/{models-ZMMLFJNN.js → models-5ZG5XY7J.js} +23 -22
  109. package/dist/{monitor-2F3T5KHP.js → monitor-TJ7AMTGB.js} +69 -35
  110. package/dist/{orchestrator-ORHT43JB.js → orchestrator-WZYB54DM.js} +4868 -1189
  111. package/dist/{paths-UXLN5YYZ.js → paths-XUC7GS6E.js} +5 -5
  112. package/dist/{reset-NXGTYNUO.js → reset-PXQT45IY.js} +8 -8
  113. package/dist/{run-RF4WJGMT.js → run-FQ74YF62.js} +82 -62
  114. package/dist/{share-UT3W6E4M.js → share-FW7SVCL3.js} +34 -10
  115. package/dist/{skills-PSACKC5Q.js → skills-7E7IRB3R.js} +25 -9
  116. package/dist/{skills-eval-WJSI55RZ.js → skills-eval-LI75W6OK.js} +43 -35
  117. package/dist/{targets-PIIRAOYS.js → targets-4CIFKCTW.js} +27 -24
  118. package/dist/{terminal-lease-ULWXWNVY.js → terminal-lease-WUZY7ZV5.js} +5 -4
  119. package/dist/{uninstall-FZCQCDKC.js → uninstall-7FV7IP4E.js} +5 -5
  120. package/dist/{upgrade-346TZ6AV.js → upgrade-K2HVIVMQ.js} +21 -20
  121. package/dist/{usage-6KKXR32N.js → usage-GTZELZQX.js} +159 -59
  122. package/dist/verifiers-RLAHT27O.js +336 -0
  123. package/dist/{verify-X5HDROLA.js → verify-BX3BRKH5.js} +7 -6
  124. package/dist/{wiki-generate-7STOCIFZ.js → wiki-generate-ASIFASCN.js} +58 -48
  125. package/dist/worker/entry.js +98 -84
  126. package/dist/{workspace-G4ZWUIPR.js → workspace-ZJ6BFM3Q.js} +4 -4
  127. package/docs/README.md +4 -3
  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-placement.md +1 -2
  132. package/docs/artifact-versions.md +10 -6
  133. package/docs/built-in-agents.md +26 -2
  134. package/docs/capacity-and-scheduling.md +1 -1
  135. package/docs/commands-and-modes.md +90 -8
  136. package/docs/configuration-and-targets.md +90 -2
  137. package/docs/context-engine.md +4 -2
  138. package/docs/context-working-set.md +4 -4
  139. package/docs/development-pipeline.md +1 -1
  140. package/docs/dispatch-architecture-rationale.md +1 -1
  141. package/docs/documentation-coverage.md +4 -4
  142. package/docs/documentation-guide.md +4 -4
  143. package/docs/eval-runner.md +1 -1
  144. package/docs/evals-internal.md +4 -45
  145. package/docs/evidence-and-memory.md +70 -10
  146. package/docs/evolution.md +1 -1
  147. package/docs/exit-codes-and-output.md +4 -1
  148. package/docs/extensions-and-sharing.md +6 -2
  149. package/docs/fleet-demo-runbook.md +2 -2
  150. package/docs/fleet-dispatch.md +224 -11
  151. package/docs/git-commit-provenance.md +2 -2
  152. package/docs/glossary.md +1 -1
  153. package/docs/installation-and-lifecycle.md +2 -2
  154. package/docs/middleware-and-components.md +20 -2
  155. package/docs/model-catalog.md +1 -1
  156. package/docs/observability.md +55 -8
  157. package/docs/proactive-memory.md +26 -16
  158. package/docs/prompt-envelope-and-tools.md +4 -2
  159. package/docs/provider-adapter-cookbook.md +1 -1
  160. package/docs/release-cut-checklist.md +83 -65
  161. package/docs/resource-library.md +59 -0
  162. package/docs/safety-model.md +29 -7
  163. package/docs/scientific-validation.md +3 -3
  164. package/docs/session-lifecycle.md +37 -1
  165. package/docs/skills-marketplace.md +16 -3
  166. package/docs/tool-usage.md +14 -7
  167. package/docs/trace-store.md +1 -1
  168. package/docs/troubleshooting.md +1 -1
  169. package/docs/tui-design.md +38 -4
  170. package/docs/worker-dispatch-mechanics.md +3 -3
  171. package/package.json +7 -4
  172. package/src/cli/agents.ts +2 -3
  173. package/src/cli/argv.ts +14 -1
  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 +121 -0
  178. package/src/cli/fleet-validate.ts +30 -0
  179. package/src/cli/fleet.ts +188 -335
  180. package/src/cli/index.ts +4 -2
  181. package/src/cli/library.ts +190 -0
  182. package/src/cli/memory.ts +272 -10
  183. package/src/cli/modes/json-stream.ts +2 -2
  184. package/src/cli/modes/print.ts +12 -1
  185. package/src/cli/run.ts +22 -2
  186. package/src/cli/share.ts +13 -1
  187. package/src/cli/targets.ts +12 -3
  188. package/src/cli/usage.ts +160 -20
  189. package/src/core/bus-events.ts +7 -0
  190. package/src/core/commit-attribution.ts +4 -4
  191. package/src/core/config.ts +130 -0
  192. package/src/core/defaults.ts +81 -0
  193. package/src/core/response-model-id.ts +134 -0
  194. package/src/core/toml.ts +62 -0
  195. package/src/core/workspace-files.ts +0 -1
  196. package/src/domains/agents/builtins/architect.md +2 -1
  197. package/src/domains/agents/builtins/oracle.md +33 -0
  198. package/src/domains/agents/catalog.ts +18 -5
  199. package/src/domains/agents/fleet-contract.ts +278 -16
  200. package/src/domains/agents/index.ts +14 -0
  201. package/src/domains/agents/recipe.ts +54 -14
  202. package/src/domains/agents/result-contract.ts +242 -5
  203. package/src/domains/config/classify.ts +4 -0
  204. package/src/domains/context/bootstrap.ts +36 -27
  205. package/src/domains/context/project-metadata.ts +19 -63
  206. package/src/domains/context/prompt-context.ts +8 -0
  207. package/src/domains/context/working-set/policies/index.ts +3 -4
  208. package/src/domains/dispatch/active-route-planner.ts +14 -0
  209. package/src/domains/dispatch/backoff.ts +2 -1
  210. package/src/domains/dispatch/budget-envelope.ts +396 -0
  211. package/src/domains/dispatch/capability-match.ts +1 -0
  212. package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
  213. package/src/domains/dispatch/contract.ts +36 -0
  214. package/src/domains/dispatch/delegation-plan.ts +167 -0
  215. package/src/domains/dispatch/execution-plan.ts +76 -5
  216. package/src/domains/dispatch/execution-role.ts +3 -1
  217. package/src/domains/dispatch/execution-scheduler.ts +183 -67
  218. package/src/domains/dispatch/extension.ts +339 -36
  219. package/src/domains/dispatch/fleet-gate.ts +14 -0
  220. package/src/domains/dispatch/fleet-plan.ts +63 -3
  221. package/src/domains/dispatch/fleet-run.ts +737 -0
  222. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  223. package/src/domains/dispatch/host-verification.ts +178 -0
  224. package/src/domains/dispatch/index.ts +38 -0
  225. package/src/domains/dispatch/intent.ts +159 -0
  226. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  227. package/src/domains/dispatch/receipt-integrity.ts +12 -4
  228. package/src/domains/dispatch/state.ts +37 -3
  229. package/src/domains/dispatch/types.ts +61 -9
  230. package/src/domains/dispatch/validation.ts +80 -6
  231. package/src/domains/dispatch/worker-spawn.ts +14 -3
  232. package/src/domains/eval/metrics/evidence.ts +0 -116
  233. package/src/domains/eval/metrics/invariants.ts +1 -1
  234. package/src/domains/eval/runners/clio-run.ts +1 -10
  235. package/src/domains/eval/runners/external-command.ts +2 -29
  236. package/src/domains/eval/schema/suite.ts +0 -7
  237. package/src/domains/eval/suites/run.ts +1 -7
  238. package/src/domains/evidence/trust-status.ts +10 -1
  239. package/src/domains/memory/index.ts +22 -0
  240. package/src/domains/memory/operations.ts +58 -1
  241. package/src/domains/memory/promotion.ts +281 -0
  242. package/src/domains/memory/prompt-section.ts +25 -5
  243. package/src/domains/memory/proposal.ts +51 -7
  244. package/src/domains/memory/task-bank.ts +3 -2
  245. package/src/domains/memory/task-memory-handoff.ts +181 -24
  246. package/src/domains/memory/task-memory-policy.ts +3 -1
  247. package/src/domains/memory/types.ts +37 -0
  248. package/src/domains/memory/validate.ts +178 -0
  249. package/src/domains/middleware/index.ts +15 -0
  250. package/src/domains/middleware/memory-intervention.ts +35 -25
  251. package/src/domains/middleware/runtime.ts +6 -0
  252. package/src/domains/middleware/skills-reminder.ts +19 -4
  253. package/src/domains/middleware/stalled-turn.ts +43 -1
  254. package/src/domains/middleware/types.ts +10 -0
  255. package/src/domains/middleware/watchdog.ts +281 -0
  256. package/src/domains/observability/contract.ts +9 -2
  257. package/src/domains/observability/cost.ts +31 -4
  258. package/src/domains/observability/extension.ts +2 -2
  259. package/src/domains/observability/index.ts +10 -0
  260. package/src/domains/observability/out-of-turn-usage.ts +223 -0
  261. package/src/domains/providers/index.ts +3 -0
  262. package/src/domains/providers/model-discovery.ts +9 -0
  263. package/src/domains/providers/runtime-resolution.ts +38 -1
  264. package/src/domains/providers/runtimes/common/probe-helpers.ts +97 -16
  265. package/src/domains/providers/types/context-window-slots.ts +18 -0
  266. package/src/domains/providers/types/runtime-descriptor.ts +3 -1
  267. package/src/domains/resources/index.ts +20 -0
  268. package/src/domains/resources/library.ts +326 -0
  269. package/src/domains/resources/skills/marketplace.ts +37 -12
  270. package/src/domains/safety/call-target.ts +211 -14
  271. package/src/domains/safety/decision-presentation.ts +268 -0
  272. package/src/domains/safety/redaction.ts +73 -0
  273. package/src/domains/session/context-ledger.ts +10 -1
  274. package/src/domains/session/decision-board.ts +4 -0
  275. package/src/domains/session/entries.ts +3 -0
  276. package/src/domains/session/handoff.ts +629 -0
  277. package/src/domains/session/history.ts +68 -19
  278. package/src/domains/session/usage.ts +24 -7
  279. package/src/domains/share/archive.ts +67 -2
  280. package/src/engine/acp/event-mapper.ts +7 -0
  281. package/src/engine/acp/server.ts +29 -2
  282. package/src/engine/apis/lmstudio.ts +25 -4
  283. package/src/engine/apis/openai-completions.ts +147 -22
  284. package/src/engine/claude/sdk-runtime.ts +8 -2
  285. package/src/engine/claude/tool-safety.ts +13 -0
  286. package/src/engine/loop-guard.ts +27 -3
  287. package/src/engine/worker-events.ts +4 -3
  288. package/src/engine/worker-runtime.ts +59 -54
  289. package/src/entry/orchestrator.ts +55 -1
  290. package/src/interactive/bus-notices.ts +26 -0
  291. package/src/interactive/chat-loop-messages.ts +22 -0
  292. package/src/interactive/chat-loop.ts +248 -1
  293. package/src/interactive/chat-renderer.ts +41 -3
  294. package/src/interactive/clio-editor.ts +44 -7
  295. package/src/interactive/context-overlay.ts +43 -5
  296. package/src/interactive/cost-overlay.ts +70 -11
  297. package/src/interactive/council-dispatch.ts +30 -0
  298. package/src/interactive/council-grid.ts +213 -0
  299. package/src/interactive/council.ts +99 -0
  300. package/src/interactive/dispatch-board.ts +471 -50
  301. package/src/interactive/fleet-run-preview.ts +307 -0
  302. package/src/interactive/footer/notifications.ts +219 -0
  303. package/src/interactive/footer/widgets.ts +13 -0
  304. package/src/interactive/handoff-round.ts +56 -0
  305. package/src/interactive/interactive-application.ts +49 -2
  306. package/src/interactive/interactive-event-projection.ts +9 -1
  307. package/src/interactive/interactive-input-runtime.ts +11 -1
  308. package/src/interactive/interactive-presentation.ts +11 -1
  309. package/src/interactive/interactive-slash-runtime.ts +52 -2
  310. package/src/interactive/interactive-subscriptions.ts +14 -2
  311. package/src/interactive/memory-overlay.ts +89 -4
  312. package/src/interactive/oracle.ts +179 -0
  313. package/src/interactive/overlay-ask-user-lifecycle.ts +7 -1
  314. package/src/interactive/overlay-frame.ts +5 -2
  315. package/src/interactive/overlay-general-openers.ts +230 -2
  316. package/src/interactive/overlay-key-routing.ts +58 -2
  317. package/src/interactive/overlay-lifecycle.ts +52 -5
  318. package/src/interactive/overlay-permission-lifecycle.ts +33 -8
  319. package/src/interactive/overlay-resource-openers.ts +11 -3
  320. package/src/interactive/overlay-session-lifecycle.ts +234 -2
  321. package/src/interactive/overlay-transitions.ts +11 -0
  322. package/src/interactive/overlays/ask-user.ts +74 -30
  323. package/src/interactive/overlays/decisions.ts +3 -1
  324. package/src/interactive/overlays/fleet-run-approval.ts +208 -0
  325. package/src/interactive/overlays/handoff-review.ts +185 -0
  326. package/src/interactive/overlays/library-install-confirm.ts +151 -0
  327. package/src/interactive/overlays/list-overlay.ts +168 -2
  328. package/src/interactive/overlays/settings.ts +101 -4
  329. package/src/interactive/overlays/side-question.ts +139 -0
  330. package/src/interactive/overlays/skills-hub.ts +401 -15
  331. package/src/interactive/permission-hint.ts +35 -0
  332. package/src/interactive/permission-overlay.ts +95 -45
  333. package/src/interactive/renderers/tool-execution.ts +19 -49
  334. package/src/interactive/session-last-turn.ts +8 -1
  335. package/src/interactive/session-usage-reseed.ts +36 -10
  336. package/src/interactive/side-question.ts +171 -0
  337. package/src/interactive/slash-commands.ts +434 -7
  338. package/src/interactive/slash-spec.ts +19 -6
  339. package/src/interactive/status/summary.ts +5 -0
  340. package/src/interactive/status/types.ts +5 -0
  341. package/src/interactive/terminal-lease.ts +1 -0
  342. package/src/interactive/theme/tokens.ts +30 -0
  343. package/src/interactive/turn-context.ts +96 -23
  344. package/src/interactive/turn-middleware.ts +16 -1
  345. package/src/interactive/turn-runtime.ts +37 -8
  346. package/src/interactive/turn-state.ts +3 -0
  347. package/src/interactive/watchdog-run.ts +75 -0
  348. package/src/interactive/worker-progress.ts +440 -0
  349. package/src/interactive/worker-share.ts +56 -1
  350. package/src/interactive/worker-stream.ts +58 -110
  351. package/src/tools/agent-tools.ts +28 -3
  352. package/src/tools/ask-user.ts +21 -1
  353. package/src/tools/bootstrap.ts +3 -0
  354. package/src/tools/compete-worktrees.ts +13 -79
  355. package/src/tools/context/index.ts +2 -2
  356. package/src/tools/dispatch-admission.ts +242 -8
  357. package/src/tools/dispatch-arguments.ts +65 -1
  358. package/src/tools/dispatch-event-text.ts +19 -0
  359. package/src/tools/dispatch-plan.ts +136 -6
  360. package/src/tools/dispatch-runner.ts +319 -13
  361. package/src/tools/dispatch-types.ts +20 -1
  362. package/src/tools/dispatch.ts +96 -3
  363. package/src/tools/monitor.ts +31 -0
  364. package/src/tools/profiles.ts +18 -4
  365. package/src/tools/registry.ts +15 -5
  366. package/src/tools/result-disposition.ts +156 -0
  367. package/src/tools/result-shaping.ts +59 -1
  368. package/src/tools/task-worktree.ts +238 -0
  369. package/src/tools/verify/authoring.ts +116 -55
  370. package/src/tools/verify/scripts.ts +62 -0
  371. package/src/tools/worker-evidence.ts +21 -1
  372. package/src/worker/spec-contract.ts +44 -3
  373. package/dist/chunk-EFADSJET.js +0 -18
  374. package/dist/chunk-HC4CLZ2Y.js +0 -68
  375. package/dist/memory-4ALKDJ4Q.js +0 -246
  376. package/src/domains/eval/metrics/chaos-stream.ts +0 -93
@@ -2,140 +2,144 @@ import { createRequire as __clioCreateRequire } from "node:module"; const requir
2
2
  import {
3
3
  SchedulingDomainModule,
4
4
  createPromptsDomainModule
5
- } from "./chunk-3HZ5RWN2.js";
5
+ } from "./chunk-EBEFWSGL.js";
6
6
  import {
7
- AgentsDomainModule,
8
7
  SafetyDomainModule
9
- } from "./chunk-X6COSD2O.js";
8
+ } from "./chunk-J7PIKKWC.js";
10
9
  import {
11
10
  LifecycleDomainModule
12
- } from "./chunk-K6WL7QZT.js";
11
+ } from "./chunk-JTSEDYVQ.js";
13
12
  import {
14
13
  ensureClioState
15
- } from "./chunk-VAWWTKDP.js";
14
+ } from "./chunk-3HAPLH5M.js";
16
15
  import {
17
16
  ConfigDomainModule,
18
17
  loadDomains
19
- } from "./chunk-KRPY7NTG.js";
18
+ } from "./chunk-BMWK7ZIZ.js";
20
19
  import {
21
20
  ObservabilityDomainModule
22
- } from "./chunk-35MKKU5R.js";
23
- import "./chunk-HC4CLZ2Y.js";
21
+ } from "./chunk-5UJ6ECTS.js";
22
+ import "./chunk-GWS3VEIW.js";
24
23
  import "./chunk-HFSBBKSQ.js";
25
- import "./chunk-E25LMLRW.js";
24
+ import "./chunk-YD734TPH.js";
26
25
  import {
27
26
  ContextDomainModule
28
- } from "./chunk-UZHIZC5S.js";
27
+ } from "./chunk-4DWFMQDR.js";
28
+ import "./chunk-LCGCVYZ4.js";
29
29
  import "./chunk-5WIGXA4T.js";
30
- import "./chunk-BRXQQJFP.js";
30
+ import "./chunk-6M7VS3J3.js";
31
31
  import {
32
32
  DispatchDomainModule,
33
- WRITE_BOUNDARY_VIOLATION_REASON,
34
33
  capacityDrain,
35
- codeStepDir,
36
- compileFleetExecutionPlan,
37
- createWriteBoundaryEnforcer,
38
- decideReviewGate,
39
- executePlan,
40
- executionPlanAncestors,
41
- materializePendingGateDecision,
34
+ executeFleetRun,
42
35
  openLedger,
43
- preflightWriteBoundaries,
44
- runCodeStep,
45
- setCapacityDraining,
46
- stagePendingGateDecision,
47
- writeCodeStepRecord
48
- } from "./chunk-QQL5RT5M.js";
36
+ planFleetResume,
37
+ readFleetRun,
38
+ setCapacityDraining
39
+ } from "./chunk-UUANF5CR.js";
49
40
  import {
50
41
  SessionDomainModule
51
- } from "./chunk-QQK64KLB.js";
42
+ } from "./chunk-6TUKSZVF.js";
52
43
  import {
53
- FLEET_COMMANDS_REMEDY,
54
- FLEET_COMMANDS_REPO_PATH,
55
- FleetCommandRegistryMissingError,
56
- listFleetContracts,
57
- loadFleetCommands,
58
- loadFleetContract,
59
- renderFleetPrompt
60
- } from "./chunk-QKMUKYO7.js";
44
+ WRITE_BOUNDARY_VIOLATION_REASON,
45
+ preflightWriteBoundaries
46
+ } from "./chunk-KZ2H5X4G.js";
61
47
  import {
62
- RUN_RECEIPT_INTEGRITY_ALGORITHM,
63
- RUN_RECEIPT_INTEGRITY_VERSION,
64
- verifyReceiptIntegrity
65
- } from "./chunk-3JLKSKD7.js";
66
- import "./chunk-34475P3I.js";
48
+ compileFleetExecutionPlan
49
+ } from "./chunk-M4AKACEO.js";
50
+ import "./chunk-RVG5JXAL.js";
51
+ import "./chunk-ZGH7FGS5.js";
52
+ import "./chunk-TSHXZTOQ.js";
67
53
  import "./chunk-TXOTCRLG.js";
68
- import "./chunk-G4BMMOKF.js";
69
- import "./chunk-X4RCMKVQ.js";
54
+ import "./chunk-HVDIIIQW.js";
55
+ import "./chunk-NDINPTJ4.js";
70
56
  import "./chunk-MVVUPGPW.js";
71
57
  import {
72
58
  ResourcesDomainModule
73
- } from "./chunk-MFFY33HR.js";
74
- import "./chunk-4BPJXDWC.js";
59
+ } from "./chunk-THKY7CD7.js";
60
+ import {
61
+ AgentsDomainModule
62
+ } from "./chunk-UVDSQ6LW.js";
63
+ import "./chunk-DR52UMZW.js";
64
+ import "./chunk-C4JBQ5SR.js";
75
65
  import "./chunk-2SFS6XQE.js";
76
66
  import "./chunk-ZWLZP4ZT.js";
77
67
  import "./chunk-W6GROXXM.js";
68
+ import {
69
+ FLEET_COMMANDS_REMEDY,
70
+ FLEET_COMMANDS_REPO_PATH,
71
+ FleetCommandRegistryMissingError,
72
+ listFleetContracts,
73
+ loadFleetCommands,
74
+ loadFleetContract,
75
+ renderFleetPrompt
76
+ } from "./chunk-KCMKRQX4.js";
78
77
  import {
79
78
  MiddlewareDomainModule
80
- } from "./chunk-2LZI5CAG.js";
79
+ } from "./chunk-XEGB6BCN.js";
81
80
  import "./chunk-IR4CFBFN.js";
82
81
  import "./chunk-UOV2BYIW.js";
83
- import "./chunk-2TZWSW76.js";
84
- import "./chunk-ZYKPLLNQ.js";
85
- import "./chunk-WPQLXFOZ.js";
82
+ import "./chunk-WHGPSPT5.js";
86
83
  import {
87
- resultContractAuthorship
88
- } from "./chunk-7RXG6QRZ.js";
84
+ formatBudgetPolicy,
85
+ formatBudgetReasons,
86
+ formatBudgetRequest,
87
+ formatEffectiveBudget
88
+ } from "./chunk-CEYBNUGC.js";
89
+ import "./chunk-5FR74PWO.js";
90
+ import "./chunk-OBMAI2DP.js";
91
+ import "./chunk-5C77SEEY.js";
89
92
  import {
90
93
  agentRoleFactsResolver,
91
- gateRouteCorrelation,
92
94
  requestExecutionRole,
93
95
  withAttemptRole
94
- } from "./chunk-22NAGB7X.js";
95
- import "./chunk-AOCYTWAV.js";
96
- import "./chunk-MV3K5QF2.js";
96
+ } from "./chunk-UND3GU2L.js";
97
97
  import "./chunk-CMZWFGD2.js";
98
98
  import "./chunk-I4HZDVNP.js";
99
- import "./chunk-FYYLNIL5.js";
100
- import "./chunk-UL3WSD3F.js";
99
+ import "./chunk-GH5622CP.js";
101
100
  import "./chunk-VG7TBQIY.js";
102
101
  import "./chunk-OQE5J4C6.js";
103
- import "./chunk-ECH6PKUQ.js";
104
- import "./chunk-BEY543CS.js";
105
- import "./chunk-5M54SPOL.js";
102
+ import "./chunk-GOXNB3AO.js";
103
+ import "./chunk-HWUFFB6L.js";
104
+ import "./chunk-DJNLUABN.js";
105
+ import "./chunk-AOCYTWAV.js";
106
+ import "./chunk-MV3K5QF2.js";
107
+ import "./chunk-UL3WSD3F.js";
108
+ import "./chunk-ODFEOB4F.js";
106
109
  import "./chunk-OZNBF4L3.js";
107
110
  import "./chunk-4BJ5BYCE.js";
111
+ import "./chunk-ECH6PKUQ.js";
108
112
  import "./chunk-6XLNIQDB.js";
109
113
  import "./chunk-5B2AEOW5.js";
110
114
  import "./chunk-CGKSTWHD.js";
111
- import "./chunk-POHLU5DW.js";
112
- import "./chunk-YHZX5GEU.js";
113
- import "./chunk-VJWL6YS5.js";
115
+ import "./chunk-M6L6IDJG.js";
116
+ import "./chunk-XAKHZX5N.js";
117
+ import "./chunk-UUVG37B4.js";
114
118
  import "./chunk-LBMZMYH2.js";
115
- import "./chunk-EKMEHE4H.js";
119
+ import "./chunk-33YXPOE3.js";
116
120
  import "./chunk-XPLRXC72.js";
117
- import "./chunk-RD5U66HV.js";
118
- import "./chunk-KOHPCX4K.js";
121
+ import "./chunk-SROCI7ZU.js";
122
+ import "./chunk-DOOEX22V.js";
119
123
  import {
120
124
  ProvidersDomainModule
121
- } from "./chunk-QWU7ZBO7.js";
125
+ } from "./chunk-VQNODYQ4.js";
122
126
  import "./chunk-CFGTUFWB.js";
123
- import "./chunk-AD2SYQYC.js";
124
- import "./chunk-4OC57DA6.js";
125
- import "./chunk-LL4KHSZI.js";
126
- import "./chunk-4VP4KH3K.js";
127
- import {
128
- attributeCommitMessage
129
- } from "./chunk-VEZEGCGW.js";
130
- import "./chunk-FQ4SKYE4.js";
131
- import "./chunk-IKCO5N3L.js";
132
- import "./chunk-3I7MS7N2.js";
127
+ import "./chunk-JRIO5UD2.js";
133
128
  import "./chunk-IHXBNWMM.js";
134
- import "./chunk-BPGS2WCQ.js";
129
+ import "./chunk-GEYXPTRF.js";
130
+ import {
131
+ readSettings
132
+ } from "./chunk-UHXRNZ2J.js";
133
+ import "./chunk-4DGYLA73.js";
134
+ import "./chunk-LL4KHSZI.js";
135
135
  import "./chunk-SST6Z5JA.js";
136
136
  import "./chunk-FO5ZOVUY.js";
137
137
  import "./chunk-R346GLFC.js";
138
+ import "./chunk-D4MDIG46.js";
139
+ import "./chunk-FQ4SKYE4.js";
138
140
  import "./chunk-4ZG3XFUR.js";
141
+ import "./chunk-IKCO5N3L.js";
142
+ import "./chunk-3I7MS7N2.js";
139
143
  import "./chunk-FCSXB6T2.js";
140
144
  import "./chunk-APJ265NV.js";
141
145
  import "./chunk-YXLYO42X.js";
@@ -144,9 +148,9 @@ import {
144
148
  } from "./chunk-BNAZZHFG.js";
145
149
  import "./chunk-6EJMN2Y3.js";
146
150
  import "./chunk-WEPFGWHJ.js";
147
- import "./chunk-HXG4IURW.js";
151
+ import "./chunk-X2KV5FXT.js";
148
152
  import "./chunk-ZGVHUX3M.js";
149
- import "./chunk-TTNYS3EA.js";
153
+ import "./chunk-OB5HIGJY.js";
150
154
  import "./chunk-JVCV3ICN.js";
151
155
  import "./chunk-7CR24IG7.js";
152
156
  import "./chunk-IWHMRKLL.js";
@@ -159,48 +163,18 @@ init_esm_shims();
159
163
  import { randomBytes } from "node:crypto";
160
164
  import { readFileSync } from "node:fs";
161
165
  import { join } from "node:path";
162
-
163
- // src/domains/dispatch/fleet-commit-attribution.ts
164
- init_esm_shims();
165
- function deriveFleetCommitAttribution(input) {
166
- const byId = new Map(input.plan.steps.map((step) => [step.id, step]));
167
- let materiallyAuthored = false;
168
- let receipt;
169
- for (const candidate of input.step.commitFrom ?? []) {
170
- const source = byId.get(candidate);
171
- const result = input.priorResults.get(candidate);
172
- if (source?.kind !== "agent" || source.scope !== "workspace" || result?.succeeded !== true || result.integrityValid !== true) {
173
- continue;
174
- }
175
- materiallyAuthored = true;
176
- if (/^[0-9a-f]{64}$/u.test(result.receiptDigest)) {
177
- receipt = {
178
- version: RUN_RECEIPT_INTEGRITY_VERSION,
179
- algorithm: RUN_RECEIPT_INTEGRITY_ALGORITHM,
180
- digest: result.receiptDigest,
181
- integrityValid: true,
182
- directlyRelevant: true
183
- };
184
- }
185
- break;
186
- }
187
- return {
188
- materiallyAssisted: materiallyAuthored,
189
- materiallyAuthored,
190
- validationSucceeded: input.validationFresh,
191
- independentReviewPassed: input.independentReviewFresh,
192
- ...receipt === void 0 ? {} : { receipt }
193
- };
194
- }
195
-
196
- // src/cli/fleet.ts
197
166
  var HELP = `clio-coder fleet <subcommand>
198
167
 
199
168
  Repo-owned fleet contracts and the dispatch status surface.
200
169
 
201
170
  Subcommands:
202
171
  list list .clio-coder/fleets/*.md contracts with validation status
172
+ new <name> --from <builtin> copy build-review, build-test, or sdlc into this repository
173
+ validate <name> [--json] run the fleet execution preflight without side effects
174
+ graph <name> [--json] print compiled waves, loops, scopes, and write boundaries
175
+ commands init draft a commented command registry from declared project entries
203
176
  run <name> [--var k=v ...] preflight and execute a fleet contract
177
+ [--resume <runId>] replay a completed prefix from a prior run of the same plan
204
178
  [--json] emit step receipts as JSON
205
179
  status [--json] show running, retrying, and total dispatch state
206
180
  drain [--json] deny new execution starts for up to one hour
@@ -218,6 +192,11 @@ function fail(message) {
218
192
  `);
219
193
  return 2;
220
194
  }
195
+ function refuse(message) {
196
+ process.stderr.write(`clio-coder fleet: ${message}
197
+ `);
198
+ return 1;
199
+ }
221
200
  function parseVars(args) {
222
201
  const vars = {};
223
202
  const rest = [];
@@ -240,28 +219,15 @@ function parseVars(args) {
240
219
  }
241
220
  return { vars, rest };
242
221
  }
243
- function fleetGateCorrelation(subject, decider) {
244
- const facts = (receipt) => ({
245
- agentId: receipt.agentId,
246
- targetId: receipt.targetId,
247
- wireModelId: receipt.wireModelId,
248
- runtimeId: receipt.runtimeId,
249
- nodeId: receipt.node?.id ?? "local"
250
- });
251
- const { agent, target, modelFamily, runtime, node, independent } = gateRouteCorrelation(
252
- facts(subject),
253
- facts(decider)
254
- );
255
- return { agent, target, modelFamily, runtime, node, independent };
256
- }
257
- var NO_WORKER_RESERVATION = "fleet-no-worker-reservation";
258
222
  function newFleetRootId() {
259
223
  return `fleet-${randomBytes(6).toString("hex")}`;
260
224
  }
261
225
  function renderStep(step) {
262
226
  if (step.kind === "code") return `code:${step.command}[${step.scope}]`;
263
227
  if (step.kind === "agent") return `${step.agent}[${step.scope}]`;
264
- const check = step.check.kind === "code" ? `code:${step.check.command}` : step.check.agent;
228
+ if (step.kind === "gate") return `gate:${step.path}[${step.run}]`;
229
+ if (step.kind === "plan") return `plan:${step.agent}[${step.roster.join(",")}; max ${step.maxTasks}]`;
230
+ const check = step.check.kind === "code" ? `code:${step.check.command}` : step.check.kind === "gate" ? `gate:${step.check.gate}` : step.check.agent;
265
231
  return `loop:${step.id}(${check} -> ${step.repair.agent} x${step.maxAttempts})`;
266
232
  }
267
233
  function listingLine(entry, state, detail) {
@@ -302,7 +268,11 @@ function contractAgents(contract) {
302
268
  const agents = [];
303
269
  for (const step of contract.steps) {
304
270
  if (step.kind === "agent") agents.push({ id: step.id, agent: step.agent, scope: step.scope });
305
- else if (step.kind === "loop") {
271
+ else if (step.kind === "gate") agents.push({ id: step.id, agent: step.agent, scope: "workspace" });
272
+ else if (step.kind === "plan") {
273
+ agents.push({ id: step.id, agent: step.agent, scope: step.scope });
274
+ for (const agent of step.roster) agents.push({ id: `${step.id}.roster`, agent, scope: "readonly" });
275
+ } else if (step.kind === "loop") {
306
276
  if (step.check.kind === "agent") {
307
277
  agents.push({ id: `${step.id}.check`, agent: step.check.agent, scope: step.check.scope });
308
278
  }
@@ -312,6 +282,28 @@ function contractAgents(contract) {
312
282
  return agents;
313
283
  }
314
284
  function preflightFleet(contract, deps) {
285
+ const targets = new Set(deps.settings.targets.map((target) => target.id));
286
+ const profiles = new Set(Object.keys(deps.settings.workers?.profiles ?? {}));
287
+ const checkRoute = (id, route) => {
288
+ if (route.target !== void 0 && !targets.has(route.target))
289
+ return `unknown target '${route.target}' at step '${id}'`;
290
+ if (route.profile !== void 0 && !profiles.has(route.profile))
291
+ return `unknown profile '${route.profile}' at step '${id}'`;
292
+ return null;
293
+ };
294
+ for (const step of contract.steps) {
295
+ if (step.kind === "agent" || step.kind === "gate" || step.kind === "plan") {
296
+ const error2 = checkRoute(step.id, step);
297
+ if (error2 !== null) return error2;
298
+ }
299
+ if (step.kind !== "loop") continue;
300
+ if (step.check.kind === "agent") {
301
+ const error2 = checkRoute(`${step.id}.check`, step.check);
302
+ if (error2 !== null) return error2;
303
+ }
304
+ const error = checkRoute(`${step.id}.repair`, step.repair);
305
+ if (error !== null) return error;
306
+ }
315
307
  for (const step of contractAgents(contract)) {
316
308
  if (!deps.agents.get(step.agent)) {
317
309
  return `unknown agent '${step.agent}' (step '${step.id}' must name a recipe from 'clio-coder agents')`;
@@ -339,8 +331,12 @@ async function runFleet(args) {
339
331
  const { vars, rest, error } = parseVars(args);
340
332
  if (error !== void 0) return fail(error);
341
333
  const json = rest.includes("--json");
334
+ const resumeIndex = rest.indexOf("--resume");
335
+ const resumeId = resumeIndex === -1 ? void 0 : rest[resumeIndex + 1];
336
+ if (resumeIndex !== -1 && (resumeId === void 0 || resumeId.startsWith("-")))
337
+ return fail("--resume requires a run id");
342
338
  const name = rest.find((arg) => !arg.startsWith("-"));
343
- if (!name) return fail("usage: clio-coder fleet run <name> [--var key=value ...] [--json]");
339
+ if (!name) return fail("usage: clio-coder fleet run <name> [--var key=value ...] [--resume <runId>] [--json]");
344
340
  let contract;
345
341
  let prompt;
346
342
  let commands;
@@ -383,13 +379,17 @@ async function runFleet(args) {
383
379
  return fail("required domains unavailable (dispatch/agents/safety)");
384
380
  }
385
381
  const roleFacts = agentRoleFactsResolver((id) => agents.getSpec(id));
386
- const preflightError = preflightFleet(contract, { agents, safety, scheduling });
382
+ const preflightError = preflightFleet(contract, {
383
+ agents,
384
+ safety,
385
+ scheduling,
386
+ settings: config?.get() ?? readSettings()
387
+ });
387
388
  if (preflightError !== null) {
388
389
  await loaded.stop();
389
390
  return fail(`preflight failed: ${preflightError}`);
390
391
  }
391
392
  const fleetRootId = newFleetRootId();
392
- let planOutcome;
393
393
  let plan;
394
394
  try {
395
395
  plan = compileFleetExecutionPlan({
@@ -408,9 +408,7 @@ async function runFleet(args) {
408
408
  return {
409
409
  requestedAuthority: spec.capabilityClass,
410
410
  approvedAuthority: spec.capabilityClass,
411
- // A gate decider answers the coordinator's question, so its
412
- // postcondition is the gate result contract, not its recipe's.
413
- expectedResultContract: context.gateRole === "reviewer" ? "verifier-report" : spec.resultContract.kind,
411
+ expectedResultContract: context.planRole === true ? "delegation-plan" : context.gateAuthorRole === true ? "artifact-report" : context.gateRole === "reviewer" ? "verifier-report" : spec.resultContract.kind,
414
412
  executionRole: withAttemptRole(requestRole, context.attempt)
415
413
  };
416
414
  }
@@ -425,233 +423,96 @@ async function runFleet(args) {
425
423
  await loaded.stop();
426
424
  return fail(`preflight failed: ${err instanceof Error ? err.message : String(err)}`);
427
425
  }
428
- const boundaryByStep = new Map(plan.steps.map((step) => [step.id, step.writes]));
429
- const boundaryEnforcer = createWriteBoundaryEnforcer({
430
- root: process.cwd(),
431
- rootId: fleetRootId,
432
- boundaryFor: (stepId) => boundaryByStep.get(stepId),
433
- onVerdict(verdict, path) {
434
- if (verdict.reason === null) return;
435
- process.stderr.write(`write boundary ${verdict.window}: ${verdict.detail ?? verdict.reason} record=${path}
426
+ let resume;
427
+ if (resumeId !== void 0) {
428
+ const record = readFleetRun(resumeId);
429
+ if (record === null) {
430
+ await loaded.stop();
431
+ return refuse(`resume run '${resumeId}' was not found in the durable fleet ledger`);
432
+ }
433
+ const planned = planFleetResume(record, plan, contract, vars);
434
+ if (!planned.ok) {
435
+ if (planned.reason === "fleet-name") {
436
+ await loaded.stop();
437
+ return refuse(`resume run '${resumeId}' belongs to fleet '${planned.priorFleet}', not '${planned.currentFleet}'`);
438
+ }
439
+ if (planned.reason === "vars") {
440
+ await loaded.stop();
441
+ return refuse(`resume run '${resumeId}' used different --var values`);
442
+ }
443
+ process.stderr.write(
444
+ `clio-coder fleet: resume plan hash differs: prior=${planned.priorHash} current=${planned.currentHash}
445
+ `
446
+ );
447
+ for (const entry of planned.diff) {
448
+ process.stderr.write(` step ${entry.index + 1}: ${entry.priorId} -> ${entry.currentId}
449
+ `);
450
+ process.stderr.write(` prior: ${JSON.stringify(entry.prior)}
436
451
  `);
452
+ process.stderr.write(` current: ${JSON.stringify(entry.current)}
453
+ `);
454
+ }
455
+ await loaded.stop();
456
+ return 1;
437
457
  }
438
- });
458
+ resume = { record, replayed: planned.replayed };
459
+ }
439
460
  process.stderr.write(
440
461
  `fleet ${contract.name}: root=${fleetRootId} plan=${plan.hash} steps=${plan.steps.length} loops=${plan.loops.length}
441
462
  `
442
463
  );
443
- const receipts = [];
444
- const receiptsByStep = /* @__PURE__ */ new Map();
445
- const planStep = (stepId) => plan.steps.find((entry) => entry.id === stepId);
446
- const attributionEnabled = config?.get().attribution.gitCommits ?? true;
447
- let validationFresh = false;
448
- let independentReviewFresh = false;
449
- const commitMessageFor = (step, priorResults) => {
450
- for (const candidate of step.commitFrom ?? []) {
451
- const source = planStep(candidate);
452
- const result = priorResults.get(candidate);
453
- if (source === void 0 || source.kind !== "agent" || result === void 0) continue;
454
- const resultContract = agents.getSpec(source.agentId)?.resultContract ?? null;
455
- if (resultContract === null) continue;
456
- const authored = resultContractAuthorship(resultContract, result.output);
457
- if (authored.commitMessage !== null) return authored.commitMessage;
458
- if (authored.summary !== null) return `clio(${fleetRootId}): ${authored.summary}`;
459
- }
460
- return `clio(${fleetRootId}): ${contract.name} ${step.id}`;
461
- };
464
+ let outcome;
462
465
  try {
463
- planOutcome = await executePlan(plan, {
464
- preflight(step) {
465
- const request = {
466
- agentId: step.agentId,
467
- executionRole: step.executionRole,
468
- task: step.task,
469
- requestOrigin: "user",
470
- lineage: { parentRunId: fleetRootId, rootRunId: fleetRootId, attempt: 0, depth: 1 },
471
- ...step.scope === "readonly" ? { autonomy: "read-only" } : {}
472
- };
473
- const resolution = dispatch.preview?.(request);
474
- if (!resolution) throw new Error(`fleet preflight cannot resolve step '${step.id}'`);
475
- return { step, costUpperBoundUsd: resolution.costUpperBoundUsd, nodeId: resolution.node.id };
476
- },
477
- reserve(_plan, admissions) {
478
- if (admissions.length === 0) return { ownerId: NO_WORKER_RESERVATION };
479
- const reservation = dispatch.reservations?.prepare({
480
- topology: "parallel",
481
- tasks: admissions.map((admission) => ({
482
- memberId: admission.step.id,
483
- wave: plan.waves.findIndex((wave) => wave.includes(admission.step.id)),
484
- resolution: dispatch.preview?.({
485
- agentId: admission.step.agentId,
486
- executionRole: admission.step.executionRole,
487
- task: admission.step.task
488
- })
489
- }))
490
- });
491
- if (!reservation) throw new Error("fleet whole-plan reservation is unavailable");
492
- return { ownerId: reservation.ownerId };
493
- },
494
- async run(step, handoffs, reservation, ledger) {
495
- const attempt = step.loop?.role === "repair" ? step.loop.attempt : 0;
496
- const request = {
497
- agentId: step.agentId,
498
- executionRole: step.executionRole,
499
- task: step.task,
500
- predecessorHandoffs: handoffs,
501
- requestOrigin: "user",
502
- lineage: { parentRunId: fleetRootId, rootRunId: fleetRootId, attempt, depth: 1 },
503
- reservation,
504
- ...ledger !== void 0 ? { ledger } : {},
505
- ...step.loop?.role === "check" ? {
506
- gate: {
507
- role: "reviewer",
508
- group: `${fleetRootId}:${step.loop.loopId}`,
509
- cycle: step.loop.attempt,
510
- subjects: handoffs.map((handoff) => ({
511
- runId: handoff.terminalRunId,
512
- digest: handoff.receiptDigest
513
- }))
514
- }
515
- } : {},
516
- ...step.scope === "readonly" ? { autonomy: "read-only" } : {}
517
- };
518
- const handle = await dispatch.dispatch(request);
519
- void (async () => {
520
- for await (const _event of handle.events) {
521
- }
522
- })().catch(() => {
523
- });
524
- return {
525
- assignmentId: handle.runId,
526
- result: handle.finalPromise.then((receipt) => {
527
- if (step.scope === "workspace") {
528
- validationFresh = false;
529
- independentReviewFresh = false;
530
- }
531
- receipts.push(receipt);
532
- receiptsByStep.set(step.id, receipt);
533
- const envelope = dispatch.getRun(receipt.runId);
534
- const integrityValid = envelope !== null && verifyReceiptIntegrity(receipt, envelope).ok;
535
- const succeeded = receipt.exitCode === 0 && (receipt.outcome === void 0 || receipt.outcome === "succeeded");
536
- if (json) process.stdout.write(`${JSON.stringify(receipt)}
537
- `);
538
- else
539
- process.stdout.write(
540
- `step ${step.id} ${step.agentId}: ${succeeded ? "succeeded" : "failed"} assignment=${handle.runId} terminal-run=${receipt.runId} cost=$${receipt.costUsd.toFixed(4)}
466
+ outcome = await executeFleetRun({
467
+ plan,
468
+ contractName: contract.name,
469
+ commands,
470
+ workspaceRoot: process.cwd(),
471
+ fleetRootId,
472
+ dispatch,
473
+ agents: { getSpec: (agentId) => agents.getSpec(agentId) },
474
+ attributionEnabled: config?.get().attribution.gitCommits ?? true,
475
+ vars,
476
+ ...resume !== void 0 ? { resume } : {},
477
+ onStepSettled(step) {
478
+ if (step.replayed === true && step.result !== void 0) {
479
+ if (json)
480
+ process.stdout.write(
481
+ `${JSON.stringify({ stepId: step.stepId, status: "replayed", receipt: { runId: step.result.terminalRunId, digest: step.result.receiptDigest } })}
541
482
  `
542
- );
543
- return {
544
- stepId: step.id,
545
- assignmentId: handle.runId,
546
- terminalRunId: receipt.runId,
547
- receiptDigest: receipt.integrity.digest,
548
- output: receipt.output?.state === "final" ? receipt.output.text : "",
549
- succeeded,
550
- integrityValid
551
- };
552
- })
553
- };
554
- },
555
- async runCode(step, _handoffs, signal, priorResults) {
556
- const command = commands?.commands.get(step.commandId);
557
- if (command === void 0) throw new Error(`fleet code step '${step.id}' has no registered command`);
558
- const isCommit = step.commitFrom !== void 0;
559
- const evidence = isCommit ? deriveFleetCommitAttribution({
560
- plan,
561
- step,
562
- priorResults,
563
- validationFresh,
564
- independentReviewFresh
565
- }) : null;
566
- if (!isCommit && step.scope === "workspace" && step.verification !== true) {
567
- validationFresh = false;
568
- independentReviewFresh = false;
483
+ );
484
+ else
485
+ process.stdout.write(
486
+ `step ${step.stepId}: replayed terminal-run=${step.result.terminalRunId} receipt=${step.result.receiptDigest}
487
+ `
488
+ );
489
+ return;
569
490
  }
570
- const originalMessage = isCommit ? commitMessageFor(step, priorResults) : null;
571
- const outcome = await runCodeStep({
572
- stepId: step.id,
573
- command,
574
- workspaceRoot: process.cwd(),
575
- artifactDir: codeStepDir(fleetRootId),
576
- signal,
577
- ...isCommit && evidence !== null && originalMessage !== null ? {
578
- substitutions: {
579
- commitMessage: attributeCommitMessage(originalMessage, evidence, attributionEnabled)
580
- },
581
- requireWorkspaceChanges: true,
582
- commitAttribution: { enabled: attributionEnabled, evidence }
583
- } : {}
584
- });
585
- if (step.verification === true) validationFresh = outcome.report.passed;
586
- const recordPath = await writeCodeStepRecord(fleetRootId, outcome.record);
587
- if (json) process.stdout.write(`${JSON.stringify({ codeStep: outcome.record })}
491
+ if (step.receipt !== void 0) {
492
+ if (json) process.stdout.write(`${JSON.stringify(step.receipt)}
588
493
  `);
589
- else
590
- process.stdout.write(
591
- `step ${step.id} code:${command.id}: ${outcome.report.passed ? "passed" : "failed"} exit=${outcome.report.exitCode} ${outcome.record.durationMs}ms record=${recordPath}
494
+ else
495
+ process.stdout.write(
496
+ `step ${step.stepId} ${step.agentId}: ${step.succeeded ? "succeeded" : "failed"}${step.failureReason !== void 0 ? ` reason=${step.failureReason}` : ""} assignment=${step.assignmentId} terminal-run=${step.terminalRunId} cost=$${step.costUsd.toFixed(4)}
592
497
  `
593
- );
594
- return {
595
- stepId: step.id,
596
- assignmentId: outcome.record.runId,
597
- terminalRunId: outcome.record.runId,
598
- receiptDigest: outcome.record.reportDigest,
599
- output: outcome.output,
600
- succeeded: outcome.report.passed,
601
- // The runner authored this report itself, so its provenance is
602
- // valid by construction; only the command's verdict can be red.
603
- integrityValid: true
604
- };
605
- },
606
- async decideLoop({ loop, step, attempt, terminalAttempt, result }) {
607
- const decider = receiptsByStep.get(step.id);
608
- const ancestors = executionPlanAncestors(plan, step.id);
609
- let subject;
610
- for (const [stepId, receipt] of receiptsByStep) {
611
- if (ancestors.has(stepId)) subject = receipt;
498
+ );
499
+ return;
612
500
  }
613
- if (decider === void 0 || subject === void 0) {
614
- return {
615
- resolved: false,
616
- findings: null,
617
- needsDecision: `loop '${loop.id}' cycle ${attempt} has no sealed reviewer or subject receipt`
618
- };
619
- }
620
- const correlation = fleetGateCorrelation(subject, decider);
621
- const decided = decideReviewGate({
622
- group: `${fleetRootId}:${loop.id}`,
623
- cycle: attempt,
624
- terminalCycle: terminalAttempt,
625
- subjects: [{ runId: subject.runId, digest: subject.integrity.digest }],
626
- decider: { runId: decider.runId, digest: decider.integrity.digest },
627
- correlation,
628
- output: result.output
629
- });
630
- independentReviewFresh = decided.verdict === "pass" && correlation.independent;
631
- const staged = stagePendingGateDecision(decided.draft);
632
- const { path: decisionPath } = materializePendingGateDecision(staged);
633
- if (!json) {
634
- process.stdout.write(
635
- `loop ${loop.id} cycle ${attempt}: ${decided.draft.outcome}${decided.draft.detail === void 0 ? "" : ` (${decided.draft.detail})`} decision=${decisionPath}
501
+ if (step.codeStep !== void 0) {
502
+ if (json) process.stdout.write(`${JSON.stringify({ codeStep: step.codeStep })}
503
+ `);
504
+ else
505
+ process.stdout.write(
506
+ `step ${step.stepId} code:${step.commandId}: ${step.succeeded ? "passed" : "failed"} exit=${step.codeStep.exitCode} ${step.codeStep.durationMs}ms record=${step.recordPath}
636
507
  `
637
- );
508
+ );
638
509
  }
639
- return {
640
- resolved: decided.verdict === "pass",
641
- findings: decided.findings,
642
- needsDecision: decided.needsDecision
643
- };
644
- },
645
- beginWriteBoundary: (window, stepIds) => boundaryEnforcer.begin(window, stepIds),
646
- verifyWriteBoundary: (window, stepIds) => boundaryEnforcer.verify(window, stepIds),
647
- cancel: (assignmentId) => dispatch.abort(assignmentId),
648
- release: (ownerId) => {
649
- if (ownerId === NO_WORKER_RESERVATION) return;
650
- dispatch.reservations?.rollbackUnconsumed(ownerId);
651
510
  },
652
- releaseUnconsumed: (ownerId) => {
653
- if (ownerId === NO_WORKER_RESERVATION) return;
654
- dispatch.reservations?.rollbackUnconsumed(ownerId);
511
+ onNotice(text, kind) {
512
+ if (kind === "write-boundary") process.stderr.write(`${text}
513
+ `);
514
+ else if (kind === "gate" && !json) process.stdout.write(`${text}
515
+ `);
655
516
  }
656
517
  });
657
518
  } catch (err) {
@@ -661,53 +522,45 @@ async function runFleet(args) {
661
522
  }
662
523
  await dispatch.drain();
663
524
  await loaded.stop();
664
- const required = plan.steps.filter((step) => step.loop === void 0 && !planOutcome.unneeded.includes(step.id));
665
- const failedLoops = planOutcome.loops.filter((loop) => !loop.resolved);
666
- const succeededSteps = required.filter((step) => planOutcome.results.get(step.id)?.succeeded === true).length;
667
- const resolvedLoops = planOutcome.loops.length - failedLoops.length;
668
525
  if (json) {
669
526
  process.stdout.write(
670
527
  `${JSON.stringify({
671
528
  fleet: contract.name,
672
529
  rootId: fleetRootId,
673
530
  planHash: plan.hash,
674
- loops: planOutcome.loops,
675
- revalidated: planOutcome.revalidated,
676
- unneeded: planOutcome.unneeded,
677
- skipped: planOutcome.skipped,
678
- needsDecision: planOutcome.needsDecision,
679
- writeBoundaries: planOutcome.writeBoundaries
531
+ loops: outcome.result.loops,
532
+ revalidated: outcome.result.revalidated,
533
+ unneeded: outcome.result.unneeded,
534
+ skipped: outcome.result.skipped,
535
+ needsDecision: outcome.result.needsDecision,
536
+ writeBoundaries: outcome.result.writeBoundaries
680
537
  })}
681
538
  `
682
539
  );
683
540
  } else {
684
- const spentUsd = receipts.reduce((sum, receipt) => sum + receipt.costUsd, 0);
685
541
  process.stdout.write(
686
- `fleet ${contract.name}: ${succeededSteps}/${required.length} steps succeeded, ${resolvedLoops}/${planOutcome.loops.length} loops resolved, total cost $${spentUsd.toFixed(4)}
542
+ `fleet ${contract.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, ${outcome.resolvedLoopCount}/${outcome.result.loops.length} loops resolved, total cost $${outcome.totalCostUsd.toFixed(4)}
687
543
  `
688
544
  );
689
- for (const loop of planOutcome.loops) {
545
+ for (const loop of outcome.result.loops)
690
546
  process.stdout.write(
691
547
  ` loop ${loop.loopId}: ${loop.reason} after ${loop.attempts} verification(s) and ${loop.repairs} repair(s)
692
548
  `
693
549
  );
694
- }
695
- if (planOutcome.revalidated.length > 0) {
550
+ if (outcome.result.revalidated.length > 0)
696
551
  process.stdout.write(
697
- ` staleness: re-ran ${planOutcome.revalidated.join(", ")} because a workspace step landed after the last green
552
+ ` staleness: re-ran ${outcome.result.revalidated.join(", ")} because a workspace step landed after the last green
698
553
  `
699
554
  );
700
- }
701
- for (const message of planOutcome.needsDecision) process.stdout.write(` needs operator decision: ${message}
555
+ for (const message of outcome.result.needsDecision) process.stdout.write(` needs operator decision: ${message}
702
556
  `);
703
- for (const boundary of planOutcome.writeBoundaries) {
557
+ for (const boundary of outcome.result.writeBoundaries) {
704
558
  if (!boundary.violated) continue;
705
559
  process.stdout.write(` write boundary ${boundary.window}: ${boundary.detail ?? WRITE_BOUNDARY_VIOLATION_REASON}
706
560
  `);
707
561
  }
708
562
  }
709
- const cleanRun = failedLoops.length === 0 && planOutcome.skipped.length === 0 && required.every((step) => planOutcome.results.get(step.id)?.succeeded === true);
710
- return cleanRun ? 0 : 1;
563
+ return outcome.cleanRun ? 0 : 1;
711
564
  }
712
565
  function isProcessAlive(pid) {
713
566
  if (pid === null || !Number.isFinite(pid) || pid <= 0) return false;
@@ -757,6 +610,7 @@ function statusSnapshot() {
757
610
  return {
758
611
  runId: row.id,
759
612
  agentId: row.agentId,
613
+ budget: row.budget ?? null,
760
614
  runtimeKind: row.runtimeKind,
761
615
  outcomePhase: row.status,
762
616
  heartbeat: rowHeartbeat(row),
@@ -814,6 +668,17 @@ function runStatus(args) {
814
668
  ` ${row.runId} ${row.agentId} node=${row.node} ${row.heartbeat} attempt=${lineage.attempt} depth=${lineage.depth} ${Math.round(row.elapsedMs / 1e3)}s $${row.costUsd.toFixed(4)}
815
669
  `
816
670
  );
671
+ const budget = row.budget;
672
+ if (budget !== null) {
673
+ process.stdout.write(` recipe policy: ${formatBudgetPolicy(budget)}
674
+ `);
675
+ process.stdout.write(` requested envelope: ${formatBudgetRequest(budget)}
676
+ `);
677
+ process.stdout.write(` effective envelope: ${formatEffectiveBudget(budget)}
678
+ `);
679
+ process.stdout.write(` clamp or escalation reason: ${formatBudgetReasons(budget)}
680
+ `);
681
+ }
817
682
  }
818
683
  }
819
684
  if (snapshot.retrying.length === 0) {
@@ -865,6 +730,14 @@ async function runFleetCommand(args) {
865
730
  switch (sub) {
866
731
  case "list":
867
732
  return runList(args.slice(1));
733
+ case "new":
734
+ return (await import("./fleet-new-RDVJLHHH.js")).runFleetNew(args.slice(1));
735
+ case "validate":
736
+ return (await import("./fleet-validate-BIYREGIK.js")).runFleetValidate(args.slice(1));
737
+ case "graph":
738
+ return (await import("./fleet-graph-Y6HPXIVF.js")).runFleetGraph(args.slice(1));
739
+ case "commands":
740
+ return (await import("./fleet-commands-ZFIWZSB3.js")).runFleetCommands(args.slice(1));
868
741
  case "run":
869
742
  return runFleet(args.slice(1));
870
743
  case "status":
@@ -884,4 +757,4 @@ export {
884
757
  runFleetCommand,
885
758
  statusSnapshot
886
759
  };
887
- //# sourceMappingURL=fleet-7XMJNQNF.js.map
760
+ //# sourceMappingURL=fleet-BDKYJFCP.js.map