@iowarp/clio-coder 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +116 -2
  2. package/CONTRIBUTING.md +39 -24
  3. package/NOTICE +16 -0
  4. package/README.md +343 -403
  5. package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
  6. package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
  9. package/dist/builtins-PD652MTK.js +22 -0
  10. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  11. package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
  12. package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
  13. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  14. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  15. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  16. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  17. package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
  18. package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
  19. package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
  20. package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
  21. package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
  22. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  23. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  24. package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
  25. package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
  26. package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
  27. package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
  28. package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
  29. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  30. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  31. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  32. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  33. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  34. package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
  35. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  36. package/dist/chunk-5ZSZEYJK.js +119 -0
  37. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  38. package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
  39. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  40. package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
  41. package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
  42. package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
  43. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  44. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  45. package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
  46. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  47. package/dist/chunk-7WUZEB2M.js +165 -0
  48. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  49. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  50. package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
  51. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  52. package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
  53. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  54. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  55. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  56. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  57. package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
  58. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  59. package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
  60. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  61. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  62. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  63. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  64. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  65. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  66. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  67. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  68. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  69. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  70. package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
  71. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  72. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  73. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  74. package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
  75. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  76. package/dist/chunk-ECOMVOHP.js +139 -0
  77. package/dist/chunk-EFSEIZE6.js +56 -0
  78. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  79. package/dist/chunk-EM2WNQS2.js +93 -0
  80. package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
  81. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  82. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  83. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  84. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  85. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  86. package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
  87. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  88. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  89. package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
  90. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  91. package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
  92. package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
  93. package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
  94. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  95. package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
  96. package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
  97. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  98. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  99. package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
  100. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  101. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  102. package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
  103. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  104. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  105. package/dist/chunk-KPRLAMP4.js +32 -0
  106. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  107. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  108. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  109. package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
  110. package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
  111. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  112. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  113. package/dist/chunk-LUL5Z66S.js +221 -0
  114. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  115. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  116. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  117. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  118. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  119. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  120. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  121. package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
  122. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  123. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  124. package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
  125. package/dist/chunk-NTK3WTHM.js +141 -0
  126. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  127. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  128. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  129. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  130. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  131. package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
  132. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  133. package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
  134. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  135. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  136. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  137. package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
  138. package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
  139. package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
  140. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  141. package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
  142. package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
  143. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  144. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  145. package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
  146. package/dist/chunk-R2CT5YDO.js +66 -0
  147. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  148. package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
  149. package/dist/chunk-SD7SHNDW.js +15 -0
  150. package/dist/chunk-SL2RDHKO.js +19 -0
  151. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  152. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  153. package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
  154. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  155. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  156. package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
  157. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  158. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  159. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  160. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  161. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  162. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  163. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  164. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  165. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  166. package/dist/chunk-USZA7GWL.js +341 -0
  167. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
  170. package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
  171. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  172. package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
  173. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  174. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  175. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  176. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  177. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  178. package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
  179. package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
  180. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  181. package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
  182. package/dist/chunk-WXA2CFJO.js +23 -0
  183. package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
  184. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  185. package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
  186. package/dist/chunk-YGDMBK7O.js +567 -0
  187. package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
  188. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  189. package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
  190. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  191. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  192. package/dist/cli/index.js +44 -44
  193. package/dist/clio-QQCMTUZE.js +26 -0
  194. package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
  195. package/dist/codewiki/build-worker.js +76 -29
  196. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  197. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  198. package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
  199. package/dist/configure-4ZM5HWJX.js +73 -0
  200. package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
  201. package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
  202. package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
  203. package/dist/context-clear-OQV76MYP.js +184 -0
  204. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  205. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  206. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
  207. package/dist/detail-UXPWRANG.js +115 -0
  208. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
  209. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  210. package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
  211. package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
  212. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  213. package/dist/evidence-35PYWGSO.js +225 -0
  214. package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
  215. package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
  216. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  217. package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
  218. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
  219. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  220. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
  221. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
  222. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  223. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  224. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
  225. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
  226. package/dist/fleet-view-IWHYGQKK.js +118 -0
  227. package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
  228. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  229. package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
  230. package/dist/inventory-74UL7UHU.js +118 -0
  231. package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
  232. package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
  233. package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
  234. package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
  235. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
  236. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  237. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  238. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  239. package/dist/preload-EJAWJEIO.js +116 -0
  240. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  241. package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
  242. package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
  243. package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
  244. package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
  245. package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
  246. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
  247. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
  248. package/dist/slash-commands-MDSDSWYF.js +92 -0
  249. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  250. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  251. package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
  252. package/dist/tasks-R6P6OV22.js +36 -0
  253. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
  254. package/dist/tools-6OCQ6SVB.js +28 -0
  255. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  256. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  257. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  258. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  259. package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
  260. package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
  261. package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
  262. package/dist/verify-HYF7KBVE.js +30 -0
  263. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  264. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  265. package/dist/wiki-generate-RK7JQ5NP.js +615 -0
  266. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  267. package/dist/worker/entry.js +108 -95
  268. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  269. package/docs/README.md +7 -6
  270. package/docs/architecture/acp.md +10 -0
  271. package/docs/architecture/architecture.md +5 -5
  272. package/docs/architecture/context-engine.md +45 -60
  273. package/docs/architecture/context-working-set.md +7 -9
  274. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  275. package/docs/architecture/evidence-and-memory.md +10 -0
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  278. package/docs/architecture/session-lifecycle.md +4 -4
  279. package/docs/architecture/tui-design.md +45 -30
  280. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  281. package/docs/guide/commands-and-modes.md +75 -61
  282. package/docs/guide/configuration-and-targets.md +126 -26
  283. package/docs/guide/configuration-reference.md +22 -7
  284. package/docs/guide/environment-variables.md +6 -2
  285. package/docs/guide/fleet-dispatch.md +13 -6
  286. package/docs/guide/glossary.md +1 -1
  287. package/docs/guide/installation-and-lifecycle.md +79 -20
  288. package/docs/guide/proactive-memory.md +1 -1
  289. package/docs/guide/skills-marketplace.md +11 -3
  290. package/docs/guide/tool-usage.md +9 -2
  291. package/docs/process/development-pipeline.md +11 -11
  292. package/docs/process/documentation-coverage.md +1 -1
  293. package/docs/process/documentation-guide.md +2 -2
  294. package/docs/process/eval-runner.md +15 -0
  295. package/docs/process/evals-internal.md +1 -1
  296. package/docs/process/release-cut-checklist.md +24 -12
  297. package/evals/README.md +4 -0
  298. package/evals/behavioral-corpus-grader.mjs +147 -14
  299. package/evals/behavioral-model-negative-control.yaml +1 -0
  300. package/evals/behavioral-model.yaml +266 -1
  301. package/evals/fixtures/docs-retrieval.json +102 -0
  302. package/evals/fixtures/scalar-decision.json +17 -0
  303. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  304. package/evals/fixtures/source-explanation.json +74 -0
  305. package/evals/fixtures/tool-arguments.json +18 -0
  306. package/evals/fixtures/tool-surface/read.txt +4 -0
  307. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  308. package/evals/no-edit-memory-grader.mjs +149 -0
  309. package/evals/scalar-decision-grader.py +41 -0
  310. package/evals/scalar-decision-machinery.ts +145 -0
  311. package/evals/source-explanation-grader.mjs +118 -0
  312. package/evals/tool-surface-grader.mjs +53 -0
  313. package/evals/tool-surface-model.yaml +274 -0
  314. package/package.json +14 -14
  315. package/skills/README.md +6 -6
  316. package/skills/registry.yaml +1 -1
  317. package/skills/skill-marketplace.json +1 -1
  318. package/src/cli/ask.ts +10 -10
  319. package/src/cli/bootstrap-generate.ts +6 -0
  320. package/src/cli/config-inspect.ts +24 -7
  321. package/src/cli/config-trust.ts +62 -0
  322. package/src/cli/config.ts +8 -0
  323. package/src/cli/configure-editor.ts +51 -0
  324. package/src/cli/configure-interop.ts +1 -1
  325. package/src/cli/configure-oauth.ts +1 -1
  326. package/src/cli/configure-onboarding.ts +232 -96
  327. package/src/cli/configure-prompts.ts +76 -0
  328. package/src/cli/configure-quick.ts +274 -0
  329. package/src/cli/configure-target.ts +14 -2
  330. package/src/cli/configure.ts +413 -174
  331. package/src/cli/context-map.ts +75 -14
  332. package/src/cli/context.ts +46 -17
  333. package/src/cli/eval.ts +17 -3
  334. package/src/cli/modes/print.ts +32 -4
  335. package/src/cli/oauth-manual-input.ts +1 -1
  336. package/src/cli/reset.ts +2 -0
  337. package/src/cli/run.ts +16 -14
  338. package/src/cli/select.ts +35 -4
  339. package/src/cli/skills-eval.ts +10 -8
  340. package/src/cli/steer-channel.ts +31 -18
  341. package/src/cli/targets.ts +83 -31
  342. package/src/cli/tasks.ts +10 -1
  343. package/src/cli/upgrade.ts +11 -8
  344. package/src/cli/usage.ts +24 -0
  345. package/src/cli/wiki-generate.ts +239 -96
  346. package/src/core/bash-exec.ts +43 -15
  347. package/src/core/bus-events.ts +15 -0
  348. package/src/core/config.ts +39 -15
  349. package/src/core/defaults.ts +38 -15
  350. package/src/{interactive → core}/external-editor.ts +4 -4
  351. package/src/core/file-references.ts +11 -1
  352. package/src/core/incomplete-installation.ts +3 -1
  353. package/src/core/settings-layers.ts +21 -5
  354. package/src/core/termination.ts +26 -9
  355. package/src/core/untrusted-content.ts +16 -0
  356. package/src/core/workspace-trust.ts +179 -0
  357. package/src/domains/agents/builtins/coder.md +4 -2
  358. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  359. package/src/domains/agents/builtins/documenter.md +7 -4
  360. package/src/domains/agents/builtins/researcher.md +1 -0
  361. package/src/domains/agents/builtins/scout.md +7 -1
  362. package/src/domains/agents/result-contract.ts +199 -26
  363. package/src/domains/config/classify.ts +1 -1
  364. package/src/domains/config/keybindings.ts +3 -31
  365. package/src/domains/context/bootstrap-prompt.ts +11 -9
  366. package/src/domains/context/bootstrap.ts +74 -39
  367. package/src/domains/context/clio-md.ts +88 -26
  368. package/src/domains/context/codewiki/build-operation.ts +121 -0
  369. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  370. package/src/domains/context/codewiki/build-worker.ts +3 -35
  371. package/src/domains/context/codewiki/coordinator.ts +36 -6
  372. package/src/domains/context/codewiki/indexer.ts +59 -19
  373. package/src/domains/context/contract.ts +6 -2
  374. package/src/domains/context/extension.ts +72 -10
  375. package/src/domains/context/fingerprint.ts +39 -34
  376. package/src/domains/context/index.ts +7 -1
  377. package/src/domains/context/prompt-context.ts +55 -14
  378. package/src/domains/context/refresh.ts +9 -57
  379. package/src/domains/context/wiki/assemble.ts +14 -10
  380. package/src/domains/context/wiki/evidence.ts +209 -0
  381. package/src/domains/context/wiki/generate.ts +201 -67
  382. package/src/domains/context/wiki/meta.ts +10 -2
  383. package/src/domains/context/wiki/plan-store.ts +70 -14
  384. package/src/domains/context/wiki/plan.ts +71 -14
  385. package/src/domains/context/wiki/prompts.ts +42 -1
  386. package/src/domains/context/wiki/source-content.ts +106 -0
  387. package/src/domains/context/wiki/staleness.ts +33 -22
  388. package/src/domains/context/working-set/contract.ts +8 -2
  389. package/src/domains/context/working-set/engine.ts +17 -4
  390. package/src/domains/context/working-set/fold.ts +15 -2
  391. package/src/domains/context/working-set/marker.ts +2 -1
  392. package/src/domains/context/working-set/project.ts +18 -7
  393. package/src/domains/context/working-set/recall.ts +82 -56
  394. package/src/domains/dispatch/active-route-planner.ts +6 -3
  395. package/src/domains/dispatch/admission-queue.ts +19 -7
  396. package/src/domains/dispatch/admission.ts +3 -3
  397. package/src/domains/dispatch/budget-envelope.ts +47 -82
  398. package/src/domains/dispatch/capacity-lease.ts +57 -19
  399. package/src/domains/dispatch/contract.ts +10 -2
  400. package/src/domains/dispatch/event-pump.ts +28 -7
  401. package/src/domains/dispatch/execution-role.ts +49 -2
  402. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  403. package/src/domains/dispatch/extension.ts +190 -105
  404. package/src/domains/dispatch/fleet-run.ts +20 -0
  405. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  406. package/src/domains/dispatch/parallel-writers.ts +34 -0
  407. package/src/domains/dispatch/reservation-store.ts +8 -34
  408. package/src/domains/dispatch/route-approval.ts +3 -3
  409. package/src/domains/dispatch/route-observer.ts +4 -2
  410. package/src/domains/dispatch/route-quality.ts +6 -1
  411. package/src/domains/dispatch/types.ts +4 -3
  412. package/src/domains/dispatch/worker-spawn.ts +58 -21
  413. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  414. package/src/domains/eval/compare/behavioral.ts +81 -14
  415. package/src/domains/eval/compare/compare.ts +15 -5
  416. package/src/domains/eval/compare/envelope.ts +12 -5
  417. package/src/domains/eval/metrics/context.ts +24 -1
  418. package/src/domains/eval/metrics/tracked.ts +4 -28
  419. package/src/domains/eval/reports/comparison.ts +9 -9
  420. package/src/domains/eval/runners/clio-run.ts +5 -1
  421. package/src/domains/eval/schema/suite.ts +2 -0
  422. package/src/domains/eval/schema/validate.ts +1 -0
  423. package/src/domains/eval/suites/run.ts +189 -13
  424. package/src/domains/eval/verifiers/integrity.ts +39 -0
  425. package/src/domains/eval/verifiers/patch.ts +58 -2
  426. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  427. package/src/domains/evidence/build.ts +4 -2
  428. package/src/domains/interop/registry.ts +2 -2
  429. package/src/domains/middleware/hooks-io.ts +45 -26
  430. package/src/domains/middleware/hooks.ts +6 -0
  431. package/src/domains/middleware/injection-screen.ts +23 -0
  432. package/src/domains/middleware/rules.ts +5 -1
  433. package/src/domains/middleware/stalled-turn.ts +18 -3
  434. package/src/domains/middleware/task-board-reminder.ts +4 -2
  435. package/src/domains/middleware/task-nudge.ts +4 -1
  436. package/src/domains/mux/contract.ts +34 -1
  437. package/src/domains/mux/dock-controller.ts +8 -1
  438. package/src/domains/mux/index.ts +1 -0
  439. package/src/domains/mux/socket-client.ts +13 -3
  440. package/src/domains/observability/contract.ts +2 -2
  441. package/src/domains/observability/projection.ts +30 -9
  442. package/src/domains/prompts/compiler.ts +10 -2
  443. package/src/domains/prompts/contract.ts +7 -4
  444. package/src/domains/prompts/extension.ts +28 -64
  445. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  446. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  447. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  448. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  449. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  450. package/src/domains/prompts/preload-prefix.ts +31 -0
  451. package/src/domains/prompts/preload.ts +135 -61
  452. package/src/domains/providers/auth/backend-file.ts +15 -11
  453. package/src/domains/providers/auth/storage.ts +3 -5
  454. package/src/domains/providers/catalog.ts +18 -3
  455. package/src/domains/providers/probe/fingerprint.ts +13 -6
  456. package/src/domains/providers/probe/reasoning.ts +2 -0
  457. package/src/domains/providers/runtime-resolution.ts +11 -9
  458. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  459. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  460. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  461. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  462. package/src/domains/resources/skills/promotion.ts +8 -1
  463. package/src/domains/safety/action-classifier.ts +9 -0
  464. package/src/domains/safety/autonomy.ts +10 -1
  465. package/src/domains/safety/contract.ts +5 -1
  466. package/src/domains/safety/default-path-policy.ts +11 -0
  467. package/src/domains/safety/extension.ts +11 -2
  468. package/src/domains/safety/policy-engine.ts +189 -32
  469. package/src/domains/safety/project-policy.ts +7 -2
  470. package/src/domains/safety/workspace-trust.ts +43 -0
  471. package/src/domains/session/compaction/compact.ts +384 -21
  472. package/src/domains/session/compaction/cut-point.ts +42 -5
  473. package/src/domains/session/compaction/tokens.ts +9 -1
  474. package/src/domains/session/decision-board.ts +43 -33
  475. package/src/domains/session/entries.ts +169 -4
  476. package/src/domains/session/prompt-manifest.ts +47 -8
  477. package/src/domains/session/task-board.ts +21 -3
  478. package/src/domains/user-tasks/handoff.ts +16 -0
  479. package/src/engine/acp/adapter.ts +44 -12
  480. package/src/engine/acp/server.ts +1 -0
  481. package/src/engine/acp/transport.ts +2 -1
  482. package/src/engine/acp/types.ts +6 -1
  483. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  484. package/src/engine/api-registry.ts +19 -2
  485. package/src/engine/apis/openai-completions.ts +13 -6
  486. package/src/engine/apis/output-budget.ts +26 -10
  487. package/src/engine/claude/sdk-runtime.ts +4 -3
  488. package/src/engine/env-api-keys.ts +2 -1
  489. package/src/engine/external-subprocess.ts +14 -3
  490. package/src/engine/loop-guard.ts +19 -2
  491. package/src/engine/provider-diagnostics.ts +129 -0
  492. package/src/engine/provider-payload.ts +3 -1
  493. package/src/engine/worker-runtime.ts +13 -2
  494. package/src/engine/worker-tools.ts +5 -1
  495. package/src/entry/extension-reload.ts +1 -0
  496. package/src/entry/orchestrator.ts +53 -15
  497. package/src/interactive/application-controller.ts +1 -31
  498. package/src/interactive/chat-loop-messages.ts +12 -4
  499. package/src/interactive/chat-loop.ts +115 -45
  500. package/src/interactive/chat-panel.ts +163 -637
  501. package/src/interactive/chat-renderer.ts +73 -30
  502. package/src/interactive/context-recall-command.ts +2 -1
  503. package/src/interactive/dispatch-board.ts +18 -5
  504. package/src/interactive/editor-submit.ts +21 -31
  505. package/src/interactive/footer/dashboard.ts +8 -3
  506. package/src/interactive/footer/widgets.ts +50 -91
  507. package/src/interactive/interactive-application.ts +24 -44
  508. package/src/interactive/interactive-event-projection.ts +9 -45
  509. package/src/interactive/interactive-input-runtime.ts +3 -28
  510. package/src/interactive/interactive-presentation.ts +45 -16
  511. package/src/interactive/interactive-slash-runtime.ts +5 -40
  512. package/src/interactive/layout.ts +31 -5
  513. package/src/interactive/model-session-replay.ts +2 -2
  514. package/src/interactive/overlay-frame.ts +1 -0
  515. package/src/interactive/overlay-general-openers.ts +5 -1
  516. package/src/interactive/overlay-lifecycle.ts +1 -0
  517. package/src/interactive/overlay-session-lifecycle.ts +7 -1
  518. package/src/interactive/overlays/ask-user.ts +1 -0
  519. package/src/interactive/overlays/message-picker.ts +1 -1
  520. package/src/interactive/overlays/settings.ts +9 -8
  521. package/src/interactive/renderers/preview.ts +16 -0
  522. package/src/interactive/renderers/tool-execution.ts +84 -161
  523. package/src/interactive/renderers/worker-entry.ts +74 -43
  524. package/src/interactive/slash-autocomplete.ts +1 -6
  525. package/src/interactive/slash-commands.ts +16 -46
  526. package/src/interactive/status/controller.ts +0 -5
  527. package/src/interactive/status/state-machine.ts +44 -26
  528. package/src/interactive/status/types.ts +3 -0
  529. package/src/interactive/status/verbs.ts +13 -12
  530. package/src/interactive/transcript-detail.ts +50 -112
  531. package/src/interactive/turn-context.ts +221 -53
  532. package/src/interactive/turn-middleware.ts +3 -1
  533. package/src/interactive/turn-persistence.ts +3 -0
  534. package/src/interactive/turn-runtime.ts +11 -2
  535. package/src/interactive/turn-state.ts +10 -9
  536. package/src/interactive/view/artifacts.ts +4 -0
  537. package/src/interactive/view/view-overlay.ts +44 -34
  538. package/src/interactive/watch-pane.ts +18 -4
  539. package/src/interactive/worker-stream.ts +7 -7
  540. package/src/tools/agent-tools.ts +6 -3
  541. package/src/tools/bash.ts +1 -1
  542. package/src/tools/builtin-tool-catalog.ts +9 -2
  543. package/src/tools/codewiki/code-nav.ts +4 -10
  544. package/src/tools/compete-judge-task.ts +71 -0
  545. package/src/tools/compete-worktrees.ts +34 -0
  546. package/src/tools/context/index.ts +32 -7
  547. package/src/tools/context/surface.ts +15 -4
  548. package/src/tools/decide.ts +1 -1
  549. package/src/tools/dispatch-admission.ts +12 -1
  550. package/src/tools/dispatch-arguments.ts +38 -1
  551. package/src/tools/dispatch-plan.ts +7 -7
  552. package/src/tools/dispatch-runner.ts +48 -32
  553. package/src/tools/dispatch-schema.ts +30 -23
  554. package/src/tools/dispatch-scout-admission.ts +10 -44
  555. package/src/tools/dispatch-scout.ts +2 -3
  556. package/src/tools/find.ts +13 -4
  557. package/src/tools/grep.ts +13 -1
  558. package/src/tools/ls.ts +7 -1
  559. package/src/tools/monitor.ts +26 -11
  560. package/src/tools/network-policy.ts +11 -24
  561. package/src/tools/observation.ts +39 -2
  562. package/src/tools/presentation.ts +1 -1
  563. package/src/tools/read.ts +112 -15
  564. package/src/tools/registry.ts +55 -18
  565. package/src/tools/result-shaping.ts +110 -2
  566. package/src/tools/tasks.ts +33 -7
  567. package/src/tools/verify/frontend.ts +67 -30
  568. package/src/tools/verify/numeric.ts +10 -5
  569. package/src/tools/web-fetch-network.ts +179 -0
  570. package/src/tools/web-fetch-surface.ts +2 -1
  571. package/src/tools/web-fetch.ts +15 -13
  572. package/src/tools/worker-evidence.ts +27 -0
  573. package/src/worker/spec-contract.ts +12 -8
  574. package/dist/builtins-WGALA46I.js +0 -22
  575. package/dist/chunk-2WZ546HR.js +0 -792
  576. package/dist/chunk-5PSMVOLM.js +0 -56
  577. package/dist/chunk-EL24TAU4.js +0 -1560
  578. package/dist/chunk-IZXGRF7P.js +0 -4048
  579. package/dist/chunk-JVCV3ICN.js +0 -47
  580. package/dist/chunk-MNJGS2IN.js +0 -33
  581. package/dist/chunk-O5CVSAG5.js +0 -122
  582. package/dist/chunk-ODGTEFFI.js +0 -50
  583. package/dist/chunk-OQE5J4C6.js +0 -73
  584. package/dist/chunk-UUVG37B4.js +0 -244
  585. package/dist/chunk-V6HJFQZE.js +0 -228
  586. package/dist/clio-QLICPCF5.js +0 -25
  587. package/dist/configure-VEPX4NMX.js +0 -55
  588. package/dist/context-clear-S4ZJCQUX.js +0 -182
  589. package/dist/detail-A7JAVSIG.js +0 -98
  590. package/dist/evidence-4F5USFKH.js +0 -208
  591. package/dist/fleet-view-MN2VG4MR.js +0 -101
  592. package/dist/inventory-C26CFDRR.js +0 -101
  593. package/dist/preload-P6DGH2PZ.js +0 -13
  594. package/dist/slash-commands-ZXPJD64J.js +0 -92
  595. package/dist/tasks-IPAGMEIX.js +0 -36
  596. package/dist/tools-EFFEAIDP.js +0 -28
  597. package/dist/verify-FWYGPKMR.js +0 -29
  598. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -37,6 +37,7 @@ import { getSharedBus } from "../core/shared-bus.js";
