@iowarp/clio-coder 0.4.4 → 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 (555) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
  5. package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-TQAHXW6Y.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-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
  17. package/dist/{chunk-W54I7H25.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-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
  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-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  24. package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
  27. package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -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-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
  34. package/dist/{chunk-25QBEXRS.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-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  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-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  43. package/dist/{chunk-2CU2H6KE.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-QZWQA4DE.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-YNFKXPEC.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-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
  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-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  66. package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
  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-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
  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-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
  79. package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
  80. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-72YIHOZQ.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-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
  93. package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
  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-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
  101. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  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-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  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-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-LLXSDWXS.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-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
  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-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  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-RXTN6AKH.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-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
  135. package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
  137. package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
  139. package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/chunk-SD7SHNDW.js +15 -0
  141. package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
  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-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
  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-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
  154. package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
  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-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
  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-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
  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-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  177. package/dist/{chunk-5636DCO5.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-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-OEJSLEPW.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-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
  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 +44 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-IJR2DBPR.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-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  195. package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
  198. package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-BOYF5EJM.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-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
  206. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  207. package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
  208. package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
  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-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
  212. package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
  213. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  214. package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
  215. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
  216. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  221. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
  229. package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
  230. package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
  231. package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
  232. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
  233. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  235. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
  239. package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
  241. package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
  242. package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
  243. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
  244. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-C2J3JYRE.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-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  256. package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
  257. package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
  258. package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -88
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +7 -6
  267. package/docs/architecture/acp.md +10 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/context-engine.md +44 -59
  270. package/docs/architecture/context-working-set.md +7 -9
  271. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  272. package/docs/architecture/evidence-and-memory.md +10 -0
  273. package/docs/architecture/pi-boundary.md +37 -7
  274. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  275. package/docs/architecture/session-lifecycle.md +4 -4
  276. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  277. package/docs/guide/commands-and-modes.md +49 -36
  278. package/docs/guide/configuration-and-targets.md +7 -2
  279. package/docs/guide/configuration-reference.md +13 -3
  280. package/docs/guide/environment-variables.md +6 -2
  281. package/docs/guide/fleet-dispatch.md +12 -0
  282. package/docs/guide/installation-and-lifecycle.md +35 -9
  283. package/docs/guide/proactive-memory.md +1 -1
  284. package/docs/guide/skills-marketplace.md +11 -3
  285. package/docs/guide/tool-usage.md +9 -2
  286. package/docs/process/development-pipeline.md +10 -10
  287. package/docs/process/documentation-guide.md +2 -2
  288. package/docs/process/eval-runner.md +15 -0
  289. package/docs/process/evals-internal.md +1 -1
  290. package/docs/process/release-cut-checklist.md +6 -6
  291. package/evals/README.md +4 -0
  292. package/evals/behavioral-corpus-grader.mjs +147 -14
  293. package/evals/behavioral-model-negative-control.yaml +1 -0
  294. package/evals/behavioral-model.yaml +266 -1
  295. package/evals/fixtures/docs-retrieval.json +102 -0
  296. package/evals/fixtures/scalar-decision.json +17 -0
  297. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  298. package/evals/fixtures/source-explanation.json +74 -0
  299. package/evals/fixtures/tool-arguments.json +18 -0
  300. package/evals/fixtures/tool-surface/read.txt +4 -0
  301. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  302. package/evals/no-edit-memory-grader.mjs +149 -0
  303. package/evals/scalar-decision-grader.py +41 -0
  304. package/evals/scalar-decision-machinery.ts +145 -0
  305. package/evals/source-explanation-grader.mjs +118 -0
  306. package/evals/tool-surface-grader.mjs +53 -0
  307. package/evals/tool-surface-model.yaml +274 -0
  308. package/package.json +14 -14
  309. package/skills/README.md +6 -6
  310. package/skills/registry.yaml +1 -1
  311. package/skills/skill-marketplace.json +1 -1
  312. package/src/cli/bootstrap-generate.ts +6 -0
  313. package/src/cli/config-inspect.ts +24 -7
  314. package/src/cli/config-trust.ts +62 -0
  315. package/src/cli/config.ts +8 -0
  316. package/src/cli/context-map.ts +75 -14
  317. package/src/cli/context.ts +46 -17
  318. package/src/cli/eval.ts +17 -3
  319. package/src/cli/modes/print.ts +32 -4
  320. package/src/cli/run.ts +16 -14
  321. package/src/cli/skills-eval.ts +10 -8
  322. package/src/cli/steer-channel.ts +31 -18
  323. package/src/cli/targets.ts +83 -31
  324. package/src/cli/tasks.ts +10 -1
  325. package/src/cli/upgrade.ts +9 -6
  326. package/src/cli/usage.ts +24 -0
  327. package/src/cli/wiki-generate.ts +239 -96
  328. package/src/core/bash-exec.ts +43 -15
  329. package/src/core/bus-events.ts +15 -0
  330. package/src/core/config.ts +33 -14
  331. package/src/core/defaults.ts +5 -4
  332. package/src/core/file-references.ts +11 -1
  333. package/src/core/incomplete-installation.ts +3 -1
  334. package/src/core/settings-layers.ts +21 -5
  335. package/src/core/termination.ts +26 -9
  336. package/src/core/untrusted-content.ts +16 -0
  337. package/src/core/workspace-trust.ts +179 -0
  338. package/src/domains/agents/builtins/coder.md +4 -2
  339. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  340. package/src/domains/agents/builtins/documenter.md +7 -4
  341. package/src/domains/agents/builtins/researcher.md +1 -0
  342. package/src/domains/agents/builtins/scout.md +7 -1
  343. package/src/domains/agents/result-contract.ts +199 -26
  344. package/src/domains/context/bootstrap-prompt.ts +11 -9
  345. package/src/domains/context/bootstrap.ts +74 -39
  346. package/src/domains/context/clio-md.ts +88 -26
  347. package/src/domains/context/codewiki/build-operation.ts +121 -0
  348. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  349. package/src/domains/context/codewiki/build-worker.ts +3 -35
  350. package/src/domains/context/codewiki/coordinator.ts +36 -6
  351. package/src/domains/context/codewiki/indexer.ts +59 -19
  352. package/src/domains/context/contract.ts +6 -2
  353. package/src/domains/context/extension.ts +72 -10
  354. package/src/domains/context/fingerprint.ts +39 -34
  355. package/src/domains/context/index.ts +7 -1
  356. package/src/domains/context/prompt-context.ts +55 -14
  357. package/src/domains/context/refresh.ts +9 -57
  358. package/src/domains/context/wiki/assemble.ts +14 -10
  359. package/src/domains/context/wiki/evidence.ts +209 -0
  360. package/src/domains/context/wiki/generate.ts +201 -67
  361. package/src/domains/context/wiki/meta.ts +10 -2
  362. package/src/domains/context/wiki/plan-store.ts +70 -14
  363. package/src/domains/context/wiki/plan.ts +71 -14
  364. package/src/domains/context/wiki/prompts.ts +42 -1
  365. package/src/domains/context/wiki/source-content.ts +106 -0
  366. package/src/domains/context/wiki/staleness.ts +33 -22
  367. package/src/domains/context/working-set/contract.ts +8 -2
  368. package/src/domains/context/working-set/engine.ts +17 -4
  369. package/src/domains/context/working-set/fold.ts +15 -2
  370. package/src/domains/context/working-set/marker.ts +2 -1
  371. package/src/domains/context/working-set/project.ts +18 -7
  372. package/src/domains/context/working-set/recall.ts +82 -56
  373. package/src/domains/dispatch/active-route-planner.ts +6 -3
  374. package/src/domains/dispatch/admission-queue.ts +19 -7
  375. package/src/domains/dispatch/admission.ts +3 -3
  376. package/src/domains/dispatch/budget-envelope.ts +47 -82
  377. package/src/domains/dispatch/capacity-lease.ts +57 -19
  378. package/src/domains/dispatch/contract.ts +10 -2
  379. package/src/domains/dispatch/event-pump.ts +28 -7
  380. package/src/domains/dispatch/execution-role.ts +49 -2
  381. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  382. package/src/domains/dispatch/extension.ts +190 -105
  383. package/src/domains/dispatch/fleet-run.ts +20 -0
  384. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  385. package/src/domains/dispatch/parallel-writers.ts +34 -0
  386. package/src/domains/dispatch/reservation-store.ts +8 -34
  387. package/src/domains/dispatch/route-approval.ts +3 -3
  388. package/src/domains/dispatch/route-observer.ts +4 -2
  389. package/src/domains/dispatch/route-quality.ts +6 -1
  390. package/src/domains/dispatch/types.ts +4 -3
  391. package/src/domains/dispatch/worker-spawn.ts +58 -21
  392. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  393. package/src/domains/eval/compare/behavioral.ts +81 -14
  394. package/src/domains/eval/compare/compare.ts +15 -5
  395. package/src/domains/eval/compare/envelope.ts +12 -5
  396. package/src/domains/eval/metrics/context.ts +24 -1
  397. package/src/domains/eval/metrics/tracked.ts +4 -28
  398. package/src/domains/eval/reports/comparison.ts +9 -9
  399. package/src/domains/eval/runners/clio-run.ts +5 -1
  400. package/src/domains/eval/schema/suite.ts +2 -0
  401. package/src/domains/eval/schema/validate.ts +1 -0
  402. package/src/domains/eval/suites/run.ts +189 -13
  403. package/src/domains/eval/verifiers/integrity.ts +39 -0
  404. package/src/domains/eval/verifiers/patch.ts +58 -2
  405. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  406. package/src/domains/evidence/build.ts +4 -2
  407. package/src/domains/interop/registry.ts +2 -2
  408. package/src/domains/middleware/hooks-io.ts +45 -26
  409. package/src/domains/middleware/hooks.ts +6 -0
  410. package/src/domains/middleware/injection-screen.ts +23 -0
  411. package/src/domains/middleware/rules.ts +5 -1
  412. package/src/domains/middleware/stalled-turn.ts +18 -3
  413. package/src/domains/middleware/task-board-reminder.ts +4 -2
  414. package/src/domains/middleware/task-nudge.ts +4 -1
  415. package/src/domains/mux/contract.ts +34 -1
  416. package/src/domains/mux/dock-controller.ts +8 -1
  417. package/src/domains/mux/index.ts +1 -0
  418. package/src/domains/mux/socket-client.ts +13 -3
  419. package/src/domains/observability/contract.ts +2 -2
  420. package/src/domains/observability/projection.ts +30 -9
  421. package/src/domains/prompts/compiler.ts +10 -2
  422. package/src/domains/prompts/contract.ts +7 -4
  423. package/src/domains/prompts/extension.ts +28 -64
  424. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  425. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  426. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  427. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  428. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  429. package/src/domains/prompts/preload-prefix.ts +31 -0
  430. package/src/domains/prompts/preload.ts +135 -61
  431. package/src/domains/providers/auth/backend-file.ts +15 -11
  432. package/src/domains/providers/auth/storage.ts +3 -5
  433. package/src/domains/providers/catalog.ts +18 -3
  434. package/src/domains/providers/runtime-resolution.ts +11 -9
  435. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  436. package/src/domains/resources/skills/promotion.ts +8 -1
  437. package/src/domains/safety/action-classifier.ts +9 -0
  438. package/src/domains/safety/autonomy.ts +10 -1
  439. package/src/domains/safety/contract.ts +5 -1
  440. package/src/domains/safety/default-path-policy.ts +11 -0
  441. package/src/domains/safety/extension.ts +11 -2
  442. package/src/domains/safety/policy-engine.ts +189 -32
  443. package/src/domains/safety/project-policy.ts +7 -2
  444. package/src/domains/safety/workspace-trust.ts +43 -0
  445. package/src/domains/session/compaction/compact.ts +384 -21
  446. package/src/domains/session/compaction/cut-point.ts +42 -5
  447. package/src/domains/session/compaction/tokens.ts +9 -1
  448. package/src/domains/session/decision-board.ts +43 -33
  449. package/src/domains/session/entries.ts +169 -4
  450. package/src/domains/session/prompt-manifest.ts +47 -8
  451. package/src/domains/session/task-board.ts +21 -3
  452. package/src/domains/user-tasks/handoff.ts +16 -0
  453. package/src/engine/acp/adapter.ts +44 -12
  454. package/src/engine/acp/server.ts +1 -0
  455. package/src/engine/acp/transport.ts +2 -1
  456. package/src/engine/acp/types.ts +6 -1
  457. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  458. package/src/engine/api-registry.ts +19 -2
  459. package/src/engine/apis/openai-completions.ts +13 -6
  460. package/src/engine/apis/output-budget.ts +26 -10
  461. package/src/engine/claude/sdk-runtime.ts +4 -3
  462. package/src/engine/env-api-keys.ts +2 -1
  463. package/src/engine/external-subprocess.ts +14 -3
  464. package/src/engine/loop-guard.ts +19 -2
  465. package/src/engine/provider-diagnostics.ts +129 -0
  466. package/src/engine/provider-payload.ts +3 -1
  467. package/src/engine/worker-runtime.ts +13 -2
  468. package/src/engine/worker-tools.ts +5 -1
  469. package/src/entry/extension-reload.ts +1 -0
  470. package/src/entry/orchestrator.ts +53 -15
  471. package/src/interactive/chat-loop-messages.ts +12 -4
  472. package/src/interactive/chat-loop.ts +115 -45
  473. package/src/interactive/chat-renderer.ts +60 -0
  474. package/src/interactive/context-recall-command.ts +2 -1
  475. package/src/interactive/dispatch-board.ts +17 -2
  476. package/src/interactive/editor-submit.ts +13 -0
  477. package/src/interactive/interactive-application.ts +8 -2
  478. package/src/interactive/interactive-event-projection.ts +7 -1
  479. package/src/interactive/interactive-presentation.ts +15 -7
  480. package/src/interactive/interactive-slash-runtime.ts +2 -0
  481. package/src/interactive/layout.ts +2 -1
  482. package/src/interactive/model-session-replay.ts +2 -2
  483. package/src/interactive/overlay-frame.ts +1 -0
  484. package/src/interactive/overlay-general-openers.ts +3 -1
  485. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  486. package/src/interactive/overlays/ask-user.ts +1 -0
  487. package/src/interactive/overlays/message-picker.ts +1 -1
  488. package/src/interactive/renderers/tool-execution.ts +17 -1
  489. package/src/interactive/renderers/worker-entry.ts +25 -10
  490. package/src/interactive/slash-commands.ts +9 -7
  491. package/src/interactive/turn-context.ts +221 -53
  492. package/src/interactive/turn-middleware.ts +3 -1
  493. package/src/interactive/turn-persistence.ts +3 -0
  494. package/src/interactive/turn-runtime.ts +11 -2
  495. package/src/interactive/turn-state.ts +10 -9
  496. package/src/interactive/watch-pane.ts +18 -4
  497. package/src/interactive/worker-stream.ts +7 -7
  498. package/src/tools/agent-tools.ts +6 -3
  499. package/src/tools/bash.ts +1 -1
  500. package/src/tools/builtin-tool-catalog.ts +9 -2
  501. package/src/tools/codewiki/code-nav.ts +4 -10
  502. package/src/tools/compete-judge-task.ts +71 -0
  503. package/src/tools/compete-worktrees.ts +34 -0
  504. package/src/tools/context/index.ts +32 -7
  505. package/src/tools/context/surface.ts +15 -4
  506. package/src/tools/decide.ts +1 -1
  507. package/src/tools/dispatch-admission.ts +12 -1
  508. package/src/tools/dispatch-arguments.ts +38 -1
  509. package/src/tools/dispatch-plan.ts +7 -7
  510. package/src/tools/dispatch-runner.ts +48 -32
  511. package/src/tools/dispatch-schema.ts +30 -23
  512. package/src/tools/dispatch-scout-admission.ts +10 -44
  513. package/src/tools/dispatch-scout.ts +2 -3
  514. package/src/tools/find.ts +13 -4
  515. package/src/tools/grep.ts +13 -1
  516. package/src/tools/ls.ts +7 -1
  517. package/src/tools/monitor.ts +26 -11
  518. package/src/tools/network-policy.ts +11 -24
  519. package/src/tools/observation.ts +39 -2
  520. package/src/tools/read.ts +112 -15
  521. package/src/tools/registry.ts +54 -17
  522. package/src/tools/result-shaping.ts +110 -2
  523. package/src/tools/tasks.ts +33 -7
  524. package/src/tools/verify/frontend.ts +67 -30
  525. package/src/tools/verify/numeric.ts +6 -1
  526. package/src/tools/web-fetch-network.ts +179 -0
  527. package/src/tools/web-fetch-surface.ts +2 -1
  528. package/src/tools/web-fetch.ts +15 -13
  529. package/src/tools/worker-evidence.ts +27 -0
  530. package/src/worker/spec-contract.ts +12 -8
  531. package/dist/builtins-WGALA46I.js +0 -22
  532. package/dist/chunk-2WZ546HR.js +0 -792
  533. package/dist/chunk-5PSMVOLM.js +0 -56
  534. package/dist/chunk-EL24TAU4.js +0 -1560
  535. package/dist/chunk-IZXGRF7P.js +0 -4048
  536. package/dist/chunk-JVCV3ICN.js +0 -47
  537. package/dist/chunk-MNJGS2IN.js +0 -33
  538. package/dist/chunk-O5CVSAG5.js +0 -122
  539. package/dist/chunk-ODGTEFFI.js +0 -50
  540. package/dist/chunk-OQE5J4C6.js +0 -73
  541. package/dist/chunk-UUVG37B4.js +0 -244
  542. package/dist/chunk-V6HJFQZE.js +0 -228
  543. package/dist/clio-QLICPCF5.js +0 -25
  544. package/dist/configure-VEPX4NMX.js +0 -55
  545. package/dist/context-clear-S4ZJCQUX.js +0 -182
  546. package/dist/detail-A7JAVSIG.js +0 -98
  547. package/dist/evidence-4F5USFKH.js +0 -208
  548. package/dist/fleet-view-MN2VG4MR.js +0 -101
  549. package/dist/inventory-C26CFDRR.js +0 -101
  550. package/dist/preload-P6DGH2PZ.js +0 -13
  551. package/dist/slash-commands-ZXPJD64J.js +0 -92
  552. package/dist/tasks-IPAGMEIX.js +0 -36
  553. package/dist/tools-EFFEAIDP.js +0 -28
  554. package/dist/verify-FWYGPKMR.js +0 -29
  555. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import type { AskUserToolPolicy } from "../../tools/registry.js";
3
3
  import type { AutonomyExposure } from "../safety/autonomy.js";
4
- import { type DecisionLedgerEntry, type DecisionRecord, decisionRef } from "./entries.js";
4
+ import { type DecisionLedgerEntry, type DecisionRecord, type DecisionSource, decisionRef } from "./entries.js";
5
5
 
6
6
  export interface DecisionLedgerEntryFields {
7
7
  kind: "decisionLedger";
@@ -187,6 +187,46 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
187
187
  dirty = true;
188
188
  };
189
189
 
190
+ const revise = (
191
+ interviewId: string,
192
+ key: string,
193
+ revisionSource: DecisionSource,
194
+ correction?: string,
195
+ ): DecisionLedgerEntryFields => {
196
+ syncToSession();
197
+ const interview = interviews.find((candidate) => candidate.interviewId === interviewId);
198
+ if (!interview) throw new Error(`decision board: interview ${interviewId} was not found on the active branch`);
199
+ const selected = interview.decisions.find((decision) => decision.key === key);
200
+ if (!selected) throw new Error(`decision board: decision ${key} was not found in interview ${interviewId}`);
201
+ const revisedAt = (deps.now?.() ?? new Date()).toISOString();
202
+ const normalizedCorrection = correction?.trim();
203
+ const entries = deps.readEntries?.() ?? [];
204
+ const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
205
+ if (!parentTurnId) throw new Error("decision board: no active branch leaf is available for the revision");
206
+ const revision: DecisionLedgerEntryFields = {
207
+ kind: "decisionLedger",
208
+ parentTurnId,
209
+ ...(interview.origin !== undefined ? { origin: interview.origin } : {}),
210
+ interviewId: interview.interviewId,
211
+ interviewStatus: interview.interviewStatus,
212
+ startedAt: interview.startedAt,
213
+ endedAt: interview.endedAt,
214
+ roundCount: interview.roundCount,
215
+ ...(interview.summary ? { summary: interview.summary } : {}),
216
+ ...(interview.transcriptPath ? { transcriptPath: interview.transcriptPath } : {}),
217
+ ...(interview.exposure ? { exposure: interview.exposure } : {}),
218
+ decisions: interview.decisions.map((decision) => {
219
+ if (decision.key !== selected.key) return { ...decision };
220
+ const next: DecisionRecord = { ...decision, status: "superseded", revisedAt, revisionSource };
221
+ if (normalizedCorrection) next.correction = normalizedCorrection;
222
+ else delete next.correction;
223
+ return next;
224
+ }),
225
+ };
226
+ append(revision);
227
+ return revision;
228
+ };
229
+
190
230
  const store: DecisionBoardStore = {
191
231
  snapshot(): ReadonlyArray<DecisionLedgerEntry> {
192
232
  syncToSession();
@@ -212,7 +252,7 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
212
252
  superseded = { interviewId: interview.interviewId, key: prior.key };
213
253
  break;
214
254
  }
215
- if (superseded !== null) store.supersede(superseded.interviewId, superseded.key, input.rationale);
255
+ if (superseded !== null) revise(superseded.interviewId, superseded.key, "agent", input.rationale);
216
256
  const now = (deps.now?.() ?? new Date()).toISOString();
217
257
  const entries = deps.readEntries?.() ?? [];
218
258
  const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
@@ -244,37 +284,7 @@ export function createDecisionBoardStore(deps: DecisionBoardStoreDeps = {}): Dec
244
284
  return { entry, superseded };
245
285
  },
246
286
  supersede(interviewId: string, key: string, correction?: string): DecisionLedgerEntryFields {
247
- syncToSession();
248
- const interview = interviews.find((candidate) => candidate.interviewId === interviewId);
249
- if (!interview) throw new Error(`decision board: interview ${interviewId} was not found on the active branch`);
250
- const selected = interview.decisions.find((decision) => decision.key === key);
251
- if (!selected) throw new Error(`decision board: decision ${key} was not found in interview ${interviewId}`);
252
- const revisedAt = (deps.now?.() ?? new Date()).toISOString();
253
- const normalizedCorrection = correction?.trim();
254
- const entries = deps.readEntries?.() ?? [];
255
- const parentTurnId = deps.getActiveLeafTurnId?.() ?? activeLeafFromEntries(entries);
256
- if (!parentTurnId) throw new Error("decision board: no active branch leaf is available for the revision");
257
- const revision: DecisionLedgerEntryFields = {
258
- kind: "decisionLedger",
259
- parentTurnId,
260
- interviewId: interview.interviewId,
261
- interviewStatus: interview.interviewStatus,
262
- startedAt: interview.startedAt,
263
- endedAt: interview.endedAt,
264
- roundCount: interview.roundCount,
265
- ...(interview.summary ? { summary: interview.summary } : {}),
266
- ...(interview.transcriptPath ? { transcriptPath: interview.transcriptPath } : {}),
267
- ...(interview.exposure ? { exposure: interview.exposure } : {}),
268
- decisions: interview.decisions.map((decision) => {
269
- if (decision.key !== selected.key) return { ...decision };
270
- const next: DecisionRecord = { ...decision, status: "superseded", revisedAt };
271
- if (normalizedCorrection) next.correction = normalizedCorrection;
272
- else delete next.correction;
273
- return next;
274
- }),
275
- };
276
- append(revision);
277
- return revision;
287
+ return revise(interviewId, key, "operator", correction);
278
288
  },
279
289
  invalidate(): void {
280
290
  dirty = true;
@@ -14,7 +14,9 @@
14
14
  * evidence builders but has no in-tree producer.
15
15
  */
16
16
 
17
- import { isSkillActivation, type SkillActivation } from "../../core/skill-activation.js";
17
+ import { createHash } from "node:crypto";
18
+
19
+ import { isSkillActivation, type PendingSkillToolPolicy, type SkillActivation } from "../../core/skill-activation.js";
18
20
  import type { ClioTurnRecord } from "../../engine/session.js";
19
21
  import { AUTONOMY_EXPOSURES, type AutonomyExposure } from "../safety/autonomy.js";
20
22
 
@@ -119,8 +121,159 @@ export interface CompactionUsage {
119
121
  apiCalls: number;
120
122
  }
121
123
 
124
+ /** Exact historical skill context, independent of generated checkpoint prose. */
125
+ export interface PreservedSkillContext {
126
+ activationRef: string;
127
+ requestRef: string;
128
+ callRef: string;
129
+ resultRef: string;
130
+ activation: SkillActivation;
131
+ requestText: string;
132
+ content: Array<{ type: "text"; text: string }>;
133
+ /** Hash of the captured rendered text blocks, not the raw SKILL.md hash. */
134
+ contentHash: string;
135
+ }
136
+
137
+ export interface SkillContextCheckpoint {
138
+ version: 1;
139
+ skills: PreservedSkillContext[];
140
+ }
141
+
142
+ export const SKILL_CONTEXT_STATE = "skillContextState";
143
+ export interface SkillContextState {
144
+ version: 1;
145
+ /** Empty is an explicit off/replacement; absence is unknown legacy state. */
146
+ activationRefs: string[];
147
+ unknown?: true;
148
+ }
149
+
150
+ export function skillContextContentHash(content: PreservedSkillContext["content"]): string {
151
+ return createHash("sha256").update(JSON.stringify(content)).digest("hex");
152
+ }
153
+
154
+ function isSkillContextState(value: unknown): value is SkillContextState {
155
+ return (
156
+ isRecord(value) &&
157
+ value.version === 1 &&
158
+ (value.unknown === undefined || value.unknown === true) &&
159
+ Array.isArray(value.activationRefs) &&
160
+ value.activationRefs.every((ref) => typeof ref === "string")
161
+ );
162
+ }
163
+
164
+ /** Ledger validation is structural; bad evidence must not make the session unreadable. */
165
+ function isSkillContextCheckpoint(value: unknown): value is SkillContextCheckpoint {
166
+ return (
167
+ isRecord(value) &&
168
+ value.version === 1 &&
169
+ Array.isArray(value.skills) &&
170
+ value.skills.every(
171
+ (skill: unknown) =>
172
+ isRecord(skill) &&
173
+ [skill.activationRef, skill.requestRef, skill.callRef, skill.resultRef, skill.requestText, skill.contentHash].every(
174
+ isString,
175
+ ) &&
176
+ isSkillActivation(skill.activation) &&
177
+ Array.isArray(skill.content) &&
178
+ skill.content.every((block: unknown) => isRecord(block) && block.type === "text" && typeof block.text === "string"),
179
+ )
180
+ );
181
+ }
182
+
183
+ export function verifiedSkillContextCheckpoint(value: unknown): value is SkillContextCheckpoint {
184
+ if (!isSkillContextCheckpoint(value)) return false;
185
+ const refs = new Set<string>();
186
+ const names = new Set<string>();
187
+ return value.skills.every((skill) => {
188
+ const activation = skill.activation;
189
+ if (
190
+ ![skill.activationRef, skill.requestRef, skill.callRef, skill.resultRef].every((ref) => ref.length > 0) ||
191
+ activation.runId !== undefined ||
192
+ activation.triggeredBy !== "tool" ||
193
+ activation.turnId !== skill.requestRef ||
194
+ !activation.name ||
195
+ !activation.filePath ||
196
+ !activation.source ||
197
+ !activation.sourceOrigin ||
198
+ !/^[a-f0-9]{64}$/.test(activation.hash) ||
199
+ (activation.drift !== undefined && activation.drift !== "match") ||
200
+ skill.content.length === 0 ||
201
+ skill.content.every((block) => block.text.length === 0) ||
202
+ skill.contentHash !== skillContextContentHash(skill.content) ||
203
+ refs.has(skill.activationRef) ||
204
+ names.has(activation.name)
205
+ )
206
+ return false;
207
+ refs.add(skill.activationRef);
208
+ names.add(activation.name);
209
+ return true;
210
+ });
211
+ }
212
+
213
+ export interface PreservedUserContext {
214
+ turnId: string;
215
+ text: string;
216
+ }
217
+ function isPreservedUserContext(value: unknown): value is PreservedUserContext {
218
+ return isRecord(value) && isString(value.turnId) && isString(value.text);
219
+ }
220
+
221
+ /** Undefined means no live policy; null explicitly forbids reuse during an uncertain replacement. */
222
+ export function mainSkillContextState(
223
+ entries: ReadonlyArray<SessionEntry>,
224
+ policy: PendingSkillToolPolicy | undefined,
225
+ ): SkillContextState | null | undefined {
226
+ if (!policy) return latestSkillContextState(entries);
227
+ // A cold turn may grant optional model activation without selecting or
228
+ // replacing any skill. Keep the recorded selection, including explicit off.
229
+ // This preserves historical content; it does not reconstruct tool authority.
230
+ if (
231
+ policy.modelActivation === true &&
232
+ policy.carriedSurface !== true &&
233
+ policy.requests.length === 0 &&
234
+ policy.loadedSkillNames.size === 0 &&
235
+ policy.loadedSkillPolicies.size === 0
236
+ )
237
+ return latestSkillContextState(entries);
238
+ if (policy.requests.some((request) => !policy.loadedSkillNames.has(request.name))) return null;
239
+ const names = [...policy.loadedSkillNames];
240
+ if (names.length === 0) return null;
241
+ const activationRefs: string[] = [];
242
+ for (const name of names) {
243
+ const entry = [...entries]
244
+ .reverse()
245
+ .find(
246
+ (candidate) =>
247
+ candidate.kind === "skillActivation" &&
248
+ candidate.activation.runId === undefined &&
249
+ candidate.activation.name === name,
250
+ );
251
+ if (!entry) return null;
252
+ activationRefs.push(entry.turnId);
253
+ }
254
+ return { version: 1, activationRefs };
255
+ }
256
+
257
+ /** Caller supplies an already selected branch. Never infer active skills from audit metadata. */
258
+ export function latestSkillContextState(entries: ReadonlyArray<SessionEntry>): SkillContextState | undefined {
259
+ for (let index = entries.length - 1; index >= 0; index--) {
260
+ const entry = entries[index];
261
+ if (entry?.kind === "custom" && entry.customType === SKILL_CONTEXT_STATE) {
262
+ return isSkillContextState(entry.data) ? entry.data : undefined;
263
+ }
264
+ if (entry?.kind === "compactionSummary" && entry.skillContext !== undefined) {
265
+ return verifiedSkillContextCheckpoint(entry.skillContext)
266
+ ? { version: 1, activationRefs: entry.skillContext.skills.map((skill) => skill.activationRef) }
267
+ : undefined;
268
+ }
269
+ }
270
+ return undefined;
271
+ }
272
+
122
273
  export interface CompactionSummaryEntry extends BaseSessionEntry {
123
274
  kind: "compactionSummary";
275
+ skillContext?: SkillContextCheckpoint;
276
+ userContext?: PreservedUserContext;
124
277
  summary: string;
125
278
  tokensBefore: number;
126
279
  firstKeptTurnId: string;
@@ -232,6 +385,8 @@ export interface DecisionRecord {
232
385
  status: DecisionStatus;
233
386
  decidedAt: string;
234
387
  revisedAt?: string;
388
+ /** Who made this revision, independently of the original decision source. Absent on legacy revisions. */
389
+ revisionSource?: DecisionSource;
235
390
  correction?: string;
236
391
  source?: DecisionSource;
237
392
  /** Options considered and not taken. Only agent decisions carry these. */
@@ -350,6 +505,8 @@ export interface WorkingSetRef {
350
505
  }
351
506
 
352
507
  export interface EvictedItem {
508
+ /** Stable session-local recall alias; absent on legacy ledger records. */
509
+ alias?: string;
353
510
  ref: WorkingSetRef;
354
511
  reason: EvictionReason;
355
512
  /** Estimated tokens the projection removes for this item (marker cost already subtracted). */
@@ -542,12 +699,13 @@ export function isDecisionRecord(value: unknown): value is DecisionRecord {
542
699
  if (!isString(value.value) || !isOneOf(value.status, DECISION_STATUSES) || !isString(value.decidedAt)) return false;
543
700
  if (!isOptionalString(value.label) || !isOptionalString(value.source_question)) return false;
544
701
  if (value.source !== undefined && !isOneOf(value.source, ["operator", "agent"])) return false;
702
+ if (value.revisionSource !== undefined && !isOneOf(value.revisionSource, ["operator", "agent"])) return false;
545
703
  if (value.alternatives !== undefined && !isStringArray(value.alternatives)) return false;
546
704
  if (!isOptionalString(value.rationale)) return false;
547
705
  if (!isOptionalString(value.revisedAt) || !isOptionalString(value.correction)) return false;
548
706
  return value.status === "superseded"
549
707
  ? isString(value.revisedAt)
550
- : value.revisedAt === undefined && value.correction === undefined;
708
+ : value.revisedAt === undefined && value.revisionSource === undefined && value.correction === undefined;
551
709
  }
552
710
 
553
711
  function isOptionalCompactionUsage(value: unknown): boolean {
@@ -605,6 +763,7 @@ function isEvictedItem(value: unknown): value is EvictedItem {
605
763
  isOneOf(value.reason, EVICTION_REASONS) &&
606
764
  isNumber(value.tokensFreed) &&
607
765
  isString(value.marker) &&
766
+ (value.alias === undefined || (typeof value.alias === "string" && /^r[1-9]\d*$/.test(value.alias))) &&
608
767
  isOptionalString(value.by)
609
768
  );
610
769
  }
@@ -628,7 +787,11 @@ export function isSessionEntry(value: unknown): value is SessionEntry {
628
787
  isOptionalBoolean(v.excludeFromContext)
629
788
  );
630
789
  case "custom":
631
- return isString(v.customType) && isOptionalBoolean(v.display);
790
+ return (
791
+ isString(v.customType) &&
792
+ isOptionalBoolean(v.display) &&
793
+ (v.customType !== SKILL_CONTEXT_STATE || isSkillContextState(v.data))
794
+ );
632
795
  case "modelChange":
633
796
  return isString(v.provider) && isString(v.modelId) && isOptionalString(v.target);
634
797
  case "thinkingLevelChange":
@@ -648,7 +811,9 @@ export function isSessionEntry(value: unknown): value is SessionEntry {
648
811
  (v.trigger === undefined || isOneOf(v.trigger, COMPACTION_TRIGGERS)) &&
649
812
  isOptionalNumber(v.tokensAfter) &&
650
813
  isOptionalNumber(v.messagesSummarized) &&
651
- isOptionalBoolean(v.isSplitTurn)
814
+ isOptionalBoolean(v.isSplitTurn) &&
815
+ (v.skillContext === undefined || isSkillContextCheckpoint(v.skillContext)) &&
816
+ (v.userContext === undefined || isPreservedUserContext(v.userContext))
652
817
  );
653
818
  case "sessionInfo":
654
819
  return isOptionalString(v.name) && isOptionalString(v.targetTurnId) && isOptionalString(v.label);
@@ -115,15 +115,54 @@ function isPromptManifestFragment(value: unknown): value is PromptManifestFragme
115
115
  );
116
116
  }
117
117
 
118
- function isProjectPreloadClass(value: unknown): value is ProjectPreloadClass {
119
- if (!isRecord(value)) return false;
118
+ /** Validate additive accounting when present, while accepting historical manifests. */
119
+ export function isProjectPreloadClass(value: unknown): value is ProjectPreloadClass {
120
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
121
+ const row = value as Record<string, unknown>;
122
+ const integer = (item: unknown): item is number => typeof item === "number" && Number.isInteger(item) && item >= 0;
123
+ const optionalInteger = (item: unknown): boolean => item === undefined || integer(item);
124
+ const range = (item: unknown): boolean =>
125
+ item === null ||
126
+ (Array.isArray(item) &&
127
+ item.length === 2 &&
128
+ integer(item[0]) &&
129
+ item[0] >= 1 &&
130
+ integer(item[1]) &&
131
+ item[1] >= item[0]);
120
132
  return (
121
- (value.mode === "full" || value.mode === "synopsis" || value.mode === "none") &&
122
- isNonNegativeInteger(value.chars) &&
123
- isNonNegativeInteger(value.lines) &&
124
- (value.reason === null || value.reason === "size" || value.reason === "lines" || value.reason === "no-clio-md") &&
125
- typeof value.nearLimit === "boolean" &&
126
- typeof value.label === "string"
133
+ typeof row.mode === "string" &&
134
+ ["full", "partial", "synopsis", "none"].includes(row.mode) &&
135
+ integer(row.chars) &&
136
+ integer(row.lines) &&
137
+ (row.reason === null || (typeof row.reason === "string" && ["size", "lines", "no-clio-md"].includes(row.reason))) &&
138
+ typeof row.nearLimit === "boolean" &&
139
+ typeof row.label === "string" &&
140
+ optionalInteger(row.includedChars) &&
141
+ optionalInteger(row.includedLines) &&
142
+ optionalInteger(row.omittedSupportFragments) &&
143
+ (row.providerSupportsTools === undefined ||
144
+ row.providerSupportsTools === null ||
145
+ typeof row.providerSupportsTools === "boolean") &&
146
+ (row.sources === undefined ||
147
+ (Array.isArray(row.sources) &&
148
+ row.sources.every((source: unknown) => {
149
+ if (source === null || typeof source !== "object" || Array.isArray(source)) return false;
150
+ const s = source as Record<string, unknown>;
151
+ return (
152
+ typeof s.path === "string" &&
153
+ typeof s.contentHash === "string" &&
154
+ /^[a-f0-9]{64}$/.test(s.contentHash) &&
155
+ integer(s.availableChars) &&
156
+ integer(s.availableLines) &&
157
+ integer(s.includedChars) &&
158
+ integer(s.includedLines) &&
159
+ s.includedChars <= s.availableChars &&
160
+ s.includedLines <= s.availableLines &&
161
+ range(s.includedRange) &&
162
+ range(s.omittedRange) &&
163
+ (s.omissionReason === null || s.omissionReason === "budget")
164
+ );
165
+ })))
127
166
  );
128
167
  }
129
168
 
@@ -29,6 +29,7 @@ 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. */
32
33
  requiredValidationEvidence?: TaskLedgerValidationEvidence[];
33
34
  /** Block or drop reason; empty for pending/active/completed tasks. */
34
35
  reason?: string;
@@ -286,6 +287,23 @@ export function foldSessionTaskHistory(entries: ReadonlyArray<unknown>): Session
286
287
  .map(({ lastIndex: _lastIndex, tasks, ...board }) => ({ ...board, tasks: [...tasks.values()] }));
287
288
  }
288
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
+
289
307
  function toEntryView(entry: {
290
308
  boardId?: string;
291
309
  goals: TaskLedgerGoal[];
@@ -311,7 +329,7 @@ function toEntryView(entry: {
311
329
  };
312
330
  if (goal.userTaskId) task.userTaskId = goal.userTaskId;
313
331
  const required = entry.requiredValidationEvidence.filter((item) => item.id.startsWith(`${goal.id}.acceptance.`));
314
- if (required.length > 0) task.requiredValidationEvidence = required.map((item) => ({ ...item }));
332
+ if (required.length > 0) task.requiredValidationEvidence = required.map(acceptanceRequirement);
315
333
  if (goal.description) task.reason = goal.description;
316
334
  const evidence = evidenceByTask.get(goal.id);
317
335
  if (evidence) task.evidence = evidence;
@@ -397,9 +415,9 @@ function applyMutation(
397
415
  if (mutation.verification && mutation.verification.length > 0) {
398
416
  picked.requiredValidationEvidence = mutation.verification.map((item, index) => ({
399
417
  id: `${picked.id}.acceptance.${index}`,
400
- description: `Operator acceptance: ${item.check}`,
418
+ description: acceptanceRequirementDescription(item.check),
401
419
  command: item.check,
402
- status: "pending",
420
+ status: "required",
403
421
  notes: `timeoutMs=${item.timeoutMs}`,
404
422
  }));
405
423
  }
@@ -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
+ }
@@ -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";
@@ -136,6 +137,7 @@ function flattenPrompt(input: AcpDelegationRunInput): string {
136
137
 
137
138
  export function emptyUsage(): AcpDelegationUsage {
138
139
  return {
140
+ tokensReported: false,
139
141
  inputTokens: 0,
140
142
  outputTokens: 0,
141
143
  cacheReadTokens: 0,
@@ -150,14 +152,33 @@ function finite(value: unknown): number {
150
152
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
151
153
  }
152
154
 
153
- /** Same field the ACP server side and `sumRunUsage` read for a dollar figure; cost is never re-derived here. */
154
- function costTotal(raw: Record<string, unknown>): number {
155
- const cost = raw.cost;
156
- return isRecord(cost) ? finite(cost.total) : 0;
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;
157
158
  }
158
159
 
159
160
  export function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
160
161
  if (!isRecord(raw)) return;
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;
161
182
  const input = finite(raw.input) + finite(raw.inputTokens) + finite(raw.input_tokens);
162
183
  const output = finite(raw.output) + finite(raw.outputTokens) + finite(raw.output_tokens);
163
184
  const cacheRead = finite(raw.cacheRead) + finite(raw.cacheReadTokens) + finite(raw.cache_read_tokens);
@@ -167,12 +188,23 @@ export function mergeUsage(into: AcpDelegationUsage, raw: unknown): void {
167
188
  into.cacheReadTokens += cacheRead;
168
189
  into.cacheWriteTokens += cacheWrite;
169
190
  into.reasoningTokens += finite(raw.reasoning) + finite(raw.reasoningTokens) + finite(raw.reasoning_tokens);
170
- // Same rule as the ACP server accumulator: prefer the peer's explicit total,
191
+ // Prefer the peer's explicit total, including zero,
171
192
  // otherwise sum the four billed categories (reasoning excluded, since a peer
172
193
  // that reports it separately still counts it inside output).
173
- const explicitTotal = finite(raw.totalTokens) + finite(raw.total_tokens);
174
- into.totalTokens += explicitTotal > 0 ? explicitTotal : input + output + cacheRead + cacheWrite;
175
- into.costUsd += costTotal(raw);
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
+ }
176
208
  }
177
209
 
178
210
  function errorMessage(value: unknown): string {
@@ -195,9 +227,9 @@ function errorEvents(messageText: string): AgentEvent[] {
195
227
  }
196
228
 
197
229
  export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegationRunHandle {
198
- // Validated settings always populate these values. Keep the public runtime
199
- // boundary safe for direct callers too: omission must not turn a silent ACP
200
- // 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.
201
233
  const connectTimeoutMs = input.agent.connectTimeoutMs ?? DEFAULT_DELEGATION_CONNECT_TIMEOUT_MS;
202
234
  const turnTimeoutMs = input.agent.turnTimeoutMs ?? DEFAULT_DELEGATION_TURN_TIMEOUT_MS;
203
235
  const now = input.now ?? Date.now;
@@ -322,7 +354,7 @@ export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegati
322
354
  sessionId,
323
355
  prompt: [{ type: "text", text: flattenPrompt(input) }],
324
356
  },
325
- turnTimeoutMs,
357
+ turnTimeoutMs === 0 ? undefined : turnTimeoutMs,
326
358
  );
327
359
  // ACP v1 has no usage field on PromptResponse. Clio servers report it in
328
360
  // _meta; other agents (Copilot/Codex/OpenCode) report nothing here, so usage
@@ -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
 
@@ -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, {
@@ -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,6 +190,8 @@ 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;
@@ -196,8 +199,10 @@ export interface AcpDelegationUsage {
196
199
  reasoningTokens: number;
197
200
  /** Peer-reported total when present, otherwise input+output+cacheRead+cacheWrite, matching the ACP server side. */
198
201
  totalTokens: number;
199
- /** Sum of the peer's `usage.cost.total`; stays 0 when the peer reports no cost. */
202
+ /** Sum of peer cost.total (legacy) or costUsd (Clio metadata); never re-priced. */
200
203
  costUsd: number;
204
+ /** Absent until usage is reported; missing or unsupported pricing provenance stays unknown. */
205
+ costProvenance?: CostProvenance;
201
206
  }
202
207
 
203
208
  export interface AcpDelegationResult {