@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
@@ -6,6 +6,7 @@ import type { ProtectedArtifactState } from "../safety/protected-artifacts.js";
6
6
  import type { AssignmentId, DispatchAssignment } from "./assignment.js";
7
7
  import type { DurableAssignmentRecord } from "./assignment-store.js";
8
8
  import type { DetachedBatchRecord, RegisterDetachedBatchInput } from "./batch-store.js";
9
+ import type { RunToolBudgetEnvelope } from "./budget-envelope.js";
9
10
  import type { ExecutionRole } from "./execution-role.js";
10
11
  import type { DispatchReservationRecord, ReservationTopology } from "./reservation-store.js";
11
12
  import type { ApprovedAssignmentRoute } from "./route-approval.js";
@@ -14,6 +15,30 @@ import type { RunEnvelope, RunLineage, RunNodeIdentity, RunPhaseDurations, RunRe
14
15
  import type { DispatchFailoverCandidate, JobSpec } from "./validation.js";
15
16
 
16
17
  export interface DispatchRequest extends JobSpec {
18
+ /** Coordinator-owned result contract override for a fleet plan step. */
19
+ resultContractOverride?: ResultContract;
20
+ /** Gate path whose post-run hash is sealed into this step's receipt. */
21
+ fleetGateReceipt?: { path: string };
22
+ /** Orchestrator-prepared task worktree state. Model arguments cannot author it. */
23
+ taskWorktree?: {
24
+ root: string;
25
+ runId: string;
26
+ path: string;
27
+ branch: string;
28
+ base: string;
29
+ ownerToken: string;
30
+ };
31
+ /** Run identity allocated before task worktree creation. Model arguments cannot author it. */
32
+ runIdHint?: string;
33
+ /** Parent checkout frozen by plan approval for task worktree application. */
34
+ taskWorktreeDestination?: string;
35
+ /** Admission-resolved commands. Model text never enters these argv vectors. */
36
+ resolvedVerification?: ReadonlyArray<{
37
+ check: string;
38
+ argv: ReadonlyArray<string>;
39
+ cwd: string;
40
+ timeoutMs: number;
41
+ }>;
17
42
  /**
18
43
  * Semantic role this request's first attempt runs under. Derived once by
19
44
  * `execution-role.ts` at request construction, never authored by a model, and
@@ -111,6 +136,7 @@ export interface DispatchSnapshot {
111
136
  outcomePhase: string;
112
137
  heartbeat: "alive" | "stale" | "dead" | "n/a";
113
138
  lineage: RunLineage;
139
+ budget?: RunToolBudgetEnvelope;
114
140
  startedAt: string;
115
141
  /** Execution-only elapsed time retained for runtime monitoring. */
116
142
  elapsedMs: number;
@@ -210,6 +236,16 @@ export interface DispatchContract {
210
236
  finalPromise: Promise<ReadonlyArray<RunReceipt>>;
211
237
  }>;
212
238
 
239
+ /** Seal a coordinator-only council synthesis receipt without invoking a model. */
240
+ sealCouncilSynthesis?(input: {
241
+ group: string;
242
+ round: number;
243
+ kind: "none" | "vote";
244
+ text: string;
245
+ subjects: ReadonlyArray<{ runId: string; digest: string | null }>;
246
+ template: RunReceipt;
247
+ }): Promise<RunReceipt>;
248
+
213
249
  /** List runs from the ledger. */
214
250
  listRuns(status?: RunStatus): ReadonlyArray<RunEnvelope>;
215
251
 
@@ -0,0 +1,167 @@
1
+ import { createHash } from "node:crypto";
2
+ import { normalizeWriteBoundary } from "../agents/write-boundary.js";
3
+
4
+ export type DelegationTaskMode = "sequential" | "parallel";
5
+
6
+ export interface DelegationPlanTask {
7
+ id: string;
8
+ agent: string;
9
+ description: string;
10
+ depends_on: ReadonlyArray<string>;
11
+ writes: ReadonlyArray<string>;
12
+ mode?: DelegationTaskMode;
13
+ }
14
+
15
+ export interface DelegationPlan {
16
+ tasks: ReadonlyArray<DelegationPlanTask>;
17
+ }
18
+
19
+ export type DelegationPlanReason =
20
+ | "delegation_plan_malformed"
21
+ | "delegation_plan_over_max_tasks"
22
+ | "delegation_plan_duplicate_id"
23
+ | "delegation_plan_roster_violation"
24
+ | "delegation_plan_dependency_unknown"
25
+ | "delegation_plan_dependency_cycle"
26
+ | "delegation_plan_writes_outside_boundary";
27
+
28
+ export type DelegationPlanValidation =
29
+ | { ok: true; plan: DelegationPlan; hash: string }
30
+ | { ok: false; reason: DelegationPlanReason; detail: string };
31
+
32
+ export interface ValidateDelegationPlanInput {
33
+ value: unknown;
34
+ roster: ReadonlyArray<string>;
35
+ maxTasks: number;
36
+ writes: ReadonlyArray<string>;
37
+ }
38
+
39
+ export const DELEGATION_PROPOSAL_BRIEFING_MAX_BYTES = 12_000;
40
+
41
+ export function buildDelegationProposalBriefing(proposals: ReadonlyArray<{ agent: string; output: string }>): string {
42
+ const value = proposals.map((proposal) => `PROPOSAL ${proposal.agent}\n${proposal.output}`).join("\n\n");
43
+ if (Buffer.byteLength(value, "utf8") <= DELEGATION_PROPOSAL_BRIEFING_MAX_BYTES) return value;
44
+ const suffix = "\n[truncated]";
45
+ const source = Buffer.from(value, "utf8");
46
+ let end = DELEGATION_PROPOSAL_BRIEFING_MAX_BYTES - Buffer.byteLength(suffix, "utf8");
47
+ while (end > 0) {
48
+ const byte = source[end];
49
+ if (byte === undefined || (byte & 0xc0) !== 0x80) break;
50
+ end -= 1;
51
+ }
52
+ return `${source.subarray(0, end).toString("utf8")}${suffix}`;
53
+ }
54
+
55
+ const ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
56
+
57
+ function insideBoundary(path: string, boundary: ReadonlyArray<string>): boolean {
58
+ return boundary.some((root) => (root.endsWith("/") ? path.startsWith(root) : path === root));
59
+ }
60
+
61
+ function malformed(detail: string): DelegationPlanValidation {
62
+ return { ok: false, reason: "delegation_plan_malformed", detail };
63
+ }
64
+
65
+ export function validateDelegationPlan(input: ValidateDelegationPlanInput): DelegationPlanValidation {
66
+ if (input.value === null || typeof input.value !== "object" || Array.isArray(input.value)) {
67
+ return malformed("delegation plan must be an object");
68
+ }
69
+ const record = input.value as Record<string, unknown>;
70
+ if (Object.keys(record).some((key) => key !== "tasks") || !Array.isArray(record.tasks)) {
71
+ return malformed("delegation plan must carry only tasks[]");
72
+ }
73
+ if (record.tasks.length === 0) return malformed("delegation plan must carry at least one task");
74
+ if (record.tasks.length > input.maxTasks) {
75
+ return {
76
+ ok: false,
77
+ reason: "delegation_plan_over_max_tasks",
78
+ detail: `delegation plan returned ${record.tasks.length} tasks, above maxTasks ${input.maxTasks}`,
79
+ };
80
+ }
81
+ const roster = new Set(input.roster);
82
+ const ids = new Set<string>();
83
+ const tasks: DelegationPlanTask[] = [];
84
+ for (const raw of record.tasks) {
85
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return malformed("every task must be an object");
86
+ const task = raw as Record<string, unknown>;
87
+ if (
88
+ Object.keys(task).some((key) => !["id", "agent", "description", "depends_on", "writes", "mode"].includes(key)) ||
89
+ typeof task.id !== "string" ||
90
+ !ID_RE.test(task.id) ||
91
+ typeof task.agent !== "string" ||
92
+ task.agent.length === 0 ||
93
+ typeof task.description !== "string" ||
94
+ task.description.trim().length === 0 ||
95
+ !Array.isArray(task.depends_on) ||
96
+ task.depends_on.some((value) => typeof value !== "string" || value.length === 0) ||
97
+ !Array.isArray(task.writes) ||
98
+ task.writes.some((value) => typeof value !== "string" || value.length === 0) ||
99
+ (task.mode !== undefined && task.mode !== "sequential" && task.mode !== "parallel")
100
+ ) {
101
+ return malformed("each task requires id, agent, description, depends_on[], writes[], and an optional valid mode");
102
+ }
103
+ if (ids.has(task.id)) {
104
+ return { ok: false, reason: "delegation_plan_duplicate_id", detail: `duplicate task id '${task.id}'` };
105
+ }
106
+ if (!roster.has(task.agent)) {
107
+ return {
108
+ ok: false,
109
+ reason: "delegation_plan_roster_violation",
110
+ detail: `task '${task.id}' names agent '${task.agent}' outside the roster`,
111
+ };
112
+ }
113
+ let writes: ReadonlyArray<string>;
114
+ try {
115
+ writes = normalizeWriteBoundary(task.writes as string[]);
116
+ } catch (error) {
117
+ return malformed(`task '${task.id}' has invalid writes: ${error instanceof Error ? error.message : String(error)}`);
118
+ }
119
+ const outside = writes.find((path) => !insideBoundary(path, input.writes));
120
+ if (outside !== undefined) {
121
+ return {
122
+ ok: false,
123
+ reason: "delegation_plan_writes_outside_boundary",
124
+ detail: `task '${task.id}' writes '${outside}' outside the plan step boundary`,
125
+ };
126
+ }
127
+ ids.add(task.id);
128
+ tasks.push({
129
+ id: task.id,
130
+ agent: task.agent,
131
+ description: task.description,
132
+ depends_on: [...(task.depends_on as string[])],
133
+ writes,
134
+ ...(task.mode !== undefined ? { mode: task.mode as DelegationTaskMode } : {}),
135
+ });
136
+ }
137
+ for (const task of tasks) {
138
+ const unknown = task.depends_on.find((dependency) => !ids.has(dependency));
139
+ if (unknown !== undefined) {
140
+ return {
141
+ ok: false,
142
+ reason: "delegation_plan_dependency_unknown",
143
+ detail: `task '${task.id}' depends on unknown task '${unknown}'`,
144
+ };
145
+ }
146
+ }
147
+ const remaining = new Set(ids);
148
+ const completed = new Set<string>();
149
+ while (remaining.size > 0) {
150
+ const ready = tasks.filter(
151
+ (task) => remaining.has(task.id) && task.depends_on.every((dependency) => completed.has(dependency)),
152
+ );
153
+ if (ready.length === 0) {
154
+ return {
155
+ ok: false,
156
+ reason: "delegation_plan_dependency_cycle",
157
+ detail: `delegation plan dependency cycle includes ${[...remaining].sort().join(", ")}`,
158
+ };
159
+ }
160
+ for (const task of ready) {
161
+ remaining.delete(task.id);
162
+ completed.add(task.id);
163
+ }
164
+ }
165
+ const plan = { tasks } satisfies DelegationPlan;
166
+ return { ok: true, plan, hash: createHash("sha256").update(JSON.stringify(plan)).digest("hex") };
167
+ }
@@ -3,7 +3,7 @@ import type { ResultContract } from "../agents/result-contract.js";
3
3
  import type { AgentAutomationAuthority } from "../agents/spec.js";
4
4
  import type { ExecutionRole } from "./execution-role.js";
5
5
 
6
- export type ExecutionPlanTopology = "parallel" | "sequential" | "pipeline" | "review" | "compete" | "fleet";
6
+ export type ExecutionPlanTopology = "parallel" | "sequential" | "pipeline" | "review" | "compete" | "council" | "fleet";
7
7
  export type ExecutionPlanScope = "readonly" | "workspace";
8
8
  export type ExecutionPlanFailurePolicy = "stop" | "continue";
9
9
 
@@ -56,6 +56,19 @@ export interface ExecutionPlanAgentStep {
56
56
  * contract declares no boundary at all and is therefore not enforced.
57
57
  */
58
58
  writes?: ReadonlyArray<string>;
59
+ /** Exact per-step route defaults from a version 5 fleet contract. */
60
+ target?: string;
61
+ profile?: string;
62
+ /** Version 5 gate authoring and baseline execution facts. */
63
+ gate?: { path: string; commandId: string };
64
+ /** Version 5 dynamic planning facts. */
65
+ plan?: {
66
+ roster: ReadonlyArray<string>;
67
+ maxTasks: number;
68
+ proposals: boolean;
69
+ };
70
+ /** The plan step that admitted this dynamically authored task. */
71
+ planParentId?: string;
59
72
  }
60
73
 
61
74
  /**
@@ -85,6 +98,8 @@ export interface ExecutionPlanCodeStep {
85
98
  commitFrom?: ReadonlyArray<string>;
86
99
  /** Declared write boundary; see `ExecutionPlanAgentStep.writes`. */
87
100
  writes?: ReadonlyArray<string>;
101
+ /** A gate check executes a declared gate file through this command. */
102
+ gate?: { gateId: string; path: string };
88
103
  }
89
104
 
90
105
  export type ExecutionPlanStep = ExecutionPlanAgentStep | ExecutionPlanCodeStep;
@@ -106,6 +121,8 @@ export interface ExecutionPlan {
106
121
  topology: ExecutionPlanTopology;
107
122
  rootTask: string;
108
123
  maxWorkers: number;
124
+ /** Serialize writer admission when set. The only supported value in this cut is one. */
125
+ writers?: 1;
109
126
  onFailure: ExecutionPlanFailurePolicy;
110
127
  steps: ReadonlyArray<ExecutionPlanStep>;
111
128
  loops: ReadonlyArray<ExecutionPlanLoop>;
@@ -240,6 +257,7 @@ function checkLoops(steps: ReadonlyArray<ExecutionPlanStep>, loops: ReadonlyArra
240
257
  function checkWriteBoundaryWaves(
241
258
  steps: ReadonlyArray<ExecutionPlanStep>,
242
259
  waves: ReadonlyArray<ReadonlyArray<string>>,
260
+ writerLimit?: 1,
243
261
  ): void {
244
262
  const byId = new Map(steps.map((step) => [step.id, step]));
245
263
  for (const [index, wave] of waves.entries()) {
@@ -250,7 +268,7 @@ function checkWriteBoundaryWaves(
250
268
  const declared = members.filter((step) => step.writes !== undefined);
251
269
  if (declared.length === 0) continue;
252
270
  const undeclared = members.filter((step) => step.writes === undefined);
253
- if (undeclared.length > 0) {
271
+ if (undeclared.length > 0 && writerLimit !== 1) {
254
272
  throw new Error(
255
273
  `execution plan: wave ${index} mixes boundary-enforced steps (${declared
256
274
  .map((step) => step.id)
@@ -260,7 +278,7 @@ function checkWriteBoundaryWaves(
260
278
  );
261
279
  }
262
280
  const writers = declared.filter((step) => (step.writes?.length ?? 0) > 0);
263
- if (writers.length > 1) {
281
+ if (writers.length > 1 && writerLimit !== 1) {
264
282
  throw new Error(
265
283
  `execution plan: wave ${index} schedules ${writers.length} steps that may write (${writers
266
284
  .map((step) => step.id)
@@ -273,6 +291,9 @@ function checkWriteBoundaryWaves(
273
291
  }
274
292
 
275
293
  export function compileExecutionPlan(input: ExecutionPlanInput): ExecutionPlan {
294
+ if (input.writers !== undefined && input.writers !== 1) {
295
+ throw new Error("execution plan: writers must be 1 when present");
296
+ }
276
297
  const steps = canonicalSteps(input.steps);
277
298
  const loops = (input.loops ?? []).map((loop) => ({
278
299
  ...loop,
@@ -281,12 +302,13 @@ export function compileExecutionPlan(input: ExecutionPlanInput): ExecutionPlan {
281
302
  }));
282
303
  checkLoops(steps, loops);
283
304
  const waves = executionPlanWaves(steps, input.maxWorkers);
284
- checkWriteBoundaryWaves(steps, waves);
305
+ checkWriteBoundaryWaves(steps, waves, input.writers);
285
306
  const canonical = {
286
307
  version: 4 as const,
287
308
  topology: input.topology,
288
309
  rootTask: input.rootTask,
289
310
  maxWorkers: input.maxWorkers,
311
+ ...(input.writers === 1 ? { writers: 1 as const } : {}),
290
312
  onFailure: input.onFailure,
291
313
  steps,
292
314
  loops,
@@ -309,6 +331,55 @@ export function executionPlanAncestors(plan: ExecutionPlan, stepId: string): Rea
309
331
  return ancestors;
310
332
  }
311
333
 
334
+ /** Recompile a plan with coordinator-validated dynamic agent tasks. */
335
+ export function spliceExecutionPlan(
336
+ plan: ExecutionPlan,
337
+ parentId: string,
338
+ tasks: ReadonlyArray<{
339
+ id: string;
340
+ agentId: string;
341
+ task: string;
342
+ dependencies: ReadonlyArray<string>;
343
+ writes: ReadonlyArray<string>;
344
+ target?: string;
345
+ profile?: string;
346
+ requestedAuthority: AgentAutomationAuthority;
347
+ approvedAuthority: AgentAutomationAuthority | null;
348
+ expectedResultContract: ResultContract["kind"];
349
+ executionRole: ExecutionRole;
350
+ }>,
351
+ ): ExecutionPlan {
352
+ const parent = plan.steps.find((step) => step.id === parentId);
353
+ if (parent?.kind !== "agent" || parent.plan === undefined) {
354
+ throw new Error(`execution plan: '${parentId}' is not a plan step`);
355
+ }
356
+ const inserted: ExecutionPlanStepInput[] = tasks.map((task) => ({
357
+ kind: "agent",
358
+ id: task.id,
359
+ agentId: task.agentId,
360
+ executionRole: task.executionRole,
361
+ scope: task.writes.length > 0 ? "workspace" : "readonly",
362
+ expectedResultContract: task.expectedResultContract,
363
+ requestedAuthority: task.requestedAuthority,
364
+ approvedAuthority: task.approvedAuthority,
365
+ dependencies: [parentId, ...task.dependencies],
366
+ task: task.task,
367
+ writes: [...task.writes],
368
+ ...(task.target !== undefined ? { target: task.target } : {}),
369
+ ...(task.profile !== undefined ? { profile: task.profile } : {}),
370
+ planParentId: parentId,
371
+ }));
372
+ return compileExecutionPlan({
373
+ topology: plan.topology,
374
+ rootTask: plan.rootTask,
375
+ maxWorkers: plan.maxWorkers,
376
+ ...(plan.writers === 1 ? { writers: 1 as const } : {}),
377
+ onFailure: plan.onFailure,
378
+ steps: [...plan.steps, ...inserted],
379
+ loops: plan.loops,
380
+ });
381
+ }
382
+
312
383
  /** A linear step declares no dependencies; the compiler chains them by position. */
313
384
  export type ExecutionPlanLinearStepInput =
314
385
  | (Omit<ExecutionPlanAgentStep, "kind" | "dependencies"> & { kind?: "agent" })
@@ -317,7 +388,7 @@ export type ExecutionPlanLinearStepInput =
317
388
  export function compileLinearExecutionPlan(
318
389
  input: Omit<ExecutionPlanInput, "steps"> & { steps: ReadonlyArray<ExecutionPlanLinearStepInput> },
319
390
  ): ExecutionPlan {
320
- const parallel = input.topology === "parallel" || input.topology === "compete";
391
+ const parallel = input.topology === "parallel" || input.topology === "compete" || input.topology === "council";
321
392
  return compileExecutionPlan({
322
393
  ...input,
323
394
  steps: input.steps.map((step, index): ExecutionPlanStepInput => {
@@ -47,7 +47,7 @@ export function isExecutionRole(value: unknown): value is ExecutionRole {
47
47
  * statistics belong to: every compete candidate occupies a distinct `candidate`
48
48
  * position but they are all ordinary `builder` routes.
49
49
  */
50
- export type GateTopologyRole = "builder" | "reviewer" | "candidate" | "judge";
50
+ export type GateTopologyRole = "builder" | "reviewer" | "candidate" | "judge" | "member" | "synthesis";
51
51
 
52
52
  /**
53
53
  * Facts the role is derived from. `capabilityClass` and `resultContractKind`
@@ -86,6 +86,8 @@ export function deriveExecutionRole(input: ExecutionRoleInput): ExecutionRole {
86
86
  if (input.attempt > 0) return "recovery";
87
87
  if (input.gateRole === "reviewer") return "reviewer";
88
88
  if (input.gateRole === "judge") return "judge";
89
+ if (input.gateRole === "synthesis") return "judge";
90
+ if (input.gateRole === "member") return "researcher";
89
91
  if (input.gateRole === "builder" || input.gateRole === "candidate") return "builder";
90
92
  if (input.resultContractKind === "verifier-report") return "verifier";
91
93
  if (input.capabilityClass === "read-only") return "researcher";