37
37
  import { isSkillActivation } from "../core/skill-activation.js";
38
38
  import { StartupTimer } from "../core/startup-timer.js";
39
39
  import { getTerminationCoordinator } from "../core/termination.js";
40
+ import { captureProjectSurface, projectSurfaceTrustNotice } from "../core/workspace-trust.js";
40
41
  import { clioDataDir, clioStateDir } from "../core/xdg.js";
41
42
  import { renderAgentCatalogSectionsFromSpecs } from "../domains/agents/catalog.js";
42
43
  import type { AgentsContract } from "../domains/agents/contract.js";
@@ -157,10 +158,9 @@ import {
157
158
  import type { SchedulingContract } from "../domains/scheduling/contract.js";
158
159
  import { SchedulingDomainModule } from "../domains/scheduling/index.js";
159
160
  import type { CompactionCallObservation } from "../domains/session/compaction/compact.js";
160
- import { type CompactResult, compact } from "../domains/session/compaction/compact.js";
161
+ import { type CompactInput, type CompactResult, compact } from "../domains/session/compaction/compact.js";
161
162
  import { collectSessionEntries } from "../domains/session/compaction/session-entries.js";
162
163
  import { estimateTokens } from "../domains/session/compaction/tokens.js";
163
- import { ceilChars } from "../domains/session/context-accounting.js";
164
164
  import type { SessionContract, SessionMeta } from "../domains/session/contract.js";
165
165
  import { activeDecisionRefs, createDecisionBoardStore } from "../domains/session/decision-board.js";
166
166
  import type { CompactionSummaryEntry, CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
@@ -615,6 +615,7 @@ function agentRoleToolWarnings(providers: ProvidersContract, settings: Readonly<
615
615
  async function resolveCompactionModel(
616
616
  settings: ClioSettings,
617
617
  providers: ProvidersContract,
618
+ signal?: AbortSignal,
618
619
  ): Promise<CompactionResolution | null> {
619
620
  const override = settings.context.compaction.model;
620
621
  let targetId = settings.chat.target;
@@ -635,7 +636,7 @@ async function resolveCompactionModel(
635
636
  wireModelId = selected.ref.model;
636
637
  }
637
638
  if (!targetId || !wireModelId) return null;
638
- await prepareBackgroundModelMetadata(providers, targetId);
639
+ await prepareBackgroundModelMetadata(providers, targetId, signal);
639
640
  const status = providers.list().find((entry) => entry.target.id === targetId);
640
641
  if (!status?.available) {
641
642
  throw new Error("context.compaction.model target is unavailable; check the selected target with clio-coder targets");
@@ -674,7 +675,7 @@ async function resolveCompactionModel(
674
675
  applyModelCapabilityPatch(model, refined.capabilities);
675
676
  let apiKey: string | undefined = LOCAL_API_KEY_FALLBACK;
676
677
  if (targetRequiresAuth(route.target, route.runtime)) {
677
- const auth = await providers.auth.resolveForTarget(route.target, route.runtime);
678
+ const auth = await providers.auth.resolveForTarget(route.target, route.runtime, signal ? { signal } : undefined);
678
679
  if (!auth.available || !auth.apiKey) {
679
680
  throw new Error(
680
681
  "context.compaction.model authentication is unavailable; authenticate the selected target with clio-coder auth",
@@ -795,6 +796,8 @@ async function runCompactionFlow(
795
796
  instructions?: string,
796
797
  trigger?: CompactionTrigger,
797
798
  observability?: BackgroundMemoryUsageSink,
799
+ budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
800
+ summarize?: CompactInput["summarize"],
798
801
  ): Promise<CompactResult | null> {
799
802
  const meta = session.current();
800
803
  if (!meta) {
@@ -806,8 +809,11 @@ async function runCompactionFlow(
806
809
  session.current()?.id === meta.id && (session.tree(meta.id).leafId ?? undefined) === activeLeafTurnId;
807
810
  const entries = filterEntriesToActivePath(readSessionEntriesForCompact(meta.id), activeLeafTurnId);
808
811
  if (entries.length === 0) return null;
812
+ budget?.signal?.throwIfAborted();
809
813
  const systemPrompt = await readCompactionSystemPrompt(settings.context.compaction.systemPrompt, meta.cwd);
810
- const resolved = await resolveCompactionModel(settings, providers);
814
+ budget?.signal?.throwIfAborted();
815
+ const resolved = await resolveCompactionModel(settings, providers, budget?.signal);
816
+ budget?.signal?.throwIfAborted();
811
817
  if (!resolved) {
812
818
  throw new Error("no model configured; set chat.target + chat.model");
813
819
  }
@@ -842,6 +848,8 @@ async function runCompactionFlow(
842
848
  try {
843
849
  result = await compact({
844
850
  entries,
851
+ ...budget,
852
+ ...(summarize ? { summarize } : {}),
845
853
  onCall: (call) => calls.push(call),
846
854
  model: resolved.model,
847
855
  ...(systemPrompt !== undefined ? { systemPrompt } : {}),
@@ -859,6 +867,10 @@ async function runCompactionFlow(
859
867
  } finally {
860
868
  releaseEndpointSlot();
861
869
  }
870
+ if (budget?.signal?.aborted) {
871
+ preserveCalls();
872
+ budget.signal.throwIfAborted();
873
+ }
862
874
  if (!isOriginCurrent()) {
863
875
  preserveCalls();
864
876
  throw new Error("compaction session or branch changed; summary discarded and originating usage retained");
@@ -877,6 +889,8 @@ async function runCompactionFlow(
877
889
  turnId: randomUUID(),
878
890
  parentTurnId: result.firstKeptTurnId ?? null,
879
891
  summary: result.summary,
892
+ ...(result.skillContext ? { skillContext: result.skillContext } : {}),
893
+ ...(result.userContext ? { userContext: result.userContext } : {}),
880
894
  tokensBefore: result.tokensBefore,
881
895
  firstKeptTurnId: result.firstKeptTurnId ?? "",
882
896
  messagesSummarized: result.messagesSummarized,
@@ -940,17 +954,28 @@ export function createProductionAutoCompact(
940
954
  getSettings: () => ClioSettings,
941
955
  providers: ProvidersContract,
942
956
  observability?: BackgroundMemoryUsageSink,
943
- ): (instructions?: string, trigger?: CompactionTrigger) => Promise<CompactResult | null> {
944
- return (instructions, trigger) =>
945
- runCompactionFlow(session, getSettings(), providers, instructions, trigger, observability);
957
+ summarize?: CompactInput["summarize"],
958
+ ): (
959
+ instructions?: string,
960
+ trigger?: CompactionTrigger,
961
+ budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
962
+ ) => Promise<CompactResult | null> {
963
+ return (instructions, trigger, budget) =>
964
+ runCompactionFlow(session, getSettings(), providers, instructions, trigger, observability, budget, summarize);
946
965
  }
947
966
 
948
- function estimateTokensFromSummary(summary: string): number {
949
- // Mirrors the rough byte/4 heuristic the rest of the compaction stack
950
- // uses for unmeasured payloads. Kept inline because this is the only
951
- // caller; pi-mono's token estimator is provider-specific and we do not
952
- // have a model handle at the persistence layer.
953
- return Math.max(1, ceilChars(summary.length));
967
+ function estimateTokensFromSummary(result: CompactResult): number {
968
+ return estimateTokens({
969
+ kind: "compactionSummary",
970
+ turnId: "estimate",
971
+ parentTurnId: null,
972
+ timestamp: "",
973
+ summary: result.summary,
974
+ firstKeptTurnId: result.firstKeptTurnId ?? "",
975
+ tokensBefore: result.tokensBefore,
976
+ ...(result.skillContext ? { skillContext: result.skillContext } : {}),
977
+ ...(result.userContext ? { userContext: result.userContext } : {}),
978
+ });
954
979
  }
955
980
 
956
981
  /**
@@ -973,7 +998,7 @@ function estimateTokensFromSummary(summary: string): number {
973
998
  function estimateTokensAfterCompaction(entries: ReadonlyArray<SessionEntry>, result: CompactResult): number {
974
999
  let droppedTokens = 0;
975
1000
  for (const entry of entries.slice(0, result.firstKeptEntryIndex)) droppedTokens += estimateTokens(entry);
976
- const summaryTokens = estimateTokensFromSummary(result.summary);
1001
+ const summaryTokens = estimateTokensFromSummary(result);
977
1002
  // The summary alone is the floor: a session whose dropped estimate exceeds
978
1003
  // the measured anchor must not report a negative or sub-summary context.
979
1004
  return Math.max(summaryTokens, result.tokensBefore - droppedTokens + summaryTokens);
@@ -1042,6 +1067,15 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1042
1067
  termination.installSignalHandlers();
1043
1068
 
1044
1069
  ensureClioState();
1070
+ for (const surface of ["safety", "settings"] as const) {
1071
+ const snapshot = captureProjectSurface(process.cwd(), surface);
1072
+ if (snapshot.verdict === "trusted") continue;
1073
+ for (const file of snapshot.files) {
1074
+ if (file.text !== null || file.error !== undefined) {
1075
+ bootStderr(`[clio-coder:trust] ${projectSurfaceTrustNotice(snapshot, file.path)}\n`);
1076
+ }
1077
+ }
1078
+ }
1045
1079
  sweepExpiredToolOffloads();
1046
1080
  timer.mark("install check");
1047
1081
 
@@ -1500,6 +1534,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1500
1534
  // different generation. The owner slot is anchored here, so user hooks
1501
1535
  // keep evaluating after the guards and before the assessors below.
1502
1536
  const hookReceiptLog = createHookReceiptLog({ persistPath: join(clioStateDir(), "hook-receipts.json") });
1537
+ let bootHookNotices = true;
1503
1538
  const extensionReload = createExtensionReloadCoordinator({
1504
1539
  extensions,
1505
1540
  middleware,
@@ -1507,10 +1542,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1507
1542
  recordReceipt: (receipt) => hookReceiptLog.record(receipt),
1508
1543
  report: (line) => {
1509
1544
  if (!interactive) process.stderr.write(`${line}\n`);
1545
+ else if (bootHookNotices) initialNotices.push(line);
1546
+ else bus.emit(BusChannels.ExtensionsLoadIssue, { message: line });
1510
1547
  },
1511
1548
  onCommitted: (event) => bus.emit(BusChannels.ExtensionsReloaded, event),
1512
1549
  });
1513
1550
  extensionReload.applyBoot();
1551
+ bootHookNotices = false;
1514
1552
  termination.onDrain(() => hookReceiptLog.flush());
1515
1553
  // Autonomy is hot-reloaded for interactive and headless admissions. ACP
1516
1554
  // server prompts use the snapshot captured at session/new.
@@ -6,16 +6,12 @@ import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-life
6
6
  export const APPLICATION_DOUBLE_TAP_MS = 500;
7
7
 
8
8
  const CLOSED_ACTION_ORDER = [
9
+ "clio-coder.output.cycle",
9
10
  "clio-coder.notifications.dismiss",
10
- "clio-coder.tool.expand",
11
- "clio-coder.tool.expandAll",
12
- "clio-coder.tool.liveOutput",
13
11
  "clio-coder.editor.external",
14
12
  "clio-coder.message.followUp",
15
13
  "clio-coder.message.interrupt",
16
14
  "clio-coder.message.dequeue",
17
- "clio-coder.thinking.expand",
18
- "clio-coder.thinking.expandAll",
19
15
  ] as const satisfies ReadonlyArray<ClioKeybinding>;
20
16
 
21
17
  export const GLOBAL_ACTION_ORDER = [
@@ -108,10 +104,6 @@ export interface ApplicationControllerDeps {
108
104
  listNotifications: () => ReadonlyArray<{ id: string }>;
109
105
  dismissNotification: (id: string) => void;
110
106
  dismissAllNotifications: () => void;
111
- toggleLastToolExpanded: () => boolean;
112
- toggleAllToolsExpanded: () => boolean;
113
- toggleLastThinking: () => boolean;
114
- toggleAllThinking: () => boolean;
115
107
  shutdownDisposers: ReadonlyArray<() => void>;
116
108
  /** Settle the last presentation mutation into an accepted/drained frame. */
117
109
  beforeStopUi?: () => Promise<void>;
@@ -145,8 +137,6 @@ export interface ApplicationController {
145
137
  handleInput(data: string): ApplicationInputResult;
146
138
  handleCtrlC(): void;
147
139
  dismissNotifications(): void;
148
- toggleToolExpansion(): void;
149
- toggleThinkingExpansion(): void;
150
140
  shutdown(): Promise<void>;
151
141
  }
152
142
 
@@ -163,8 +153,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
163
153
  let shuttingDown = false;
164
154
  let lastCtrlCAt = 0;
165
155
  let lastNotificationDismissAt = 0;
166
- let lastToolExpandAt = 0;
167
- let lastThinkingExpandAt = 0;
168
156
 
169
157
  const isDoubleTap = (lastAt: number, now: number): boolean => lastAt > 0 && now - lastAt <= APPLICATION_DOUBLE_TAP_MS;
170
158
 
@@ -346,22 +334,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
346
334
  if (first) deps.dismissNotification(first.id);
347
335
  };
348
336
 
349
- const toggleToolExpansion = (): void => {
350
- const now = deps.clock.now();
351
- const doubleTap = isDoubleTap(lastToolExpandAt, now);
352
- lastToolExpandAt = now;
353
- const changed = doubleTap ? deps.toggleAllToolsExpanded() : deps.toggleLastToolExpanded();
354
- if (changed) deps.requestRender();
355
- };
356
-
357
- const toggleThinkingExpansion = (): void => {
358
- const now = deps.clock.now();
359
- const doubleTap = isDoubleTap(lastThinkingExpandAt, now);
360
- lastThinkingExpandAt = now;
361
- const changed = doubleTap ? deps.toggleAllThinking() : deps.toggleLastThinking();
362
- if (changed) deps.requestRender();
363
- };
364
-
365
337
  const handleInput = (data: string): ApplicationInputResult => {
366
338
  const initialOverlayState = deps.getOverlayState();
367
339
  if (overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending()) deps.leaderKeys.reset();
@@ -427,8 +399,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
427
399
  handleInput,
428
400
  handleCtrlC,
429
401
  dismissNotifications,
430
- toggleToolExpansion,
431
- toggleThinkingExpansion,
432
402
  shutdown,
433
403
  };
434
404
  }
@@ -162,10 +162,9 @@ export function isLengthStopAssistantMessage(message: AgentMessage | undefined):
162
162
  }
163
163
 
164
164
  /**
165
- * An aborted assistant message with no rendered content: empty text and no
166
- * structured tool call. This is what `agent.abort()` leaves behind when the
167
- * model is interrupted between deltas. The chat loop suppresses it after a
168
- * loop-guard interrupt has already written a durable closing turn.
165
+ * An aborted assistant message with no text, thinking, or structured tool
166
+ * call. Only a hollow abort needs a synthetic closing record; streamed
167
+ * thinking belongs to the same durable assistant as any partial answer.
169
168
  */
170
169
  export function isEmptyAbortedAssistantMessage(message: AgentMessage | undefined): boolean {
171
170
  if (
@@ -179,9 +178,17 @@ export function isEmptyAbortedAssistantMessage(message: AgentMessage | undefined
179
178
  }
180
179
  if ((message as { stopReason?: unknown }).stopReason !== "aborted") return false;
181
180
  if (extractText(message).trim().length > 0) return false;
181
+ if (extractThinking(message).trim().length > 0) return false;
182
182
  return !hasStructuredToolCall(message);
183
183
  }
184
184
 
185
+ /** Apply host cancellation provenance only to a structurally aborted message. */
186
+ export function explainInterruptedAssistant(message: AgentMessage, reason: string | null): boolean {
187
+ if (reason === null || message.role !== "assistant" || message.stopReason !== "aborted") return false;
188
+ message.errorMessage = reason;
189
+ return true;
190
+ }
191
+
185
192
  function lengthStopMetadata(message: AgentMessage): Record<string, unknown> {
186
193
  const usage = (message as { usage?: unknown }).usage;
187
194
  const metadata: Record<string, unknown> = {
@@ -497,6 +504,7 @@ export function assistantSessionPayload(
497
504
  "model",
498
505
  "responseModel",
499
506
  "responseId",
507
+ "providerThinkingLevel",
500
508
  "gatewayRouting",
501
509
  "diagnostics",
502
510
  ]) {
@@ -13,6 +13,7 @@
13
13
  * machine, and the shared ChatTurnState the modules coordinate through.
14
14
  */
15
15
 
16
+ import { AsyncLocalStorage } from "node:async_hooks";
16
17
  import { BusChannels, type RunAbortSource } from "../core/bus-events.js";
17
18
  import type { ClioSettings } from "../core/config.js";
18
19
  import type { SafeEventBus } from "../core/event-bus.js";
@@ -45,14 +46,21 @@ import {
45
46
  } from "../domains/providers/index.js";
46
47
  import { type AutonomyLevel, modelMayActivateSkills } from "../domains/safety/autonomy.js";
47
48
  import type { ProtectedArtifactState } from "../domains/safety/protected-artifacts.js";
48
- import type { CompactResult } from "../domains/session/compaction/compact.js";
49
+ import type { CompactInput, CompactResult } from "../domains/session/compaction/compact.js";
49
50
  import type { ContextSnapshot, ContextUsageSnapshot } from "../domains/session/context-accounting.js";
50
51
  import { ceilChars, snapshotInputTokens } from "../domains/session/context-accounting.js";
51
52
  import type { ContextLedger } from "../domains/session/context-ledger.js";
52
53
  import type { SessionContract } from "../domains/session/contract.js";
53
- import type { CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
54
+ import {
55
+ type CompactionTrigger,
56
+ latestSkillContextState,
57
+ mainSkillContextState,
58
+ type SessionEntry,
59
+ SKILL_CONTEXT_STATE,
60
+ } from "../domains/session/entries.js";
54
61
  import { protectedArtifactStateFromSessionEntries } from "../domains/session/protected-artifacts.js";
55
62
  import { isRetryableErrorMessage, type RetrySettings } from "../domains/session/retry.js";
63
+ import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
56
64
  import { createEngineAgent } from "../engine/agent.js";
57
65
  import { resolveReservedOutputTokens } from "../engine/apis/output-budget.js";
58
66
  import { cwdHash } from "../engine/session.js";
@@ -65,6 +73,7 @@ import {
65
73
  createPendingSkillToolPolicy,
66
74
  detectOverflowFromState,
67
75
  detectTerminalFailureFromState,
76
+ explainInterruptedAssistant,
68
77
  notConfiguredNotice,
69
78
  noticeMessage,
70
79
  pendingSkillRequestPreamble,
@@ -189,6 +198,8 @@ export type ChatLoopEvent =
189
198
  | ToolApprovalStateEvent;
190
199
 
191
200
  export interface ChatSubmitOptions {
201
+ /** Host-owned run identity, scoped to this submit and its internal continuations. */
202
+ hostRun?: ToolInvokeOptions["hostRun"];
192
203
  images?: ReadonlyArray<ImageContent>;
193
204
  /** Files already expanded into this session's working context. */
194
205
  workingContextPaths?: ReadonlyArray<string>;
@@ -443,7 +454,11 @@ export interface CreateChatLoopDeps {
443
454
  * Both sites share an AutoCompactionTrigger so two fires in the same tick
444
455
  * coalesce onto one summarization call.
445
456
  */
446
- autoCompact?: (instructions?: string, trigger?: CompactionTrigger) => Promise<CompactResult | null>;
457
+ autoCompact?: (
458
+ instructions?: string,
459
+ trigger?: CompactionTrigger,
460
+ budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
461
+ ) => Promise<CompactResult | null>;
447
462
  /** Optional observability sink for orchestrator chat token usage. */
448
463
  observability?: ObservabilityContract;
449
464
  /**
@@ -649,10 +664,33 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
649
664
  * line back when it lifts; the skill-activation ledger entry already
650
665
  * records provenance, so this is the notice, not a second UI.
651
666
  */
652
- const armSkillSurface = (policy: PendingSkillToolPolicy | undefined, loadedBefore?: ReadonlySet<string>): void => {
667
+ const armSkillSurface = (
668
+ policy: PendingSkillToolPolicy | undefined,
669
+ loadedBefore?: ReadonlySet<string>,
670
+ explicitOff = false,
671
+ ): void => {
653
672
  const previous = skillSurfaceNames(state.activeSkillSurface).join(", ");
654
673
  const next = armedSkillSurface(policy);
655
674
  const current = skillSurfaceNames(next).join(", ");
675
+ if (
676
+ deps.session?.current() &&
677
+ (explicitOff ||
678
+ previous.length > 0 ||
679
+ (policy?.loadedSkillNames.size ?? 0) > 0 ||
680
+ (policy?.requests.length ?? 0) > 0)
681
+ ) {
682
+ const entries = filterEntriesToActivePath(deps.readSessionEntries?.() ?? [], state.lastTurnId ?? undefined);
683
+ const selection = next
684
+ ? mainSkillContextState(entries, next)
685
+ : (policy?.loadedSkillNames.size ?? 0) > 0
686
+ ? null
687
+ : { version: 1 as const, activationRefs: [] };
688
+ const data = selection ?? { version: 1 as const, activationRefs: [], unknown: true as const };
689
+ if (JSON.stringify(data) !== JSON.stringify(latestSkillContextState(entries))) {
690
+ // Persist before changing live state: restart must not resurrect a cleared/replaced skill.
691
+ deps.session.appendEntry({ kind: "custom", customType: SKILL_CONTEXT_STATE, parentTurnId: state.lastTurnId, data });
692
+ }
693
+ }
656
694
  state.activeSkillSurface = next;
657
695
  const activated = skillSurfaceLabels(policy).filter((label) => !loadedBefore?.has(label.split(" ")[0] ?? label));
658
696
  if (activated.length > 0) {
@@ -692,10 +730,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
692
730
 
693
731
  const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().chat.retry);
694
732
 
733
+ const hostRunContext = new AsyncLocalStorage<ToolInvokeOptions["hostRun"]>();
695
734
  const currentToolInvokeOptions = (): Partial<ToolInvokeOptions> => {
696
735
  const options: Partial<ToolInvokeOptions> = {
697
736
  toolResultMaxBytes: deps.getSettings().context.toolResultMaxBytes,
698
737
  };
738
+ const hostRun = hostRunContext.getStore();
739
+ if (hostRun !== undefined) options.hostRun = hostRun;
699
740
  const sessionId = deps.session?.current()?.id ?? null;
700
741
  if (sessionId) options.sessionId = sessionId;
701
742
  const turnId = state.activeUserTurnId ?? state.lastTurnId;
@@ -774,7 +815,10 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
774
815
  emitNotice,
775
816
  });
776
817
  const emitRuntimeEvent = (event: AgentEvent | AssistantDeltaEvent): void => {
777
- if (event.type === "message_end") rewriteStallAbortMessage(state, event.message);
818
+ if (event.type === "message_end") {
819
+ rewriteStallAbortMessage(state, event.message);
820
+ explainInterruptedAssistant(event.message, state.activeInterruptReason);
821
+ }
778
822
  emit(event as ChatLoopEvent);
779
823
  };
780
824
 
@@ -1007,7 +1051,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1007
1051
  interruptRefusal: () => (state.streaming ? interruptRefusalReason() : null),
1008
1052
  clearSkillSurface: () => {
1009
1053
  const cleared = skillSurfaceNames(state.activeSkillSurface);
1010
- armSkillSurface(undefined);
1054
+ armSkillSurface(undefined, undefined, true);
1011
1055
  return cleared;
1012
1056
  },
1013
1057
  clearQueuedFollowUps: () => queues.clearQueuedMirror().map((entry) => entry.text),
@@ -1145,9 +1189,10 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1145
1189
  const forceNow = process.env.CLIO_CODER_FORCE_COMPACT === "1";
1146
1190
  try {
1147
1191
  setTurnPreparation("compacting");
1148
- await context.runAutoCompact(agentRuntime, forceNow, undefined, undefined, submittedText);
1192
+ await context.runAutoCompact(agentRuntime, forceNow, undefined, undefined, submittedText, pendingSkillPolicy);
1149
1193
  } catch (err) {
1150
1194
  emitNotice(`[Clio Coder] auto-compaction failed: ${err instanceof Error ? err.message : String(err)}`);
1195
+ if (err instanceof Error && err.name === "AbortError") return;
1151
1196
  } finally {
1152
1197
  endPreparationCompaction();
1153
1198
  }
@@ -1170,8 +1215,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1170
1215
  toolSignature,
1171
1216
  });
1172
1217
 
1173
- const reservedOutput = resolveReservedOutputTokens(agentRuntime.runtimeResolution.capabilityDecisions.maxTokens);
1174
1218
  const effectiveWindow = agentRuntime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
1219
+ const outputForInput = (inputTokens: number): number =>
1220
+ resolveReservedOutputTokens(agentRuntime.runtimeResolution.capabilityDecisions.maxTokens, {
1221
+ api: agentRuntime.agent.state.model?.api ?? "",
1222
+ contextWindow: effectiveWindow,
1223
+ inputTokens,
1224
+ });
1175
1225
  const pendingInputTokens = ceilChars(submittedText.length);
1176
1226
  let turnSnapshot = captureTurnSnapshot("pending");
1177
1227
  // The snapshot prices the prompt at chars/4. When the provider has
@@ -1184,28 +1234,38 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1184
1234
  snapshotInputTokens(snapshot) + pendingInputTokens,
1185
1235
  context.liveContextEstimate(agentRuntime, submittedText).tokens,
1186
1236
  );
1187
- const totalEstimate = budgetedPromptTokens(turnSnapshot) + reservedOutput;
1237
+ const inputEstimate = budgetedPromptTokens(turnSnapshot);
1238
+ const reservedOutput = outputForInput(inputEstimate);
1239
+ const totalEstimate = inputEstimate + reservedOutput;
1188
1240
 
1189
1241
  if (effectiveWindow > 0 && totalEstimate > effectiveWindow) {
1190
1242
  emitNotice(
1191
1243
  `[Clio Coder] Estimated request size ${totalEstimate} tokens (input ${totalEstimate - reservedOutput} + output budget ${reservedOutput}) exceeds the effective context window of ${effectiveWindow} tokens. Running compaction before sending...`,
1192
1244
  );
1193
1245
  setTurnPreparation("compacting");
1246
+ let compactionFailure: string | undefined;
1194
1247
  const compacted = await context
1195
- .runAutoCompact(agentRuntime, true, undefined, undefined, submittedText)
1248
+ .runAutoCompact(agentRuntime, true, undefined, "overflow", submittedText, pendingSkillPolicy)
1249
+ .catch((error: unknown) => {
1250
+ compactionFailure = error instanceof Error ? error.message : String(error);
1251
+ return false;
1252
+ })
1196
1253
  .finally(endPreparationCompaction);
1197
1254
  if (!compacted) {
1198
- emitNotice(
1199
- "[Clio Coder] Compaction could not reclaim enough space. Request blocked; trim the prompt, reduce active tools, or start a fresh session.",
1255
+ emitAdmissionNotice(
1256
+ `[Clio Coder] Request exceeds the context window and compaction could not reclaim enough space.${compactionFailure ? ` ${compactionFailure}.` : ""} Trim the prompt or reduce active tools.`,
1257
+ "context-window-exceeded",
1200
1258
  );
1201
1259
  return;
1202
1260
  }
1203
1261
  context.refreshAgentMessagesFromSession(agentRuntime);
1204
1262
  turnSnapshot = captureTurnSnapshot("pending");
1205
- const postTotalEstimate = budgetedPromptTokens(turnSnapshot) + reservedOutput;
1263
+ const postInputEstimate = budgetedPromptTokens(turnSnapshot);
1264
+ const postTotalEstimate = postInputEstimate + outputForInput(postInputEstimate);
1206
1265
  if (postTotalEstimate > effectiveWindow) {
1207
- emitNotice(
1266
+ emitAdmissionNotice(
1208
1267
  `[Clio Coder] Request still exceeds the effective window after compaction (${postTotalEstimate} > ${effectiveWindow}). Request blocked.`,
1268
+ "context-window-exceeded",
1209
1269
  );
1210
1270
  return;
1211
1271
  }
@@ -1264,6 +1324,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1264
1324
  state.toolProseAbortReason = null;
1265
1325
  state.toolProseAssessedChars = 0;
1266
1326
  state.activeInterruptReason = null;
1327
+ state.interruptedAssistantMessage = null;
1267
1328
  state.interruptedUsage = null;
1268
1329
 
1269
1330
  // 6. Cache-disturbance honesty (T3.3)
@@ -1355,19 +1416,21 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1355
1416
  }
1356
1417
  state.streaming = false;
1357
1418
  if (state.activeInterruptReason !== null) {
1358
- // The loop-guard cancel showed its closing message live; persist
1359
- // the durable closing turn only now, after the aborted run's
1360
- // in-flight tool results have all landed, so the ledger replays
1361
- // as tool_calls → tool_results → closing text.
1362
- // A thinking-only abort never reaches the ledger, so its estimated
1363
- // spend rides on the closing turn; persistence computes nothing
1364
- // further for a message that already reports positive usage.
1365
- const closing = noticeMessage(state.activeInterruptReason);
1366
- if (state.interruptedUsage !== null) {
1367
- (closing as { usage?: unknown }).usage = state.interruptedUsage;
1368
- }
1369
- persistence.appendAssistantTurn(closing);
1419
+ const reason = state.activeInterruptReason;
1370
1420
  state.activeInterruptReason = null;
1421
+ // A partial response already closed with the cancellation reason.
1422
+ // Only a hollow abort needs a synthetic assistant, after all tool
1423
+ // results have landed. Publish its notice after settlement too, so
1424
+ // it cannot split the entry the provider's message_end finalizes.
1425
+ if (state.interruptedAssistantMessage === null) {
1426
+ const closing = noticeMessage(reason);
1427
+ if (state.interruptedUsage !== null) {
1428
+ (closing as { usage?: unknown }).usage = state.interruptedUsage;
1429
+ }
1430
+ persistence.appendAssistantTurn(closing);
1431
+ emitNotice(reason, "warning", "turn.interrupted");
1432
+ }
1433
+ state.interruptedAssistantMessage = null;
1371
1434
  state.interruptedUsage = null;
1372
1435
  }
1373
1436
  state.currentPendingSkillPolicy = priorPendingSkillPolicy;
@@ -1385,6 +1448,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1385
1448
 
1386
1449
  cancel(options?: ChatCancelOptions): void {
1387
1450
  const wasStreaming = state.streaming;
1451
+ context.cancelCompaction();
1388
1452
  recovery.cancelRetryCountdown();
1389
1453
  // Clear both queues before the abort settles the in-flight prompt:
1390
1454
  // a cancelled run must not deliver queued steers or follow-ups, and
@@ -1392,19 +1456,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1392
1456
  queues.clearQueuedMirror();
1393
1457
  const requestedReason = options?.reason?.trim();
1394
1458
  if (wasStreaming) {
1395
- // Show the stop reason immediately, but persist the durable closing
1396
- // turn only when the run settles (submit's finally). The abort below
1397
- // still lets the in-flight tool results land; persisting here would
1398
- // interleave an assistant turn between a tool-call message and its
1399
- // results, which strict chat templates reject on replay.
1400
- // `activeInterruptReason` meanwhile suppresses the empty aborted
1401
- // messages the abort leaves behind, in both the ledger and the live
1402
- // transcript. Operator cancels take the same path with the default
1403
- // text, so they no longer render a redundant "[aborted] Request was
1404
- // aborted" turn on top of the cancellation notice.
1459
+ // Keep immediate feedback in the footer. A transcript notice here
1460
+ // would split the streamed entry before message_end can finalize it.
1461
+ // The reason is carried by the provider's aborted assistant, or by
1462
+ // one synthetic closing record after an empty abort settles.
1405
1463
  state.activeInterruptReason =
1406
1464
  requestedReason && requestedReason.length > 0 ? requestedReason : "[Clio Coder] active response cancelled.";
1407
- emitNotice(state.activeInterruptReason, "warning", "turn.interrupted");
1465
+ emitFooterNotice("warning", state.activeInterruptReason, "turn.interrupted");
1408
1466
  }
1409
1467
  state.runtime?.agent.abort();
1410
1468
  if (wasStreaming && deps.bus) {
@@ -1595,11 +1653,16 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1595
1653
  return;
1596
1654
  }
1597
1655
  let compacted = false;
1656
+ enterPreparation();
1657
+ setTurnPreparation("compacting");
1598
1658
  try {
1599
1659
  compacted = await context.runAutoCompact(agentRuntime, true, instructions, "force");
1600
1660
  } catch (err) {
1601
1661
  emitNotice(`[/context compact] ${err instanceof Error ? err.message : String(err)}`);
1602
1662
  return;
1663
+ } finally {
1664
+ leavePreparation();
1665
+ endPreparationCompaction();
1603
1666
  }
1604
1667
  if (!compacted) {
1605
1668
  emitNotice("[/context compact] nothing to compact; session is empty or no cut crossed");
@@ -1633,6 +1696,9 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1633
1696
  // released at admission, not settlement, so steering stays immediate.
1634
1697
  let admissionTail: Promise<void> | null = null;
1635
1698
  api.submit = (text, options = {}) => {
1699
+ // Capture before admission can await. Internal resubmits inherit the
1700
+ // async scope; every independent public submit explicitly starts its own.
1701
+ const hostRun = options.hostRun === undefined ? undefined : structuredClone(options.hostRun);
1636
1702
  // The operator owns the slot from the keystroke, not from admission. The
1637
1703
  // prefix the pre-warm already pushed through stays in it either way, so
1638
1704
  // aborting here costs nothing and stops the real turn from queueing behind
@@ -1669,14 +1735,18 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1669
1735
  // A presentation observer cannot refuse a turn after the editor has
1670
1736
  // consumed it. The ordinary render path can recover on its next tick.
1671
1737
  }
1672
- return submitTracked(text, {
1673
- ...submitOptions,
1674
- onAdmitted: () => {
1675
- releaseTicket();
1676
- leaveOnce();
1677
- options.onAdmitted?.();
1678
- },
1679
- }).finally(releaseTicket);
1738
+ return hostRunContext
1739
+ .run(hostRun, () =>
1740
+ submitTracked(text, {
1741
+ ...submitOptions,
1742
+ onAdmitted: () => {
1743
+ releaseTicket();
1744
+ leaveOnce();
1745
+ options.onAdmitted?.();
1746
+ },
1747
+ }),
1748
+ )
1749
+ .finally(releaseTicket);
1680
1750
  };
1681
1751
  const run = previous ? previous.then(start) : start();
1682
1752
  return run.finally(leaveOnce);