@iowarp/clio-coder 0.4.4 → 0.4.6

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 (598) hide show
  1. package/CHANGELOG.md +116 -2
  2. package/CONTRIBUTING.md +39 -24
  3. package/NOTICE +16 -0
  4. package/README.md +343 -403
  5. package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
  6. package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
  9. package/dist/builtins-PD652MTK.js +22 -0
  10. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  11. package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
  12. package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
  13. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  14. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  15. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  16. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  17. package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
  18. package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
  19. package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
  20. package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
  21. package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
  22. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  23. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  24. package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
  25. package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
  26. package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
  27. package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
  28. package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
  29. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  30. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  31. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  32. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  33. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  34. package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
  35. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  36. package/dist/chunk-5ZSZEYJK.js +119 -0
  37. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  38. package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
  39. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  40. package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
  41. package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
  42. package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
  43. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  44. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  45. package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
  46. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  47. package/dist/chunk-7WUZEB2M.js +165 -0
  48. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  49. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  50. package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
  51. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  52. package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
  53. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  54. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  55. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  56. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  57. package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
  58. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  59. package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
  60. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  61. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  62. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  63. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  64. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  65. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  66. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  67. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  68. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  69. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  70. package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
  71. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  72. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  73. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  74. package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
  75. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  76. package/dist/chunk-ECOMVOHP.js +139 -0
  77. package/dist/chunk-EFSEIZE6.js +56 -0
  78. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  79. package/dist/chunk-EM2WNQS2.js +93 -0
  80. package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
  81. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  82. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  83. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  84. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  85. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  86. package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
  87. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  88. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  89. package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
  90. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  91. package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
  92. package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
  93. package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
  94. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  95. package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
  96. package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
  97. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  98. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  99. package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
  100. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  101. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  102. package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
  103. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  104. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  105. package/dist/chunk-KPRLAMP4.js +32 -0
  106. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  107. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  108. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  109. package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
  110. package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
  111. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  112. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  113. package/dist/chunk-LUL5Z66S.js +221 -0
  114. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  115. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  116. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  117. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  118. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  119. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  120. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  121. package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
  122. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  123. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  124. package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
  125. package/dist/chunk-NTK3WTHM.js +141 -0
  126. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  127. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  128. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  129. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  130. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  131. package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
  132. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  133. package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
  134. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  135. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  136. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  137. package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
  138. package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
  139. package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
  140. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  141. package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
  142. package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
  143. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  144. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  145. package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
  146. package/dist/chunk-R2CT5YDO.js +66 -0
  147. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  148. package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
  149. package/dist/chunk-SD7SHNDW.js +15 -0
  150. package/dist/chunk-SL2RDHKO.js +19 -0
  151. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  152. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  153. package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
  154. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  155. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  156. package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
  157. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  158. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  159. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  160. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  161. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  162. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  163. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  164. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  165. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  166. package/dist/chunk-USZA7GWL.js +341 -0
  167. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
  170. package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
  171. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  172. package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
  173. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  174. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  175. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  176. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  177. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  178. package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
  179. package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
  180. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  181. package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
  182. package/dist/chunk-WXA2CFJO.js +23 -0
  183. package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
  184. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  185. package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
  186. package/dist/chunk-YGDMBK7O.js +567 -0
  187. package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
  188. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  189. package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
  190. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  191. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  192. package/dist/cli/index.js +44 -44
  193. package/dist/clio-QQCMTUZE.js +26 -0
  194. package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
  195. package/dist/codewiki/build-worker.js +76 -29
  196. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  197. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  198. package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
  199. package/dist/configure-4ZM5HWJX.js +73 -0
  200. package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
  201. package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
  202. package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
  203. package/dist/context-clear-OQV76MYP.js +184 -0
  204. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  205. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  206. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
  207. package/dist/detail-UXPWRANG.js +115 -0
  208. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
  209. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  210. package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
  211. package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
  212. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  213. package/dist/evidence-35PYWGSO.js +225 -0
  214. package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
  215. package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
  216. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  217. package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
  218. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
  219. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  220. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
  221. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
  222. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  223. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  224. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
  225. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
  226. package/dist/fleet-view-IWHYGQKK.js +118 -0
  227. package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
  228. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  229. package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
  230. package/dist/inventory-74UL7UHU.js +118 -0
  231. package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
  232. package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
  233. package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
  234. package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
  235. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
  236. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  237. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  238. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  239. package/dist/preload-EJAWJEIO.js +116 -0
  240. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  241. package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
  242. package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
  243. package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
  244. package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
  245. package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
  246. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
  247. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
  248. package/dist/slash-commands-MDSDSWYF.js +92 -0
  249. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  250. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  251. package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
  252. package/dist/tasks-R6P6OV22.js +36 -0
  253. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
  254. package/dist/tools-6OCQ6SVB.js +28 -0
  255. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  256. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  257. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  258. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  259. package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
  260. package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
  261. package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
  262. package/dist/verify-HYF7KBVE.js +30 -0
  263. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  264. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  265. package/dist/wiki-generate-RK7JQ5NP.js +615 -0
  266. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  267. package/dist/worker/entry.js +108 -95
  268. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  269. package/docs/README.md +7 -6
  270. package/docs/architecture/acp.md +10 -0
  271. package/docs/architecture/architecture.md +5 -5
  272. package/docs/architecture/context-engine.md +45 -60
  273. package/docs/architecture/context-working-set.md +7 -9
  274. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  275. package/docs/architecture/evidence-and-memory.md +10 -0
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  278. package/docs/architecture/session-lifecycle.md +4 -4
  279. package/docs/architecture/tui-design.md +45 -30
  280. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  281. package/docs/guide/commands-and-modes.md +75 -61
  282. package/docs/guide/configuration-and-targets.md +126 -26
  283. package/docs/guide/configuration-reference.md +22 -7
  284. package/docs/guide/environment-variables.md +6 -2
  285. package/docs/guide/fleet-dispatch.md +13 -6
  286. package/docs/guide/glossary.md +1 -1
  287. package/docs/guide/installation-and-lifecycle.md +79 -20
  288. package/docs/guide/proactive-memory.md +1 -1
  289. package/docs/guide/skills-marketplace.md +11 -3
  290. package/docs/guide/tool-usage.md +9 -2
  291. package/docs/process/development-pipeline.md +11 -11
  292. package/docs/process/documentation-coverage.md +1 -1
  293. package/docs/process/documentation-guide.md +2 -2
  294. package/docs/process/eval-runner.md +15 -0
  295. package/docs/process/evals-internal.md +1 -1
  296. package/docs/process/release-cut-checklist.md +24 -12
  297. package/evals/README.md +4 -0
  298. package/evals/behavioral-corpus-grader.mjs +147 -14
  299. package/evals/behavioral-model-negative-control.yaml +1 -0
  300. package/evals/behavioral-model.yaml +266 -1
  301. package/evals/fixtures/docs-retrieval.json +102 -0
  302. package/evals/fixtures/scalar-decision.json +17 -0
  303. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  304. package/evals/fixtures/source-explanation.json +74 -0
  305. package/evals/fixtures/tool-arguments.json +18 -0
  306. package/evals/fixtures/tool-surface/read.txt +4 -0
  307. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  308. package/evals/no-edit-memory-grader.mjs +149 -0
  309. package/evals/scalar-decision-grader.py +41 -0
  310. package/evals/scalar-decision-machinery.ts +145 -0
  311. package/evals/source-explanation-grader.mjs +118 -0
  312. package/evals/tool-surface-grader.mjs +53 -0
  313. package/evals/tool-surface-model.yaml +274 -0
  314. package/package.json +14 -14
  315. package/skills/README.md +6 -6
  316. package/skills/registry.yaml +1 -1
  317. package/skills/skill-marketplace.json +1 -1
  318. package/src/cli/ask.ts +10 -10
  319. package/src/cli/bootstrap-generate.ts +6 -0
  320. package/src/cli/config-inspect.ts +24 -7
  321. package/src/cli/config-trust.ts +62 -0
  322. package/src/cli/config.ts +8 -0
  323. package/src/cli/configure-editor.ts +51 -0
  324. package/src/cli/configure-interop.ts +1 -1
  325. package/src/cli/configure-oauth.ts +1 -1
  326. package/src/cli/configure-onboarding.ts +232 -96
  327. package/src/cli/configure-prompts.ts +76 -0
  328. package/src/cli/configure-quick.ts +274 -0
  329. package/src/cli/configure-target.ts +14 -2
  330. package/src/cli/configure.ts +413 -174
  331. package/src/cli/context-map.ts +75 -14
  332. package/src/cli/context.ts +46 -17
  333. package/src/cli/eval.ts +17 -3
  334. package/src/cli/modes/print.ts +32 -4
  335. package/src/cli/oauth-manual-input.ts +1 -1
  336. package/src/cli/reset.ts +2 -0
  337. package/src/cli/run.ts +16 -14
  338. package/src/cli/select.ts +35 -4
  339. package/src/cli/skills-eval.ts +10 -8
  340. package/src/cli/steer-channel.ts +31 -18
  341. package/src/cli/targets.ts +83 -31
  342. package/src/cli/tasks.ts +10 -1
  343. package/src/cli/upgrade.ts +11 -8
  344. package/src/cli/usage.ts +24 -0
  345. package/src/cli/wiki-generate.ts +239 -96
  346. package/src/core/bash-exec.ts +43 -15
  347. package/src/core/bus-events.ts +15 -0
  348. package/src/core/config.ts +39 -15
  349. package/src/core/defaults.ts +38 -15
  350. package/src/{interactive → core}/external-editor.ts +4 -4
  351. package/src/core/file-references.ts +11 -1
  352. package/src/core/incomplete-installation.ts +3 -1
  353. package/src/core/settings-layers.ts +21 -5
  354. package/src/core/termination.ts +26 -9
  355. package/src/core/untrusted-content.ts +16 -0
  356. package/src/core/workspace-trust.ts +179 -0
  357. package/src/domains/agents/builtins/coder.md +4 -2
  358. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  359. package/src/domains/agents/builtins/documenter.md +7 -4
  360. package/src/domains/agents/builtins/researcher.md +1 -0
  361. package/src/domains/agents/builtins/scout.md +7 -1
  362. package/src/domains/agents/result-contract.ts +199 -26
  363. package/src/domains/config/classify.ts +1 -1
  364. package/src/domains/config/keybindings.ts +3 -31
  365. package/src/domains/context/bootstrap-prompt.ts +11 -9
  366. package/src/domains/context/bootstrap.ts +74 -39
  367. package/src/domains/context/clio-md.ts +88 -26
  368. package/src/domains/context/codewiki/build-operation.ts +121 -0
  369. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  370. package/src/domains/context/codewiki/build-worker.ts +3 -35
  371. package/src/domains/context/codewiki/coordinator.ts +36 -6
  372. package/src/domains/context/codewiki/indexer.ts +59 -19
  373. package/src/domains/context/contract.ts +6 -2
  374. package/src/domains/context/extension.ts +72 -10
  375. package/src/domains/context/fingerprint.ts +39 -34
  376. package/src/domains/context/index.ts +7 -1
  377. package/src/domains/context/prompt-context.ts +55 -14
  378. package/src/domains/context/refresh.ts +9 -57
  379. package/src/domains/context/wiki/assemble.ts +14 -10
  380. package/src/domains/context/wiki/evidence.ts +209 -0
  381. package/src/domains/context/wiki/generate.ts +201 -67
  382. package/src/domains/context/wiki/meta.ts +10 -2
  383. package/src/domains/context/wiki/plan-store.ts +70 -14
  384. package/src/domains/context/wiki/plan.ts +71 -14
  385. package/src/domains/context/wiki/prompts.ts +42 -1
  386. package/src/domains/context/wiki/source-content.ts +106 -0
  387. package/src/domains/context/wiki/staleness.ts +33 -22
  388. package/src/domains/context/working-set/contract.ts +8 -2
  389. package/src/domains/context/working-set/engine.ts +17 -4
  390. package/src/domains/context/working-set/fold.ts +15 -2
  391. package/src/domains/context/working-set/marker.ts +2 -1
  392. package/src/domains/context/working-set/project.ts +18 -7
  393. package/src/domains/context/working-set/recall.ts +82 -56
  394. package/src/domains/dispatch/active-route-planner.ts +6 -3
  395. package/src/domains/dispatch/admission-queue.ts +19 -7
  396. package/src/domains/dispatch/admission.ts +3 -3
  397. package/src/domains/dispatch/budget-envelope.ts +47 -82
  398. package/src/domains/dispatch/capacity-lease.ts +57 -19
  399. package/src/domains/dispatch/contract.ts +10 -2
  400. package/src/domains/dispatch/event-pump.ts +28 -7
  401. package/src/domains/dispatch/execution-role.ts +49 -2
  402. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  403. package/src/domains/dispatch/extension.ts +190 -105
  404. package/src/domains/dispatch/fleet-run.ts +20 -0
  405. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  406. package/src/domains/dispatch/parallel-writers.ts +34 -0
  407. package/src/domains/dispatch/reservation-store.ts +8 -34
  408. package/src/domains/dispatch/route-approval.ts +3 -3
  409. package/src/domains/dispatch/route-observer.ts +4 -2
  410. package/src/domains/dispatch/route-quality.ts +6 -1
  411. package/src/domains/dispatch/types.ts +4 -3
  412. package/src/domains/dispatch/worker-spawn.ts +58 -21
  413. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  414. package/src/domains/eval/compare/behavioral.ts +81 -14
  415. package/src/domains/eval/compare/compare.ts +15 -5
  416. package/src/domains/eval/compare/envelope.ts +12 -5
  417. package/src/domains/eval/metrics/context.ts +24 -1
  418. package/src/domains/eval/metrics/tracked.ts +4 -28
  419. package/src/domains/eval/reports/comparison.ts +9 -9
  420. package/src/domains/eval/runners/clio-run.ts +5 -1
  421. package/src/domains/eval/schema/suite.ts +2 -0
  422. package/src/domains/eval/schema/validate.ts +1 -0
  423. package/src/domains/eval/suites/run.ts +189 -13
  424. package/src/domains/eval/verifiers/integrity.ts +39 -0
  425. package/src/domains/eval/verifiers/patch.ts +58 -2
  426. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  427. package/src/domains/evidence/build.ts +4 -2
  428. package/src/domains/interop/registry.ts +2 -2
  429. package/src/domains/middleware/hooks-io.ts +45 -26
  430. package/src/domains/middleware/hooks.ts +6 -0
  431. package/src/domains/middleware/injection-screen.ts +23 -0
  432. package/src/domains/middleware/rules.ts +5 -1
  433. package/src/domains/middleware/stalled-turn.ts +18 -3
  434. package/src/domains/middleware/task-board-reminder.ts +4 -2
  435. package/src/domains/middleware/task-nudge.ts +4 -1
  436. package/src/domains/mux/contract.ts +34 -1
  437. package/src/domains/mux/dock-controller.ts +8 -1
  438. package/src/domains/mux/index.ts +1 -0
  439. package/src/domains/mux/socket-client.ts +13 -3
  440. package/src/domains/observability/contract.ts +2 -2
  441. package/src/domains/observability/projection.ts +30 -9
  442. package/src/domains/prompts/compiler.ts +10 -2
  443. package/src/domains/prompts/contract.ts +7 -4
  444. package/src/domains/prompts/extension.ts +28 -64
  445. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  446. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  447. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  448. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  449. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  450. package/src/domains/prompts/preload-prefix.ts +31 -0
  451. package/src/domains/prompts/preload.ts +135 -61
  452. package/src/domains/providers/auth/backend-file.ts +15 -11
  453. package/src/domains/providers/auth/storage.ts +3 -5
  454. package/src/domains/providers/catalog.ts +18 -3
  455. package/src/domains/providers/probe/fingerprint.ts +13 -6
  456. package/src/domains/providers/probe/reasoning.ts +2 -0
  457. package/src/domains/providers/runtime-resolution.ts +11 -9
  458. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  459. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  460. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  461. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  462. package/src/domains/resources/skills/promotion.ts +8 -1
  463. package/src/domains/safety/action-classifier.ts +9 -0
  464. package/src/domains/safety/autonomy.ts +10 -1
  465. package/src/domains/safety/contract.ts +5 -1
  466. package/src/domains/safety/default-path-policy.ts +11 -0
  467. package/src/domains/safety/extension.ts +11 -2
  468. package/src/domains/safety/policy-engine.ts +189 -32
  469. package/src/domains/safety/project-policy.ts +7 -2
  470. package/src/domains/safety/workspace-trust.ts +43 -0
  471. package/src/domains/session/compaction/compact.ts +384 -21
  472. package/src/domains/session/compaction/cut-point.ts +42 -5
  473. package/src/domains/session/compaction/tokens.ts +9 -1
  474. package/src/domains/session/decision-board.ts +43 -33
  475. package/src/domains/session/entries.ts +169 -4
  476. package/src/domains/session/prompt-manifest.ts +47 -8
  477. package/src/domains/session/task-board.ts +21 -3
  478. package/src/domains/user-tasks/handoff.ts +16 -0
  479. package/src/engine/acp/adapter.ts +44 -12
  480. package/src/engine/acp/server.ts +1 -0
  481. package/src/engine/acp/transport.ts +2 -1
  482. package/src/engine/acp/types.ts +6 -1
  483. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  484. package/src/engine/api-registry.ts +19 -2
  485. package/src/engine/apis/openai-completions.ts +13 -6
  486. package/src/engine/apis/output-budget.ts +26 -10
  487. package/src/engine/claude/sdk-runtime.ts +4 -3
  488. package/src/engine/env-api-keys.ts +2 -1
  489. package/src/engine/external-subprocess.ts +14 -3
  490. package/src/engine/loop-guard.ts +19 -2
  491. package/src/engine/provider-diagnostics.ts +129 -0
  492. package/src/engine/provider-payload.ts +3 -1
  493. package/src/engine/worker-runtime.ts +13 -2
  494. package/src/engine/worker-tools.ts +5 -1
  495. package/src/entry/extension-reload.ts +1 -0
  496. package/src/entry/orchestrator.ts +53 -15
  497. package/src/interactive/application-controller.ts +1 -31
  498. package/src/interactive/chat-loop-messages.ts +12 -4
  499. package/src/interactive/chat-loop.ts +115 -45
  500. package/src/interactive/chat-panel.ts +163 -637
  501. package/src/interactive/chat-renderer.ts +73 -30
  502. package/src/interactive/context-recall-command.ts +2 -1
  503. package/src/interactive/dispatch-board.ts +18 -5
  504. package/src/interactive/editor-submit.ts +21 -31
  505. package/src/interactive/footer/dashboard.ts +8 -3
  506. package/src/interactive/footer/widgets.ts +50 -91
  507. package/src/interactive/interactive-application.ts +24 -44
  508. package/src/interactive/interactive-event-projection.ts +9 -45
  509. package/src/interactive/interactive-input-runtime.ts +3 -28
  510. package/src/interactive/interactive-presentation.ts +45 -16
  511. package/src/interactive/interactive-slash-runtime.ts +5 -40
  512. package/src/interactive/layout.ts +31 -5
  513. package/src/interactive/model-session-replay.ts +2 -2
  514. package/src/interactive/overlay-frame.ts +1 -0
  515. package/src/interactive/overlay-general-openers.ts +5 -1
  516. package/src/interactive/overlay-lifecycle.ts +1 -0
  517. package/src/interactive/overlay-session-lifecycle.ts +7 -1
  518. package/src/interactive/overlays/ask-user.ts +1 -0
  519. package/src/interactive/overlays/message-picker.ts +1 -1
  520. package/src/interactive/overlays/settings.ts +9 -8
  521. package/src/interactive/renderers/preview.ts +16 -0
  522. package/src/interactive/renderers/tool-execution.ts +84 -161
  523. package/src/interactive/renderers/worker-entry.ts +74 -43
  524. package/src/interactive/slash-autocomplete.ts +1 -6
  525. package/src/interactive/slash-commands.ts +16 -46
  526. package/src/interactive/status/controller.ts +0 -5
  527. package/src/interactive/status/state-machine.ts +44 -26
  528. package/src/interactive/status/types.ts +3 -0
  529. package/src/interactive/status/verbs.ts +13 -12
  530. package/src/interactive/transcript-detail.ts +50 -112
  531. package/src/interactive/turn-context.ts +221 -53
  532. package/src/interactive/turn-middleware.ts +3 -1
  533. package/src/interactive/turn-persistence.ts +3 -0
  534. package/src/interactive/turn-runtime.ts +11 -2
  535. package/src/interactive/turn-state.ts +10 -9
  536. package/src/interactive/view/artifacts.ts +4 -0
  537. package/src/interactive/view/view-overlay.ts +44 -34
  538. package/src/interactive/watch-pane.ts +18 -4
  539. package/src/interactive/worker-stream.ts +7 -7
  540. package/src/tools/agent-tools.ts +6 -3
  541. package/src/tools/bash.ts +1 -1
  542. package/src/tools/builtin-tool-catalog.ts +9 -2
  543. package/src/tools/codewiki/code-nav.ts +4 -10
  544. package/src/tools/compete-judge-task.ts +71 -0
  545. package/src/tools/compete-worktrees.ts +34 -0
  546. package/src/tools/context/index.ts +32 -7
  547. package/src/tools/context/surface.ts +15 -4
  548. package/src/tools/decide.ts +1 -1
  549. package/src/tools/dispatch-admission.ts +12 -1
  550. package/src/tools/dispatch-arguments.ts +38 -1
  551. package/src/tools/dispatch-plan.ts +7 -7
  552. package/src/tools/dispatch-runner.ts +48 -32
  553. package/src/tools/dispatch-schema.ts +30 -23
  554. package/src/tools/dispatch-scout-admission.ts +10 -44
  555. package/src/tools/dispatch-scout.ts +2 -3
  556. package/src/tools/find.ts +13 -4
  557. package/src/tools/grep.ts +13 -1
  558. package/src/tools/ls.ts +7 -1
  559. package/src/tools/monitor.ts +26 -11
  560. package/src/tools/network-policy.ts +11 -24
  561. package/src/tools/observation.ts +39 -2
  562. package/src/tools/presentation.ts +1 -1
  563. package/src/tools/read.ts +112 -15
  564. package/src/tools/registry.ts +55 -18
  565. package/src/tools/result-shaping.ts +110 -2
  566. package/src/tools/tasks.ts +33 -7
  567. package/src/tools/verify/frontend.ts +67 -30
  568. package/src/tools/verify/numeric.ts +10 -5
  569. package/src/tools/web-fetch-network.ts +179 -0
  570. package/src/tools/web-fetch-surface.ts +2 -1
  571. package/src/tools/web-fetch.ts +15 -13
  572. package/src/tools/worker-evidence.ts +27 -0
  573. package/src/worker/spec-contract.ts +12 -8
  574. package/dist/builtins-WGALA46I.js +0 -22
  575. package/dist/chunk-2WZ546HR.js +0 -792
  576. package/dist/chunk-5PSMVOLM.js +0 -56
  577. package/dist/chunk-EL24TAU4.js +0 -1560
  578. package/dist/chunk-IZXGRF7P.js +0 -4048
  579. package/dist/chunk-JVCV3ICN.js +0 -47
  580. package/dist/chunk-MNJGS2IN.js +0 -33
  581. package/dist/chunk-O5CVSAG5.js +0 -122
  582. package/dist/chunk-ODGTEFFI.js +0 -50
  583. package/dist/chunk-OQE5J4C6.js +0 -73
  584. package/dist/chunk-UUVG37B4.js +0 -244
  585. package/dist/chunk-V6HJFQZE.js +0 -228
  586. package/dist/clio-QLICPCF5.js +0 -25
  587. package/dist/configure-VEPX4NMX.js +0 -55
  588. package/dist/context-clear-S4ZJCQUX.js +0 -182
  589. package/dist/detail-A7JAVSIG.js +0 -98
  590. package/dist/evidence-4F5USFKH.js +0 -208
  591. package/dist/fleet-view-MN2VG4MR.js +0 -101
  592. package/dist/inventory-C26CFDRR.js +0 -101
  593. package/dist/preload-P6DGH2PZ.js +0 -13
  594. package/dist/slash-commands-ZXPJD64J.js +0 -92
  595. package/dist/tasks-IPAGMEIX.js +0 -36
  596. package/dist/tools-EFFEAIDP.js +0 -28
  597. package/dist/verify-FWYGPKMR.js +0 -29
  598. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -12,6 +12,7 @@ import {
12
12
  } from "../domains/dispatch/gate-role-prompts.js";
