@iowarp/clio-coder 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +22 -6
  3. package/dist/{acp-2BEHC4DL.js → acp-U67UHUK2.js} +14 -14
  4. package/dist/{agents-LNNFTM53.js → agents-YU6SGALZ.js} +42 -35
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-KXXFI2VS.js → auth-5ZPJOIVG.js} +32 -24
  7. package/dist/builtins-C6JMZVV6.js +17 -0
  8. package/dist/{chunk-E25LMLRW.js → chunk-26LEYJZH.js} +2 -2
  9. package/dist/{chunk-TSHXZTOQ.js → chunk-2HEJ2F35.js} +5 -5
  10. package/dist/{chunk-PBTHKCPN.js → chunk-2HFZQUHL.js} +7 -7
  11. package/dist/{chunk-FO5ZOVUY.js → chunk-3BINW3FP.js} +5 -5
  12. package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
  13. package/dist/{chunk-CKXWIANG.js → chunk-4SPRNWDE.js} +18 -16
  14. package/dist/{chunk-E2ER4LJF.js → chunk-5C3AQNDW.js} +25 -1
  15. package/dist/{chunk-XF5N4U5A.js → chunk-5DHKRSMQ.js} +9 -8
  16. package/dist/{chunk-43AOLP7E.js → chunk-5FR74PWO.js} +2 -1
  17. package/dist/{chunk-EKY57CSP.js → chunk-5H3GB5BO.js} +68 -772
  18. package/dist/{chunk-6XXKFVSN.js → chunk-5Q2VVUKB.js} +4 -4
  19. package/dist/{chunk-DJVECN66.js → chunk-7RFXX52T.js} +295 -3705
  20. package/dist/{chunk-ZXF4XRKW.js → chunk-7RGZWPB6.js} +158 -8
  21. package/dist/{chunk-FYYLNIL5.js → chunk-A2NJGIB3.js} +2 -2
  22. package/dist/{chunk-XXQNGV4M.js → chunk-A3WNZD3P.js} +548 -72
  23. package/dist/{chunk-VEZEGCGW.js → chunk-B5CSFE7B.js} +23 -21
  24. package/dist/{chunk-2SFS6XQE.js → chunk-DGSYXYMX.js} +3 -2
  25. package/dist/chunk-DR52UMZW.js +21 -0
  26. package/dist/{chunk-ZWLZP4ZT.js → chunk-DYIM5TJT.js} +98 -12
  27. package/dist/{chunk-QKMUKYO7.js → chunk-E77JEWSD.js} +270 -125
  28. package/dist/{chunk-LYF7OHWH.js → chunk-EMYUUSFG.js} +12 -467
  29. package/dist/{chunk-4VP4KH3K.js → chunk-EQ63NRB7.js} +8 -8
  30. package/dist/chunk-FBVTI2TJ.js +518 -0
  31. package/dist/{chunk-R46L2BIR.js → chunk-FHJEP5SW.js} +19 -25
  32. package/dist/{chunk-WR67VIZY.js → chunk-GN57SG4G.js} +66 -8
  33. package/dist/{chunk-RD5U66HV.js → chunk-GPIEI3LY.js} +9 -9
  34. package/dist/{chunk-PCZJO5TI.js → chunk-GU2UIAFZ.js} +13 -178
  35. package/dist/chunk-GWS3VEIW.js +195 -0
  36. package/dist/chunk-H7IXIC72.js +103 -0
  37. package/dist/{chunk-3BPUFZDL.js → chunk-HLE42MG7.js} +3 -3
  38. package/dist/{chunk-24I7BN55.js → chunk-IFBNV6H6.js} +3 -3
  39. package/dist/{chunk-QNQHSOLF.js → chunk-IGWKHNIQ.js} +114 -55
  40. package/dist/chunk-IIZWH4XA.js +172 -0
  41. package/dist/{chunk-AD2SYQYC.js → chunk-IJ7RPIYJ.js} +124 -6
  42. package/dist/chunk-J3YUBZWY.js +382 -0
  43. package/dist/{chunk-5JGRAMKL.js → chunk-JOZYP4GM.js} +8 -6
  44. package/dist/{chunk-OH3TOQTB.js → chunk-K4XHGFR5.js} +751 -15
  45. package/dist/{chunk-EYPA3EGJ.js → chunk-KTYTFRMB.js} +178 -14
  46. package/dist/chunk-LU7P4LHA.js +33 -0
  47. package/dist/chunk-ME6CCNFO.js +108 -0
  48. package/dist/chunk-MXKJU4JB.js +1100 -0
  49. package/dist/{chunk-RY3LY4J5.js → chunk-N22QMJKY.js} +21 -18
  50. package/dist/chunk-NMPKI6XL.js +3006 -0
  51. package/dist/chunk-NUGM5KR6.js +165 -0
  52. package/dist/{chunk-22NAGB7X.js → chunk-P43ETTHK.js} +5 -94
  53. package/dist/{chunk-NILBFAPG.js → chunk-PMDBGQSJ.js} +2 -2
  54. package/dist/chunk-PT7HYKEM.js +165 -0
  55. package/dist/chunk-RVG5JXAL.js +41 -0
  56. package/dist/{chunk-GEYXPTRF.js → chunk-RWSI4YD7.js} +2 -2
  57. package/dist/{chunk-4BPJXDWC.js → chunk-TANS5ZJS.js} +35 -19
  58. package/dist/{verifiers-NCBTHHN2.js → chunk-TB5666IT.js} +67 -324
  59. package/dist/{chunk-QM3F2GKX.js → chunk-TLQJPP24.js} +7927 -8088
  60. package/dist/{chunk-G7MUEIGA.js → chunk-TT36MB5S.js} +2 -1
  61. package/dist/chunk-TTHACPOM.js +961 -0
  62. package/dist/{chunk-6US73PDB.js → chunk-TYPGUK6W.js} +7 -7
  63. package/dist/{chunk-MFFY33HR.js → chunk-U6MBIEMB.js} +554 -209
  64. package/dist/chunk-VAWNZU7Z.js +242 -0
  65. package/dist/{chunk-IR4CFBFN.js → chunk-VCBR6CU7.js} +12 -12
  66. package/dist/{chunk-WHJYKASB.js → chunk-VHN4MY6O.js} +2 -2
  67. package/dist/{chunk-XYDYPRZI.js → chunk-VWZOAB7K.js} +10 -10
  68. package/dist/{chunk-ZRGEBJ4T.js → chunk-WLFILSD5.js} +48 -48
  69. package/dist/{chunk-K7T3E2SR.js → chunk-WNIJTQQK.js} +12 -11
  70. package/dist/{chunk-CYQKWTG3.js → chunk-WSB3FPX7.js} +68 -20
  71. package/dist/{chunk-KHSFENX2.js → chunk-WWCZ5F23.js} +116 -14
  72. package/dist/{chunk-XE2VEJHX.js → chunk-WXY7KU3G.js} +2 -2
  73. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  74. package/dist/{chunk-KOHPCX4K.js → chunk-XWSF374K.js} +5 -5
  75. package/dist/{chunk-CJUB2JJ2.js → chunk-YS5VLNH5.js} +10 -10
  76. package/dist/{chunk-ZZMN5OM4.js → chunk-ZNLWCMVZ.js} +2 -2
  77. package/dist/{chunk-WHGPSPT5.js → chunk-ZVJ5BLO2.js} +2 -2
  78. package/dist/cli/index.js +33 -31
  79. package/dist/{clio-M2KGYUFZ.js → clio-QVTYJ57A.js} +10 -10
  80. package/dist/{code-nav-GQNL7XA6.js → code-nav-FGGFIE7L.js} +5 -5
  81. package/dist/codewiki/build-worker.js +4 -4
  82. package/dist/{components-5TTYYX6G.js → components-ZFA3SAER.js} +9 -9
  83. package/dist/{config-XUUYQIWO.js → config-LW5IJFQN.js} +65 -55
  84. package/dist/{configure-IHJ7YOMV.js → configure-7XIZCOU4.js} +29 -24
  85. package/dist/{context-75MIWW3U.js → context-L3WL3X7K.js} +54 -43
  86. package/dist/{context-ZQ7SIFJV.js → context-N52ZA626.js} +30 -14
  87. package/dist/{context-74JLXAWD.js → context-Y6Y7QPR6.js} +12 -12
  88. package/dist/{context-clear-GYKWNUML.js → context-clear-MBQRLSDQ.js} +54 -43
  89. package/dist/{context-index-SSR5ECNE.js → context-index-HVMFQHK3.js} +5 -5
  90. package/dist/{context-working-set-UX5KEP4J.js → context-working-set-GS6DSO7F.js} +18 -18
  91. package/dist/{dispatch-runner-GIJBHNFL.js → dispatch-runner-22ZCNOM3.js} +367 -79
  92. package/dist/{docs-6FZSCG5B.js → docs-7LQ23DLM.js} +9 -9
  93. package/dist/{doctor-SVJ5BZCW.js → doctor-M7YEDGAE.js} +27 -23
  94. package/dist/{eval-CG6LLBLD.js → eval-BEC2WHDA.js} +73 -20
  95. package/dist/{evidence-ZYFIEN42.js → evidence-REJUMSKM.js} +70 -59
  96. package/dist/{evolve-QGEXEMDW.js → evolve-PY5ZBA5K.js} +50 -39
  97. package/dist/{extensions-ADGNCJJD.js → extensions-HVKU65YU.js} +7 -7
  98. package/dist/{fleet-S5R4ZOQY.js → fleet-7WZEWRFA.js} +236 -377
  99. package/dist/fleet-commands-UVHWM76J.js +70 -0
  100. package/dist/fleet-graph-6ULH7PES.js +125 -0
  101. package/dist/fleet-new-RDVJLHHH.js +48 -0
  102. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-J53T6CCE.js} +5 -5
  103. package/dist/fleet-validate-72PC4SLA.js +79 -0
  104. package/dist/{init-5DRU55YR.js → init-OG3TPGQG.js} +69 -57
  105. package/dist/library-CNTMPLRF.js +217 -0
  106. package/dist/{memory-7YKKR6UC.js → memory-6IS7F275.js} +52 -41
  107. package/dist/{models-ZPOLRU2C.js → models-ENRJDA5W.js} +37 -31
  108. package/dist/{monitor-US5F5YGZ.js → monitor-XLDVO7TN.js} +79 -42
  109. package/dist/{orchestrator-E2AL4T5N.js → orchestrator-6KSPYRHA.js} +4126 -762
  110. package/dist/{paths-E7KYAQWE.js → paths-DBXMZMDU.js} +6 -6
  111. package/dist/registry-LG64LTF4.js +11 -0
  112. package/dist/{reset-KZ652EK6.js → reset-RZ4ER727.js} +12 -12
  113. package/dist/{run-SRNBKDWD.js → run-Y2CNK5RU.js} +89 -76
  114. package/dist/{share-CGZE33UP.js → share-A55GYP6Z.js} +37 -13
  115. package/dist/{skills-S2X4DLY5.js → skills-ALC5J6AT.js} +29 -13
  116. package/dist/{skills-eval-W2GGIC4R.js → skills-eval-JPBEBYQU.js} +60 -48
  117. package/dist/support-MIETYA5E.js +38 -0
  118. package/dist/{targets-54SWINWB.js → targets-VGNXIR3S.js} +46 -36
  119. package/dist/{terminal-lease-SAIF2OGY.js → terminal-lease-WOBR64YA.js} +4 -4
  120. package/dist/{uninstall-BVLWXKBT.js → uninstall-ZJF5H5ZN.js} +9 -9
  121. package/dist/{upgrade-JKAR27XC.js → upgrade-FUSUAGHR.js} +31 -28
  122. package/dist/{usage-MSAWCLX4.js → usage-N4MKVHKD.js} +140 -68
  123. package/dist/verifiers-YAWOJ3H2.js +336 -0
  124. package/dist/{verify-X5HDROLA.js → verify-LTDHYBGY.js} +10 -9
  125. package/dist/{wiki-generate-GUSOQ6ZP.js → wiki-generate-6M7GHTBJ.js} +75 -62
  126. package/dist/worker/entry.js +67 -57
  127. package/docs/README.md +3 -2
  128. package/docs/acp.md +1 -1
  129. package/docs/alcf-provider.md +1 -1
  130. package/docs/architecture.md +2 -2
  131. package/docs/artifact-versions.md +11 -6
  132. package/docs/built-in-agents.md +26 -2
  133. package/docs/capacity-and-scheduling.md +1 -1
  134. package/docs/commands-and-modes.md +83 -3
  135. package/docs/configuration-and-targets.md +86 -4
  136. package/docs/context-engine.md +1 -1
  137. package/docs/development-pipeline.md +1 -1
  138. package/docs/dispatch-architecture-rationale.md +1 -1
  139. package/docs/documentation-coverage.md +3 -3
  140. package/docs/documentation-guide.md +3 -3
  141. package/docs/eval-runner.md +1 -1
  142. package/docs/evals-internal.md +1 -1
  143. package/docs/evidence-and-memory.md +74 -10
  144. package/docs/evolution.md +1 -1
  145. package/docs/exit-codes-and-output.md +4 -1
  146. package/docs/extensions-and-sharing.md +6 -2
  147. package/docs/fleet-demo-runbook.md +2 -2
  148. package/docs/fleet-dispatch.md +228 -16
  149. package/docs/git-commit-provenance.md +2 -2
  150. package/docs/glossary.md +22 -2
  151. package/docs/installation-and-lifecycle.md +2 -2
  152. package/docs/middleware-and-components.md +2 -1
  153. package/docs/model-catalog.md +1 -1
  154. package/docs/observability.md +56 -9
  155. package/docs/proactive-memory.md +1 -1
  156. package/docs/prompt-envelope-and-tools.md +4 -2
  157. package/docs/provider-adapter-cookbook.md +1 -1
  158. package/docs/release-cut-checklist.md +83 -65
  159. package/docs/resource-library.md +59 -0
  160. package/docs/safety-model.md +2 -2
  161. package/docs/scientific-validation.md +3 -3
  162. package/docs/session-lifecycle.md +37 -1
  163. package/docs/skills-marketplace.md +16 -3
  164. package/docs/tool-usage.md +14 -7
  165. package/docs/trace-store.md +1 -1
  166. package/docs/troubleshooting.md +1 -1
  167. package/docs/tui-design.md +1 -1
  168. package/docs/worker-dispatch-mechanics.md +3 -3
  169. package/package.json +1 -2
  170. package/src/cli/argv.ts +5 -0
  171. package/src/cli/configure.ts +107 -23
  172. package/src/cli/doctor.ts +5 -1
  173. package/src/cli/evidence.ts +30 -25
  174. package/src/cli/fleet-commands.ts +37 -0
  175. package/src/cli/fleet-graph.ts +102 -0
  176. package/src/cli/fleet-new.ts +36 -0
  177. package/src/cli/fleet-preflight.ts +111 -0
  178. package/src/cli/fleet-validate.ts +30 -0
  179. package/src/cli/fleet.ts +173 -335
  180. package/src/cli/index.ts +3 -1
  181. package/src/cli/library.ts +190 -0
  182. package/src/cli/share.ts +13 -1
  183. package/src/cli/shared.ts +1 -0
  184. package/src/cli/targets.ts +4 -1
  185. package/src/cli/usage.ts +111 -19
  186. package/src/cli/validate-model.ts +60 -5
  187. package/src/core/bus-events.ts +29 -0
  188. package/src/core/commit-attribution.ts +4 -4
  189. package/src/core/config.ts +130 -0
  190. package/src/core/defaults.ts +81 -0
  191. package/src/core/path-boundary.ts +100 -0
  192. package/src/domains/agents/builtins/architect.md +1 -0
  193. package/src/domains/agents/builtins/oracle.md +33 -0
  194. package/src/domains/agents/catalog.ts +13 -1
  195. package/src/domains/agents/extension.ts +2 -11
  196. package/src/domains/agents/fleet-contract.ts +304 -24
  197. package/src/domains/agents/index.ts +14 -0
  198. package/src/domains/agents/recipe.ts +7 -1
  199. package/src/domains/agents/registry.ts +73 -5
  200. package/src/domains/agents/result-contract.ts +360 -15
  201. package/src/domains/agents/write-boundary.ts +15 -50
  202. package/src/domains/config/classify.ts +4 -0
  203. package/src/domains/context/project-rules.ts +51 -1
  204. package/src/domains/dispatch/active-route-planner.ts +14 -0
  205. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  206. package/src/domains/dispatch/assignment-store.ts +151 -14
  207. package/src/domains/dispatch/backoff.ts +2 -1
  208. package/src/domains/dispatch/capability-match.ts +1 -0
  209. package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
  210. package/src/domains/dispatch/contract.ts +48 -0
  211. package/src/domains/dispatch/delegation-plan.ts +164 -0
  212. package/src/domains/dispatch/execution-plan.ts +76 -5
  213. package/src/domains/dispatch/execution-role.ts +12 -2
  214. package/src/domains/dispatch/execution-scheduler.ts +183 -67
  215. package/src/domains/dispatch/extension.ts +412 -74
  216. package/src/domains/dispatch/fleet-gate.ts +14 -0
  217. package/src/domains/dispatch/fleet-plan.ts +63 -3
  218. package/src/domains/dispatch/fleet-run.ts +791 -0
  219. package/src/domains/dispatch/gate-role-prompts.ts +47 -0
  220. package/src/domains/dispatch/host-verification.ts +178 -0
  221. package/src/domains/dispatch/index.ts +41 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +235 -0
  224. package/src/domains/dispatch/path-scope.ts +370 -0
  225. package/src/domains/dispatch/receipt-integrity.ts +9 -4
  226. package/src/domains/dispatch/state.ts +36 -3
  227. package/src/domains/dispatch/types.ts +64 -12
  228. package/src/domains/dispatch/validation.ts +69 -6
  229. package/src/domains/dispatch/write-boundary-enforcer.ts +45 -0
  230. package/src/domains/dispatch/write-boundary.ts +201 -22
  231. package/src/domains/eval/metrics/evidence.ts +79 -2
  232. package/src/domains/eval/runners/clio-run.ts +12 -2
  233. package/src/domains/evidence/build.ts +69 -11
  234. package/src/domains/evidence/index.ts +21 -0
  235. package/src/domains/evidence/provenance.ts +46 -11
  236. package/src/domains/evidence/trust-projection.ts +274 -0
  237. package/src/domains/evidence/trust-status.ts +155 -18
  238. package/src/domains/evidence/types.ts +4 -0
  239. package/src/domains/extensions/discovery.ts +88 -1
  240. package/src/domains/extensions/resources.ts +20 -8
  241. package/src/domains/extensions/state.ts +6 -2
  242. package/src/domains/extensions/types.ts +4 -1
  243. package/src/domains/lifecycle/doctor.ts +140 -1
  244. package/src/domains/middleware/index.ts +15 -0
  245. package/src/domains/middleware/watchdog.ts +281 -0
  246. package/src/domains/observability/contract.ts +3 -1
  247. package/src/domains/observability/cost.ts +12 -1
  248. package/src/domains/observability/extension.ts +2 -2
  249. package/src/domains/observability/index.ts +10 -0
  250. package/src/domains/observability/out-of-turn-usage.ts +223 -0
  251. package/src/domains/prompts/contract.ts +3 -5
  252. package/src/domains/providers/extension.ts +30 -2
  253. package/src/domains/resources/common-loader.ts +3 -0
  254. package/src/domains/resources/index.ts +20 -0
  255. package/src/domains/resources/library.ts +326 -0
  256. package/src/domains/resources/prompts/loader.ts +119 -14
  257. package/src/domains/resources/skills/marketplace.ts +37 -12
  258. package/src/domains/safety/policy-engine.ts +5 -5
  259. package/src/domains/safety/run-effects.ts +64 -1
  260. package/src/domains/safety/scope.ts +7 -12
  261. package/src/domains/session/handoff.ts +629 -0
  262. package/src/domains/share/archive.ts +67 -2
  263. package/src/engine/acp/server.ts +4 -1
  264. package/src/engine/prompt-templates.ts +18 -1
  265. package/src/engine/worker-runtime.ts +6 -3
  266. package/src/entry/orchestrator.ts +37 -0
  267. package/src/interactive/bus-notices.ts +26 -0
  268. package/src/interactive/chat-loop.ts +235 -1
  269. package/src/interactive/chat-renderer.ts +22 -0
  270. package/src/interactive/cost-overlay.ts +31 -3
  271. package/src/interactive/council-dispatch.ts +30 -0
  272. package/src/interactive/council-grid.ts +213 -0
  273. package/src/interactive/council.ts +99 -0
  274. package/src/interactive/dispatch-board.ts +311 -17
  275. package/src/interactive/fleet-run-preview.ts +307 -0
  276. package/src/interactive/footer/notifications.ts +219 -0
  277. package/src/interactive/handoff-round.ts +56 -0
  278. package/src/interactive/interactive-application.ts +43 -1
  279. package/src/interactive/interactive-event-projection.ts +23 -1
  280. package/src/interactive/interactive-slash-runtime.ts +52 -2
  281. package/src/interactive/interactive-subscriptions.ts +14 -2
  282. package/src/interactive/oracle.ts +179 -0
  283. package/src/interactive/overlay-ask-user-lifecycle.ts +6 -0
  284. package/src/interactive/overlay-general-openers.ts +190 -1
  285. package/src/interactive/overlay-key-routing.ts +17 -1
  286. package/src/interactive/overlay-lifecycle.ts +41 -1
  287. package/src/interactive/overlay-permission-lifecycle.ts +10 -0
  288. package/src/interactive/overlay-resource-openers.ts +11 -3
  289. package/src/interactive/overlay-session-lifecycle.ts +234 -2
  290. package/src/interactive/overlays/fleet-run-approval.ts +208 -0
  291. package/src/interactive/overlays/handoff-review.ts +185 -0
  292. package/src/interactive/overlays/library-install-confirm.ts +151 -0
  293. package/src/interactive/overlays/list-overlay.ts +168 -2
  294. package/src/interactive/overlays/settings.ts +221 -30
  295. package/src/interactive/overlays/side-question.ts +139 -0
  296. package/src/interactive/overlays/skills-hub.ts +401 -15
  297. package/src/interactive/side-question.ts +171 -0
  298. package/src/interactive/slash-commands.ts +439 -7
  299. package/src/interactive/slash-spec.ts +19 -6
  300. package/src/interactive/theme/tokens.ts +30 -0
  301. package/src/interactive/turn-middleware.ts +15 -1
  302. package/src/interactive/view/artifacts.ts +42 -9
  303. package/src/interactive/view/view-overlay.ts +15 -3
  304. package/src/interactive/watchdog-run.ts +75 -0
  305. package/src/interactive/worker-receipts.ts +14 -2
  306. package/src/interactive/worker-share.ts +56 -1
  307. package/src/interactive/worker-stream.ts +15 -0
  308. package/src/tools/bootstrap.ts +3 -0
  309. package/src/tools/compete-worktrees.ts +13 -79
  310. package/src/tools/dispatch-admission.ts +251 -18
  311. package/src/tools/dispatch-arguments.ts +84 -1
  312. package/src/tools/dispatch-plan.ts +165 -6
  313. package/src/tools/dispatch-runner.ts +364 -23
  314. package/src/tools/dispatch-types.ts +20 -1
  315. package/src/tools/dispatch.ts +72 -2
  316. package/src/tools/monitor.ts +29 -0
  317. package/src/tools/profiles.ts +18 -4
  318. package/src/tools/task-worktree.ts +238 -0
  319. package/src/tools/verify/authoring.ts +61 -1
  320. package/src/tools/verify/scripts.ts +62 -0
  321. package/src/tools/worker-evidence.ts +21 -14
  322. package/src/worker/spec-contract.ts +3 -1
  323. package/dist/chunk-HC4CLZ2Y.js +0 -68
