@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
@@ -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.
@@ -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);
@@ -17,6 +17,7 @@ import { existsSync } from "node:fs";
17
17
  import { ToolNames } from "../core/tool-names.js";
18
18
  import { foldWorkingSet } from "../domains/context/working-set/fold.js";
19
19
  import { compactionCut } from "../domains/context/working-set/visible.js";
20
+ import { captureSkillContext } from "../domains/session/compaction/compact.js";
20
21
  import type {
21
22
  BashExecutionEntry,
22
23
  BranchSummaryEntry,
@@ -25,12 +26,14 @@ import type {
25
26
  FileEntryEntry,
26
27
  MessageEntry,
27
28
  ModelChangeEntry,
29
+ PreservedSkillContext,
28
30
  ProtectedArtifactEntry,
29
31
  SessionEntry,
30
32
  SessionInfoEntry,
31
33
  ThinkingLevelChangeEntry,
32
34
  WorkerRunEntry,
33
35
  } from "../domains/session/entries.js";
36
+ import { latestSkillContextState, verifiedSkillContextCheckpoint } from "../domains/session/entries.js";
34
37
  import {
35
38
  HANDOFF_NOTE_CUSTOM_TYPE,
36
39
  HANDOFF_SEED_CUSTOM_TYPE,
@@ -334,6 +337,8 @@ export function createCoalescingChatRenderer(deps: CreateCoalescingChatRendererD
334
337
  * Options for the rehydrate helper used by /resume and /fork.
335
338
  */
336
339
  export interface RehydrateChatPanelOptions {
340
+ /** Unprojected ledger for verifying historical skill receipts after eviction projection. */
341
+ skillContextEntries?: ReadonlyArray<SessionEntry>;
337
342
  /**
338
343
  * Select the active branch ancestry without truncating later sidecars.
339
344
  * Live compaction replay uses this so a summary appended after the current
@@ -451,6 +456,7 @@ function richMessageFromEntry(entry: MessageEntry, maxTextChars?: number): Agent
451
456
  "responseModelIdObservation",
452
457
  "responseModel",
453
458
  "responseId",
459
+ "providerThinkingLevel",
454
460
  "gatewayRouting",
455
461
  "diagnostics",
456
462
  "contextUsageInvalidated",
@@ -1068,6 +1074,15 @@ function appendContextMessage(
1068
1074
  out.push(makeTextMessage(role, truncateReplayText(trimmed), timestamp));
1069
1075
  }
1070
1076
 
1077
+ const UNVERIFIED_SKILL_CHECKPOINT_TEXT =
1078
+ "Preserved skill instructions on this checkpoint failed integrity verification and were not replayed. If a skill still applies, ask the operator to run /skill <name> again.";
1079
+
1080
+ /** Selected but unverifiable: name the skill and the exact ledger ref instead of dropping it. */
1081
+ function unverifiedSkillContextText(skill: PreservedSkillContext): string {
1082
+ const activation = skill.activation;
1083
+ return `Preserved skill instructions for ${activation.name} (source=${activation.source} hash=${activation.hash} path=${activation.filePath}) could not be re-verified against this session's ledger and were not replayed. If the skill still applies, recall the original load with context(scope="recall", ref="${skill.resultRef}") or ask the operator to run /skill ${activation.name} again.`;
1084
+ }
1085
+
1071
1086
  function skillActivationContextText(entry: Extract<SessionEntry, { kind: "skillActivation" }>): string {
1072
1087
  const activation = entry.activation;
1073
1088
  const turn = activation.turnId ? ` turn=${activation.turnId}` : "";
@@ -1080,6 +1095,16 @@ export function buildReplayAgentMessagesFromTurns(
1080
1095
  ): AgentMessage[] {
1081
1096
  const out = createOrderedReplaySink();
1082
1097
  const seenToolCalls = new Set<string>();
1098
+ const activeEntries = truncateAtTurn(
1099
+ filterEntriesToActivePath(turns, options.activeLeafTurnId ?? options.uptoTurnId),
1100
+ options.uptoTurnId,
1101
+ );
1102
+ const skillState = latestSkillContextState(activeEntries);
1103
+ const evidence = truncateAtTurn(
1104
+ filterEntriesToActivePath(options.skillContextEntries ?? turns, options.activeLeafTurnId ?? options.uptoTurnId),
1105
+ options.uptoTurnId,
1106
+ );
1107
+ const verified = captureSkillContext(evidence, skillState);
1083
1108
  for (const entry of selectReplayEntries(turns, options)) {
1084
1109
  switch (entry.kind) {
1085
1110
  case "message": {
@@ -1113,8 +1138,43 @@ export function buildReplayAgentMessagesFromTurns(
1113
1138
  break;
1114
1139
  case "compactionSummary":
1115
1140
  appendContextMessage(out, "user", compactionContextText(entry), entry.timestamp);
1141
+ if (entry.userContext)
1142
+ out.push(
1143
+ makeTextMessage("user", `Active user instructions (verbatim):\n${entry.userContext.text}`, entry.timestamp),
1144
+ );
1145
+ if (entry.skillContext !== undefined) {
1146
+ const retainedSkills = entry.skillContext.skills.length;
1147
+ if (!verifiedSkillContextCheckpoint(entry.skillContext)) {
1148
+ // The raw pairs behind a tampered checkpoint are already outside the
1149
+ // replay window. Say so rather than dropping the skill without a trace.
1150
+ if (retainedSkills > 0) {
1151
+ out.push(makeTextMessage("user", UNVERIFIED_SKILL_CHECKPOINT_TEXT, entry.timestamp));
1152
+ }
1153
+ break;
1154
+ }
1155
+ for (const skill of entry.skillContext.skills) {
1156
+ // An explicit later state that no longer names this activation is a
1157
+ // deliberate off or replacement; it leaves no trace, by design.
1158
+ if (skillState && !skillState.unknown && !skillState.activationRefs.includes(skill.activationRef)) continue;
1159
+ const receipt = verified?.skills.find((candidate) => candidate.activationRef === skill.activationRef);
1160
+ if (!receipt || JSON.stringify(receipt) !== JSON.stringify(skill)) {
1161
+ // Still selected, but its original receipt cannot be re-verified
1162
+ // (masked, rewritten, or unknown state). Never inject unverified
1163
+ // bytes, and never lose the skill silently either.
1164
+ out.push(makeTextMessage("user", unverifiedSkillContextText(skill), entry.timestamp));
1165
+ continue;
1166
+ }
1167
+ // This is historical instruction context, not a generated summary or a tool result.
1168
+ // Keep the exact captured blocks outside summary replay's text cap.
1169
+ out.push(makeTextMessage("user", `Preserved skill request (verbatim):\n${skill.requestText}`, entry.timestamp));
1170
+ out.push(makeTextMessage("user", `Verified loaded skill: ${JSON.stringify(skill.activation)}`, entry.timestamp));
1171
+ for (const block of skill.content) out.push(makeTextMessage("user", block.text, entry.timestamp));
1172
+ }
1173
+ }
1116
1174
  break;
1117
1175
  case "skillActivation":
1176
+ if (entry.activation.runId !== undefined || (skillState && !skillState.activationRefs.includes(entry.turnId)))
1177
+ break;
1118
1178
  appendContextMessage(out, "user", skillActivationContextText(entry), entry.timestamp);
1119
1179
  break;
1120
1180
  // The one custom entry that becomes a model message. `/handoff` seeds a