13
13
  import { narrowDispatchIntentToReadOnly, normalizeDispatchIntent } from "../domains/dispatch/intent.js";
14
14
  import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
15
+ import { parallelWriterConflict } from "../domains/dispatch/parallel-writers.js";
15
16
  import { approvedRouteCandidates } from "../domains/dispatch/route-approval.js";
16
17
  import { defaultRoutingIntent } from "../domains/dispatch/routing-intent.js";
17
18
  import type { DispatchFailoverMode } from "../domains/dispatch/validation.js";
@@ -26,6 +27,7 @@ import {
26
27
  DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT,
27
28
  type DispatchPlanView,
28
29
  describeDispatchPlan,
30
+ dispatchPlanTopology,
29
31
  RESOLVED_DISPATCH_PLAN_ARGUMENT,
30
32
  type ResolvedDispatchPlanArtifact,
31
33
  resolvedDispatchPlanFromArgs,
@@ -533,6 +535,10 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
533
535
  if (args.writers === 1 && mode !== "parallel") {
534
536
  return shapeRejection(args, "dispatch: writers is supported only for parallel dispatch");
535
537
  }
538
+ if (mode === "parallel" && args.writers !== 1) {
539
+ const conflict = parallelWriterConflict(parsed.requests, deps.getAgentSpecs());
540
+ if (conflict !== null) return shapeRejection(args, conflict);
541
+ }
536
542
  const parentCheckout = gitCheckoutRoot(process.cwd());
537
543
  for (const request of parsed.requests) {
538
544
  if (request.worktree !== true) continue;
@@ -605,6 +611,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
605
611
  resolveTask(
606
612
  {
607
613
  agentId: gateDeciderAgentId(reviewResult.review.reviewer),
614
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
608
615
  executionRole: "reviewer",
609
616
  task: renderDispatchReviewerTask(base.task, subject.runId, cycle, base.intent),
610
617
  systemPrompt: REVIEWER_GATE_PROMPT,
@@ -640,6 +647,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
640
647
  resolveTask(
641
648
  {
642
649
  agentId: gateDeciderAgentId(compete.judge?.agent),
650
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
643
651
  executionRole: "judge",
644
652
  task: `Plan-time capability check for the ${compete.candidates}-candidate judge.`,
645
653
  systemPrompt: JUDGE_GATE_PROMPT,
@@ -712,6 +720,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
712
720
  if (council.synthesis === "judge") {
713
721
  const judgeRequest: DispatchRequest = {
714
722
  agentId: council.judge?.agent ?? base.agentId,
723
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
715
724
  executionRole: "judge",
716
725
  task: "Plan-time capability check for council synthesis.",
717
726
  systemPrompt: COUNCIL_JUDGE_PROMPT,
@@ -738,7 +747,9 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
738
747
  for (const [index, request] of parsed.requests.entries()) tasks.push(resolveTask(request, "task", index + 1));
739
748
  }
740
749
 
741
- const topology = describeDispatchPlan(args).topology;
750
+ // Scope has already been resolved on tasks. Rendering the raw call here
751
+ // would discard its typed intent and run legacy prose inference again.
752
+ const topology = dispatchPlanTopology(args);
742
753
  const planScale =
743
754
  tasks.length > 1 ||
744
755
  topology === "compete" ||
@@ -1,5 +1,6 @@
1
1
  /** Pure model-argument parsing; every returned DispatchRequest has a concrete agent id. */
2
2
 
3
+ import { parseResultSummaryMaxBytes } from "../domains/agents/result-contract.js";
3
4
  import type { AgentAutomationAuthority } from "../domains/agents/spec.js";
4
5
  import { type AgentTaskType, classifyAgentTask } from "../domains/dispatch/agent-candidates.js";
5
6
  import { cloneDispatchBudgetRequest } from "../domains/dispatch/budget-envelope.js";
@@ -108,6 +109,29 @@ export function maxOutputBytesArg(args: Record<string, unknown>): number {
108
109
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : DEFAULT_MAX_OUTPUT_BYTES;
109
110
  }
110
111
 
112
+ /**
113
+ * The caller's inline-summary allowance, range-checked here so a bad value is
114
+ * a tool error rather than a sealed run failure. The scope records whether
115
+ * this assignment set it or inherited a batch default (see
116
+ * `dispatchResultContract`).
117
+ */
118
+ function resultSummaryArg(
119
+ args: Record<string, unknown>,
120
+ scope: "task" | "batch",
121
+ ): { ok: true; value: DispatchRequest["resultSummary"] } | { ok: false; message: string } {
122
+ if (!("result_summary_max_bytes" in args) || args.result_summary_max_bytes === undefined) {
123
+ return { ok: true, value: undefined };
124
+ }
125
+ try {
126
+ return {
127
+ ok: true,
128
+ value: { maxBytes: parseResultSummaryMaxBytes(args.result_summary_max_bytes, "result_summary_max_bytes"), scope },
129
+ };
130
+ } catch (error) {
131
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
132
+ }
133
+ }
134
+
111
135
  export function timeoutMsArg(args: Record<string, unknown>): number | undefined {
112
136
  const value = args.timeout_ms;
113
137
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
@@ -116,6 +140,7 @@ export function timeoutMsArg(args: Record<string, unknown>): number | undefined
116
140
  function dispatchRequestFromArgs(
117
141
  args: Record<string, unknown>,
118
142
  options: DispatchArgumentParserOptions,
143
+ resultSummaryScope: "task" | "batch" = "task",
119
144
  ): { ok: true; request: DispatchRequest } | { ok: false; message: string } {
120
145
  const task = stringArg(args, "task");
121
146
  if (!task) return { ok: false, message: "missing task (pass list:true to see available agents)" };
@@ -223,6 +248,9 @@ function dispatchRequestFromArgs(
223
248
  }
224
249
  }
225
250
  }
251
+ const resultSummary = resultSummaryArg(args, resultSummaryScope);
252
+ if (!resultSummary.ok) return resultSummary;
253
+ if (resultSummary.value !== undefined) request.resultSummary = resultSummary.value;
226
254
  if ("persona" in args && args.persona !== undefined) {
227
255
  if (typeof args.persona !== "string") return { ok: false, message: "persona must be a string" };
228
256
  const persona = args.persona.trim();
@@ -278,10 +306,19 @@ export function dispatchRequestsFromArgs(
278
306
  for (let index = 0; index < tasks.length; index += 1) {
279
307
  const item = tasks[index];
280
308
  const itemArgs: Record<string, unknown> = isRecord(item) ? { ...shared, ...item } : { ...shared, task: item };
309
+ // A shared allowance over several members is inherited, not chosen for
310
+ // each of them; a one-task batch is the single-task form the tool
311
+ // normalizes every call into, so its shared value is that task's own.
312
+ const resultSummaryScope =
313
+ tasks.length > 1 &&
314
+ Object.hasOwn(shared, "result_summary_max_bytes") &&
315
+ !(isRecord(item) && Object.hasOwn(item, "result_summary_max_bytes"))
316
+ ? "batch"
317
+ : "task";
281
318
  const sharedIntent = isRecord(shared.intent) ? shared.intent : null;
282
319
  const itemIntent = isRecord(item) && Object.hasOwn(item, "intent") && isRecord(item.intent) ? item.intent : null;
283
320
  if (sharedIntent !== null && itemIntent !== null) itemArgs.intent = { ...sharedIntent, ...itemIntent };
284
- const parsed = dispatchRequestFromArgs(itemArgs, options);
321
+ const parsed = dispatchRequestFromArgs(itemArgs, options, resultSummaryScope);
285
322
  if (!parsed.ok) return { ok: false, message: `dispatch: task ${index + 1}: ${parsed.message}` };
286
323
  if (sharedIntent !== null && itemIntent !== null) {
287
324
  if (options.resolveIntent === undefined) {
@@ -376,7 +376,8 @@ function canonicalCandidates(value: unknown): DispatchFailoverCandidate[] | null
376
376
  return out.length > 0 ? out : null;
377
377
  }
378
378
 
379
- function topologyOf(args: Record<string, unknown>): DispatchPlanTopology {
379
+ /** Select topology without rendering unresolved task scope or consulting provider state. */
380
+ export function dispatchPlanTopology(args: Record<string, unknown>): DispatchPlanTopology {
380
381
  if (isRecord(args.apply_winner)) return "compete";
381
382
  if (args.mode === "compete") return "compete";
382
383
  if (args.mode === "council") return "council";
@@ -400,8 +401,8 @@ function renderPlanText(
400
401
  ): string {
401
402
  const lines = [
402
403
  `dispatch plan: topology=${topology} tasks=${tasks.length}`,
403
- `cost ceiling: ${costCeilingUsd === undefined ? "unavailable" : `$${costCeilingUsd.toFixed(4)}`}`,
404
- `deadline: ${deadlineMs === null ? "per-assignment" : `${deadlineMs}ms whole-plan`}`,
404
+ `advisory session cost baseline: ${costCeilingUsd === undefined ? "unavailable" : `$${costCeilingUsd.toFixed(4)}`}`,
405
+ `deadline: ${deadlineMs === null ? "none (advisory planning)" : `${deadlineMs}ms whole-plan`}`,
405
406
  ];
406
407
  if (confirmation !== undefined) {
407
408
  lines.push(
@@ -450,7 +451,7 @@ function renderPlanText(
450
451
  const approval = task.routeApproval;
451
452
  const selected = approval.decision.selected;
452
453
  lines.push(
453
- ` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs} maxAttempts=${approval.maxAttempts}`,
454
+ ` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs ?? "none"} maxAttempts=${approval.maxAttempts}`,
454
455
  );
455
456
  }
456
457
  if (task.agentSelection !== null) {
@@ -778,8 +779,7 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
778
779
  !Number.isInteger(value.maxWorkers) ||
779
780
  Number(value.maxWorkers) < 1 ||
780
781
  (value.onFailure !== "stop" && value.onFailure !== "continue") ||
781
- !Number.isInteger(value.deadlineMs) ||
782
- Number(value.deadlineMs) < 1
782
+ (value.deadlineMs !== null && (!Number.isInteger(value.deadlineMs) || Number(value.deadlineMs) < 1))
783
783
  )
784
784
  return null;
785
785
  if (
@@ -902,7 +902,7 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
902
902
  const args = prepareDispatchArguments(rawArgs ?? {});
903
903
  const preparationFailed = typeof args[DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT] === "string";
904
904
  const resolved = resolvedDispatchPlanFromArgs(args);
905
- const topology = resolved?.topology ?? topologyOf(args);
905
+ const topology = resolved?.topology ?? dispatchPlanTopology(args);
906
906
  const tasks = resolved?.tasks ?? taskViews(args);
907
907
  const costCeilingUsd = resolved?.costCeilingUsd;
908
908
  const deadlineMs = resolved?.deadlineMs ?? null;
@@ -51,6 +51,7 @@ import { summarizeTrustStatus } from "../domains/evidence/trust-projection.js";
51
51
  import { adaptRunReceiptTrustStatus } from "../domains/evidence/trust-status.js";
52
52
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
53
53
  import { activeDecisionRefs } from "../domains/session/decision-board.js";
54
+ import { renderCompeteJudgeTask } from "./compete-judge-task.js";
54
55
  import {
55
56
  type CandidateWorktree,
56
57
  type CompeteGroupOwnership,
@@ -560,7 +561,12 @@ function dispatchDetails(
560
561
  }
561
562
  return {
562
563
  mode,
563
- assignmentIds: runs.map((run) => run.receipt.lineage?.rootRunId ?? run.receipt.runId),
564
+ assignmentIds: runs.map(
565
+ (run) =>
566
+ deps.dispatch.assignments?.getStored(run.receipt.runId)?.assignmentId ??
567
+ run.receipt.lineage?.rootRunId ??
568
+ run.receipt.runId,
569
+ ),
564
570
  terminalRunIds: runs.map((run) => run.receipt.runId),
565
571
  receiptCount: runs.length,
566
572
  failedCount: failed.length,
@@ -787,6 +793,7 @@ async function runReviewGated(
787
793
  }
788
794
  const reviewerRequest: DispatchRequest = {
789
795
  agentId: gateDeciderAgentId(review.reviewer),
796
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
790
797
  executionRole: "reviewer",
791
798
  task: renderDispatchReviewerTask(base.task, builder.receipt.runId, cycle, base.intent),
792
799
  systemPrompt: REVIEWER_GATE_PROMPT,
@@ -865,20 +872,6 @@ async function runReviewGated(
865
872
  }
866
873
  }
867
874
 
868
- function judgeTask(originalTask: string, candidates: ReadonlyArray<CandidateWorktree>, stats: string[]): string {
869
- const lines = [
870
- `Rank ${candidates.length} candidate implementations of this task and pick the best one.`,
871
- "Original task:",
872
- originalTask,
873
- "Candidates:",
874
- ...candidates.map(
875
- (candidate, index) =>
876
- ` ${candidate.index}. branch=${candidate.branch} worktree=${candidate.path} (${stats[index] ?? "?"})`,
877
- ),
878
- ];
879
- return lines.join("\n\n");
880
- }
881
-
882
875
  function readVerifiedGateReceipt(deps: DispatchToolDeps, runId: string): RunReceipt | null {
883
876
  const envelope = deps.dispatch.getRun(runId);
884
877
  if (envelope === null) return null;
@@ -1173,6 +1166,11 @@ async function runCompete(
1173
1166
  const throwIfStopped = (): void => {
1174
1167
  if (stop !== null) throw new Error(stop.message);
1175
1168
  };
1169
+ // A stopped phase still has terminal receipts worth reporting. Keep the
1170
+ // ordinary error result and no winner, without discarding those identities
1171
+ // through the generic exception path after the settlement barrier.
1172
+ const stoppedOutcome = (): CompeteOutcome | null =>
1173
+ stop === null ? null : { runs, decisions, group, winner: null, needsDecision: stop.message };
1176
1174
  const settleRun = async (
1177
1175
  handle: Awaited<ReturnType<DispatchContract["dispatch"]>>,
1178
1176
  request: DispatchRequest,
@@ -1331,7 +1329,8 @@ async function runCompete(
1331
1329
  });
1332
1330
  const candidateRuns = await settledCompletedRuns(candidateOwned, "candidate settlement");
1333
1331
  runs.push(...candidateRuns);
1334
- throwIfStopped();
1332
+ const stoppedCandidates = stoppedOutcome();
1333
+ if (stoppedCandidates !== null) return stoppedCandidates;
1335
1334
  const stats = worktrees.map((worktree, index) => {
1336
1335
  const receipt = candidateRuns[index]?.receipt;
1337
1336
  const failed = receipt !== undefined && isPipelineStepFailure(receipt);
@@ -1356,8 +1355,22 @@ async function runCompete(
1356
1355
  }
1357
1356
  const judgeRequest: DispatchRequest = {
1358
1357
  agentId: gateDeciderAgentId(compete.judge?.agent),
1358
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
1359
1359
  executionRole: "judge",
1360
- task: judgeTask(base.task, worktrees, stats),
1360
+ task: renderCompeteJudgeTask(base.task, worktrees, stats, candidateRuns),
1361
+ // Candidate prose and receipt locators are evidence, not inferred authority.
1362
+ // Read-only execution is enforced by the role/autonomy, not empty write roots.
1363
+ intent: narrowDispatchIntentToReadOnly(
1364
+ base.intent ?? {
1365
+ version: 2,
1366
+ readRoots: [],
1367
+ writeRoots: [],
1368
+ relevantPaths: [],
1369
+ pathProvenance: [],
1370
+ expectedOutputs: [],
1371
+ verification: [],
1372
+ },
1373
+ ),
1361
1374
  systemPrompt: JUDGE_GATE_PROMPT,
1362
1375
  autonomy: "read-only",
1363
1376
  cwd: root,
@@ -1390,7 +1403,8 @@ async function runCompete(
1390
1403
  const judgeRun = (await settledCompletedRuns([judgeOwned], "judge settlement"))[0];
1391
1404
  if (judgeRun === undefined) throw new Error("judge produced no completed run");
1392
1405
  runs.push(judgeRun);
1393
- throwIfStopped();
1406
+ const stoppedJudge = stoppedOutcome();
1407
+ if (stoppedJudge !== null) return stoppedJudge;
1394
1408
  const judgeReceipt = judgeRun.receipt;
1395
1409
  const judgeSummary = judgeRun.summary;
1396
1410
  // Every judged outcome names the same subjects, decider, and correlation;
@@ -1532,7 +1546,7 @@ async function runCompete(
1532
1546
 
1533
1547
  // Losers are always cleaned; the winner's worktree and branch survive
1534
1548
  // only while an operator decision is pending (supervised pick or a
1535
- // failed merge). The durable state transition happens after the worker
1549
+ // failed merge). Every removed candidate is archived under a durable recovery ref. The durable state transition happens after the worker
1536
1550
  // barrier and before deletion, defining the safe restart boundary.
1537
1551
  const winnerAtFinalization = currentWinner();
1538
1552
  if (ownership !== null) {
@@ -1588,8 +1602,7 @@ async function runCompete(
1588
1602
  /**
1589
1603
  * Apply a preserved compete winner. Plan-scale by definition, so supervised
1590
1604
  * autonomy levels park this call for operator confirmation; the approval IS
1591
- * the winner confirmation. After a successful merge the whole compete group
1592
- * is cleaned up.
1605
+ * the winner confirmation. After a successful merge scratch worktrees are cleaned up; candidate recovery refs remain.
1593
1606
  */
1594
1607
  function runApplyWinner(
1595
1608
  input: { branch: string; cwd: string },
@@ -1736,7 +1749,7 @@ function runApplyWinner(
1736
1749
  }
1737
1750
  return {
1738
1751
  kind: "ok",
1739
- output: `winner ${branch} merged into the current branch; compete group ${group} cleaned up`,
1752
+ output: `winner ${branch} merged into the current branch; compete group ${group} scratch cleaned up; candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)`,
1740
1753
  details: {
1741
1754
  mode: "apply_winner",
1742
1755
  branch,
@@ -1801,14 +1814,14 @@ function competeResult(
1801
1814
  if (outcome.winner?.applied === true) {
1802
1815
  return {
1803
1816
  kind: "ok",
1804
- output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged)\n\n${body}`,
1817
+ output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged); candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)\n\n${body}`,
1805
1818
  details,
1806
1819
  };
1807
1820
  }
1808
1821
  if (outcome.winner !== null && outcome.needsDecision === undefined) {
1809
1822
  const lines = [
1810
1823
  `compete winner: candidate ${outcome.winner.index} (branch ${outcome.winner.branch}), preserved for confirmation at autonomy ${autonomy}`,
1811
- `Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing candidates were cleaned up.`,
1824
+ `Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing candidate states remain under refs/clio-coder/compete/; list them with git for-each-ref.`,
1812
1825
  ];
1813
1826
  return { kind: "ok", output: `${lines.join("\n")}\n\n${body}`, details };
1814
1827
  }
@@ -1998,6 +2011,7 @@ async function runCouncil(
1998
2011
  const finalRuns = [...prior.values()];
1999
2012
  const judgeRequest: DispatchRequest = {
2000
2013
  agentId: council.judge?.agent ?? base.agentId,
2014
+ ...(base.budget === undefined ? {} : { budget: base.budget }),
2001
2015
  executionRole: "judge",
2002
2016
  task: `Synthesize the council answers for this task:\n\n${base.task}`,
2003
2017
  briefing: boundedCouncilBriefing(
@@ -2165,6 +2179,7 @@ export async function runDispatchTool(
2165
2179
  // admission bounds. Keep these off the serializable approved request.
2166
2180
  const dispatch = deps.dispatch;
2167
2181
  const preparation = {
2182
+ ...(options?.hostRun === undefined ? {} : { hostRun: structuredClone(options.hostRun) }),
2168
2183
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
2169
2184
  ...(timeoutMs === undefined ? {} : { deadlineAt: Date.now() + timeoutMs }),
2170
2185
  };
@@ -2305,12 +2320,7 @@ export async function runDispatchTool(
2305
2320
  try {
2306
2321
  if (resolvedPlan?.topology === "fleet") {
2307
2322
  const executionPlan = admissionState.trustedExecutionPlans.get(args);
2308
- if (
2309
- executionPlan === undefined ||
2310
- resolvedPlan.source === null ||
2311
- resolvedPlan.deadlineMs === null ||
2312
- reservationOwnerId === undefined
2313
- ) {
2323
+ if (executionPlan === undefined || resolvedPlan.source === null || reservationOwnerId === undefined) {
2314
2324
  return { kind: "error", message: "dispatch: trusted Scout dependency plan is unavailable" };
2315
2325
  }
2316
2326
  if (executionPlan.hash !== resolvedPlan.source.executionPlanHash) {
@@ -2611,10 +2621,16 @@ async function runPipeline(
2611
2621
  const { receipt, summary } = await registered.completion;
2612
2622
  activeRunId = null;
2613
2623
  runs.push(completeRun(deps, receipt, summary));
2614
- if (isPipelineStepFailure(receipt)) {
2624
+ // Execution can succeed while a conforming report records a failed
2625
+ // check. Keep that receipt truthful, but do not feed failed quality
2626
+ // into a dependent step. Review/compete use failure to drive their
2627
+ // own repair loops, so this condition belongs only to the pipeline.
2628
+ const failedQuality = receipt.quality.resultContract?.quality === "fail";
2629
+ if (isPipelineStepFailure(receipt) || failedQuality) {
2615
2630
  const skipped = requests.length - (index + 1);
2631
+ const reason = isPipelineStepFailure(receipt) ? pipelineFailureReason(receipt) : "result quality=fail";
2616
2632
  throw new PipelineHaltError(
2617
- `pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${pipelineFailureReason(receipt)}); skipped ${skipped} later step(s)`,
2633
+ `pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${reason}); skipped ${skipped} later step(s)`,
2618
2634
  [...runs],
2619
2635
  );
2620
2636
  }
@@ -1,5 +1,6 @@
1
1
  import { type Static, Type } from "typebox";
2
2
  import type { FleetSettings } from "../core/defaults.js";
3
+ import { RESULT_SUMMARY_MAX_BYTES_CEILING } from "../domains/agents/result-contract.js";
3
4
  import { DISPATCH_BRIEFING_MAX_BYTES } from "../domains/dispatch/validation.js";
4
5
  import { StringEnum } from "../engine/ai.js";
5
6
  import { TOOL_PROFILE_NAMES } from "./profiles.js";
@@ -18,7 +19,7 @@ import { TOOL_PROFILE_NAMES } from "./profiles.js";
18
19
  export interface DispatchSchemaComposition {
19
20
  /** `roster`, `members`, `synthesis`, `rounds`: a council needs a configured roster to name. */
20
21
  council: boolean;
21
- /** `candidates`, `judge`, `apply_winner`: a compete needs more than one fleet route to compare. */
22
+ /** `candidates`, `judge`, `apply_winner`: distinct executions may share one fleet route. */
22
23
  compete: boolean;
23
24
  /** `routing.posture`, `minimumQuality`, `locality`, `failover`: they act only once adaptive routing is activated. */
24
25
  adaptiveRouting: boolean;
@@ -30,28 +31,15 @@ export const FULL_DISPATCH_SCHEMA_COMPOSITION: DispatchSchemaComposition = Objec
30
31
  adaptiveRouting: true,
31
32
  });
32
33
 
33
- type FleetShape = Pick<FleetSettings, "default" | "profiles" | "rosters" | "adaptiveRouting">;
34
-
35
- /** Distinct target/model routes the fleet can dispatch to: the default plus every profile and roster member. */
36
- function distinctFleetRoutes(fleet: FleetShape): number {
37
- const routes = new Set<string>();
38
- const add = (target: string | null | undefined, model: string | null | undefined): void => {
39
- if (!target) return;
40
- routes.add(`${target}${model ?? ""}`);
41
- };
42
- add(fleet.default.target, fleet.default.model);
43
- for (const profile of Object.values(fleet.profiles)) add(profile.target, profile.model);
44
- for (const roster of Object.values(fleet.rosters)) {
45
- for (const member of roster.members) add(member.target, member.model);
46
- }
47
- return routes.size;
48
- }
34
+ type FleetShape = Pick<FleetSettings, "rosters" | "adaptiveRouting">;
49
35
 
50
36
  export function dispatchSchemaCompositionFor(fleet: FleetShape): DispatchSchemaComposition {
51
37
  const routing = fleet.adaptiveRouting;
52
38
  return {
53
39
  council: Object.keys(fleet.rosters).length > 0,
54
- compete: distinctFleetRoutes(fleet) > 1,
40
+ // The runner isolates candidate executions and dispatches a separate judge;
41
+ // route diversity is not required. Normal admission still validates routes.
42
+ compete: true,
55
43
  adaptiveRouting: routing.roles.length > 0 || routing.postures.length > 0 || routing.agentRoles.length > 0,
56
44
  };
57
45
  }
@@ -85,7 +73,7 @@ const DispatchBudgetSchema = Type.Object(
85
73
  {
86
74
  additionalProperties: false,
87
75
  description:
88
- "Tool-call budget within the recipe's range; retryRevision preauthorizes one ceiling for a retry or revision phase.",
76
+ "Advisory tool-call estimate; choose appropriate counts even above recipe recommendations. retryRevision sets a retry/revision estimate. Crossing estimates does not stop work.",
89
77
  },
90
78
  );
91
79
 
@@ -124,7 +112,7 @@ const DispatchIntentSchema = Type.Object(
124
112
  {
125
113
  additionalProperties: false,
126
114
  description:
127
- "Repository-relative paths and outputs. Declare it on every dispatch: it selects the project rules that apply and pins worker context, where omitting it falls back to path tokens scraped from the task text. verification entries are declared check ids from package scripts or .clio-coder/verifiers.yaml. Per-task intent must fit inside the top-level intent.",
115
+ "Repository-relative paths and outputs. Declare it on every dispatch: it selects the project rules that apply and pins worker context, where omitting it falls back to path tokens scraped from the task text. verification entries are declared check ids from package scripts or .clio-coder/verifiers.yaml. Per-task intent fields override inherited top-level fields within its scope. For disjoint parallel writes, set each task's write_roots to only its assigned outputs; expected_outputs alone does not narrow write access.",
128
116
  },
129
117
  );
130
118
 
@@ -193,7 +181,12 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
193
181
  briefing: Type.Optional(
194
182
  Type.String({ description: `Per-task parent context, max ${DISPATCH_BRIEFING_MAX_BYTES} UTF-8 bytes.` }),
195
183
  ),
196
- agent: Type.Optional(Type.String({ description: "Recipe id (default coder)." })),
184
+ agent: Type.Optional(
185
+ Type.String({
186
+ description:
187
+ "Recipe id for this task: set scout/documenter explicitly in a mixed pipeline; names in task text do not select recipes, and omission inherits the batch/default recipe.",
188
+ }),
189
+ ),
197
190
  budget: Type.Optional(BudgetRef),
198
191
  target: Type.Optional(Type.String()),
199
192
  model: Type.Optional(Type.String()),
@@ -201,6 +194,13 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
201
194
  worktree: Type.Optional(Type.Literal(true, { description: "Run this writer in an isolated git worktree." })),
202
195
  intent: Type.Optional(IntentRef),
203
196
  gate: Type.Optional(Type.String({ description: "One declared check id, shorthand for intent.verification." })),
197
+ result_summary_max_bytes: Type.Optional(
198
+ Type.Integer({
199
+ minimum: 1,
200
+ maximum: RESULT_SUMMARY_MAX_BYTES_CEILING,
201
+ description: "This task's inline summary allowance; mutation-report workers (coder, documenter) only.",
202
+ }),
203
+ ),
204
204
  }),
205
205
  ]),
206
206
  { description: "Batch of assignments; one string or object is wrapped." },
@@ -284,8 +284,8 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
284
284
  agent: Type.Optional(
285
285
  Type.String({
286
286
  description: composition.council
287
- ? "Default recipe id for string tasks, or auto (default coder; researcher for council)."
288
- : "Default recipe id for string tasks, or auto (default coder).",
287
+ ? "Default recipe id for tasks without their own agent, or auto (default coder; researcher for council)."
288
+ : "Default recipe id for tasks without their own agent, or auto (default coder).",
289
289
  }),
290
290
  ),
291
291
  briefing: Type.Optional(
@@ -332,6 +332,13 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
332
332
  cwd: Type.Optional(Type.String({ description: "Default worker working directory." })),
333
333
  timeout_ms: Type.Optional(Type.Number({ description: "Abort the dispatch after this many ms." })),
334
334
  max_output_bytes: Type.Optional(Type.Number({ description: "Max summary bytes returned." })),
335
+ result_summary_max_bytes: Type.Optional(
336
+ Type.Integer({
337
+ minimum: 1,
338
+ maximum: RESULT_SUMMARY_MAX_BYTES_CEILING,
339
+ description: `UTF-8 byte allowance for a mutation-report worker's inline summary (coder, documenter), default 16384. A batch default applies to mutation-report steps only; other steps ignore it. Storage bound, not the returned preview (max_output_bytes).`,
340
+ }),
341
+ ),
335
342
  },
336
343
  { $defs: DISPATCH_DEFS },
337
344
  );
@@ -11,14 +11,11 @@ import type {
11
11
  } from "../domains/dispatch/contract.js";
12
12
  import { type ExecutionPlan, requireAgentSteps } from "../domains/dispatch/execution-plan.js";
13
13
  import { verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
14
- import { sameRouteIdentity } from "../domains/dispatch/route-decision.js";
15
14
  import type { RoutingIntent } from "../domains/dispatch/routing-intent.js";
16
15
  import { compileScoutTransition, type ScoutAgentBinding } from "../domains/dispatch/scout-transition.js";
17
16
  import type { RunEnvelope, RunReceipt } from "../domains/dispatch/types.js";
18
17
  import type { ResolvedDispatchPlanArtifact } from "./dispatch-plan.js";
19
18
 
20
- const MAX_SCOUT_PLAN_DEADLINE_MS = 3_600_000;
21
-
22
19
  export interface ScoutContinuationRef {
23
20
  runId: string;
24
21
  receiptDigest: string;
@@ -132,8 +129,8 @@ export function prepareScoutContinuation(input: {
132
129
  : {
133
130
  ...sourceIntent,
134
131
  posture: sourceIntent.posture === "manual" ? "balanced" : sourceIntent.posture,
135
- maxCostUsd: input.costCeilingUsd,
136
- deadlineMs: null,
132
+ maxCostUsd: sourceIntent.maxCostUsd,
133
+ deadlineMs: sourceIntent.deadlineMs,
137
134
  requiredCapabilities: [...sourceIntent.requiredCapabilities],
138
135
  failover: "approved",
139
136
  };
@@ -164,11 +161,7 @@ export function prepareScoutContinuation(input: {
164
161
  routingIntent,
165
162
  });
166
163
  }
167
- const priorCostCeiling = input.source.receipt.routingIntent.maxCostUsd;
168
- const effectiveCostCeiling =
169
- input.authorization === "full-auto-policy" && priorCostCeiling !== null
170
- ? Math.min(input.costCeilingUsd, priorCostCeiling)
171
- : input.costCeilingUsd;
164
+ const explicitCostCeiling = input.source.receipt.routingIntent.maxCostUsd;
172
165
  const bindings: ScoutAgentBinding[] = proposals.map(({ subtask, agentSpec }) => ({
173
166
  subtaskId: subtask.id,
174
167
  spec: agentSpec,
@@ -192,35 +185,8 @@ export function prepareScoutContinuation(input: {
192
185
  throw new Error("dispatch: full-auto policy does not grant every requested Scout authority");
193
186
  }
194
187
  const plan = transition.plan;
195
- const p95ByStep = new Map(
196
- proposals.map((proposal) => {
197
- const selected = proposal.decision.candidateEvaluations.find((entry) =>
198
- sameRouteIdentity(entry.candidate, proposal.decision.selected),
199
- );
200
- if (selected === undefined || selected.rejection !== null) {
201
- throw new Error(`dispatch: Scout step '${proposal.subtask.id}' has no admissible latency estimate`);
202
- }
203
- return [proposal.subtask.id, selected.estimate.p95EndToEndMs] as const;
204
- }),
205
- );
206
- const predictedDeadlineMs = Math.ceil(
207
- plan.waves.reduce(
208
- (total, wave) => total + Math.max(...wave.map((stepId) => p95ByStep.get(stepId) ?? Number.POSITIVE_INFINITY)),
209
- 0,
210
- ),
211
- );
212
- if (
213
- !Number.isFinite(predictedDeadlineMs) ||
214
- predictedDeadlineMs < 1 ||
215
- predictedDeadlineMs > MAX_SCOUT_PLAN_DEADLINE_MS
216
- ) {
217
- throw new Error("dispatch: Scout continuation exceeds the finite whole-plan deadline ceiling");
218
- }
219
- const priorDeadlineMs = input.source.receipt.routingIntent.deadlineMs;
220
- if (input.authorization === "full-auto-policy" && priorDeadlineMs !== null && predictedDeadlineMs > priorDeadlineMs) {
221
- throw new Error("dispatch: full-auto Scout continuation exceeds the previously granted deadline");
222
- }
223
- const deadlineMs = Math.max(priorDeadlineMs ?? 0, predictedDeadlineMs);
188
+ // Route estimates are advisory. Only a caller-supplied deadline grants stop authority.
189
+ const deadlineMs = input.source.receipt.routingIntent.deadlineMs;
224
190
  const requests: DispatchRequest[] = [];
225
191
  const resolutions: DispatchPlanTaskResolution[] = [];
226
192
  const tasks = requireAgentSteps(plan.steps).map((step, index): ResolvedDispatchPlanArtifact["tasks"][number] => {
@@ -241,7 +207,7 @@ export function prepareScoutContinuation(input: {
241
207
  cwd: input.source.envelope.cwd,
242
208
  requestOrigin: "user",
243
209
  agentSelection: selection,
244
- routingIntent: { ...proposal.routingIntent, maxCostUsd: effectiveCostCeiling, deadlineMs, failover: "none" },
210
+ routingIntent: { ...proposal.routingIntent, maxCostUsd: explicitCostCeiling, deadlineMs, failover: "none" },
245
211
  failover: "none",
246
212
  });
247
213
  resolutions.push(proposal.resolution);
@@ -253,7 +219,7 @@ export function prepareScoutContinuation(input: {
253
219
  node: proposal.resolution.node.id,
254
220
  nodeKind: proposal.resolution.node.kind,
255
221
  ...(proposal.resolution.node.host === undefined ? {} : { nodeHost: proposal.resolution.node.host }),
256
- routingIntent: { ...proposal.routingIntent, maxCostUsd: effectiveCostCeiling, deadlineMs, failover: "none" },
222
+ routingIntent: { ...proposal.routingIntent, maxCostUsd: explicitCostCeiling, deadlineMs, failover: "none" },
257
223
  failover: "none",
258
224
  routeApproval: null,
259
225
  agentSelection: selection,
@@ -269,8 +235,8 @@ export function prepareScoutContinuation(input: {
269
235
  };
270
236
  });
271
237
  const aggregateCost = resolutions.reduce((sum, resolution) => sum + resolution.costUpperBoundUsd, 0);
272
- if (!Number.isFinite(aggregateCost) || aggregateCost > effectiveCostCeiling) {
273
- throw new Error("dispatch: Scout continuation exceeds the scheduling cost ceiling");
238
+ if (!Number.isFinite(aggregateCost) || (explicitCostCeiling !== null && aggregateCost > explicitCostCeiling)) {
239
+ throw new Error("dispatch: Scout continuation exceeds the explicit routing cost ceiling");
274
240
  }
275
241
  return {
276
242
  artifact: {
@@ -285,7 +251,7 @@ export function prepareScoutContinuation(input: {
285
251
  maxWorkers: plan.maxWorkers,
286
252
  onFailure: plan.onFailure,
287
253
  tasks,
288
- costCeilingUsd: effectiveCostCeiling,
254
+ costCeilingUsd: input.costCeilingUsd,
289
255
  deadlineMs,
290
256
  },
291
257
  requests,
@@ -186,8 +186,7 @@ export async function runScoutContinuationPlan<T, S>(input: {
186
186
  ): Promise<{ receipt: RunReceipt; summary: S }>;
187
187
  complete(receipt: RunReceipt, summary: S): { value: T; integrityValid: boolean };
188
188
  }): Promise<{ runs: T[]; skipped: ReadonlyArray<string> }> {
189
- if (input.artifact.deadlineMs === null) throw new Error("Scout dependency plan has no whole-plan deadline");
190
- const assignmentDeadlineAt = Date.now() + input.artifact.deadlineMs;
189
+ const assignmentDeadlineAt = input.artifact.deadlineMs === null ? undefined : Date.now() + input.artifact.deadlineMs;
191
190
  const completedByStep = new Map<string, T>();
192
191
  const byStep = new Map(
193
192
  input.artifact.tasks.map((task, index) => [task.stepId, { task, request: input.requests[index] }]),
@@ -234,7 +233,7 @@ export async function runScoutContinuationPlan<T, S>(input: {
234
233
  ...bound.request,
235
234
  predecessorHandoffs: handoffs,
236
235
  reservation,
237
- assignmentDeadlineAt,
236
+ ...(assignmentDeadlineAt === undefined ? {} : { assignmentDeadlineAt }),
238
237
  ...(ledger !== undefined ? { ledger } : {}),
239
238
  };
240
239
  const handle = await input.dispatch.dispatch(request);