@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
@@ -12,7 +12,7 @@ import {
12
12
  import { getTerminationCoordinator } from "../../core/termination.js";
13
13
  import { ToolNames } from "../../core/tool-names.js";
14
14
  import { createRunReceiptQuality } from "../../domains/dispatch/receipt-findings.js";
15
- import { openLedger } from "../../domains/dispatch/state.js";
15
+ import { newRunId, openLedger } from "../../domains/dispatch/state.js";
16
16
  import type { RunKind, RunOutcome, RunReceiptDraft, RunStatus, ToolCallStat } from "../../domains/dispatch/types.js";
17
17
  import type { AgentMessage, ImageContent } from "../../engine/types.js";
18
18
  import type { ChatLoop, ChatLoopEvent } from "../../interactive/chat-loop.js";
@@ -58,6 +58,8 @@ export interface HeadlessMainAgentOptions {
58
58
  }
59
59
 
60
60
  interface HeadlessMainAgentResult {
61
+ /** Latest assistant stop, superseded by subsequent continuation messages. */
62
+ outputExhausted: boolean;
61
63
  text: string;
62
64
  error: string | null;
63
65
  /**
@@ -154,6 +156,7 @@ function resultFromEvent(event: ChatLoopEvent, current: HeadlessMainAgentResult)
154
156
  if (event.type !== "message_end") return current;
155
157
  const message = event.message;
156
158
  if (message?.role !== "assistant") return current;
159
+ current = { ...current, outputExhausted: message.stopReason === "length", sawTerminatingToolResult: false };
157
160
  const error = assistantError(message);
158
161
  if (error) return { ...current, text: "", error };
159
162
  const text = assistantText(message).trimEnd();
@@ -180,8 +183,15 @@ function recordToolEnd(stats: HeadlessMainAgentReceiptStats, event: ChatLoopEven
180
183
  stat.count += 1;
181
184
  const durationMs = durationMsFromEvent(event);
182
185
  if (durationMs !== undefined) stat.totalDurationMs += durationMs;
183
- if (event.isError) stat.errors += 1;
184
- else stat.ok += 1;
186
+ // Registry settlement is authoritative; legacy producers only expose isError.
187
+ const outcome = (event as { outcome?: unknown }).outcome;
188
+ if (outcome === "blocked") stat.blocked += 1;
189
+ else if (outcome === "error") stat.errors += 1;
190
+ else if (outcome === "ok") stat.ok += 1;
191
+ else if (outcome === undefined) {
192
+ if (event.isError) stat.errors += 1;
193
+ else stat.ok += 1;
194
+ }
185
195
  stats.toolStats.set(tool, stat);
186
196
  if (tool === ToolNames.Context) {
187
197
  const rawTurnId = (event as { turnId?: unknown }).turnId;
@@ -267,6 +277,7 @@ interface HeadlessTerminalOutcome {
267
277
  }
268
278
 
269
279
  async function recordHeadlessMainAgentReceipt(input: {
280
+ runId: string;
270
281
  chat: ChatLoop;
271
282
  task: string;
272
283
  startedAt: string;
@@ -289,6 +300,7 @@ async function recordHeadlessMainAgentReceipt(input: {
289
300
  const outcomeDetail = input.terminal.failureMessage;
290
301
  const ledger = openLedger();
291
302
  const envelope = ledger.create({
303
+ id: input.runId,
292
304
  agentId: "main-agent",
293
305
  executionRole: "builder",
294
306
  requestOrigin: "user",
@@ -394,10 +406,14 @@ function defaultShutdownHooks(): HeadlessShutdownHooks {
394
406
  }
395
407
 
396
408
  export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMainAgentOptions): Promise<number> {
409
+ // Children need the authoritative parent before submit can invoke dispatch.
410
+ // The terminal writer reuses this identity whichever settlement path wins.
411
+ const runId = newRunId();
397
412
  const mode = options.mode ?? "text";
398
413
  const jsonEvents = options.jsonEvents ?? "full";
399
414
  const startedAt = new Date().toISOString();
400
415
  let result: HeadlessMainAgentResult = {
416
+ outputExhausted: false,
401
417
  text: "",
402
418
  error: null,
403
419
  sawTerminatingToolResult: false,
@@ -422,6 +438,7 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
422
438
  if (sealed !== null) return sealed;
423
439
  const endedAt = new Date().toISOString();
424
440
  sealed = recordHeadlessMainAgentReceipt({
441
+ runId,
425
442
  chat,
426
443
  task: options.prompt,
427
444
  startedAt,
@@ -526,6 +543,7 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
526
543
  try {
527
544
  if (mode === "json" && jsonEvents === "terminal") writeTerminalTurnStart();
528
545
  const submitOptions = {
546
+ hostRun: { runId, lineage: { parentRunId: null, rootRunId: runId, depth: 0, attempt: 0 } },
529
547
  ...(options.images && options.images.length > 0 ? { images: options.images } : {}),
530
548
  ...(options.workingContextPaths && options.workingContextPaths.length > 0
531
549
  ? { workingContextPaths: options.workingContextPaths }
@@ -573,6 +591,15 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
573
591
  } else if (result.error) {
574
592
  terminal = { exitCode: 1, outcome: "failed", status: "failed", failureMessage: result.error };
575
593
  stderrMessage = prefixHeadlessFailure(chat, result.error);
594
+ } else if (result.outputExhausted && !result.sawTerminatingToolResult) {
595
+ // The provider returned normally, but generation exhausted its budget.
596
+ // Earlier chatter and partial prose cannot turn that terminal cause into
597
+ // success. A later assistant message or terminating tool supersedes it.
598
+ const failureMessage =
599
+ "clio-coder run: output token limit reached (stopReason=length); generation incomplete. Consider resuming with a narrower task, lower reasoning effort, or a larger output budget.";
600
+ terminal = { exitCode: 1, outcome: "failed", status: "failed", failureMessage };
601
+ stderrMessage = failureMessage;
602
+ if (mode === "text" && result.text.length > 0) stdoutMessage = result.text;
576
603
  } else if (result.text.length === 0 && !result.sawTerminatingToolResult) {
577
604
  const failureMessage =
578
605
  result.lastNotice !== null
@@ -611,7 +638,8 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
611
638
 
612
639
  if (stderrMessage !== null) {
613
640
  process.stderr.write(`${stderrMessage}\n`);
614
- } else if (stdoutMessage !== null) {
641
+ }
642
+ if (stdoutMessage !== null) {
615
643
  writeRawStdout(`${stdoutMessage}\n`);
616
644
  }
617
645
  await flushRawStdout();
package/src/cli/run.ts CHANGED
@@ -2,6 +2,7 @@ import { type ClioSettings, readSettings } from "../core/config.js";
2
2
  import { loadDomains } from "../core/domain-loader.js";
3
3
  import { readFileArgsAsync } from "../core/file-references.js";
4
4
  import { withRunOverrides } from "../core/run-overrides.js";
5
+ import { readStrictLayeredSettings } from "../core/settings-layers.js";
5
6
  import { clioDataDir } from "../core/xdg.js";
6
7
  import type { AgentsContract } from "../domains/agents/contract.js";
7
8
  import { AgentsDomainModule } from "../domains/agents/index.js";
@@ -101,15 +102,15 @@ function hasDispatchOnlyOptions(parsed: RunCliArgs): boolean {
101
102
 
102
103
  /**
103
104
  * True when an explicit --target override names a target that is not in
104
- * settings.targets. `readSettings().targets` is the same source the runtime
105
- * resolver checks (providers.getTarget), so this mirrors its `target-not-found`
105
+ * effective settings.targets. Include project overlays just as the runtime
106
+ * resolver does (providers.getTarget), so this mirrors its `target-not-found`
106
107
  * verdict without booting the providers domain. Unreadable/invalid settings
107
108
  * fall through (returns false) so the normal boot path surfaces that error
108
109
  * instead of a misleading "target not found".
109
110
  */
110
- function explicitTargetMissing(targetId: string): boolean {
111
+ export function explicitTargetMissing(targetId: string): boolean {
111
112
  try {
112
- return !readSettings().targets.some((target) => target.id === targetId);
113
+ return !readStrictLayeredSettings(process.cwd()).settings.targets.some((target) => target.id === targetId);
113
114
  } catch {
114
115
  return false;
115
116
  }
@@ -163,9 +164,9 @@ function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
163
164
  }
164
165
 
165
166
  /**
166
- * The TUI's verdict for a command-shaped token the registry does not own,
167
- * applied to a headless task. Returns the refusal message, or null when the
168
- * task is not an unknown command.
167
+ * Refuse commands the headless prompt path cannot execute. Skill invocations
168
+ * and prompt templates have production expansion paths; interactive commands
169
+ * do not, so accepting them would send their literal text to the model.
169
170
  *
170
171
  * `parseSlashCommand` is the canonical shape test and the canonical registry
171
172
  * walk, so a token that is one word of letters, digits, hyphens, or colons and
@@ -190,11 +191,14 @@ function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
190
191
  * closure sits on. Boundaries rule6 in `tests/boundaries/check-boundaries.ts`
191
192
  * holds both halves of that.
192
193
  */
193
- async function unknownSlashCommandRefusal(task: string): Promise<string | null> {
194
+ async function headlessSlashCommandRefusal(task: string): Promise<string | null> {
194
195
  if (!task.trim().startsWith("/")) return null;
195
196
  const { parseSlashCommand } = await import("../interactive/slash-commands.js");
196
197
  const command = parseSlashCommand(task);
197
- if (command.kind !== "unknown-command") return null;
198
+ if (command.kind === "skill-invocation" || command.kind === "unknown" || command.kind === "empty") return null;
199
+ if (command.kind !== "unknown-command") {
200
+ return "interactive commands are not supported by clio-coder run; use interactive chat or the corresponding CLI command";
201
+ }
198
202
  const { loadPromptTemplates } = await import("../domains/resources/index.js");
199
203
  const templates = loadPromptTemplates({ cwd: process.cwd() });
200
204
  if (templates.items.some((template) => template.name === command.token)) return null;
@@ -260,11 +264,9 @@ export async function runClioRun(
260
264
  if (!assembled) return 2;
261
265
 
262
266
  if (parsed.agentId === undefined) {
263
- // A mistyped slash command is a usage error, not a task. Refusing it
264
- // here keeps it from booting a session and spending a model turn on a
265
- // command that was never run, which is what the TUI has always done
266
- // and what docs/guide/extensions-and-sharing.md documents for both surfaces.
267
- const slashRefusal = await unknownSlashCommandRefusal(assembled.prompt);
267
+ // Reject unknown and unsupported interactive commands before boot;
268
+ // neither has a headless handler that could honor the request.
269
+ const slashRefusal = await headlessSlashCommandRefusal(assembled.prompt);
268
270
  if (slashRefusal !== null) {
269
271
  process.stderr.write(`clio-coder run: ${slashRefusal}\n`);
270
272
  return 2;
@@ -272,10 +272,10 @@ export async function runSkillsEvalCommand(nameOrPath: string, options: SkillsEv
272
272
  return anyUnmeasured || evidenceErrors.length > 0 ? 3 : 0;
273
273
  }
274
274
 
275
- export type NetworkPolicyLabel = "hermetic" | "allowed";
275
+ export type NetworkPolicyLabel = "retrieve-disabled" | "allowed";
276
276
 
277
277
  function networkPolicyLabel(allowNetwork: boolean): NetworkPolicyLabel {
278
- return allowNetwork ? "allowed" : "hermetic";
278
+ return allowNetwork ? "allowed" : "retrieve-disabled";
279
279
  }
280
280
 
281
281
  /**
@@ -287,7 +287,7 @@ function networkPolicyLabel(allowNetwork: boolean): NetworkPolicyLabel {
287
287
  function describeArmPolicy(allowNetwork: boolean): string {
288
288
  const network = allowNetwork
289
289
  ? "network allowed (--allow-network), so arm runs keep the web tools"
290
- : "network hermetic, so the web tools are stripped from every arm run (pass --allow-network to keep them)";
290
+ : "retrieval tools disabled in every arm run; bash networking requires OS isolation (pass --allow-network to keep web tools)";
291
291
  return `policy: autonomy ${ARM_AUTONOMY} for the baseline and treatment arms in per-run disposable workspaces; ${network}`;
292
292
  }
293
293
 
@@ -295,7 +295,7 @@ function describeArmPolicy(allowNetwork: boolean): string {
295
295
  function describeArmPolicyOutcome(allowNetwork: boolean): string {
296
296
  const network = allowNetwork
297
297
  ? "network: allowed (--allow-network); arm runs kept the web tools"
298
- : "network: hermetic; the web tools were stripped from every arm run";
298
+ : "retrieval: disabled; bash networking was not constrained";
299
299
  return `policy: the baseline and treatment arms ran at autonomy ${ARM_AUTONOMY}; ${network}`;
300
300
  }
301
301
 
@@ -353,17 +353,19 @@ function unmeasuredBullets(scenario: SkillEvalScenario, reason: string): ScoredB
353
353
 
354
354
  /**
355
355
  * The environment each arm's child `clio-coder run` inherits. Absent
356
- * `--allow-network` the hermetic switch is set, which strips the RETRIEVE
356
+ * `--allow-network` the retrieval registration switch is set, which strips the RETRIEVE
357
357
  * plane from every registry the child and its descendants build. With the flag
358
358
  * the variable is removed rather than left alone, so an ambient setting in the
359
359
  * operator's shell cannot make `--allow-network` a claim the run does not keep.
360
360
  *
361
361
  * @internal Exported for contract tests.
362
362
  */
363
- function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
363
+ export function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
364
364
  const childEnv: NodeJS.ProcessEnv = { ...env };
365
- if (allowNetwork) Reflect.deleteProperty(childEnv, NO_NETWORK_TOOLS_ENV);
366
- else childEnv[NO_NETWORK_TOOLS_ENV] = "1";
365
+ if (allowNetwork) {
366
+ Reflect.deleteProperty(childEnv, NO_NETWORK_TOOLS_ENV);
367
+ Reflect.deleteProperty(childEnv, "CLIO_CODER_NO_NETWORK_TOOLS");
368
+ } else childEnv[NO_NETWORK_TOOLS_ENV] = "1";
367
369
  return childEnv;
368
370
  }
369
371
 
@@ -1,18 +1,44 @@
1
1
  import * as fs from "node:fs";
2
+ import { Socket } from "node:net";
2
3
  import * as readline from "node:readline";
3
4
 
4
5
  export function setupSteerChannel(filePath: string, onLine: (line: string) => void): () => void {
5
6
  let closed = false;
6
7
  let watcher: fs.FSWatcher | null = null;
7
- let stream: fs.ReadStream | null = null;
8
+ let stream: Socket | null = null;
8
9
  let rl: readline.Interface | null = null;
10
+ const cleanup = () => {
11
+ if (closed) return;
12
+ closed = true;
13
+ watcher?.close();
14
+ rl?.close();
15
+ stream?.destroy();
16
+ };
17
+ const reportError = (err: unknown) => {
18
+ if (closed) return;
19
+ process.stderr.write(
20
+ `clio-coder run: failed to setup steer channel: ${err instanceof Error ? err.message : String(err)}\n`,
21
+ );
22
+ cleanup();
23
+ };
9
24
 
10
25
  try {
11
26
  const stats = fs.statSync(filePath);
12
27
  if (stats.isFIFO()) {
13
- // Named pipe: we can just read from the stream
14
- stream = fs.createReadStream(filePath);
28
+ // A blocking fs read cannot be cancelled while a FIFO writer stays
29
+ // open. Socket uses readiness-driven pipe reads that destroy() closes.
30
+ // Keep read-only access and the existing first-writer-EOF behavior.
31
+ const fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
32
+ try {
33
+ stream = new Socket({ fd, readable: true, writable: false });
34
+ } catch (err) {
35
+ // Ownership transfers to Socket only after successful construction.
36
+ fs.closeSync(fd);
37
+ throw err;
38
+ }
39
+ stream.on("error", reportError);
15
40
  rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
41
+ rl.on("error", reportError);
16
42
  rl.on("line", (line) => {
17
43
  if (closed) return;
18
44
  const trimmed = line.trim();
@@ -66,21 +92,8 @@ export function setupSteerChannel(filePath: string, onLine: (line: string) => vo
66
92
  });
67
93
  }
68
94
  } catch (err) {
69
- process.stderr.write(
70
- `clio-coder run: failed to setup steer channel: ${err instanceof Error ? err.message : String(err)}\n`,
71
- );
95
+ reportError(err);
72
96
  }
73
97
 
74
- return () => {
75
- closed = true;
76
- if (watcher) {
77
- watcher.close();
78
- }
79
- if (rl) {
80
- rl.close();
81
- }
82
- if (stream) {
83
- stream.destroy();
84
- }
85
- };
98
+ return cleanup;
86
99
  }
@@ -5,6 +5,8 @@ import {
5
5
  readSettings,
6
6
  removeFleetProfileFromSettings,
7
7
  setFleetProfileInSettings,
8
+ type TargetSelectionRole,
9
+ type UseTargetOptions,
8
10
  updateSettings,
9
11
  useTargetInSettings,
10
12
  } from "../core/config.js";
@@ -24,6 +26,7 @@ import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.
24
26
  import type { CapabilityFlags } from "../domains/providers/types/capability-flags.js";
25
27
  import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
26
28
  import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
29
+ import { resolveSupportedWireModels } from "./configure-target.js";
27
30
  import { printError, printOk } from "./shared.js";
28
31
  import { column, terminalColumns, truncate, wrapPlain } from "./text-layout.js";
29
32
 
@@ -259,7 +262,7 @@ function parseUseArgs(args: ReadonlyArray<string>): UseArgs | null {
259
262
  return parsed;
260
263
  }
261
264
 
262
- function runUse(args: ReadonlyArray<string>): number {
265
+ async function runUse(args: ReadonlyArray<string>): Promise<number> {
263
266
  if (wantsHelp(args)) return printUsage(USE_USAGE);
264
267
  let parsed: UseArgs | null;
265
268
  try {
@@ -281,42 +284,91 @@ function runUse(args: ReadonlyArray<string>): number {
281
284
  }
282
285
  const registry = getRuntimeRegistry();
283
286
  if (registry.list().length === 0) registerBuiltinRuntimes(registry);
284
- const runtime = registry.get(target.runtime);
285
- if (!runtime) {
286
- printError(
287
- `cannot use target '${target.id}' as orchestrator target because runtime '${target.runtime}' is not registered`,
288
- );
287
+ const options: UseTargetOptions = {
288
+ ...(parsed.model !== undefined ? { model: parsed.model } : {}),
289
+ ...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
290
+ ...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
291
+ ...(parsed.workerTarget !== undefined ? { workerTargetId: parsed.workerTarget } : {}),
292
+ ...(parsed.backgroundModel !== undefined ? { backgroundModel: parsed.backgroundModel } : {}),
293
+ };
294
+ const candidate = structuredClone(settings);
295
+ const selection = useTargetInSettings(candidate, target.id, options);
296
+ if (!selection) {
297
+ printError(`no target with id ${parsed.workerTarget}`);
289
298
  return 1;
290
299
  }
291
- if (!isOrchestratorEligibleRuntime(runtime)) {
292
- printError(
293
- `cannot use target '${target.id}' as orchestrator target because runtime '${runtime.id}' is not an HTTP/native runtime`,
294
- );
300
+ const labels: Record<TargetSelectionRole, string> = {
301
+ chat: "chat",
302
+ fleet: "fleet dispatch",
303
+ memory: "background memory",
304
+ };
305
+ const routes = { chat: candidate.chat, fleet: candidate.fleet.default, memory: candidate.context.memory };
306
+ const inventories = new Map<string, Awaited<ReturnType<typeof resolveSupportedWireModels>>>();
307
+ const checkedTargets = new Map<string, string>();
308
+ for (const role of selection.roles) {
309
+ const route = routes[role];
310
+ const selectedTarget = candidate.targets.find((entry) => entry.id === route.target);
311
+ if (!selectedTarget) throw new Error("selected target disappeared");
312
+ const runtime = registry.get(selectedTarget.runtime);
313
+ if (!runtime || !(role === "fleet" ? isDispatchEligibleRuntime(runtime) : isOrchestratorEligibleRuntime(runtime))) {
314
+ printError(
315
+ `cannot use target '${selectedTarget.id}' for ${labels[role]}: runtime '${selectedTarget.runtime}' is not eligible`,
316
+ );
317
+ return 1;
318
+ }
319
+ checkedTargets.set(selectedTarget.id, JSON.stringify(selectedTarget));
320
+ if (route.model === null) continue;
321
+ let inventory = inventories.get(selectedTarget.id);
322
+ if (!inventory) {
323
+ inventory = await resolveSupportedWireModels(runtime, selectedTarget, selectedTarget);
324
+ inventories.set(selectedTarget.id, inventory);
325
+ }
326
+ if (inventory.models.length > 0 && !inventory.models.includes(route.model)) {
327
+ printError(
328
+ `target '${selectedTarget.id}' does not list model '${route.model}' for ${labels[role]} (${inventory.source} inventory). Use an exact listed model id: ${inventory.models.slice(0, 10).join(", ")}`,
329
+ );
330
+ return 1;
331
+ }
332
+ if (inventory.models.length === 0) {
333
+ // Keep offline selection possible, but never imply that an unknown id was verified.
334
+ process.stderr.write(
335
+ `warning: could not verify model '${route.model}' for ${labels[role]}: target '${selectedTarget.id}' returned no model list; saving the id as written\n`,
336
+ );
337
+ } else if (inventory.source === "cache" || inventory.source === "legacy") {
338
+ process.stderr.write(
339
+ `warning: using ${inventory.source} model inventory for target '${selectedTarget.id}'; live availability was not verified\n`,
340
+ );
341
+ }
342
+ }
343
+ // Re-read under the settings lock. A changed endpoint/default invalidates the
344
+ // checked inventory; unrelated concurrent role edits are preserved by the scoped mutation.
345
+ let changedRoles: TargetSelectionRole[] = [];
346
+ try {
347
+ updateSettings((fresh) => {
348
+ for (const [id, descriptor] of checkedTargets) {
349
+ if (JSON.stringify(fresh.targets.find((entry) => entry.id === id)) !== descriptor) {
350
+ throw new Error(`target '${id}' changed while checking models; retry targets use`);
351
+ }
352
+ }
353
+ const applied = useTargetInSettings(fresh, target.id, options);
354
+ if (!applied) throw new Error("target changed while checking models; retry targets use");
355
+ changedRoles = applied.changedRoles;
356
+ });
357
+ } catch (error) {
358
+ printError(error instanceof Error ? error.message : String(error));
295
359
  return 1;
296
360
  }
297
- let workerTarget = target;
298
- if (parsed.workerTarget !== undefined && parsed.workerTarget !== target.id) {
299
- const resolved = resolveDispatchProfileTarget(settings, parsed.workerTarget, "fleet worker target");
300
- if ("exitCode" in resolved) return resolved.exitCode;
301
- workerTarget = resolved.target;
361
+ const changedByTarget = new Map<string, string[]>();
362
+ for (const role of changedRoles) {
363
+ const id = routes[role].target as string;
364
+ const names = changedByTarget.get(id) ?? [];
365
+ names.push(labels[role]);
366
+ changedByTarget.set(id, names);
302
367
  }
303
- const backgroundModel = parsed.backgroundModel;
304
- // Locked read-modify-write so a concurrent session's field-level
305
- // write-through (Shift+Tab, Alt+L, …) cannot be lost between our read
306
- // above and this save.
307
- updateSettings((fresh) => {
308
- useTargetInSettings(fresh, target.id, {
309
- ...(parsed.model !== undefined ? { model: parsed.model } : {}),
310
- ...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
311
- ...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
312
- workerTargetId: workerTarget.id,
313
- ...(backgroundModel !== undefined ? { backgroundModel } : {}),
314
- });
315
- });
316
- const dispatchWhere = workerTarget === target ? "" : ` and ${workerTarget.id} for fleet dispatch`;
317
- const chatWhere = workerTarget === target ? "for chat and fleet dispatch" : "for chat";
318
368
  printOk(
319
- `using target ${target.id} ${chatWhere}${dispatchWhere}${backgroundModel === undefined ? "" : ", and background memory"}`,
369
+ changedRoles.length === 0
370
+ ? "no role settings changed"
371
+ : `using ${[...changedByTarget].map(([id, names]) => `target ${id} for ${names.join(" and ")}`).join("; ")}`,
320
372
  );
321
373
  return 0;
322
374
  }
package/src/cli/tasks.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { normalizeIntentExpectedOutputs, normalizeIntentVerification } from "../domains/dispatch/intent.js";
2
2
  import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
3
+ import { formatUserTaskHandoff } from "../domains/user-tasks/handoff.js";
3
4
  import { createUserTasksStore } from "../domains/user-tasks/store.js";
4
5
  import { packageDeclaredCheck } from "../tools/verify/catalog.js";
5
6
  import { discoverDeclaredChecksAtRoot, discoverDeclaredProjectEntriesAtRoot } from "../tools/verify/scripts.js";
@@ -74,7 +75,15 @@ export function runTasksCommand(args: string[]): number {
74
75
  } else if (action === "list" && rest.length === 0) {
75
76
  console.log(JSON.stringify(store.snapshot(), null, 2));
76
77
  } else if ((action === "hand" || action === "done" || action === "drop") && rest.length === 1) {
77
- console.log(JSON.stringify(store[action](rest[0] ?? ""), null, 2));
78
+ const task = store[action](rest[0] ?? "");
79
+ console.log(JSON.stringify(task, null, 2));
80
+ if (action === "hand") {
81
+ console.error(
82
+ "CLI hand records the inbox state only; it does not start a session or submit the interactive /tasks hand turn. " +
83
+ "Pass this pickup prompt to clio-coder run in the same project:\n" +
84
+ formatUserTaskHandoff(task),
85
+ );
86
+ }
78
87
  } else throw new Error(HELP);
79
88
  return 0;
80
89
  } catch (error) {
@@ -21,11 +21,12 @@ Flags:
21
21
  --dry-run print planned actions without changing anything
22
22
  --channel=<chan> npm dist-tag to install (latest|beta|dev). npm installs only.
23
23
  --skip-migrations skip migrations after the install step
24
+ --post-install apply local checks after a package-manager update; skip reinstall
24
25
  --json emit machine-readable JSON output
25
26
  --help, -h show this message
26
27
  `;
27
28
 
28
- const SOURCE_UPGRADE_STEPS = ["git pull", "npm run install:local", "hash -r"] as const;
29
+ const SOURCE_UPGRADE_STEPS = ["git pull", "pnpm run install:local", "hash -r"] as const;
29
30
  /** One wording for the source-update advice. Three paths print it; they used to disagree. */
30
31
  const SOURCE_UPGRADE_LEAD = "To update the checkout itself, run:";
31
32
 
@@ -85,7 +86,7 @@ function parseUpgradeArgs(argv: ReadonlyArray<string>): UpgradeOptions {
85
86
  * the installed version is the newest one.
86
87
  */
87
88
  type RegistryLookup =
88
- | { asked: false; reason: "source checkout" | "network checks are disabled" }
89
+ | { asked: false; reason: "source checkout" | "network checks are disabled" | "post-install checks" }
89
90
  | { asked: true; version: string | null };
90
91
 
91
92
  function testSeam(name: string): string | undefined {
@@ -186,11 +187,13 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
186
187
  const before = getVersionInfo().clio;
187
188
  const stateDir = clioStateDir();
188
189
  const method = detectInstallMethod();
189
- const methodLabel = method === "source" ? "source checkout" : "npm global";
190
+ const methodLabel = method === "source" ? "source checkout" : opts.postInstall ? "package install" : "npm global";
190
191
  presenter.setMethod(methodLabel);
191
192
 
192
193
  const noNetwork = Boolean(testSeam("CLIO_CODER_TEST_UPGRADE_NO_NETWORK"));
193
- const lookup = await lookUpAvailableVersion(opts.channel, method, noNetwork);
194
+ const lookup: RegistryLookup = opts.postInstall
195
+ ? { asked: false, reason: "post-install checks" }
196
+ : await lookUpAvailableVersion(opts.channel, method, noNetwork);
194
197
  const availableVersion = lookup.asked ? lookup.version : null;
195
198
 
196
199
  presenter.step(`Installation method: ${methodLabel}`);
@@ -201,7 +204,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
201
204
  if (availableVersion !== null) presenter.step(`Available version: ${availableVersion}`);
202
205
  else if (!lookup.asked) presenter.step(`Available version: not checked (${lookup.reason})`);
203
206
  else presenter.step("Available version: unknown (the registry could not be reached)");
204
- if (method === "npm") presenter.step(`Channel: ${opts.channel}`);
207
+ if (method === "npm" && !opts.postInstall) presenter.step(`Channel: ${opts.channel}`);
205
208
  presenter.step(`State dir: ${shortenPath(stateDir)}`);
206
209
 
207
210
  const migrations = listMigrations();
@@ -236,7 +239,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
236
239
 
237
240
  if (opts.dryRun) {
238
241
  if (method === "source") presenter.commandAdvice(SOURCE_UPGRADE_LEAD, SOURCE_UPGRADE_STEPS.join("\n"));
239
- else presenter.note(`Would run: npm install -g @iowarp/clio-coder@${opts.channel}`);
242
+ else if (!opts.postInstall) presenter.note(`Would run: npm install -g @iowarp/clio-coder@${opts.channel}`);
240
243
  if (opts.skipMigrations) presenter.note("Would skip migrations (--skip-migrations).");
241
244
  else if (pendingMigrationIds.length === 0) presenter.note("No pending migrations.");
242
245
  else {
package/src/cli/usage.ts CHANGED
@@ -354,6 +354,9 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
354
354
  diagnostics.malformedAuditRows = auditRows.errors.length;
355
355
  const auditInWindow = auditRows.rows.filter((row) => row.ts !== null && inWindow(row.ts, windowStart, now));
356
356
  const auditToolCalls = auditInWindow.filter((row) => row.auditKind === "tool_call");
357
+ const permissions = summarizePermissionDecisions(
358
+ auditInWindow.filter((row) => row.auditKind === "permission").map((row) => row.row),
359
+ );
357
360
  const auditBlocked = auditToolCalls.filter((row) => {
358
361
  const decision = typeof row.row.decision === "string" ? row.row.decision : "";
359
362
  return decision === "blocked" || decision === "denied";
@@ -564,6 +567,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
564
567
  emit({ kind: "fact", fact: "unverified-successes", value: accountability.unverifiedSuccesses });
565
568
  emit({ kind: "fact", fact: "ungrounded-claims", value: accountability.ungroundedClaims });
566
569
  emit({ kind: "fact", fact: "audit-tool-calls", value: auditToolCalls.length, blocked: auditBlocked.length });
570
+ emit({ kind: "fact", fact: "permission-approval", ...permissions });
567
571
  if (usageMeasurable) {
568
572
  // The origin split is emitted only when something out of turn was
569
573
  // recorded, so a report over an archive with no `/btw`, `/handoff`, or
@@ -656,6 +660,9 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
656
660
  } else {
657
661
  out(` receipt store missing at ${presence.receiptsPath}`);
658
662
  }
663
+ out(
664
+ ` permission decisions: ${permissions.requested} requested, ${permissions.granted} granted, ${permissions.denied} denied, ${permissions.expired} expired; approval rate ${permissions.approvalRate === null ? "n/a" : `${(permissions.approvalRate * 100).toFixed(1)}%`}`,
665
+ );
659
666
  out(` audited tool calls in window: ${auditToolCalls.length} (${auditBlocked.length} blocked/denied)`);
660
667
  if (usageMeasurable) {
661
668
  out(
@@ -1128,3 +1135,20 @@ function numberOr0(value: unknown): number {
1128
1135
  function isRecord(value: unknown): value is Record<string, unknown> {
1129
1136
  return typeof value === "object" && value !== null && !Array.isArray(value);
1130
1137
  }
1138
+
1139
+ /** Event-window approval rate. Resolutions can belong to requests outside the window. */
1140
+ export function summarizePermissionDecisions(rows: ReadonlyArray<Record<string, unknown>>): {
1141
+ requested: number;
1142
+ granted: number;
1143
+ denied: number;
1144
+ expired: number;
1145
+ approvalRate: number | null;
1146
+ } {
1147
+ const counts = { requested: 0, granted: 0, denied: 0, expired: 0 };
1148
+ for (const row of rows) {
1149
+ const status = row.status;
1150
+ if (status === "requested" || status === "granted" || status === "denied" || status === "expired")
1151
+ counts[status] += 1;
1152
+ }
1153
+ return { ...counts, approvalRate: counts.requested === 0 ? null : counts.granted / counts.requested };
1154
+ }