@@ -20,6 +20,8 @@ import type { ResultContract } from "../domains/agents/result-contract.js";
20
20
  import { AGENT_AUTOMATION_AUTHORITIES, type AgentAutomationAuthority } from "../domains/agents/spec.js";
21
21
  import type { DispatchRequest } from "../domains/dispatch/contract.js";
22
22
  import { type ExecutionRole, isExecutionRole } from "../domains/dispatch/execution-role.js";
23
+ import { type DispatchIntent, isDispatchIntent } from "../domains/dispatch/intent.js";
24
+ import { resolveDispatchPathScope } from "../domains/dispatch/path-scope.js";
23
25
  import {
24
26
  type ApprovedAssignmentRoute,
25
27
  cloneApprovedAssignmentRoute,
@@ -31,7 +33,15 @@ import { isRoutingIntent, type RoutingIntent } from "../domains/dispatch/routing
31
33
  import type { DispatchFailoverCandidate, DispatchFailoverMode } from "../domains/dispatch/validation.js";
32
34
  import { prepareDispatchArguments } from "./dispatch-arguments.js";
33
35
 
34
- export type DispatchPlanTopology = "parallel" | "sequential" | "pipeline" | "review" | "compete" | "detached" | "fleet";
36
+ export type DispatchPlanTopology =
37
+ | "parallel"
38
+ | "sequential"
39
+ | "pipeline"
40
+ | "review"
41
+ | "compete"
42
+ | "council"
43
+ | "detached"
44
+ | "fleet";
35
45
 
36
46
  export type DispatchPlanSource = null | {
37
47
  kind: "scout-transition";
@@ -51,6 +61,9 @@ export interface DispatchPlanTaskView {
51
61
  task: string;
52
62
  /** Exact canonical bounded briefing approved for this task. */
53
63
  briefing?: string;
64
+ worktree?: true;
65
+ apply?: "merge" | "preserve";
66
+ worktreeDestination?: string;
54
67
  model?: string;
55
68
  node?: string;
56
69
  /** Effective transport identity; host is authenticated for SSH placement. */
@@ -59,7 +72,8 @@ export interface DispatchPlanTaskView {
59
72
  /** Effective configured target id used as the execution pin. */
60
73
  target?: string;
61
74
  /** Coordinator role when the topology expands one user task into several runs. */
62
- role?: "task" | "builder" | "reviewer" | "candidate" | "judge";
75
+ role?: "task" | "builder" | "reviewer" | "candidate" | "judge" | "member" | "synthesis";
76
+ council?: { label: string; color?: string; round: number; rounds: number; synthesis: "none" | "judge" | "vote" };
63
77
  /** One-based source task or gate cycle/candidate number. */
64
78
  position?: number;
65
79
  /** Normalized advisory posture and hard bounds sealed into the plan. */
@@ -79,6 +93,8 @@ export interface DispatchPlanTaskView {
79
93
  authorityGrant: DispatchPlanAuthorityGrant;
80
94
  agentDecision: RouteDecisionV1 | null;
81
95
  wave: number | null;
96
+ intent?: DispatchIntent;
97
+ resolvedVerification?: NonNullable<DispatchRequest["resolvedVerification"]>;
82
98
  }
83
99
 
84
100
  export interface DispatchPlanView {
@@ -112,7 +128,20 @@ export interface ResolvedDispatchPlanArtifact {
112
128
  Required<Pick<DispatchPlanTaskView, "agent" | "task" | "model" | "node" | "target">> &
113
129
  Required<Pick<DispatchPlanTaskView, "nodeKind" | "failover">> &
114
130
  Required<Pick<DispatchPlanTaskView, "routingIntent">> &
115
- Pick<DispatchPlanTaskView, "briefing" | "nodeHost" | "role" | "position" | "allowedCandidates"> &
131
+ Pick<
132
+ DispatchPlanTaskView,
133
+ | "briefing"
134
+ | "worktree"
135
+ | "apply"
136
+ | "worktreeDestination"
137
+ | "nodeHost"
138
+ | "role"
139
+ | "council"
140
+ | "position"
141
+ | "allowedCandidates"
142
+ | "intent"
143
+ | "resolvedVerification"
144
+ > &
116
145
  Required<
117
146
  Pick<
118
147
  DispatchPlanTaskView,
@@ -136,7 +165,7 @@ export interface ResolvedDispatchPlanArtifact {
136
165
  export function withResolvedPlanTaskPin(
137
166
  request: DispatchRequest,
138
167
  task: ResolvedDispatchPlanArtifact["tasks"][number] | undefined,
139
- options: { pinTask?: boolean } = {},
168
+ options: { pinTask?: boolean; pinBriefing?: boolean } = {},
140
169
  ): DispatchRequest {
141
170
  if (task === undefined) return request;
142
171
  const {
@@ -170,7 +199,24 @@ export function withResolvedPlanTaskPin(
170
199
  ? {}
171
200
  : { allowedCandidates: task.allowedCandidates.map((candidate) => ({ ...candidate })) }),
172
201
  task: options.pinTask === false ? request.task : task.task,
173
- ...(task.briefing !== undefined ? { briefing: task.briefing } : {}),
202
+ ...(options.pinBriefing === false
203
+ ? request.briefing !== undefined
204
+ ? { briefing: request.briefing }
205
+ : {}
206
+ : task.briefing !== undefined
207
+ ? { briefing: task.briefing }
208
+ : {}),
209
+ ...(task.worktree === true
210
+ ? {
211
+ worktree: true as const,
212
+ apply: task.apply ?? "merge",
213
+ ...(task.worktreeDestination === undefined ? {} : { taskWorktreeDestination: task.worktreeDestination }),
214
+ }
215
+ : {}),
216
+ ...(task.intent !== undefined ? { intent: structuredClone(task.intent) } : {}),
217
+ ...(task.resolvedVerification !== undefined
218
+ ? { resolvedVerification: task.resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
219
+ : {}),
174
220
  target: task.target,
175
221
  model: task.model,
176
222
  node: task.node,
@@ -201,6 +247,33 @@ function safeField(value: string): string {
201
247
  return result;
202
248
  }
203
249
 
250
+ function renderLegacyPathScope(task: DispatchPlanTaskView): string[] {
251
+ if (task.intent !== undefined) return [];
252
+ const scope = resolveDispatchPathScope({
253
+ agentId: task.agent,
254
+ executionRole: task.executionRole,
255
+ task: task.task,
256
+ ...(task.briefing !== undefined ? { briefing: task.briefing } : {}),
257
+ });
258
+ const lines = [" scope mode=legacy-inferred"];
259
+ for (const [policy, entries] of [
260
+ ["working_context", scope.provenance.workingContextPaths],
261
+ ["write_boundary", scope.provenance.writeBoundaries],
262
+ ] as const) {
263
+ for (const entry of entries) {
264
+ for (const evidence of entry.evidence) {
265
+ lines.push(
266
+ ` scope ${policy} path=${JSON.stringify(safeField(entry.path))} provenance=${evidence.provenance} source=${evidence.source} confidence=${evidence.confidence} reason=${evidence.reason}`,
267
+ );
268
+ }
269
+ }
270
+ }
271
+ if (scope.provenance.workingContextPaths.length === 0 && scope.provenance.writeBoundaries.length === 0) {
272
+ lines.push(" scope policy_paths=none");
273
+ }
274
+ return lines;
275
+ }
276
+
204
277
  function taskViews(args: Record<string, unknown>): DispatchPlanTaskView[] {
205
278
  const tasks = Array.isArray(args.tasks) ? args.tasks : [];
206
279
  const sharedAgent = str(args.agent) ?? "coder";
@@ -224,6 +297,12 @@ function taskViews(args: Record<string, unknown>): DispatchPlanTaskView[] {
224
297
  };
225
298
  const briefing = "briefing" in record ? str(record.briefing) : str(args.briefing);
226
299
  if (briefing !== undefined) view.briefing = briefing;
300
+ const worktree = "worktree" in record ? record.worktree : args.worktree;
301
+ if (worktree === true) {
302
+ view.worktree = true;
303
+ const apply = "apply" in record ? record.apply : args.apply;
304
+ view.apply = apply === "preserve" ? "preserve" : "merge";
305
+ }
227
306
  const model = str(record.model) ?? sharedModel;
228
307
  if (model !== undefined) view.model = model;
229
308
  const node = str(record.node) ?? sharedNode;
@@ -266,6 +345,7 @@ function canonicalCandidates(value: unknown): DispatchFailoverCandidate[] | null
266
345
  function topologyOf(args: Record<string, unknown>): DispatchPlanTopology {
267
346
  if (isRecord(args.apply_winner)) return "compete";
268
347
  if (args.mode === "compete") return "compete";
348
+ if (args.mode === "council") return "council";
269
349
  if (args.review === true || isRecord(args.review)) return "review";
270
350
  if (args.detach === true) return "detached";
271
351
  if (args.mode === "sequential") return "sequential";
@@ -315,6 +395,15 @@ function renderPlanText(
315
395
  lines.push(
316
396
  ` ${index + 1}.${role} agent=${safeField(task.agent)}${target}${model}${node}${failover}${routingText} task=${JSON.stringify(safeField(task.task))}`,
317
397
  );
398
+ if (task.council !== undefined) {
399
+ lines.push(
400
+ ` council label=${safeField(task.council.label)} color=${safeField(task.council.color ?? "none")} round=${task.council.round} rounds=${task.council.rounds} synthesis=${task.council.synthesis}`,
401
+ );
402
+ }
403
+ if (task.worktree === true)
404
+ lines.push(
405
+ ` worktree=true apply=${task.apply ?? "merge"} destination=${safeField(task.worktreeDestination ?? "unresolved")}`,
406
+ );
318
407
  if (task.allowedCandidates !== undefined) {
319
408
  for (const [candidateIndex, candidate] of task.allowedCandidates.entries()) {
320
409
  lines.push(
@@ -352,6 +441,16 @@ function renderPlanText(
352
441
  ` briefing_bytes=${Buffer.byteLength(task.briefing, "utf8")} briefing_sha256=${createHash("sha256").update(task.briefing, "utf8").digest("hex")} briefing_preview=${JSON.stringify(safeField(task.briefing))}`,
353
442
  );
354
443
  }
444
+ if (task.intent !== undefined) {
445
+ const serialized = JSON.stringify(task.intent);
446
+ lines.push(` intent_sha256=${createHash("sha256").update(serialized, "utf8").digest("hex")}`);
447
+ }
448
+ lines.push(...renderLegacyPathScope(task));
449
+ for (const check of task.resolvedVerification ?? []) {
450
+ lines.push(
451
+ ` verification check=${safeField(check.check)} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
452
+ );
453
+ }
355
454
  }
356
455
  return lines.join("\n");
357
456
  }
@@ -362,12 +461,16 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
362
461
  "agent",
363
462
  "task",
364
463
  "briefing",
464
+ "worktree",
465
+ "apply",
466
+ "worktreeDestination",
365
467
  "model",
366
468
  "node",
367
469
  "nodeKind",
368
470
  "nodeHost",
369
471
  "target",
370
472
  "role",
473
+ "council",
371
474
  "position",
372
475
  "routingIntent",
373
476
  "failover",
@@ -381,6 +484,8 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
381
484
  "authorityGrant",
382
485
  "agentDecision",
383
486
  "wave",
487
+ "intent",
488
+ "resolvedVerification",
384
489
  ]);
385
490
  if (Object.keys(value).some((key) => !allowedKeys.has(key))) return false;
386
491
  for (const key of [
@@ -409,17 +514,37 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
409
514
  value.role !== "builder" &&
410
515
  value.role !== "reviewer" &&
411
516
  value.role !== "candidate" &&
412
- value.role !== "judge"
517
+ value.role !== "judge" &&
518
+ value.role !== "member" &&
519
+ value.role !== "synthesis"
413
520
  ) {
414
521
  return false;
415
522
  }
416
523
  if (value.position !== undefined && (!Number.isInteger(value.position) || Number(value.position) < 1)) return false;
524
+ if (value.council !== undefined) {
525
+ if (
526
+ !isRecord(value.council) ||
527
+ typeof value.council.label !== "string" ||
528
+ value.council.label.length === 0 ||
529
+ (value.council.color !== undefined && typeof value.council.color !== "string") ||
530
+ !Number.isInteger(value.council.round) ||
531
+ Number(value.council.round) < 1 ||
532
+ !Number.isInteger(value.council.rounds) ||
533
+ Number(value.council.rounds) < 1 ||
534
+ (value.council.synthesis !== "none" && value.council.synthesis !== "judge" && value.council.synthesis !== "vote")
535
+ )
536
+ return false;
537
+ }
417
538
  if (value.nodeKind !== "local" && value.nodeKind !== "ssh") return false;
418
539
  if (value.nodeKind === "ssh" && (typeof value.nodeHost !== "string" || value.nodeHost.trim().length === 0))
419
540
  return false;
420
541
  if (value.nodeKind === "local" && value.nodeHost !== undefined) return false;
421
542
  if (value.briefing !== undefined && (typeof value.briefing !== "string" || value.briefing.trim().length === 0))
422
543
  return false;
544
+ if (value.worktree !== undefined && value.worktree !== true) return false;
545
+ if (value.apply !== undefined && value.apply !== "merge" && value.apply !== "preserve") return false;
546
+ if (value.apply !== undefined && value.worktree !== true) return false;
547
+ if (value.worktreeDestination !== undefined && typeof value.worktreeDestination !== "string") return false;
423
548
  if (failoverModeOf(value.failover) === undefined) return false;
424
549
  if (!isRoutingIntent(value.routingIntent)) return false;
425
550
  if (value.routeApproval !== null && !isApprovedAssignmentRoute(value.routeApproval)) return false;
@@ -441,6 +566,21 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
441
566
  return false;
442
567
  if (value.authorityGrant !== null && !isAuthorityGrant(value.authorityGrant)) return false;
443
568
  if (value.agentDecision !== null && !isAgentDecision(value.agentDecision)) return false;
569
+ if (value.intent !== undefined && !isDispatchIntent(value.intent)) return false;
570
+ if (
571
+ value.resolvedVerification !== undefined &&
572
+ (!Array.isArray(value.resolvedVerification) ||
573
+ !value.resolvedVerification.every(
574
+ (check) =>
575
+ isRecord(check) &&
576
+ typeof check.check === "string" &&
577
+ Array.isArray(check.argv) &&
578
+ check.argv.every((arg) => typeof arg === "string") &&
579
+ typeof check.cwd === "string" &&
580
+ typeof check.timeoutMs === "number",
581
+ ))
582
+ )
583
+ return false;
444
584
  if (value.failover === "approved") {
445
585
  if (canonicalCandidates(value.allowedCandidates) === null) return false;
446
586
  } else if (value.allowedCandidates !== undefined) {
@@ -455,11 +595,16 @@ const RESULT_CONTRACT_KINDS = new Set<ResultContract["kind"]>([
455
595
  "architect-plan",
456
596
  "scout-report",
457
597
  "verifier-report",
598
+ "council-report",
458
599
  "debugger-report",
459
600
  "research-report",
460
601
  "mutation-report",
461
602
  "provenance-report",
603
+ "oracle-report",
462
604
  "external-delegation",
605
+ "artifact-report",
606
+ "context-handbook",
607
+ "delegation-plan",
463
608
  ]);
464
609
 
465
610
  function isAuthorityGrant(value: unknown): value is Exclude<DispatchPlanAuthorityGrant, null> {
@@ -572,6 +717,7 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
572
717
  value.topology !== "pipeline" &&
573
718
  value.topology !== "review" &&
574
719
  value.topology !== "compete" &&
720
+ value.topology !== "council" &&
575
721
  value.topology !== "detached" &&
576
722
  value.topology !== "fleet"
577
723
  ) {
@@ -632,6 +778,13 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
632
778
  agent: task.agent.trim(),
633
779
  task: task.task.trim(),
634
780
  ...(task.briefing !== undefined ? { briefing: task.briefing.trim() } : {}),
781
+ ...(task.worktree === true
782
+ ? {
783
+ worktree: true as const,
784
+ apply: task.apply ?? "merge",
785
+ ...(task.worktreeDestination === undefined ? {} : { worktreeDestination: task.worktreeDestination }),
786
+ }
787
+ : {}),
635
788
  model: task.model.trim(),
636
789
  node: task.node.trim(),
637
790
  nodeKind: task.nodeKind,
@@ -652,7 +805,12 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
652
805
  : {}),
653
806
  ...(task.nodeHost !== undefined ? { nodeHost: task.nodeHost.trim() } : {}),
654
807
  ...(task.role !== undefined ? { role: task.role } : {}),
808
+ ...(task.council !== undefined ? { council: { ...task.council } } : {}),
655
809
  ...(task.position !== undefined ? { position: task.position } : {}),
810
+ ...(task.intent !== undefined ? { intent: structuredClone(task.intent) } : {}),
811
+ ...(task.resolvedVerification !== undefined
812
+ ? { resolvedVerification: task.resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
813
+ : {}),
656
814
  })),
657
815
  costCeilingUsd: value.costCeilingUsd,
658
816
  deadlineMs: value.deadlineMs as number | null,
@@ -716,6 +874,7 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
716
874
  (tasks.length > 1 ||
717
875
  source !== null ||
718
876
  topology === "compete" ||
877
+ topology === "council" ||
719
878
  remote ||
720
879
  tasks.some((task) => task.failover === "approved") ||
721
880
  confirmation !== undefined ||