@iowarp/clio-coder 0.4.3 → 0.4.5

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 (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -29,6 +29,8 @@ export interface TaskBoardTask {
29
29
  status: TaskLedgerStatus;
30
30
  origin?: "agent" | "user";
31
31
  userTaskId?: string;
32
+ /** Operator requirements are declarations, not projected verifier execution results. */
33
+ requiredValidationEvidence?: TaskLedgerValidationEvidence[];
32
34
  /** Block or drop reason; empty for pending/active/completed tasks. */
33
35
  reason?: string;
34
36
  /** Evidence note recorded when the task was completed. */
@@ -64,7 +66,7 @@ export interface TaskBoardCounts {
64
66
  export type TaskBoardMutation =
65
67
  | { op: "plan"; title: string; tasks: ReadonlyArray<string> }
66
68
  | { op: "add"; tasks: ReadonlyArray<string> }
67
- | { op: "pick"; title: string; userTaskId: string }
69
+ | { op: "pick"; title: string; userTaskId: string; verification?: ReadonlyArray<{ check: string; timeoutMs: number }> }
68
70
  | { op: "start"; id: string }
69
71
  | { op: "done"; id: string; evidence: string }
70
72
  | { op: "block"; id: string; reason: string }
@@ -179,6 +181,7 @@ function boardStatus(tasks: ReadonlyArray<TaskBoardTask>): TaskLedgerStatus {
179
181
  export function toTaskLedgerEntryFields(board: TaskBoardSnapshot, now: Date): TaskLedgerEntryFields {
180
182
  const evidence: TaskLedgerValidationEvidence[] = [];
181
183
  const subgoals: TaskLedgerGoal[] = board.tasks.map((task) => {
184
+ evidence.push(...(task.requiredValidationEvidence ?? []).map((item) => ({ ...item })));
182
185
  if (task.status === "completed" && task.evidence) {
183
186
  evidence.push({
184
187
  id: `${task.id}.evidence`,
@@ -284,6 +287,23 @@ export function foldSessionTaskHistory(entries: ReadonlyArray<unknown>): Session
284
287
  .map(({ lastIndex: _lastIndex, tasks, ...board }) => ({ ...board, tasks: [...tasks.values()] }));
285
288
  }
286
289
 
290
+ function acceptanceRequirementDescription(check: string): string {
291
+ return `Operator acceptance requirement: ${check} (declaration only; see verification receipts for execution status)`;
292
+ }
293
+
294
+ /** Old pickup snapshots used pending for declarations; preserve any actual observations. */
295
+ function acceptanceRequirement(item: TaskLedgerValidationEvidence): TaskLedgerValidationEvidence {
296
+ if (
297
+ item.status === "pending" &&
298
+ item.command &&
299
+ item.description === `Operator acceptance: ${item.command}` &&
300
+ item.observedAt === undefined
301
+ ) {
302
+ return { ...item, status: "required", description: acceptanceRequirementDescription(item.command) };
303
+ }
304
+ return { ...item };
305
+ }
306
+
287
307
  function toEntryView(entry: {
288
308
  boardId?: string;
289
309
  goals: TaskLedgerGoal[];
@@ -308,6 +328,8 @@ function toEntryView(entry: {
308
328
  origin: goal.origin ?? "agent",
309
329
  };
310
330
  if (goal.userTaskId) task.userTaskId = goal.userTaskId;
331
+ const required = entry.requiredValidationEvidence.filter((item) => item.id.startsWith(`${goal.id}.acceptance.`));
332
+ if (required.length > 0) task.requiredValidationEvidence = required.map(acceptanceRequirement);
311
333
  if (goal.description) task.reason = goal.description;
312
334
  const evidence = evidenceByTask.get(goal.id);
313
335
  if (evidence) task.evidence = evidence;
@@ -390,6 +412,15 @@ function applyMutation(
390
412
  origin: "user",
391
413
  userTaskId: mutation.userTaskId,
392
414
  };
415
+ if (mutation.verification && mutation.verification.length > 0) {
416
+ picked.requiredValidationEvidence = mutation.verification.map((item, index) => ({
417
+ id: `${picked.id}.acceptance.${index}`,
418
+ description: acceptanceRequirementDescription(item.check),
419
+ command: item.check,
420
+ status: "required",
421
+ notes: `timeoutMs=${item.timeoutMs}`,
422
+ }));
423
+ }
393
424
  return {
394
425
  board: {
395
426
  boardId: board?.boardId ?? "",
@@ -14,8 +14,7 @@ import { entryBelongsToPath } from "./active-path.js";
14
14
  * install it as current.
15
15
  *
16
16
  * Used by SessionContract.fork (current session) and the /fork message
17
- * picker path that lands in slice 12b-3. Kept out of extension.ts so the
18
- * bundle wiring stays thin.
17
+ * picker overlay. Kept out of extension.ts so the bundle wiring stays thin.
19
18
  */
20
19
  export interface ForkInput {
21
20
  /** The state we are forking from. Must carry a live writer. */
@@ -6,7 +6,7 @@ import type { ResolvedLabel } from "./manager.js";
6
6
  * Purely functional tree-walk helpers. Given the raw SessionTreeNode[] that
7
7
  * the engine persists plus a label map and a leaf pointer, produce a
8
8
  * render-friendly snapshot. No I/O. Used by SessionContract.tree() to
9
- * deliver a serializable structure to overlay renderers in slice 12b-2.
9
+ * deliver a serializable structure to the /tree overlay renderer.
10
10
  */
11
11
 
12
12
  /**
@@ -0,0 +1,56 @@
1
+ import {
2
+ DISPATCH_INTENT_TIMEOUT_MIN_MS,
3
+ type DispatchIntentCheckBound,
4
+ type DispatchIntentVerification,
5
+ normalizeIntentExpectedOutputs,
6
+ normalizeIntentVerification,
7
+ } from "../dispatch/intent.js";
8
+
9
+ export interface UserTaskAcceptance {
10
+ expectedOutputs: string[];
11
+ verification: DispatchIntentVerification[];
12
+ }
13
+
14
+ /** Validate stored acceptance without consulting a catalog that may have changed. */
15
+ export function normalizeUserTaskAcceptance(raw: unknown): UserTaskAcceptance {
16
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
17
+ throw new Error("acceptance must be an object");
18
+ }
19
+ const value = raw as Record<string, unknown>;
20
+ if (Object.keys(value).some((key) => key !== "expectedOutputs" && key !== "verification")) {
21
+ throw new Error("acceptance contains an unknown field");
22
+ }
23
+ if (!Array.isArray(value.expectedOutputs) || !Array.isArray(value.verification)) {
24
+ throw new Error("acceptance requires expectedOutputs and verification arrays");
25
+ }
26
+ const checks = new Map<string, DispatchIntentCheckBound>();
27
+ const rawVerification = value.verification.map((entry: unknown) => {
28
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
29
+ throw new Error("acceptance verification must contain check and timeoutMs");
30
+ }
31
+ const item = entry as Record<string, unknown>;
32
+ if (Object.keys(item).some((key) => key !== "check" && key !== "timeoutMs")) {
33
+ throw new Error("acceptance verification contains an unknown field");
34
+ }
35
+ if (
36
+ typeof item.check !== "string" ||
37
+ typeof item.timeoutMs !== "number" ||
38
+ !Number.isSafeInteger(item.timeoutMs) ||
39
+ item.timeoutMs <= 0
40
+ ) {
41
+ throw new Error("acceptance verification requires a check and a positive integer timeoutMs");
42
+ }
43
+ checks.set(item.check.trim(), {
44
+ id: item.check.trim(),
45
+ timeoutMs: Math.max(DISPATCH_INTENT_TIMEOUT_MIN_MS, item.timeoutMs, checks.get(item.check.trim())?.timeoutMs ?? 0),
46
+ });
47
+ return { check: item.check, timeout_ms: item.timeoutMs };
48
+ });
49
+ const expectedOutputs = normalizeIntentExpectedOutputs(value.expectedOutputs);
50
+ if (!Array.isArray(expectedOutputs))
51
+ throw new Error(expectedOutputs.ok ? "invalid acceptance outputs" : expectedOutputs.message);
52
+ const verification = normalizeIntentVerification(rawVerification, checks);
53
+ if (!Array.isArray(verification))
54
+ throw new Error(verification.ok ? "invalid acceptance verification" : verification.message);
55
+ return { expectedOutputs, verification };
56
+ }
@@ -0,0 +1,40 @@
1
+ import { isSessionEntry } from "../session/entries.js";
2
+ import type { TaskBoardSnapshot } from "../session/task-board.js";
3
+ import type { UserTaskAcceptance } from "./acceptance.js";
4
+ import type { UserTask } from "./store.js";
5
+
6
+ /** Keep a task's acceptance through the turn that finishes or blocks its board row. */
7
+ export function activeUserTaskAcceptance(
8
+ tasks: ReadonlyArray<UserTask>,
9
+ board: TaskBoardSnapshot | null,
10
+ sessionId: string | null,
11
+ window: ReadonlyArray<unknown>,
12
+ ): UserTaskAcceptance | undefined {
13
+ if (!board || !sessionId) return undefined;
14
+ const touched = new Set<string>();
15
+ for (const entry of window) {
16
+ if (!isSessionEntry(entry) || entry.kind !== "message" || entry.role !== "tool_call") continue;
17
+ if (!entry.payload || typeof entry.payload !== "object") continue;
18
+ const payload = entry.payload as { name?: string; toolName?: string; args?: { action?: string; id?: string } };
19
+ if (
20
+ (payload.name ?? payload.toolName) === "tasks" &&
21
+ payload.args?.id &&
22
+ ["done", "block", "drop"].includes(payload.args.action ?? "")
23
+ )
24
+ touched.add(payload.args.id);
25
+ }
26
+ const linked = new Set(
27
+ board.tasks
28
+ .filter((task) => task.status === "pending" || task.status === "active" || touched.has(task.id))
29
+ .map((task) => task.userTaskId),
30
+ );
31
+ const acceptance = tasks
32
+ .filter((task) => task.handedSessionId === sessionId && linked.has(task.id))
33
+ .flatMap((task) => (task.acceptance ? [task.acceptance] : []));
34
+ return acceptance.length > 0
35
+ ? {
36
+ expectedOutputs: [...new Set(acceptance.flatMap((item) => item.expectedOutputs))],
37
+ verification: acceptance.flatMap((item) => item.verification),
38
+ }
39
+ : undefined;
40
+ }
@@ -0,0 +1,16 @@
1
+ import type { UserTask } from "./store.js";
2
+
3
+ /** The operator-authored pickup turn shared by CLI, slash, and overlay handoffs. */
4
+ export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note" | "acceptance">): string {
5
+ const note = task.note ? ` ${task.note}.` : "";
6
+ const acceptance = task.acceptance ? ` Acceptance: ${JSON.stringify(task.acceptance)}.` : "";
7
+ return (
8
+ `Operator task ${task.id}: ${task.title}.${note}${acceptance} ` +
9
+ `Before working this task, call tasks action="pick" id="${task.id}" and confirm its durable session/board link. ` +
10
+ "Use the returned linked tN for start and done; do not replace the pickup with a self-created plan or pick unrelated inbox tasks. " +
11
+ "Respect the task's authorized scope, including proposal-only limits. If pickup fails, report the actual state and stop this task's work. " +
12
+ "After work and required verification, call tasks done on that linked tN with concrete evidence, then tasks list. " +
13
+ `Claim ${task.id} completed only if the linked board row is completed and the durable operator task is done with the same session/board link. ` +
14
+ "Report the IDs, actual state, and verification results or limitations; an unpicked or still-handed task is not done."
15
+ );
16
+ }
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { CLIO_PROJECT_DIR } from "../../core/artifact-paths.js";
4
4
  import { atomicWrite } from "../../engine/session.js";
5
+ import { normalizeUserTaskAcceptance, type UserTaskAcceptance } from "./acceptance.js";
5
6
 
6
7
  export const USER_TASKS_FILE_VERSION = 1 as const;
7
8
  export const USER_TASKS_RELATIVE_PATH = `${CLIO_PROJECT_DIR}/user-tasks.json`;
@@ -12,6 +13,7 @@ export interface UserTask {
12
13
  id: string;
13
14
  title: string;
14
15
  note?: string;
16
+ acceptance?: UserTaskAcceptance;
15
17
  status: UserTaskStatus;
16
18
  createdAt: string;
17
19
  updatedAt: string;
@@ -37,7 +39,8 @@ export interface UserTasksStore {
37
39
  readonly path: string;
38
40
  snapshot(): ReadonlyArray<UserTask>;
39
41
  get(id: string): UserTask | null;
40
- add(title: string, note?: string): UserTask;
42
+ add(title: string, note?: string, acceptance?: UserTaskAcceptance): UserTask;
43
+ setAcceptance(id: string, acceptance: UserTaskAcceptance): UserTask;
41
44
  hand(id: string, sessionId?: string): UserTask;
42
45
  done(id: string): UserTask;
43
46
  drop(id: string): UserTask;
@@ -65,6 +68,7 @@ const TASK_KEYS = new Set([
65
68
  "id",
66
69
  "title",
67
70
  "note",
71
+ "acceptance",
68
72
  "status",
69
73
  "createdAt",
70
74
  "updatedAt",
@@ -86,6 +90,13 @@ function isOptionalString(value: unknown): boolean {
86
90
 
87
91
  function isUserTask(value: unknown): value is UserTask {
88
92
  if (!isRecord(value) || !hasOnlyKeys(value, TASK_KEYS)) return false;
93
+ if (value.acceptance !== undefined) {
94
+ try {
95
+ normalizeUserTaskAcceptance(value.acceptance);
96
+ } catch {
97
+ return false;
98
+ }
99
+ }
89
100
  return (
90
101
  typeof value.id === "string" &&
91
102
  /^u[1-9]\d*$/.test(value.id) &&
@@ -138,7 +149,7 @@ function parseFile(body: string, path: string): UserTasksFile {
138
149
  }
139
150
 
140
151
  function copyTask(task: UserTask): UserTask {
141
- return { ...task };
152
+ return { ...task, ...(task.acceptance ? { acceptance: normalizeUserTaskAcceptance(task.acceptance) } : {}) };
142
153
  }
143
154
 
144
155
  function initialFile(): UserTasksFile {
@@ -219,7 +230,8 @@ export function createUserTasksStore(deps: UserTasksStoreDeps): UserTasksStore {
219
230
  const task = load().tasks.find((candidate) => candidate.id === id);
220
231
  return task ? copyTask(task) : null;
221
232
  },
222
- add(title: string, note?: string): UserTask {
233
+ add(title: string, note?: string, acceptance?: UserTaskAcceptance): UserTask {
234
+ const normalizedAcceptance = acceptance === undefined ? undefined : normalizeAcceptance(acceptance);
223
235
  const normalizedTitle = title.trim();
224
236
  if (normalizedTitle.length === 0) throw new UserTasksStoreError("operator task title cannot be empty");
225
237
  const normalizedNote = note?.trim();
@@ -229,6 +241,7 @@ export function createUserTasksStore(deps: UserTasksStoreDeps): UserTasksStore {
229
241
  id: `u${file.nextId}`,
230
242
  title: normalizedTitle,
231
243
  ...(normalizedNote ? { note: normalizedNote } : {}),
244
+ ...(normalizedAcceptance ? { acceptance: normalizedAcceptance } : {}),
232
245
  status: "open",
233
246
  createdAt: timestamp,
234
247
  updatedAt: timestamp,
@@ -238,6 +251,16 @@ export function createUserTasksStore(deps: UserTasksStoreDeps): UserTasksStore {
238
251
  save(file);
239
252
  return copyTask(task);
240
253
  },
254
+ setAcceptance(id: string, acceptance: UserTaskAcceptance): UserTask {
255
+ const normalized = normalizeAcceptance(acceptance);
256
+ const file = load();
257
+ const task = file.tasks.find((item) => item.id === id);
258
+ if (!task) throw new UserTasksStoreError(`operator task ${id} was not found`);
259
+ task.acceptance = normalized;
260
+ task.updatedAt = now();
261
+ save(file);
262
+ return copyTask(task);
263
+ },
241
264
  hand(id: string, sessionId?: string): UserTask {
242
265
  return mutate(id, ["open"], "handed", sessionId);
243
266
  },
@@ -295,3 +318,11 @@ export function createUserTasksStore(deps: UserTasksStoreDeps): UserTasksStore {
295
318
  },
296
319
  };
297
320
  }
321
+
322
+ function normalizeAcceptance(raw: unknown): UserTaskAcceptance {
323
+ try {
324
+ return normalizeUserTaskAcceptance(raw);
325
+ } catch (error) {
326
+ throw new UserTasksStoreError(error instanceof Error ? error.message : String(error), { cause: error });
327
+ }
328
+ }
@@ -5,6 +5,7 @@ import {
5
5
  type DelegationAgentConfig,
6
6
  } from "../../core/defaults.js";
7
7
  import type { HeartbeatStamp } from "../../domains/dispatch/heartbeat.js";
8
+ import { resolveCostProvenance } from "../../domains/providers/types/cost-provenance.js";
8
9
  import type { AutonomyLevel } from "../../domains/safety/autonomy.js";
9
10
  import type { SafetyContract } from "../../domains/safety/contract.js";
10
11
  import type { AgentEvent } from "../types.js";
@@ -134,13 +135,16 @@ function flattenPrompt(input: AcpDelegationRunInput): string {
134
135
  return parts.join("\n\n");
135
136
  }
136
137
 
137
- function emptyUsage(): AcpDelegationUsage {
138
+ export function emptyUsage(): AcpDelegationUsage {
138
139
  return {
140
+ tokensReported: false,
139
141
  inputTokens: 0,
140
142
  outputTokens: 0,
141
143
  cacheReadTokens: 0,
142
144
  cacheWriteTokens: 0,
143
145
  reasoningTokens: 0,
146
+ totalTokens: 0,
147
+ costUsd: 0,
144
148
  };
145
149
  }
146
150
 
@@ -148,13 +152,59 @@ function finite(value: unknown): number {
148
152
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
149
153
  }
150
154
 
151
- function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
155
+ /** Presence matters: an explicit zero must not fall back to another observation. */
156
+ function nonnegative(value: unknown): number | undefined {
157
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
158
+ }
159
+
160
+ export function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
152
161
  if (!isRecord(raw)) return;
153
- into.inputTokens += finite(raw.input) + finite(raw.inputTokens) + finite(raw.input_tokens);
154
- into.outputTokens += finite(raw.output) + finite(raw.outputTokens) + finite(raw.output_tokens);
155
- into.cacheReadTokens += finite(raw.cacheRead) + finite(raw.cacheReadTokens) + finite(raw.cache_read_tokens);
156
- into.cacheWriteTokens += finite(raw.cacheWrite) + finite(raw.cacheWriteTokens) + finite(raw.cache_write_tokens);
162
+ const tokensReported = [
163
+ raw.input,
164
+ raw.inputTokens,
165
+ raw.input_tokens,
166
+ raw.output,
167
+ raw.outputTokens,
168
+ raw.output_tokens,
169
+ raw.cacheRead,
170
+ raw.cacheReadTokens,
171
+ raw.cache_read_tokens,
172
+ raw.cacheWrite,
173
+ raw.cacheWriteTokens,
174
+ raw.cache_write_tokens,
175
+ raw.reasoning,
176
+ raw.reasoningTokens,
177
+ raw.reasoning_tokens,
178
+ raw.totalTokens,
179
+ raw.total_tokens,
180
+ ].some((value) => nonnegative(value) !== undefined);
181
+ into.tokensReported ||= tokensReported;
182
+ const input = finite(raw.input) + finite(raw.inputTokens) + finite(raw.input_tokens);
183
+ const output = finite(raw.output) + finite(raw.outputTokens) + finite(raw.output_tokens);
184
+ const cacheRead = finite(raw.cacheRead) + finite(raw.cacheReadTokens) + finite(raw.cache_read_tokens);
185
+ const cacheWrite = finite(raw.cacheWrite) + finite(raw.cacheWriteTokens) + finite(raw.cache_write_tokens);
186
+ into.inputTokens += input;
187
+ into.outputTokens += output;
188
+ into.cacheReadTokens += cacheRead;
189
+ into.cacheWriteTokens += cacheWrite;
157
190
  into.reasoningTokens += finite(raw.reasoning) + finite(raw.reasoningTokens) + finite(raw.reasoning_tokens);
191
+ // Prefer the peer's explicit total, including zero,
192
+ // otherwise sum the four billed categories (reasoning excluded, since a peer
193
+ // that reports it separately still counts it inside output).
194
+ const explicitTotal = nonnegative(raw.totalTokens) ?? nonnegative(raw.total_tokens);
195
+ into.totalTokens += explicitTotal ?? input + output + cacheRead + cacheWrite;
196
+ // Clio metadata uses costUsd; legacy message usage uses cost.total. These
197
+ // are alternate representations of one amount, never additive sources.
198
+ const cost = (isRecord(raw.cost) ? nonnegative(raw.cost.total) : undefined) ?? nonnegative(raw.costUsd);
199
+ into.costUsd += cost ?? 0;
200
+ if (tokensReported || cost !== undefined) {
201
+ const provenance = cost === undefined ? "unknown" : resolveCostProvenance(raw.costProvenance, "unknown");
202
+ const previous = into.costProvenance;
203
+ if (previous === undefined || previous === provenance) into.costProvenance = provenance;
204
+ else if (previous === "unknown" || provenance === "unknown") into.costProvenance = "unknown";
205
+ else if (previous === "estimated" || provenance === "estimated") into.costProvenance = "estimated";
206
+ else into.costProvenance = "known";
207
+ }
158
208
  }
159
209
 
160
210
  function errorMessage(value: unknown): string {
@@ -177,9 +227,9 @@ function errorEvents(messageText: string): AgentEvent[] {
177
227
  }
178
228
 
179
229
  export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegationRunHandle {
180
- // Validated settings always populate these values. Keep the public runtime
181
- // boundary safe for direct callers too: omission must not turn a silent ACP
182
- // peer into an unbounded request.
230
+ // Connection faults stay bounded. Elapsed turn time is not a progress signal;
231
+ // only an explicit positive timeout stops a healthy turn. Dispatch owns its
232
+ // event-inactivity watchdog and cancellation/process cleanup.
183
233
  const connectTimeoutMs = input.agent.connectTimeoutMs ?? DEFAULT_DELEGATION_CONNECT_TIMEOUT_MS;
184
234
  const turnTimeoutMs = input.agent.turnTimeoutMs ?? DEFAULT_DELEGATION_TURN_TIMEOUT_MS;
185
235
  const now = input.now ?? Date.now;
@@ -304,7 +354,7 @@ export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegati
304
354
  sessionId,
305
355
  prompt: [{ type: "text", text: flattenPrompt(input) }],
306
356
  },
307
- turnTimeoutMs,
357
+ turnTimeoutMs === 0 ? undefined : turnTimeoutMs,
308
358
  );
309
359
  // ACP v1 has no usage field on PromptResponse. Clio servers report it in
310
360
  // _meta; other agents (Copilot/Codex/OpenCode) report nothing here, so usage
@@ -60,7 +60,7 @@ export interface AcpServerChat {
60
60
  onEvent(handler: (event: AcpServerEvent) => void): () => void;
61
61
  isStreaming(): boolean;
62
62
  getSessionId(): string | null;
63
- /** Replace provider context and the next persisted parent after session/load. */
63
+ /** Replace provider context and the next persisted parent for a new or loaded session. */
64
64
  resetForSession?(leafTurnId: string | null, replayMessages?: ReadonlyArray<AgentMessage>): void;
65
65
  dispose?(): void;
66
66
  }
@@ -268,6 +268,7 @@ const ACP_ADMISSION_REASONS = new Set([
268
268
  "model-not-configured",
269
269
  "chat-unsupported",
270
270
  "streaming-unsupported",
271
+ "context-window-exceeded",
271
272
  "admission-failed",
272
273
  ]);
273
274
 
@@ -1406,6 +1407,7 @@ function installPermissionBridge(input: {
1406
1407
  toolCallSnapshot: (wireId: string) => AcpToolCallSnapshot | null;
1407
1408
  permissionTimeoutMs: number;
1408
1409
  expireActivePrompt: () => void;
1410
+ cancelActivePrompt: (reason: string) => void;
1409
1411
  }): AcpPermissionBridge {
1410
1412
  if (!input.toolRegistry) return { unregister: () => {}, cancelPending: () => {} };
1411
1413
  let pendingCancel: ((reason: string) => void) | null = null;
@@ -1573,6 +1575,17 @@ function installPermissionBridge(input: {
1573
1575
  // client mint `allow-always` and get a grant this server never
1574
1576
  // offered as an option.
1575
1577
  const answer = outcome.response.outcome;
1578
+ if (answer.outcome === "cancelled") {
1579
+ const reason = "ACP client cancelled permission";
1580
+ // Abort before releasing the parked tools so their results cannot
1581
+ // start another model request while session/cancel is in flight.
1582
+ input.cancelActivePrompt(reason);
1583
+ emitResolution({ status: "denied", decidedBy: "cancelled", reason });
1584
+ queuedRequestIds.clear();
1585
+ queuedRequestDetails.clear();
1586
+ input.toolRegistry?.cancelParkedCalls(reason);
1587
+ return;
1588
+ }
1576
1589
  if (answer.outcome === "selected" && answer.optionId === "allow-once") {
1577
1590
  emitResolution({ status: "granted", decidedBy: "acp-client" });
1578
1591
  await input.toolRegistry?.resumeParkedCalls({
@@ -1695,6 +1708,10 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1695
1708
  activePromptState.permissionExpired = true;
1696
1709
  options.chat.cancel();
1697
1710
  },
1711
+ cancelActivePrompt: (reason) => {
1712
+ const session = activeSessionId === null ? undefined : sessions.get(activeSessionId);
1713
+ if (session) cancelSession(session, reason);
1714
+ },
1698
1715
  });
1699
1716
  /**
1700
1717
  * Sends one frame of the opt-in stream. Every forwarded channel goes through
@@ -2128,9 +2145,8 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2128
2145
 
2129
2146
  options.transport.onRequest("session/new", (params) => {
2130
2147
  requireInitialized();
2131
- // One chat instance, one provider context, one ledger ancestry. A second
2132
- // session id over the same process would share all three with the first,
2133
- // so the honest answer is to refuse and let the client start a process.
2148
+ // The chat instance can bind only one session at a time. Closing that
2149
+ // session releases the slot; the next creation resets its conversation.
2134
2150
  if (sessionCreated) {
2135
2151
  throw new AcpRequestError(-32000, "this server hosts one session per process", { code: "session_limit" });
2136
2152
  }
@@ -2144,6 +2160,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2144
2160
  if (safeStoredIdentifier(id, ACP_MAX_SESSION_ID_BYTES) === null) {
2145
2161
  throw new AcpRequestError(-32000, "session creation failed", { code: "internal_error" });
2146
2162
  }
2163
+ options.chat.resetForSession?.(null);
2147
2164
  const autonomy = options.autonomy?.() ?? DEFAULT_AUTONOMY_LEVEL;
2148
2165
  const boundTarget = safeConfiguredIdentifier(meta?.target ?? route.target, ACP_MAX_TARGET_ID_BYTES);
2149
2166
  const boundModel = safeConfiguredIdentifier(meta?.model ?? route.model, ACP_MAX_MODEL_ID_BYTES);
@@ -2529,6 +2546,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2529
2546
  if (options.session?.current()?.id === session.id) await options.session.close();
2530
2547
  sessions.delete(session.id);
2531
2548
  if (boundSessionId === session.id) boundSessionId = null;
2549
+ sessionCreated = false;
2532
2550
  closedSessionIds.add(session.id);
2533
2551
  return {};
2534
2552
  });
@@ -6,6 +6,7 @@ import {
6
6
  reportCommitAttributionDiagnostic,
7
7
  withManagedGitCommitAttributionEnvironment,
8
8
  } from "../../core/git-commit-attribution.js";
9
+ import { buildSafeToolEnv } from "../../core/safe-exec.js";
9
10
  import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
10
11
  import {
11
12
  ACP_INTERNAL_ERROR_MESSAGE,
@@ -207,7 +208,7 @@ class StdioJsonRpcTransport implements AcpJsonRpcTransport {
207
208
  this.childClosePromise = new Promise((resolve) => {
208
209
  this.resolveChildClose = resolve;
209
210
  });
210
- const childEnvironment = options.env ? { ...process.env, ...options.env } : process.env;
211
+ const childEnvironment = buildSafeToolEnv(options.env);
211
212
  // A delegated external harness authors its own commits. Clio only
212
213
  // assisted by delegating, so no Co-authored-by is claimed for it.
213
214
  const attribution = withManagedGitCommitAttributionEnvironment(childEnvironment, {
@@ -534,6 +535,10 @@ export function createStdioTransport(
534
535
  }
535
536
 
536
537
  class StreamJsonRpcPeerTransport implements AcpJsonRpcPeerTransport {
538
+ private outputPaused = false;
539
+ private queuedOutputBytes = 0;
540
+ private sinkOutputBytes = 0;
541
+ private readonly outputQueue: string[] = [];
537
542
  private nextId = 1;
538
543
  private buffer = "";
539
544
  /** True while the bytes of an oversized line are being dropped up to its terminating newline. */
@@ -626,18 +631,56 @@ class StreamJsonRpcPeerTransport implements AcpJsonRpcPeerTransport {
626
631
  }
627
632
 
628
633
  private write(message: AcpJsonRpcMessage): void {
634
+ if (this.closed) return;
629
635
  const line = `${JSON.stringify(message)}\n`;
630
- if (this.writeOverride) {
631
- this.writeOverride(line);
632
- return;
636
+ if (this.outputPaused) {
637
+ const bytes = Buffer.byteLength(line, "utf8");
638
+ // Include bytes already held by the sink in the existing frame budget.
639
+ if (this.queuedOutputBytes + this.sinkOutputBytes + bytes > ACP_MAX_INPUT_LINE_BYTES) {
640
+ this.markClosed(new AcpProcessError("ACP output buffer exceeded byte limit"));
641
+ return;
642
+ }
633
643
  }
634
- // A `false` return means the stream buffered rather than flushed. Honoring
635
- // it means pausing frame production, which changes turn timing, so the
636
- // decision to keep writing is deferred rather than forgotten (CONTRACT
637
- // C001 §6 leaves stdout backpressure out of this profile).
638
- this.output.write(line);
644
+ this.outputQueue.push(line);
645
+ this.queuedOutputBytes += Buffer.byteLength(line, "utf8");
646
+ if (!this.outputPaused) this.flushOutput();
639
647
  }
640
648
 
649
+ private readonly flushOutput = (): void => {
650
+ this.outputPaused = false;
651
+ while (!this.closed && !this.outputPaused && this.outputQueue.length > 0) {
652
+ const line = this.outputQueue.shift();
653
+ if (line === undefined) break;
654
+ this.queuedOutputBytes -= Buffer.byteLength(line, "utf8");
655
+ try {
656
+ // Stdout can count buffered strings in UTF-16 units rather than bytes.
657
+ // Retain their byte count until drain, bounding earlier writes by at
658
+ // most three UTF-8 bytes per unit still held by the sink.
659
+ this.sinkOutputBytes = Math.min(this.sinkOutputBytes, this.output.writableLength * 3);
660
+ let ready: boolean;
661
+ if (this.writeOverride) {
662
+ this.writeOverride(line);
663
+ // The stdout guard writes to this sink but does not return write's boolean.
664
+ ready = !this.output.writableNeedDrain;
665
+ } else {
666
+ ready = this.output.write(line);
667
+ }
668
+ this.sinkOutputBytes =
669
+ this.output.writableLength === 0 ? 0 : this.sinkOutputBytes + Buffer.byteLength(line, "utf8");
670
+ if (!ready && !this.closed) {
671
+ if (this.queuedOutputBytes + this.sinkOutputBytes > ACP_MAX_INPUT_LINE_BYTES) {
672
+ this.markClosed(new AcpProcessError("ACP output buffer exceeded byte limit"));
673
+ return;
674
+ }
675
+ this.outputPaused = true;
676
+ this.output.once("drain", this.flushOutput);
677
+ }
678
+ } catch (err) {
679
+ this.markClosed(new AcpProcessError(`ACP output write failed: ${errorMessage(err)}`));
680
+ }
681
+ }
682
+ };
683
+
641
684
  private consume(chunk: string): void {
642
685
  this.buffer += chunk;
643
686
  for (;;) {
@@ -757,6 +800,9 @@ class StreamJsonRpcPeerTransport implements AcpJsonRpcPeerTransport {
757
800
  private markClosed(reason: unknown): void {
758
801
  if (this.isClosed) return;
759
802
  this.isClosed = true;
803
+ this.output.removeListener("drain", this.flushOutput);
804
+ this.outputQueue.length = 0;
805
+ this.queuedOutputBytes = 0;
760
806
  this.failAll(reason);
761
807
  for (const handler of this.closeHandlers) handler();
762
808
  }
@@ -1,3 +1,4 @@
1
+ import type { CostProvenance } from "../../domains/providers/types/cost-provenance.js";
1
2
  import type { AgentMessage } from "../types.js";
2
3
 
3
4
  /**
@@ -189,11 +190,19 @@ export interface AcpPromptResponse {
189
190
  }
190
191
 
191
192
  export interface AcpDelegationUsage {
193
+ /** A valid peer token field was present, including an explicit zero. */
194
+ tokensReported: boolean;
192
195
  inputTokens: number;
193
196
  outputTokens: number;
194
197
  cacheReadTokens: number;
195
198
  cacheWriteTokens: number;
196
199
  reasoningTokens: number;
200
+ /** Peer-reported total when present, otherwise input+output+cacheRead+cacheWrite, matching the ACP server side. */
201
+ totalTokens: number;
202
+ /** Sum of peer cost.total (legacy) or costUsd (Clio metadata); never re-priced. */
203
+ costUsd: number;
204
+ /** Absent until usage is reported; missing or unsupported pricing provenance stays unknown. */
205
+ costProvenance?: CostProvenance;
197
206
  }
198
207
 
199
208
  export interface AcpDelegationResult {