@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
@@ -71,10 +71,11 @@ import {
71
71
  resolveAgentToolCompatibility,
72
72
  } from "../agents/spec.js";
73
73
  import type { ConfigContract } from "../config/contract.js";
74
- import type { ContextContract, ProjectStructuredContext } from "../context/contract.js";
74
+ import type { ContextContract, ProjectPromptContext, ProjectStructuredContext } from "../context/contract.js";
75
75
  import type { MiddlewareContract } from "../middleware/contract.js";
76
76
  import { workerSafetyOneLiner } from "../prompts/compiler.js";
77
77
  import type { PromptsContract } from "../prompts/contract.js";
78
+ import { selectProjectPreload } from "../prompts/preload.js";
78
79
  import { type EffectivePricing, resolveEffectivePricing } from "../providers/catalog.js";
79
80
  import {
80
81
  type CapabilityFlags,
@@ -153,7 +154,7 @@ import {
153
154
  import { type BatchState, createBatch, onRunComplete, snapshotBatch } from "./batch-tracker.js";
154
155
  import { type RunToolBudgetEnvelope, resolveToolBudgetEnvelope } from "./budget-envelope.js";
155
156
  import { assessCapabilityMismatch, type CapabilityMismatch } from "./capability-match.js";
156
- import { capacityLeaseUsage, createNodeLeaseUsageReader } from "./capacity-lease.js";
157
+ import { capacityLeaseUsage, capacityLeaseUsageAsync, createNodeLeaseUsageReader } from "./capacity-lease.js";
157
158
  import { acquireCheckoutWriterLease, type CheckoutWriterLease } from "./checkout-writer-lease.js";
158
159
  import type {
159
160
  DispatchAdmissionObserver,
@@ -163,9 +164,9 @@ import type {
163
164
  DispatchRequest,
164
165
  DispatchSnapshot,
165
166
  } from "./contract.js";
166
- import { createWorkerOutputCapture, startDispatchEventPump } from "./event-pump.js";
167
+ import { createWorkerOutputCapture, startDispatchEventPump, workerOutputCaptureBytes } from "./event-pump.js";
167
168
  import type { ExecutionHandoff } from "./execution-handoff.js";
168
- import { appliesRecipeResultContract, routeCorrelationFactsForRun, withAttemptRole } from "./execution-role.js";
169
+ import { dispatchResultContract, routeCorrelationFactsForRun, withAttemptRole } from "./execution-role.js";
169
170
  import {
170
171
  affectsTargetBreaker,
171
172
  classifyFailure,
@@ -231,7 +232,6 @@ import {
231
232
  rebindDispatchReservationMember,
232
233
  releaseDispatchReservation,
233
234
  releaseDispatchReservationMember,
234
- reservedBudgetUsd,
235
235
  reservedPlanPeakSlots,
236
236
  rollbackDispatchReservation,
237
237
  rollbackUnconsumedDispatchReservation,
@@ -364,7 +364,9 @@ interface ActiveRun {
364
364
  stallKilled: boolean;
365
365
  /** ACP event-inactivity window; null for native runs (heartbeat spec governs those). */
366
366
  stallTimeoutMs: number | null;
367
+ /** Internal logical assignment/retry lineage, independent of published host ancestry. */
367
368
  lineage: RunLineage;
369
+ hostRun?: DispatchPreparationOptions["hostRun"];
368
370
  heartbeatAt: HeartbeatStamp | null;
369
371
  heartbeatStatus: HeartbeatStatus;
370
372
  meter: RunTokenMeter;
@@ -777,6 +779,11 @@ function workerDiagnosticsText(result: SpawnedWorkerResult, maxChars: number): s
777
779
  if (malformedStdoutLines > 0) {
778
780
  parts.push(`malformed stdout lines: ${malformedStdoutLines}`);
779
781
  }
782
+ if (result.signal) {
783
+ // Keep the observed close signal beside contract failures, and at the
784
+ // tail so bounded stderr diagnostics cannot truncate it away.
785
+ parts.push(`worker process signal: ${result.signal}`);
786
+ }
780
787
  if (parts.length === 0) return null;
781
788
  return truncateDiagnosticText(parts.join("; "), maxChars);
782
789
  }
@@ -1107,6 +1114,12 @@ export interface WorkerDynamicContext {
1107
1114
  autonomy?: AutonomyLevel | null;
1108
1115
  /** Effective approval routing; defaults to deny for legacy direct callers. */
1109
1116
  onPermission?: WorkerPermissionMode | null;
1117
+ /** Captured authored handbooks; preferred over the legacy structured projection. */
1118
+ projectPrompt?: ProjectPromptContext | null;
1119
+ /** Admitted native read capability; null for an unknown external inventory. */
1120
+ projectReadTools?: boolean | null;
1121
+ /** External runtimes do not promise the native read schema. */
1122
+ projectExternalReadTools?: boolean;
1110
1123
  /** Structured CLIO-CODER.md fields; null when CLIO-CODER.md is absent or malformed. */
1111
1124
  project?: ProjectStructuredContext | null;
1112
1125
  /** The run's own working directory and top-level layout; sent at every tier. */
@@ -1160,10 +1173,10 @@ function renderWorkerProjectContext(
1160
1173
 
1161
1174
  /** True when the rendered project message body includes the verification block. */
1162
1175
  function workerProjectContextIncludesVerification(body: string): boolean {
1163
- return body.includes("\nVerification expectations:\n");
1176
+ return body.startsWith("# Project Context\n") && body.includes("\nVerification expectations:\n");
1164
1177
  }
1165
1178
 
1166
- function buildDynamicPromptMessages(
1179
+ export function buildDynamicPromptMessages(
1167
1180
  req: DispatchRequest,
1168
1181
  dynamicContext: WorkerDynamicContext = {},
1169
1182
  ): WorkerPromptMessage[] {
@@ -1172,10 +1185,22 @@ function buildDynamicPromptMessages(
1172
1185
  const body = renderWorkerWorkspaceContext(dynamicContext.workspace);
1173
1186
  messages.push({ id: "dispatch-workspace", body, contentHash: sha256(body) });
1174
1187
  }
1175
- if (dynamicContext.project && dynamicContext.projectContextTier === "bounded") {
1176
- const body = renderWorkerProjectContext(dynamicContext.project, {
1177
- includeVerification: dynamicContext.capabilityClass === "verification",
1178
- });
1188
+ if (dynamicContext.projectContextTier === "bounded") {
1189
+ const authored = dynamicContext.projectPrompt;
1190
+ // Authored instructions remain verbatim, including test guidance. Never
1191
+ // duplicate them with a second projection of conventions or verification.
1192
+ const body = authored
1193
+ ? authored.handbookSources.length > 0
1194
+ ? selectProjectPreload(authored, dynamicContext.projectReadTools ?? null, {
1195
+ maxChars: WORKER_PROJECT_CONTEXT_MAX_CHARS,
1196
+ externalReadTools: dynamicContext.projectExternalReadTools === true,
1197
+ }).text
1198
+ : ""
1199
+ : dynamicContext.project
1200
+ ? renderWorkerProjectContext(dynamicContext.project, {
1201
+ includeVerification: dynamicContext.capabilityClass === "verification",
1202
+ })
1203
+ : "";
1179
1204
  if (body.length > 0) {
1180
1205
  messages.push({ id: "dispatch-project-context", body, contentHash: sha256(body) });
1181
1206
  }
@@ -1454,7 +1479,7 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
1454
1479
  if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
1455
1480
  return [
1456
1481
  "Antigravity CLI owns its internal tools, network activity, prompts, and approvals; Clio observes only structured stream output and does not provide per-tool mediation or complete tool telemetry",
1457
- "Antigravity conversation ids are recorded only as opaque provider observations; Clio does not resume them",
1482
+ "Antigravity resumes a conversation only when the caller supplies its id explicitly",
1458
1483
  "Antigravity runs are one-shot and never retried automatically",
1459
1484
  ];
1460
1485
  }
@@ -1626,22 +1651,6 @@ function workerToolCallHardCap(settings: EffectiveSettings): number {
1626
1651
  return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
1627
1652
  }
1628
1653
 
1629
- /**
1630
- * Only a runtime that declares its external agent loop may accept a declared
1631
- * per-tool budget: Clio records that budget as unobserved rather than enforced.
1632
- * Any other subprocess runtime cannot mediate tool calls, so a declared budget
1633
- * would be a claim nobody enforces.
1634
- */
1635
- export function assertWorkerBudgetEnforceable(
1636
- runtime: Pick<RuntimeDescriptor, "id" | "kind" | "externalAgentLoop">,
1637
- hasDeclaredBudget: boolean,
1638
- ): void {
1639
- if (!hasDeclaredBudget || runtime.kind !== "subprocess" || runtime.externalAgentLoop !== undefined) return;
1640
- throw new Error(
1641
- `dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
1642
- );
1643
- }
1644
-
1645
1654
  /** Per-tool budget enforcement is real only where Clio observes each tool call. */
1646
1655
  export function budgetEnforcementForRuntime(
1647
1656
  runtime: Pick<RuntimeDescriptor, "kind">,
@@ -1657,7 +1666,6 @@ function resolveEffectiveWorkerBudget(input: {
1657
1666
  settings: EffectiveSettings;
1658
1667
  runtime: RuntimeDescriptor;
1659
1668
  }): RunToolBudgetEnvelope {
1660
- assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
1661
1669
  const hardCap = workerToolCallHardCap(input.settings);
1662
1670
  const declared = input.declared ?? {
1663
1671
  toolCalls: hardCap,
@@ -1737,15 +1745,6 @@ function assertPlannedNodeIdentity(req: DispatchRequest, actual: RunNodeIdentity
1737
1745
  );
1738
1746
  }
1739
1747
 
1740
- function assertApprovedCostCeiling(req: DispatchRequest, liveCeilingUsd: number): void {
1741
- const approved = req.plan?.costCeilingUsd;
1742
- if (approved === undefined) return;
1743
- if (Object.is(approved, liveCeilingUsd)) return;
1744
- throw new Error(
1745
- `dispatch: scheduling cost ceiling drifted after plan approval (approved $${approved.toFixed(4)}, current $${liveCeilingUsd.toFixed(4)}); re-plan before launch`,
1746
- );
1747
- }
1748
-
1749
1748
  /** Fail closed until another runtime has an explicitly tested JSON-schema wire contract. */
1750
1749
  function assertResponseSchemaEnforceable(
1751
1750
  runtime: RuntimeDescriptor,
@@ -1929,10 +1928,9 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
1929
1928
  // Requiring a recipe contract here meant a caller-supplied override against a
1930
1929
  // recipe with none was sealed but never sent, so the worker spent no repair
1931
1930
  // round on a contract it was never told about and the run failed on a shape
1932
- // nothing had asked it for.
1933
- const workerResultContract = appliesRecipeResultContract(input.req.gate?.role)
1934
- ? (input.req.resultContractOverride ?? input.recipe?.resultContract)
1935
- : undefined;
1931
+ // nothing had asked it for. A caller's summary allowance is folded in by
1932
+ // the same resolver the seal uses, so the two never disagree.
1933
+ const workerResultContract = dispatchResultContract(input.req, input.recipe);
1936
1934
  if (workerResultContract) spec.resultContract = workerResultContract;
1937
1935
  const product = input.req.product ?? input.recipe?.product;
1938
1936
  if (product) spec.product = product;
@@ -2586,10 +2584,17 @@ export function createDispatchBundle(
2586
2584
  return configuredEndpointCapacities()[endpoint.key] ?? endpoint;
2587
2585
  }
2588
2586
 
2589
- function reservationCapacitySnapshot(settings: EffectiveSettings): ReservationCapacitySnapshot {
2587
+ /** Initial plan preparation has a synchronous host contract. */
2588
+ function reservationCapacitySnapshotSync(settings: EffectiveSettings): ReservationCapacitySnapshot {
2589
+ return reservationCapacitySnapshot(settings, capacityLeaseUsage());
2590
+ }
2591
+
2592
+ function reservationCapacitySnapshot(
2593
+ settings: EffectiveSettings,
2594
+ usage: ReturnType<typeof capacityLeaseUsage>,
2595
+ ): ReservationCapacitySnapshot {
2596
+ // Read budget after the capacity lock wait too; concurrent callbacks may spend.
2590
2597
  const preflight = scheduling.preflight();
2591
- // Reservation planning compares against a fresh read, never the display cache.
2592
- const usage = capacityLeaseUsage();
2593
2598
  const nodes: Record<string, { active: number; limit: number }> = {
2594
2599
  local: { active: usage.nodes.local ?? 0, limit: configuredGlobalCapacity(settings) },
2595
2600
  };
@@ -2624,7 +2629,7 @@ export function createDispatchBundle(
2624
2629
  ...(task.resolution.endpoint !== undefined ? { endpointKey: task.resolution.endpoint.key } : {}),
2625
2630
  costUpperBoundUsd: task.resolution.routeApproval?.totalCostUpperBoundUsd ?? task.resolution.costUpperBoundUsd,
2626
2631
  })),
2627
- capacity: reservationCapacitySnapshot(getEffectiveSettings()),
2632
+ capacity: reservationCapacitySnapshotSync(getEffectiveSettings()),
2628
2633
  nowMs: now(),
2629
2634
  });
2630
2635
  ownedReservations.add(record.ownerId);
@@ -2655,20 +2660,10 @@ export function createDispatchBundle(
2655
2660
  }
2656
2661
 
2657
2662
  function assertBudgetAdmitsRoute(req: DispatchRequest, pricing: EffectivePricing, settings: EffectiveSettings): void {
2658
- const preflight = scheduling.preflight();
2659
- assertApprovedCostCeiling(req, preflight.ceilingUsd);
2660
- if (preflight.verdict === "over" || preflight.verdict === "at") {
2661
- denyDispatchForBudget(preflight, req.agentId);
2662
- }
2663
2663
  const estimateUsd = conservativeRouteAdmissionEstimateUsd(pricing, admissionMaxOutputTokens(settings));
2664
2664
  const intentCeiling = req.routingIntent?.maxCostUsd;
2665
2665
  if (intentCeiling !== null && intentCeiling !== undefined && estimateUsd > intentCeiling)
2666
2666
  denyDispatchForBudget({ currentUsd: estimateUsd, ceilingUsd: intentCeiling }, req.agentId, estimateUsd);
2667
- const heldUsd = reservedBudgetUsd();
2668
- const projectedUsd = preflight.currentUsd + heldUsd + (req.reservation === undefined ? estimateUsd : 0);
2669
- if (scheduling.checkCeiling(projectedUsd) !== "under") {
2670
- denyDispatchForBudget({ currentUsd: projectedUsd, ceilingUsd: preflight.ceilingUsd }, req.agentId, estimateUsd);
2671
- }
2672
2667
  }
2673
2668
 
2674
2669
  function configuredGlobalCapacity(settings: EffectiveSettings): number {
@@ -2716,7 +2711,12 @@ export function createDispatchBundle(
2716
2711
  const assignmentId =
2717
2712
  req.lineage?.rootRunId ?? req.runIdHint ?? `pending-${queuedAt.toString(36)}-${randomBytes(6).toString("hex")}`;
2718
2713
  const requestedAt = Date.parse(timing.requestedAt ?? timing.queuedAt);
2719
- const deadlineAt = req.assignmentDeadlineAt ?? requestedAt + (req.routingIntent?.deadlineMs ?? 60_000);
2714
+ const deadlineAt =
2715
+ req.assignmentDeadlineAt ??
2716
+ (req.routingIntent?.deadlineMs === undefined || req.routingIntent.deadlineMs === null
2717
+ ? undefined
2718
+ : requestedAt + req.routingIntent.deadlineMs);
2719
+ if (deadlineAt !== undefined) req.assignmentDeadlineAt = deadlineAt;
2720
2720
  if (req.lineage === undefined) await registerAssignment(assignmentId);
2721
2721
  // A plan's queued members keep their wave order and their reserved peak.
2722
2722
  const plan =
@@ -2735,7 +2735,7 @@ export function createDispatchBundle(
2735
2735
  assignmentId,
2736
2736
  nodeId,
2737
2737
  ...(endpoint !== null && endpoint !== undefined ? { endpointKey: endpoint.key } : {}),
2738
- deadlineAt,
2738
+ ...(deadlineAt === undefined ? {} : { deadlineAt }),
2739
2739
  ...plan,
2740
2740
  // A fleet's first attempt carries lineage and still owns the held
2741
2741
  // reservation member that admission must transfer into its lease.
@@ -2767,7 +2767,8 @@ export function createDispatchBundle(
2767
2767
  settings: EffectiveSettings,
2768
2768
  ): Promise<void> {
2769
2769
  if (req.reservation === undefined || req.lineage === undefined) return;
2770
- const capacity = reservationCapacitySnapshot(settings);
2770
+ // Retries can await fresh capacity; the advisory display cache is never admission data.
2771
+ const capacity = reservationCapacitySnapshot(settings, await capacityLeaseUsageAsync());
2771
2772
  const rebind = {
2772
2773
  ...req.reservation,
2773
2774
  nodeId,
@@ -2795,6 +2796,7 @@ export function createDispatchBundle(
2795
2796
  const retryQueue = new Map<string, RetryQueueEntry>();
2796
2797
  const retryBackoff = new Map<string, BackoffState>();
2797
2798
  const retryReasons = new Map<string, string>();
2799
+ const assignmentRootsByAttempt = new Map<string, string>();
2798
2800
  const assignments = new AssignmentRegistry({
2799
2801
  onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
2800
2802
  });
@@ -2824,8 +2826,19 @@ export function createDispatchBundle(
2824
2826
  }
2825
2827
 
2826
2828
  function lineageFor(req: DispatchRequest, runId: string): RunLineage {
2827
- if (req.lineage) return { ...req.lineage };
2828
- return { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
2829
+ const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
2830
+ assignmentRootsByAttempt.set(runId, lineage.rootRunId);
2831
+ return lineage;
2832
+ }
2833
+
2834
+ function publishedLineage(lineage: RunLineage, hostRun: DispatchPreparationOptions["hostRun"]): RunLineage {
2835
+ if (hostRun === undefined) return { ...lineage };
2836
+ return {
2837
+ parentRunId: lineage.attempt === 0 ? hostRun.runId : lineage.parentRunId,
2838
+ rootRunId: hostRun.lineage.rootRunId,
2839
+ depth: hostRun.lineage.depth + 1,
2840
+ attempt: lineage.attempt,
2841
+ };
2829
2842
  }
2830
2843
 
2831
2844
  function accumulateFinalizedTotals(receipt: RunReceipt): void {
@@ -3144,7 +3157,7 @@ export function createDispatchBundle(
3144
3157
  if (decision.excludedRouteParts.includes("model")) delete retryReq.model;
3145
3158
  if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
3146
3159
  }
3147
- const handle = await dispatch(retryReq);
3160
+ const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
3148
3161
  // The assignment folds every attempt into one stream with a reset marker.
3149
3162
  const marker: AssignmentAttemptStartEvent = {
3150
3163
  type: "attempt_start",
@@ -3330,6 +3343,27 @@ export function createDispatchBundle(
3330
3343
  }
3331
3344
  }
3332
3345
 
3346
+ /** Explicit deadlines outlive queue admission and use the ordinary truthful abort path. */
3347
+ function watchAssignmentDeadline(run: ActiveRun, callerDeadlineAt?: number): void {
3348
+ const deadlineAt = run.req.assignmentDeadlineAt;
3349
+ if (deadlineAt === undefined || (callerDeadlineAt !== undefined && deadlineAt >= callerDeadlineAt)) return;
3350
+ let timer: ReturnType<typeof setTimeout> | undefined;
3351
+ let settled = false;
3352
+ const check = (): void => {
3353
+ if (settled || run.aborted || run.stallKilled) return;
3354
+ const remaining = deadlineAt - now();
3355
+ if (remaining <= 0) {
3356
+ contract.abort(run.runId, { cause: "timeout", detail: "timed out: explicit assignment deadline reached" });
3357
+ } else timer = setTimeout(check, Math.min(2_147_483_647, remaining));
3358
+ };
3359
+ const close = (): void => {
3360
+ settled = true;
3361
+ clearTimeout(timer);
3362
+ };
3363
+ void run.promise.then(close, close);
3364
+ check();
3365
+ }
3366
+
3333
3367
  function startHeartbeatWatchdog(): void {
3334
3368
  if (heartbeatTimer || heartbeatIntervalMs <= 0) return;
3335
3369
  heartbeatTimer = setInterval(checkActiveHeartbeats, heartbeatIntervalMs);
@@ -3491,6 +3525,9 @@ export function createDispatchBundle(
3491
3525
  if (!recipe) {
3492
3526
  throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
3493
3527
  }
3528
+ // Resolve the applied contract once here so a caller's summary allowance
3529
+ // on a recipe that carries no summary fails before any model boots.
3530
+ dispatchResultContract(req, recipe);
3494
3531
  const spec = normalizeAgentSpec(recipe);
3495
3532
  if (req.requestOrigin === "user" && !isUserVisibleAgent(spec)) {
3496
3533
  throw new Error(
@@ -3593,17 +3630,24 @@ export function createDispatchBundle(
3593
3630
  settings,
3594
3631
  runtime: target.runtime,
3595
3632
  });
3596
- // Fetch structured project context only for tiers that receive it, so
3633
+ // Fetch captured project context only for tiers that receive it, so
3597
3634
  // read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
3598
3635
  // (capability-class default, recipe frontmatter override).
3599
3636
  const tier = spec.projectContextTier;
3600
- const project = projectContext && tier === "bounded" ? projectContext.projectStructuredContext(cwd) : null;
3637
+ const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
3601
3638
  const dynamicPromptMessages = buildDynamicPromptMessages(req, {
3602
3639
  capabilityClass: spec.capabilityClass,
3603
3640
  projectContextTier: tier,
3604
3641
  autonomy: effectiveAutonomy,
3605
3642
  onPermission: settings?.fleet.permissions.mode ?? "deny",
3606
- project,
3643
+ projectPrompt,
3644
+ projectReadTools:
3645
+ target.runtime.kind === "subprocess"
3646
+ ? null
3647
+ : effectiveTools.includes(ToolNames.Read)
3648
+ ? targetToolCapability(target)
3649
+ : false,
3650
+ projectExternalReadTools: target.runtime.kind === "subprocess",
3607
3651
  workspace: readWorkspaceRootFacts(cwd),
3608
3652
  });
3609
3653
  const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
@@ -3676,6 +3720,9 @@ export function createDispatchBundle(
3676
3720
  `dispatch: shadow or internal agent '${req.agentId}' cannot run on external ACP agent '${agentId}'`,
3677
3721
  );
3678
3722
  }
3723
+ // A summary allowance on a recipe with no summary field fails here,
3724
+ // before the external agent is started.
3725
+ dispatchResultContract(req, spec);
3679
3726
  }
3680
3727
  if (!settings) throw new Error("dispatch: effective settings required for ACP delegation");
3681
3728
  const configured = settings.integrations.externalAgents.entries.find((entry) => entry.id === agentId);
@@ -3703,14 +3750,17 @@ export function createDispatchBundle(
3703
3750
  // ACP delegation defaults to no project context: repo conventions and
3704
3751
  // invariants never leave the machine unless this agent's config opts in
3705
3752
  // with projectContext: "bounded". No recipe means no capability class,
3706
- // so the verification section can never ride along. The safety posture
3753
+ // so no derived verification supplement is added. Authored test guidance
3754
+ // stays intact within the opted-in source budget. The safety posture
3707
3755
  // line still rides along for every worker run.
3708
3756
  const tier: AgentProjectContextTier = configured.projectContext ?? "none";
3709
- const project = projectContext && tier === "bounded" ? projectContext.projectStructuredContext(cwd) : null;
3757
+ const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
3710
3758
  const dynamicPromptMessages = buildDynamicPromptMessages(req, {
3711
3759
  projectContextTier: tier,
3712
3760
  autonomy,
3713
- project,
3761
+ projectPrompt,
3762
+ projectReadTools: null,
3763
+ projectExternalReadTools: true,
3714
3764
  workspace: readWorkspaceRootFacts(cwd),
3715
3765
  });
3716
3766
  const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
@@ -3753,12 +3803,25 @@ export function createDispatchBundle(
3753
3803
  timing: RunPhaseMarks,
3754
3804
  routeDecision: RouteDecisionV1,
3755
3805
  observer?: DispatchAdmissionObserver,
3806
+ callerDeadlineAt?: number,
3807
+ hostRun?: DispatchPreparationOptions["hostRun"],
3756
3808
  ): Promise<{
3757
3809
  runId: string;
3758
3810
  events: AsyncIterableIterator<unknown>;
3759
3811
  finalPromise: Promise<RunReceipt>;
3760
3812
  }> {
3761
3813
  const lifecycle = resolveAcpDelegationLifecycle(req, settings);
3814
+ const estimate = workerToolCallHardCap(settings);
3815
+ const budgetEnvelope = resolveToolBudgetEnvelope({
3816
+ recipeId: req.agentId,
3817
+ policy: { toolCalls: estimate, readReserve: 0, synthesis: true },
3818
+ ...(req.budget === undefined ? {} : { request: req.budget }),
3819
+ hardCap: estimate,
3820
+ hasReadTool: false,
3821
+ retry: (req.lineage?.attempt ?? 0) > 0,
3822
+ revision: false,
3823
+ enforcement: "external-one-shot",
3824
+ });
3762
3825
  publishDispatchPathScope(req, lifecycle.pathScope);
3763
3826
  timing.decisionCompletedAt = new Date(now()).toISOString();
3764
3827
  const targetId = `delegation:${lifecycle.agentConfig.id}`;
@@ -3840,7 +3903,11 @@ export function createDispatchBundle(
3840
3903
  let outcomeCode: RunOutcomeCode | null = null;
3841
3904
  let reportedSpoofedOutcome = false;
3842
3905
  let runIdForPermissionAudit: string | null = null;
3843
- const outputCapture = createWorkerOutputCapture();
3906
+ const outputCapture = createWorkerOutputCapture({
3907
+ maxBytes: workerOutputCaptureBytes(
3908
+ dispatchResultContract(req, req.agentId && maybeAgents ? maybeAgents.getSpec(req.agentId) : null),
3909
+ ),
3910
+ });
3844
3911
  const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
3845
3912
  if (timing[field] !== undefined) return;
3846
3913
  timing[field] = new Date(now()).toISOString();
@@ -4008,10 +4075,11 @@ export function createDispatchBundle(
4008
4075
  }
4009
4076
  identity = detectRunIdentity();
4010
4077
  ledgerRef.update(envelope.id, {
4078
+ budget: budgetEnvelope,
4011
4079
  status: "running",
4012
4080
  pid: acp.pid,
4013
4081
  heartbeatAt: heartbeatIso(acp.heartbeatAt),
4014
- lineage,
4082
+ lineage: publishedLineage(lineage, hostRun),
4015
4083
  identity,
4016
4084
  node: LOCAL_RUN_NODE,
4017
4085
  ...(lifecycle.pipeline ? { pipeline: lifecycle.pipeline } : {}),
@@ -4043,6 +4111,7 @@ export function createDispatchBundle(
4043
4111
  });
4044
4112
  }
4045
4113
  context.bus.emit(BusChannels.DispatchStarted, {
4114
+ budget: budgetEnvelope,
4046
4115
  runId: envelope.id,
4047
4116
  agentId: req.agentId,
4048
4117
  task: req.task,
@@ -4100,6 +4169,7 @@ export function createDispatchBundle(
4100
4169
  rejectFinal = rej;
4101
4170
  });
4102
4171
  const activeRun: ActiveRun = {
4172
+ budget: budgetEnvelope,
4103
4173
  runId: envelope.id,
4104
4174
  req,
4105
4175
  abort: acp.abort,
@@ -4125,6 +4195,7 @@ export function createDispatchBundle(
4125
4195
  stallKilled: false,
4126
4196
  stallTimeoutMs: lifecycle.agentConfig.stallTimeoutMs ?? DEFAULT_ACP_STALL_TIMEOUT_MS,
4127
4197
  lineage,
4198
+ ...(hostRun === undefined ? {} : { hostRun }),
4128
4199
  heartbeatAt: acp.heartbeatAt,
4129
4200
  heartbeatStatus: "alive",
4130
4201
  meter: tokenMeter,
@@ -4145,8 +4216,7 @@ export function createDispatchBundle(
4145
4216
  // the same messages, so adding both would double-count. Event-metered
4146
4217
  // values survive only when the adapter reported nothing.
4147
4218
  const usage = result.usage;
4148
- const adapterReportedUsage =
4149
- usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens + usage.reasoningTokens > 0;
4219
+ const adapterReportedUsage = usage.tokensReported;
4150
4220
  if (adapterReportedUsage) {
4151
4221
  tokenMeter.inputTokens = usage.inputTokens;
4152
4222
  tokenMeter.outputTokens = usage.outputTokens;
@@ -4154,8 +4224,9 @@ export function createDispatchBundle(
4154
4224
  tokenMeter.cacheWriteTokens = usage.cacheWriteTokens;
4155
4225
  tokenMeter.reasoningTokens = usage.reasoningTokens;
4156
4226
  }
4157
- const tokenCount =
4158
- tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
4227
+ const tokenCount = adapterReportedUsage
4228
+ ? usage.totalTokens
4229
+ : tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
4159
4230
  const safetyMetadata = safety.policy?.metadata() ?? null;
4160
4231
  const init = result.delegation.initialize;
4161
4232
  const agentInfo = init?.agentInfo;
@@ -4178,7 +4249,7 @@ export function createDispatchBundle(
4178
4249
  outcome,
4179
4250
  outcomeCode,
4180
4251
  outcomeDetail,
4181
- lineage,
4252
+ lineage: publishedLineage(lineage, hostRun),
4182
4253
  identity,
4183
4254
  // An ACP peer is spawned by this process, so the run's node is this host.
4184
4255
  node: LOCAL_RUN_NODE,
@@ -4189,6 +4260,7 @@ export function createDispatchBundle(
4189
4260
  ...(req.plan !== undefined ? { plan: req.plan } : {}),
4190
4261
  ...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
4191
4262
  ...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
4263
+ budget: budgetEnvelope,
4192
4264
  projectContext: lifecycle.projectContext,
4193
4265
  rulesApplied: lifecycle.rulesApplied,
4194
4266
  operatorProfileApplied: lifecycle.operatorProfileApplied,
@@ -4207,8 +4279,8 @@ export function createDispatchBundle(
4207
4279
  reasoningTokenCount: tokenMeter.reasoningTokens,
4208
4280
  ...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
4209
4281
  ...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
4210
- costUsd: 0,
4211
- costProvenance: "unknown",
4282
+ costUsd: usage.costUsd,
4283
+ costProvenance: usage.costProvenance ?? "unknown",
4212
4284
  compiledPromptHash: lifecycle.compiledPromptHash,
4213
4285
  staticCompositionHash: lifecycle.staticCompositionHash,
4214
4286
  staticShellHash: lifecycle.staticCompositionHash,
@@ -4284,7 +4356,7 @@ export function createDispatchBundle(
4284
4356
  outcome,
4285
4357
  outcomeCode: receipt.outcomeCode ?? null,
4286
4358
  outcomeDetail: receipt.outcomeDetail ?? null,
4287
- lineage,
4359
+ lineage: publishedLineage(lineage, hostRun),
4288
4360
  tokenCount: receipt.tokenCount,
4289
4361
  inputTokenCount: receipt.inputTokenCount ?? 0,
4290
4362
  outputTokenCount: receipt.outputTokenCount ?? 0,
@@ -4463,7 +4535,7 @@ export function createDispatchBundle(
4463
4535
  outcome: "failed" satisfies RunOutcome,
4464
4536
  outcomeDetail: detail,
4465
4537
  reason: "failed",
4466
- lineage,
4538
+ lineage: publishedLineage(lineage, hostRun),
4467
4539
  exitCode: 1,
4468
4540
  });
4469
4541
  throw error;
@@ -4472,6 +4544,7 @@ export function createDispatchBundle(
4472
4544
  }
4473
4545
  })().then(resolveFinal, rejectFinal);
4474
4546
  active.set(envelope.id, activeRun);
4547
+ watchAssignmentDeadline(activeRun, callerDeadlineAt);
4475
4548
 
4476
4549
  return {
4477
4550
  runId: envelope.id,
@@ -4491,6 +4564,7 @@ export function createDispatchBundle(
4491
4564
  finalPromise: Promise<RunReceipt>;
4492
4565
  effectiveRequest: DispatchRequest;
4493
4566
  }> {
4567
+ const hostRun = preparation?.hostRun;
4494
4568
  const requestedAt = new Date(now()).toISOString();
4495
4569
  const timing: RunPhaseMarks = { requestedAt, decisionStartedAt: requestedAt };
4496
4570
  const settings = getEffectiveSettings();
@@ -4536,11 +4610,13 @@ export function createDispatchBundle(
4536
4610
  const phases = envelope ? deriveEnvelopePhaseDurations(envelope) : undefined;
4537
4611
  if (envelope === null || envelope === undefined) return;
4538
4612
  const outcome = receipt.outcome ?? (receipt.exitCode === 0 ? "succeeded" : "failed");
4613
+ const assignmentId = assignmentRootFor(receipt.runId);
4539
4614
  const quality = reduceRouteQuality({
4540
- subject: { receipt, envelope },
4615
+ subject: { receipt, envelope, assignmentId },
4541
4616
  receipts: [{ receipt, envelope }],
4542
4617
  });
4543
4618
  routeObserver.recordOutcome(observation.id, {
4619
+ assignmentId,
4544
4620
  route: observation.decision.executedRoute,
4545
4621
  outcome,
4546
4622
  qualityLabel: quality.label,
@@ -4558,11 +4634,6 @@ export function createDispatchBundle(
4558
4634
  return handle;
4559
4635
  };
4560
4636
  if (req.delegationAgentId) {
4561
- if (req.budget !== undefined) {
4562
- throw new Error(
4563
- "dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
4564
- );
4565
- }
4566
4637
  assertPlannedNodeIdentity(req, { id: "local", kind: "local" });
4567
4638
  assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
4568
4639
  if (req.responseSchema !== undefined) {
@@ -4580,7 +4651,15 @@ export function createDispatchBundle(
4580
4651
  }
4581
4652
  await rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
4582
4653
  routeObservation = observeShadowRoute(req, undefined, settings);
4583
- const delegated = await dispatchAcpDelegation(req, settings, timing, routeObservation.decision, observer);
4654
+ const delegated = await dispatchAcpDelegation(
4655
+ req,
4656
+ settings,
4657
+ timing,
4658
+ routeObservation.decision,
4659
+ observer,
4660
+ preparation?.deadlineAt,
4661
+ hostRun,
4662
+ );
4584
4663
  // An ACP member never runs host verification, so it can only ever leave
4585
4664
  // the barrier. It still edits the checkout, so the barrier has to wait
4586
4665
  // for it; dispatch() releases it when its finalPromise settles.
@@ -4835,7 +4914,11 @@ export function createDispatchBundle(
4835
4914
  lifecycle.runtimeKind === "http" ||
4836
4915
  (lifecycle.runtimeKind === "sdk" && lifecycle.target.runtime.id === "claude-sdk");
4837
4916
  let workerPolicyPermissionCounter = 0;
4838
- const outputCapture = createWorkerOutputCapture();
4917
+ // The bound the receipt can seal follows the contract this run will be
4918
+ // validated against; a conforming result never arrives clipped.
4919
+ const outputCapture = createWorkerOutputCapture({
4920
+ maxBytes: workerOutputCaptureBytes(dispatchResultContract(req, lifecycle.recipe)),
4921
+ });
4839
4922
  const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
4840
4923
  if (timing[field] !== undefined) return;
4841
4924
  timing[field] = new Date(now()).toISOString();
@@ -5114,7 +5197,7 @@ export function createDispatchBundle(
5114
5197
  ledgerRef.update(envelope.id, {
5115
5198
  status: "running",
5116
5199
  pid,
5117
- lineage,
5200
+ lineage: publishedLineage(lineage, hostRun),
5118
5201
  identity,
5119
5202
  node: placement?.node ?? LOCAL_RUN_NODE,
5120
5203
  ...(placement?.reroutes !== undefined && placement.reroutes.length > 0
@@ -5267,6 +5350,7 @@ export function createDispatchBundle(
5267
5350
  stallKilled: false,
5268
5351
  stallTimeoutMs: null,
5269
5352
  lineage,
5353
+ ...(hostRun === undefined ? {} : { hostRun }),
5270
5354
  heartbeatAt,
5271
5355
  heartbeatStatus: "alive",
5272
5356
  meter: tokenMeter,
@@ -5350,7 +5434,7 @@ export function createDispatchBundle(
5350
5434
  runtimeKind: lifecycle.runtimeKind,
5351
5435
  outcome,
5352
5436
  outcomeCode,
5353
- lineage,
5437
+ lineage: publishedLineage(lineage, hostRun),
5354
5438
  ...(req.intent !== undefined ? { intent: structuredClone(req.intent) } : {}),
5355
5439
  pathScope: structuredClone(lifecycle.pathScope.provenance),
5356
5440
  identity,
@@ -5481,7 +5565,7 @@ export function createDispatchBundle(
5481
5565
  outcome,
5482
5566
  outcomeCode: receipt.outcomeCode ?? null,
5483
5567
  outcomeDetail: receipt.outcomeDetail ?? null,
5484
- lineage,
5568
+ lineage: publishedLineage(lineage, hostRun),
5485
5569
  tokenCount: receipt.tokenCount,
5486
5570
  inputTokenCount: receipt.inputTokenCount ?? 0,
5487
5571
  outputTokenCount: receipt.outputTokenCount ?? 0,
@@ -5601,13 +5685,12 @@ export function createDispatchBundle(
5601
5685
  const steering = snapshotSteeringProvenance();
5602
5686
  const capturedOutput = outputCapture.snapshot();
5603
5687
  const observedRunEffects = runEffects.snapshot();
5604
- const appliedResultContract = appliesRecipeResultContract(req.gate?.role)
5605
- ? (req.resultContractOverride ?? lifecycle.recipe?.resultContract ?? null)
5606
- : null;
5688
+ const appliedResultContract = dispatchResultContract(req, lifecycle.recipe) ?? null;
5607
5689
  const resultContract = validateRecipeResult({
5608
5690
  contract: appliedResultContract,
5609
5691
  reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
5610
5692
  output: capturedOutput?.state === "final" ? capturedOutput.text : null,
5693
+ outputTruncated: capturedOutput?.truncated === true,
5611
5694
  cwd: lifecycle.cwd,
5612
5695
  networkAllowed:
5613
5696
  lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
@@ -5657,8 +5740,7 @@ export function createDispatchBundle(
5657
5740
  finalDetail = [finalDetail, describeUngroundedValidations(validationGrounding)].filter(Boolean).join("; ");
5658
5741
  }
5659
5742
  const hasTerminalArtifact =
5660
- (req.resultContractOverride ?? lifecycle.recipe?.resultContract)?.kind === "architect-plan" &&
5661
- resultValidation?.conformance === "pass";
5743
+ appliedResultContract?.kind === "architect-plan" && resultValidation?.conformance === "pass";
5662
5744
  if (finalOutcome === "succeeded" && !hasDurableFinalOutput(capturedOutput) && !hasTerminalArtifact) {
5663
5745
  finalOutcome = "failed";
5664
5746
  outcomeCode = "worker_final_output_missing";
@@ -5848,7 +5930,7 @@ export function createDispatchBundle(
5848
5930
  outcome: "failed" satisfies RunOutcome,
5849
5931
  outcomeDetail: detail,
5850
5932
  reason: "failed",
5851
- lineage,
5933
+ lineage: publishedLineage(lineage, hostRun),
5852
5934
  exitCode: 1,
5853
5935
  });
5854
5936
  throw error;
@@ -5859,6 +5941,7 @@ export function createDispatchBundle(
5859
5941
  })().then(resolveFinal, rejectFinal);
5860
5942
 
5861
5943
  active.set(envelope.id, activeRun);
5944
+ watchAssignmentDeadline(activeRun, preparation?.deadlineAt);
5862
5945
 
5863
5946
  return attachRouteObservation({
5864
5947
  runId: envelope.id,
@@ -5985,11 +6068,6 @@ export function createDispatchBundle(
5985
6068
  req = validation.restore(validated.spec);
5986
6069
 
5987
6070
  if (req.delegationAgentId) {
5988
- if (req.budget !== undefined) {
5989
- throw new Error(
5990
- "dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
5991
- );
5992
- }
5993
6071
  const protectedArtifactState = getProtectedArtifactState();
5994
6072
  assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
5995
6073
  if (req.responseSchema !== undefined) {
@@ -6405,6 +6483,7 @@ export function createDispatchBundle(
6405
6483
  exitCode: 0,
6406
6484
  gate,
6407
6485
  council,
6486
+ ...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
6408
6487
  ...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
6409
6488
  });
6410
6489
  const receipt = l.recordReceipt(runId, {
@@ -6446,6 +6525,7 @@ export function createDispatchBundle(
6446
6525
  sessionId: input.template.sessionId,
6447
6526
  gate,
6448
6527
  council,
6528
+ ...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
6449
6529
  ...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
6450
6530
  });
6451
6531
  await l.persist();
@@ -6651,7 +6731,7 @@ export function createDispatchBundle(
6651
6731
  runtimeKind: run.runtimeKind,
6652
6732
  outcomePhase: run.stallKilled ? "terminating" : run.aborted ? "aborting" : "running",
6653
6733
  heartbeat,
6654
- lineage: { ...run.lineage },
6734
+ lineage: publishedLineage(run.lineage, run.hostRun),
6655
6735
  startedAt: run.startedAt,
6656
6736
  elapsedMs,
6657
6737
  timing,
@@ -6739,7 +6819,12 @@ export function createDispatchBundle(
6739
6819
  if (assignments.get(id) !== null) return id;
6740
6820
  const live = active.get(id);
6741
6821
  if (live) return live.lineage.rootRunId;
6742
- return ledger?.get(id)?.lineage?.rootRunId ?? id;
6822
+ const local = assignmentRootsByAttempt.get(id);
6823
+ if (local !== undefined) return local;
6824
+ // After restart the immutable attempt history identifies the logical
6825
+ // assignment; a receipt's root may instead name its main host run.
6826
+ const stored = listStoredAssignments().find((record) => record.assignmentId === id || record.attempts.includes(id));
6827
+ return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
6743
6828
  }
6744
6829
 
6745
6830
  function currentAssignmentRun(id: string): ActiveRun | null {
@@ -6794,8 +6879,8 @@ export function createDispatchBundle(
6794
6879
  };
6795
6880
  },
6796
6881
  assignments: {
6797
- get: (id) => assignments.get(id),
6798
- getStored: (id) => getStoredAssignment(id),
6882
+ get: (id) => assignments.get(assignmentRootFor(id)),
6883
+ getStored: (id) => getStoredAssignment(assignmentRootFor(id)),
6799
6884
  flushWrites: async () => {
6800
6885
  await Promise.allSettled([...assignmentWrites]);
6801
6886
  },