@iowarp/clio-coder 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/CHANGELOG.md +116 -2
  2. package/CONTRIBUTING.md +39 -24
  3. package/NOTICE +16 -0
  4. package/README.md +343 -403
  5. package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
  6. package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
  9. package/dist/builtins-PD652MTK.js +22 -0
  10. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  11. package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
  12. package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
  13. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  14. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  15. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  16. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  17. package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
  18. package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
  19. package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
  20. package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
  21. package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
  22. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  23. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  24. package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
  25. package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
  26. package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
  27. package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
  28. package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
  29. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  30. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  31. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  32. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  33. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  34. package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
  35. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  36. package/dist/chunk-5ZSZEYJK.js +119 -0
  37. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  38. package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
  39. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  40. package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
  41. package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
  42. package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
  43. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  44. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  45. package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
  46. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  47. package/dist/chunk-7WUZEB2M.js +165 -0
  48. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  49. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  50. package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
  51. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  52. package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
  53. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  54. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  55. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  56. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  57. package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
  58. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  59. package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
  60. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  61. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  62. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  63. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  64. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  65. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  66. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  67. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  68. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  69. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  70. package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
  71. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  72. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  73. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  74. package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
  75. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  76. package/dist/chunk-ECOMVOHP.js +139 -0
  77. package/dist/chunk-EFSEIZE6.js +56 -0
  78. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  79. package/dist/chunk-EM2WNQS2.js +93 -0
  80. package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
  81. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  82. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  83. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  84. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  85. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  86. package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
  87. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  88. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  89. package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
  90. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  91. package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
  92. package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
  93. package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
  94. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  95. package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
  96. package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
  97. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  98. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  99. package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
  100. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  101. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  102. package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
  103. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  104. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  105. package/dist/chunk-KPRLAMP4.js +32 -0
  106. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  107. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  108. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  109. package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
  110. package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
  111. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  112. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  113. package/dist/chunk-LUL5Z66S.js +221 -0
  114. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  115. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  116. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  117. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  118. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  119. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  120. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  121. package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
  122. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  123. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  124. package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
  125. package/dist/chunk-NTK3WTHM.js +141 -0
  126. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  127. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  128. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  129. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  130. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  131. package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
  132. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  133. package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
  134. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  135. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  136. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  137. package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
  138. package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
  139. package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
  140. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  141. package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
  142. package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
  143. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  144. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  145. package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
  146. package/dist/chunk-R2CT5YDO.js +66 -0
  147. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  148. package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
  149. package/dist/chunk-SD7SHNDW.js +15 -0
  150. package/dist/chunk-SL2RDHKO.js +19 -0
  151. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  152. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  153. package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
  154. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  155. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  156. package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
  157. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  158. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  159. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  160. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  161. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  162. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  163. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  164. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  165. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  166. package/dist/chunk-USZA7GWL.js +341 -0
  167. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
  170. package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
  171. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  172. package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
  173. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  174. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  175. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  176. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  177. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  178. package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
  179. package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
  180. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  181. package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
  182. package/dist/chunk-WXA2CFJO.js +23 -0
  183. package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
  184. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  185. package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
  186. package/dist/chunk-YGDMBK7O.js +567 -0
  187. package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
  188. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  189. package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
  190. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  191. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  192. package/dist/cli/index.js +44 -44
  193. package/dist/clio-QQCMTUZE.js +26 -0
  194. package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
  195. package/dist/codewiki/build-worker.js +76 -29
  196. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  197. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  198. package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
  199. package/dist/configure-4ZM5HWJX.js +73 -0
  200. package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
  201. package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
  202. package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
  203. package/dist/context-clear-OQV76MYP.js +184 -0
  204. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  205. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  206. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
  207. package/dist/detail-UXPWRANG.js +115 -0
  208. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
  209. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  210. package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
  211. package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
  212. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  213. package/dist/evidence-35PYWGSO.js +225 -0
  214. package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
  215. package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
  216. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  217. package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
  218. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
  219. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  220. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
  221. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
  222. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  223. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  224. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
  225. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
  226. package/dist/fleet-view-IWHYGQKK.js +118 -0
  227. package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
  228. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  229. package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
  230. package/dist/inventory-74UL7UHU.js +118 -0
  231. package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
  232. package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
  233. package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
  234. package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
  235. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
  236. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  237. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  238. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  239. package/dist/preload-EJAWJEIO.js +116 -0
  240. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  241. package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
  242. package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
  243. package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
  244. package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
  245. package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
  246. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
  247. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
  248. package/dist/slash-commands-MDSDSWYF.js +92 -0
  249. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  250. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  251. package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
  252. package/dist/tasks-R6P6OV22.js +36 -0
  253. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
  254. package/dist/tools-6OCQ6SVB.js +28 -0
  255. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  256. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  257. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  258. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  259. package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
  260. package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
  261. package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
  262. package/dist/verify-HYF7KBVE.js +30 -0
  263. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  264. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  265. package/dist/wiki-generate-RK7JQ5NP.js +615 -0
  266. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  267. package/dist/worker/entry.js +108 -95
  268. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  269. package/docs/README.md +7 -6
  270. package/docs/architecture/acp.md +10 -0
  271. package/docs/architecture/architecture.md +5 -5
  272. package/docs/architecture/context-engine.md +45 -60
  273. package/docs/architecture/context-working-set.md +7 -9
  274. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  275. package/docs/architecture/evidence-and-memory.md +10 -0
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  278. package/docs/architecture/session-lifecycle.md +4 -4
  279. package/docs/architecture/tui-design.md +45 -30
  280. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  281. package/docs/guide/commands-and-modes.md +75 -61
  282. package/docs/guide/configuration-and-targets.md +126 -26
  283. package/docs/guide/configuration-reference.md +22 -7
  284. package/docs/guide/environment-variables.md +6 -2
  285. package/docs/guide/fleet-dispatch.md +13 -6
  286. package/docs/guide/glossary.md +1 -1
  287. package/docs/guide/installation-and-lifecycle.md +79 -20
  288. package/docs/guide/proactive-memory.md +1 -1
  289. package/docs/guide/skills-marketplace.md +11 -3
  290. package/docs/guide/tool-usage.md +9 -2
  291. package/docs/process/development-pipeline.md +11 -11
  292. package/docs/process/documentation-coverage.md +1 -1
  293. package/docs/process/documentation-guide.md +2 -2
  294. package/docs/process/eval-runner.md +15 -0
  295. package/docs/process/evals-internal.md +1 -1
  296. package/docs/process/release-cut-checklist.md +24 -12
  297. package/evals/README.md +4 -0
  298. package/evals/behavioral-corpus-grader.mjs +147 -14
  299. package/evals/behavioral-model-negative-control.yaml +1 -0
  300. package/evals/behavioral-model.yaml +266 -1
  301. package/evals/fixtures/docs-retrieval.json +102 -0
  302. package/evals/fixtures/scalar-decision.json +17 -0
  303. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  304. package/evals/fixtures/source-explanation.json +74 -0
  305. package/evals/fixtures/tool-arguments.json +18 -0
  306. package/evals/fixtures/tool-surface/read.txt +4 -0
  307. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  308. package/evals/no-edit-memory-grader.mjs +149 -0
  309. package/evals/scalar-decision-grader.py +41 -0
  310. package/evals/scalar-decision-machinery.ts +145 -0
  311. package/evals/source-explanation-grader.mjs +118 -0
  312. package/evals/tool-surface-grader.mjs +53 -0
  313. package/evals/tool-surface-model.yaml +274 -0
  314. package/package.json +14 -14
  315. package/skills/README.md +6 -6
  316. package/skills/registry.yaml +1 -1
  317. package/skills/skill-marketplace.json +1 -1
  318. package/src/cli/ask.ts +10 -10
  319. package/src/cli/bootstrap-generate.ts +6 -0
  320. package/src/cli/config-inspect.ts +24 -7
  321. package/src/cli/config-trust.ts +62 -0
  322. package/src/cli/config.ts +8 -0
  323. package/src/cli/configure-editor.ts +51 -0
  324. package/src/cli/configure-interop.ts +1 -1
  325. package/src/cli/configure-oauth.ts +1 -1
  326. package/src/cli/configure-onboarding.ts +232 -96
  327. package/src/cli/configure-prompts.ts +76 -0
  328. package/src/cli/configure-quick.ts +274 -0
  329. package/src/cli/configure-target.ts +14 -2
  330. package/src/cli/configure.ts +413 -174
  331. package/src/cli/context-map.ts +75 -14
  332. package/src/cli/context.ts +46 -17
  333. package/src/cli/eval.ts +17 -3
  334. package/src/cli/modes/print.ts +32 -4
  335. package/src/cli/oauth-manual-input.ts +1 -1
  336. package/src/cli/reset.ts +2 -0
  337. package/src/cli/run.ts +16 -14
  338. package/src/cli/select.ts +35 -4
  339. package/src/cli/skills-eval.ts +10 -8
  340. package/src/cli/steer-channel.ts +31 -18
  341. package/src/cli/targets.ts +83 -31
  342. package/src/cli/tasks.ts +10 -1
  343. package/src/cli/upgrade.ts +11 -8
  344. package/src/cli/usage.ts +24 -0
  345. package/src/cli/wiki-generate.ts +239 -96
  346. package/src/core/bash-exec.ts +43 -15
  347. package/src/core/bus-events.ts +15 -0
  348. package/src/core/config.ts +39 -15
  349. package/src/core/defaults.ts +38 -15
  350. package/src/{interactive → core}/external-editor.ts +4 -4
  351. package/src/core/file-references.ts +11 -1
  352. package/src/core/incomplete-installation.ts +3 -1
  353. package/src/core/settings-layers.ts +21 -5
  354. package/src/core/termination.ts +26 -9
  355. package/src/core/untrusted-content.ts +16 -0
  356. package/src/core/workspace-trust.ts +179 -0
  357. package/src/domains/agents/builtins/coder.md +4 -2
  358. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  359. package/src/domains/agents/builtins/documenter.md +7 -4
  360. package/src/domains/agents/builtins/researcher.md +1 -0
  361. package/src/domains/agents/builtins/scout.md +7 -1
  362. package/src/domains/agents/result-contract.ts +199 -26
  363. package/src/domains/config/classify.ts +1 -1
  364. package/src/domains/config/keybindings.ts +3 -31
  365. package/src/domains/context/bootstrap-prompt.ts +11 -9
  366. package/src/domains/context/bootstrap.ts +74 -39
  367. package/src/domains/context/clio-md.ts +88 -26
  368. package/src/domains/context/codewiki/build-operation.ts +121 -0
  369. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  370. package/src/domains/context/codewiki/build-worker.ts +3 -35
  371. package/src/domains/context/codewiki/coordinator.ts +36 -6
  372. package/src/domains/context/codewiki/indexer.ts +59 -19
  373. package/src/domains/context/contract.ts +6 -2
  374. package/src/domains/context/extension.ts +72 -10
  375. package/src/domains/context/fingerprint.ts +39 -34
  376. package/src/domains/context/index.ts +7 -1
  377. package/src/domains/context/prompt-context.ts +55 -14
  378. package/src/domains/context/refresh.ts +9 -57
  379. package/src/domains/context/wiki/assemble.ts +14 -10
  380. package/src/domains/context/wiki/evidence.ts +209 -0
  381. package/src/domains/context/wiki/generate.ts +201 -67
  382. package/src/domains/context/wiki/meta.ts +10 -2
  383. package/src/domains/context/wiki/plan-store.ts +70 -14
  384. package/src/domains/context/wiki/plan.ts +71 -14
  385. package/src/domains/context/wiki/prompts.ts +42 -1
  386. package/src/domains/context/wiki/source-content.ts +106 -0
  387. package/src/domains/context/wiki/staleness.ts +33 -22
  388. package/src/domains/context/working-set/contract.ts +8 -2
  389. package/src/domains/context/working-set/engine.ts +17 -4
  390. package/src/domains/context/working-set/fold.ts +15 -2
  391. package/src/domains/context/working-set/marker.ts +2 -1
  392. package/src/domains/context/working-set/project.ts +18 -7
  393. package/src/domains/context/working-set/recall.ts +82 -56
  394. package/src/domains/dispatch/active-route-planner.ts +6 -3
  395. package/src/domains/dispatch/admission-queue.ts +19 -7
  396. package/src/domains/dispatch/admission.ts +3 -3
  397. package/src/domains/dispatch/budget-envelope.ts +47 -82
  398. package/src/domains/dispatch/capacity-lease.ts +57 -19
  399. package/src/domains/dispatch/contract.ts +10 -2
  400. package/src/domains/dispatch/event-pump.ts +28 -7
  401. package/src/domains/dispatch/execution-role.ts +49 -2
  402. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  403. package/src/domains/dispatch/extension.ts +190 -105
  404. package/src/domains/dispatch/fleet-run.ts +20 -0
  405. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  406. package/src/domains/dispatch/parallel-writers.ts +34 -0
  407. package/src/domains/dispatch/reservation-store.ts +8 -34
  408. package/src/domains/dispatch/route-approval.ts +3 -3
  409. package/src/domains/dispatch/route-observer.ts +4 -2
  410. package/src/domains/dispatch/route-quality.ts +6 -1
  411. package/src/domains/dispatch/types.ts +4 -3
  412. package/src/domains/dispatch/worker-spawn.ts +58 -21
  413. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  414. package/src/domains/eval/compare/behavioral.ts +81 -14
  415. package/src/domains/eval/compare/compare.ts +15 -5
  416. package/src/domains/eval/compare/envelope.ts +12 -5
  417. package/src/domains/eval/metrics/context.ts +24 -1
  418. package/src/domains/eval/metrics/tracked.ts +4 -28
  419. package/src/domains/eval/reports/comparison.ts +9 -9
  420. package/src/domains/eval/runners/clio-run.ts +5 -1
  421. package/src/domains/eval/schema/suite.ts +2 -0
  422. package/src/domains/eval/schema/validate.ts +1 -0
  423. package/src/domains/eval/suites/run.ts +189 -13
  424. package/src/domains/eval/verifiers/integrity.ts +39 -0
  425. package/src/domains/eval/verifiers/patch.ts +58 -2
  426. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  427. package/src/domains/evidence/build.ts +4 -2
  428. package/src/domains/interop/registry.ts +2 -2
  429. package/src/domains/middleware/hooks-io.ts +45 -26
  430. package/src/domains/middleware/hooks.ts +6 -0
  431. package/src/domains/middleware/injection-screen.ts +23 -0
  432. package/src/domains/middleware/rules.ts +5 -1
  433. package/src/domains/middleware/stalled-turn.ts +18 -3
  434. package/src/domains/middleware/task-board-reminder.ts +4 -2
  435. package/src/domains/middleware/task-nudge.ts +4 -1
  436. package/src/domains/mux/contract.ts +34 -1
  437. package/src/domains/mux/dock-controller.ts +8 -1
  438. package/src/domains/mux/index.ts +1 -0
  439. package/src/domains/mux/socket-client.ts +13 -3
  440. package/src/domains/observability/contract.ts +2 -2
  441. package/src/domains/observability/projection.ts +30 -9
  442. package/src/domains/prompts/compiler.ts +10 -2
  443. package/src/domains/prompts/contract.ts +7 -4
  444. package/src/domains/prompts/extension.ts +28 -64
  445. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  446. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  447. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  448. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  449. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  450. package/src/domains/prompts/preload-prefix.ts +31 -0
  451. package/src/domains/prompts/preload.ts +135 -61
  452. package/src/domains/providers/auth/backend-file.ts +15 -11
  453. package/src/domains/providers/auth/storage.ts +3 -5
  454. package/src/domains/providers/catalog.ts +18 -3
  455. package/src/domains/providers/probe/fingerprint.ts +13 -6
  456. package/src/domains/providers/probe/reasoning.ts +2 -0
  457. package/src/domains/providers/runtime-resolution.ts +11 -9
  458. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  459. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  460. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  461. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  462. package/src/domains/resources/skills/promotion.ts +8 -1
  463. package/src/domains/safety/action-classifier.ts +9 -0
  464. package/src/domains/safety/autonomy.ts +10 -1
  465. package/src/domains/safety/contract.ts +5 -1
  466. package/src/domains/safety/default-path-policy.ts +11 -0
  467. package/src/domains/safety/extension.ts +11 -2
  468. package/src/domains/safety/policy-engine.ts +189 -32
  469. package/src/domains/safety/project-policy.ts +7 -2
  470. package/src/domains/safety/workspace-trust.ts +43 -0
  471. package/src/domains/session/compaction/compact.ts +384 -21
  472. package/src/domains/session/compaction/cut-point.ts +42 -5
  473. package/src/domains/session/compaction/tokens.ts +9 -1
  474. package/src/domains/session/decision-board.ts +43 -33
  475. package/src/domains/session/entries.ts +169 -4
  476. package/src/domains/session/prompt-manifest.ts +47 -8
  477. package/src/domains/session/task-board.ts +21 -3
  478. package/src/domains/user-tasks/handoff.ts +16 -0
  479. package/src/engine/acp/adapter.ts +44 -12
  480. package/src/engine/acp/server.ts +1 -0
  481. package/src/engine/acp/transport.ts +2 -1
  482. package/src/engine/acp/types.ts +6 -1
  483. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  484. package/src/engine/api-registry.ts +19 -2
  485. package/src/engine/apis/openai-completions.ts +13 -6
  486. package/src/engine/apis/output-budget.ts +26 -10
  487. package/src/engine/claude/sdk-runtime.ts +4 -3
  488. package/src/engine/env-api-keys.ts +2 -1
  489. package/src/engine/external-subprocess.ts +14 -3
  490. package/src/engine/loop-guard.ts +19 -2
  491. package/src/engine/provider-diagnostics.ts +129 -0
  492. package/src/engine/provider-payload.ts +3 -1
  493. package/src/engine/worker-runtime.ts +13 -2
  494. package/src/engine/worker-tools.ts +5 -1
  495. package/src/entry/extension-reload.ts +1 -0
  496. package/src/entry/orchestrator.ts +53 -15
  497. package/src/interactive/application-controller.ts +1 -31
  498. package/src/interactive/chat-loop-messages.ts +12 -4
  499. package/src/interactive/chat-loop.ts +115 -45
  500. package/src/interactive/chat-panel.ts +163 -637
  501. package/src/interactive/chat-renderer.ts +73 -30
  502. package/src/interactive/context-recall-command.ts +2 -1
  503. package/src/interactive/dispatch-board.ts +18 -5
  504. package/src/interactive/editor-submit.ts +21 -31
  505. package/src/interactive/footer/dashboard.ts +8 -3
  506. package/src/interactive/footer/widgets.ts +50 -91
  507. package/src/interactive/interactive-application.ts +24 -44
  508. package/src/interactive/interactive-event-projection.ts +9 -45
  509. package/src/interactive/interactive-input-runtime.ts +3 -28
  510. package/src/interactive/interactive-presentation.ts +45 -16
  511. package/src/interactive/interactive-slash-runtime.ts +5 -40
  512. package/src/interactive/layout.ts +31 -5
  513. package/src/interactive/model-session-replay.ts +2 -2
  514. package/src/interactive/overlay-frame.ts +1 -0
  515. package/src/interactive/overlay-general-openers.ts +5 -1
  516. package/src/interactive/overlay-lifecycle.ts +1 -0
  517. package/src/interactive/overlay-session-lifecycle.ts +7 -1
  518. package/src/interactive/overlays/ask-user.ts +1 -0
  519. package/src/interactive/overlays/message-picker.ts +1 -1
  520. package/src/interactive/overlays/settings.ts +9 -8
  521. package/src/interactive/renderers/preview.ts +16 -0
  522. package/src/interactive/renderers/tool-execution.ts +84 -161
  523. package/src/interactive/renderers/worker-entry.ts +74 -43
  524. package/src/interactive/slash-autocomplete.ts +1 -6
  525. package/src/interactive/slash-commands.ts +16 -46
  526. package/src/interactive/status/controller.ts +0 -5
  527. package/src/interactive/status/state-machine.ts +44 -26
  528. package/src/interactive/status/types.ts +3 -0
  529. package/src/interactive/status/verbs.ts +13 -12
  530. package/src/interactive/transcript-detail.ts +50 -112
  531. package/src/interactive/turn-context.ts +221 -53
  532. package/src/interactive/turn-middleware.ts +3 -1
  533. package/src/interactive/turn-persistence.ts +3 -0
  534. package/src/interactive/turn-runtime.ts +11 -2
  535. package/src/interactive/turn-state.ts +10 -9
  536. package/src/interactive/view/artifacts.ts +4 -0
  537. package/src/interactive/view/view-overlay.ts +44 -34
  538. package/src/interactive/watch-pane.ts +18 -4
  539. package/src/interactive/worker-stream.ts +7 -7
  540. package/src/tools/agent-tools.ts +6 -3
  541. package/src/tools/bash.ts +1 -1
  542. package/src/tools/builtin-tool-catalog.ts +9 -2
  543. package/src/tools/codewiki/code-nav.ts +4 -10
  544. package/src/tools/compete-judge-task.ts +71 -0
  545. package/src/tools/compete-worktrees.ts +34 -0
  546. package/src/tools/context/index.ts +32 -7
  547. package/src/tools/context/surface.ts +15 -4
  548. package/src/tools/decide.ts +1 -1
  549. package/src/tools/dispatch-admission.ts +12 -1
  550. package/src/tools/dispatch-arguments.ts +38 -1
  551. package/src/tools/dispatch-plan.ts +7 -7
  552. package/src/tools/dispatch-runner.ts +48 -32
  553. package/src/tools/dispatch-schema.ts +30 -23
  554. package/src/tools/dispatch-scout-admission.ts +10 -44
  555. package/src/tools/dispatch-scout.ts +2 -3
  556. package/src/tools/find.ts +13 -4
  557. package/src/tools/grep.ts +13 -1
  558. package/src/tools/ls.ts +7 -1
  559. package/src/tools/monitor.ts +26 -11
  560. package/src/tools/network-policy.ts +11 -24
  561. package/src/tools/observation.ts +39 -2
  562. package/src/tools/presentation.ts +1 -1
  563. package/src/tools/read.ts +112 -15
  564. package/src/tools/registry.ts +55 -18
  565. package/src/tools/result-shaping.ts +110 -2
  566. package/src/tools/tasks.ts +33 -7
  567. package/src/tools/verify/frontend.ts +67 -30
  568. package/src/tools/verify/numeric.ts +10 -5
  569. package/src/tools/web-fetch-network.ts +179 -0
  570. package/src/tools/web-fetch-surface.ts +2 -1
  571. package/src/tools/web-fetch.ts +15 -13
  572. package/src/tools/worker-evidence.ts +27 -0
  573. package/src/worker/spec-contract.ts +12 -8
  574. package/dist/builtins-WGALA46I.js +0 -22
  575. package/dist/chunk-2WZ546HR.js +0 -792
  576. package/dist/chunk-5PSMVOLM.js +0 -56
  577. package/dist/chunk-EL24TAU4.js +0 -1560
  578. package/dist/chunk-IZXGRF7P.js +0 -4048
  579. package/dist/chunk-JVCV3ICN.js +0 -47
  580. package/dist/chunk-MNJGS2IN.js +0 -33
  581. package/dist/chunk-O5CVSAG5.js +0 -122
  582. package/dist/chunk-ODGTEFFI.js +0 -50
  583. package/dist/chunk-OQE5J4C6.js +0 -73
  584. package/dist/chunk-UUVG37B4.js +0 -244
  585. package/dist/chunk-V6HJFQZE.js +0 -228
  586. package/dist/clio-QLICPCF5.js +0 -25
  587. package/dist/configure-VEPX4NMX.js +0 -55
  588. package/dist/context-clear-S4ZJCQUX.js +0 -182
  589. package/dist/detail-A7JAVSIG.js +0 -98
  590. package/dist/evidence-4F5USFKH.js +0 -208
  591. package/dist/fleet-view-MN2VG4MR.js +0 -101
  592. package/dist/inventory-C26CFDRR.js +0 -101
  593. package/dist/preload-P6DGH2PZ.js +0 -13
  594. package/dist/slash-commands-ZXPJD64J.js +0 -92
  595. package/dist/tasks-IPAGMEIX.js +0 -36
  596. package/dist/tools-EFFEAIDP.js +0 -28
  597. package/dist/verify-FWYGPKMR.js +0 -29
  598. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -1,8 +1,10 @@
1
1
  import { execFileSync } from "node:child_process";
2
- import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { createHash } from "node:crypto";
3
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
4
  import path from "node:path";
4
5
  import { CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
5
- import { readCodewiki } from "../domains/context/codewiki/artifact.js";
6
+ import { type CodewikiCoordinatedResult, coordinateCodewikiWrite } from "../domains/context/codewiki/coordinator.js";
7
+ import type { Codewiki } from "../domains/context/codewiki/schema.js";
6
8
  import { buildArchitectureSeed, serializeArchitectureSeed } from "../domains/context/wiki/map-seed.js";
7
9
 
8
10
  const HELP = `Usage:
@@ -11,7 +13,8 @@ const HELP = `Usage:
11
13
  Write an archify architecture seed for the current repository from the codewiki
12
14
  index, without model calls. The seed is the starting spec for the archify skill:
13
15
  components are the largest directory areas, connections are collapsed import
14
- edges, and sources point at indexed files and lines.
16
+ edges. The index is reconciled with current files before mapping; sources are
17
+ pinned only when clean Git evidence matches those files.
15
18
 
16
19
  Options:
17
20
  --out <path> where to write the seed (default: ${CLIO_ARTIFACT_DIR}/maps/<repo>.architecture.json)
@@ -28,21 +31,53 @@ function gitValue(cwd: string, args: string[]): string | null {
28
31
  const out = execFileSync("git", args, { cwd, timeout: 5000, stdio: ["ignore", "pipe", "ignore"] })
29
32
  .toString("utf8")
30
33
  .trim();
31
- return out.length > 0 ? out : null;
34
+ return out;
32
35
  } catch {
33
36
  return null;
34
37
  }
35
38
  }
36
39
 
37
- /** The origin remote as an https URL and HEAD as a full sha, when git can say. */
38
- function repositoryFacts(cwd: string): { url: string; revision: string } | undefined {
39
- const remote = gitValue(cwd, ["remote", "get-url", "origin"]);
40
+ type SourceState = "clean" | "dirty" | "unknown";
41
+
42
+ /** A successful empty status means clean; unavailable Git evidence never does. */
43
+ function repositoryFacts(
44
+ cwd: string,
45
+ codewiki: Codewiki,
46
+ indexedHead: string | null,
47
+ ): { sourceState: SourceState; repository?: { url: string; revision: string } } {
40
48
  const revision = gitValue(cwd, ["rev-parse", "--verify", "HEAD"]);
41
- if (!remote || !revision) return undefined;
49
+ const status = gitValue(cwd, ["status", "--porcelain", "--untracked-files=normal"]);
50
+ if (!revision || status === null) return { sourceState: "unknown" };
51
+ if (status !== "" || revision !== indexedHead) return { sourceState: "dirty" };
52
+ // Source paths in the seed are workspace-relative. A nested workspace has
53
+ // no proven repository-relative path mapping, so cannot supply citations.
54
+ if (gitValue(cwd, ["rev-parse", "--show-prefix"]) !== "") return { sourceState: "unknown" };
55
+ const tree = gitValue(cwd, ["ls-tree", "-r", "-z", revision]);
56
+ if (tree === null) return { sourceState: "unknown" };
57
+ const blobs = new Map<string, string>();
58
+ for (const entry of tree.split("\0")) {
59
+ const match = /^100[0-7]{3} blob ([a-f0-9]{40})\t([\s\S]+)$/.exec(entry);
60
+ if (match) blobs.set(match[2] as string, match[1] as string);
61
+ }
62
+ try {
63
+ for (const file of codewiki.files) {
64
+ const contents = readFileSync(path.join(cwd, file.path));
65
+ // Verify both parser input identity and immutable Git blob identity.
66
+ // This also catches ignored/untracked inputs and assume-unchanged files
67
+ // that a successful `git status` alone cannot certify.
68
+ const indexedHash = createHash("sha256").update(contents.toString("utf8")).digest("hex").slice(0, 16);
69
+ const blob = createHash("sha1").update(`blob ${contents.length}\0`).update(contents).digest("hex");
70
+ if (indexedHash !== file.hash || blobs.get(file.path) !== blob) return { sourceState: "dirty" };
71
+ }
72
+ } catch {
73
+ return { sourceState: "unknown" };
74
+ }
75
+ const remote = gitValue(cwd, ["remote", "get-url", "origin"]);
76
+ if (!remote) return { sourceState: "clean" };
42
77
  let url = remote.endsWith(".git") ? remote.slice(0, -4) : remote;
43
78
  const ssh = /^git@([^:]+):(.+)$/.exec(url);
44
79
  if (ssh) url = `https://${ssh[1]}/${ssh[2]}`;
45
- return { url, revision };
80
+ return { sourceState: "clean", repository: { url, revision } };
46
81
  }
47
82
 
48
83
  export async function runContextMapCommand(args: string[]): Promise<number> {
@@ -72,16 +107,40 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
72
107
  return 2;
73
108
  }
74
109
  const cwd = process.cwd();
75
- const codewiki = readCodewiki(cwd);
76
- if (!codewiki) {
110
+ let reconciled: CodewikiCoordinatedResult | null;
111
+ try {
112
+ reconciled = await coordinateCodewikiWrite(
113
+ cwd,
114
+ (current, workspace) =>
115
+ current
116
+ ? {
117
+ kind: "ensure",
118
+ cwd: workspace,
119
+ current,
120
+ language: current.language,
121
+ // Map evidence must reconcile actual inputs, even if a state file
122
+ // happens to carry a matching fingerprint from another operation.
123
+ previous: null,
124
+ }
125
+ : null,
126
+ { requireExisting: true },
127
+ );
128
+ } catch (error) {
129
+ process.stderr.write(
130
+ `clio-coder context map: index refresh failed: ${error instanceof Error ? error.message : String(error)}\n`,
131
+ );
132
+ return 1;
133
+ }
134
+ if (!reconciled) {
77
135
  process.stderr.write(
78
136
  "clio-coder context map: no codewiki index in .clio-coder/codewiki.json; run `clio-coder context index` first\n",
79
137
  );
80
138
  return 1;
81
139
  }
82
- const seed = buildArchitectureSeed(codewiki, {
140
+ const facts = repositoryFacts(cwd, reconciled.codewiki, reconciled.worker.fingerprint.gitHead);
141
+ const seed = buildArchitectureSeed(reconciled.codewiki, {
83
142
  title: path.basename(cwd),
84
- repository: repositoryFacts(cwd),
143
+ repository: facts.repository,
85
144
  });
86
145
  const target = out ? path.resolve(cwd, out) : defaultMapSeedPath(cwd);
87
146
  mkdirSync(path.dirname(target), { recursive: true });
@@ -91,6 +150,8 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
91
150
  components: seed.components.length,
92
151
  connections: seed.connections.length,
93
152
  repository: seed.meta.repository ?? null,
153
+ index: "reconciled",
154
+ sourceState: facts.sourceState,
94
155
  };
95
156
  if (json) {
96
157
  process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
@@ -102,7 +163,7 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
102
163
  ` ${payload.components} components, ${payload.connections} connections${
103
164
  payload.repository
104
165
  ? `, sources pinned at ${payload.repository.revision.slice(0, 12)}`
105
- : "; no GitHub origin at a full revision, so no source citations"
166
+ : `; no source citations (source state: ${payload.sourceState}; requires verified clean files and a GitHub origin at a full revision)`
106
167
  }`,
107
168
  payload.repository
108
169
  ? " next: validate and deliver it with the archify skill, passing --repo-root ."
@@ -1,12 +1,15 @@
1
1
  import { join, resolve } from "node:path";
2
2
  import type { BootstrapProgressEvent } from "../domains/context/index.js";
3
3
  import type { BootstrapGenerationState } from "../domains/context/state.js";
4
+ import type { RunWikiGenerateResult } from "../domains/context/wiki/generate.js";
5
+ import type { WikiMeta } from "../domains/context/wiki/meta.js";
6
+ import { MAX_PAGE_ATTEMPTS } from "../domains/context/wiki/plan-store.js";
4
7
 
5
8
  const HELP = `Usage:
6
9
  clio-coder context
7
10
  clio-coder context init [--yes] [--preview|--heuristic] [--adopt] [--propose|--apply|--rewrite]
8
11
  clio-coder context refresh [--wiki]
9
- clio-coder context wiki [--update] [--status] [--depth auto|simple|medium|detailed]
12
+ clio-coder context wiki [--update|--retry-pending] [--status] [--depth auto|simple|medium|detailed]
10
13
  [--target <id>] [--model <id>] [--thinking off|low|medium|high]
11
14
  clio-coder context reset [--all] [--yes]
12
15
  clio-coder context index [--json]
@@ -32,6 +35,36 @@ function printWikiProgress(event: BootstrapProgressEvent): void {
32
35
  process.stderr.write(`clio-coder context wiki: ${event.message}${detail}\n`);
33
36
  }
34
37
 
38
+ function wikiRecoveryLines(meta: WikiMeta | null): string[] {
39
+ const pending = meta?.plan?.pages.filter((page) => page.status !== "written") ?? [];
40
+ if (pending.length === 0) return [];
41
+ const exhausted = pending.filter((page) => page.attempts >= MAX_PAGE_ATTEMPTS).length;
42
+ const failures = pending.filter((page) => page.lastFailure);
43
+ return [
44
+ `pending: ${pending.length} page(s)${exhausted > 0 ? `; ${exhausted} exhausted ordinary writer attempts` : ""}`,
45
+ ...failures.slice(0, 8).map((page) => `${page.path}: ${page.lastFailure?.phase}: ${page.lastFailure?.detail}`),
46
+ ...(failures.length > 8 ? [`${failures.length - 8} more page failures retained in wiki metadata`] : []),
47
+ "Run `clio-coder context wiki --retry-pending` to retry pending pages once, including exhausted pages, without replanning.",
48
+ ];
49
+ }
50
+
51
+ function printWikiOutcome(prefix: string, result: RunWikiGenerateResult, meta: WikiMeta | null): void {
52
+ const pending = result.pending ?? meta?.plan?.pages.filter((page) => page.status !== "written").length ?? 0;
53
+ const complete = meta?.plan
54
+ ? meta.plan.pages.filter((page) => page.status === "written").length
55
+ : (meta?.generation?.pagesWritten ?? Math.max(0, result.pages - pending));
56
+ const published = `${result.pages} published page${result.pages === 1 ? "" : "s"}`;
57
+ const progress = `${complete} complete, ${pending} pending`;
58
+ const outcome = pending > 0 ? "incomplete" : result.status === "noop" ? "unchanged" : "generated";
59
+ process.stdout.write(`${prefix}: ${outcome} (${published}; ${progress})\n`);
60
+ if (pending > 0) {
61
+ const recovery = wikiRecoveryLines(meta);
62
+ process.stdout.write(
63
+ `${recovery.length > 0 ? recovery.join("\n") : "Run `clio-coder context wiki --update` to continue pending pages."}\n`,
64
+ );
65
+ }
66
+ }
67
+
35
68
  function compactMetric(value: number, suffix: string): string {
36
69
  if (value < 1000) return `${value}${suffix}`;
37
70
  return `${(value / 1000).toFixed(1)}k${suffix}`;
@@ -82,10 +115,7 @@ async function printContextStatus(): Promise<number> {
82
115
  : "ok";
83
116
 
84
117
  const prompt = context.renderPromptContext(cwd);
85
- const preloadClass = preload.classifyProjectPreload({
86
- hasClioMd: prompt.clioMd !== null,
87
- text: prompt.text,
88
- });
118
+ const preloadClass = preload.selectProjectPreload(prompt, null).classification;
89
119
 
90
120
  const codewiki = context.readCodewiki(cwd);
91
121
  const codewikiCount = codewiki ? context.codewikiEntries(codewiki).length : 0;
@@ -134,7 +164,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
134
164
  return 2;
135
165
  }
136
166
  try {
137
- const { runContextRefresh } = await import("../domains/context/index.js");
167
+ const { runContextRefresh, readWikiMeta } = await import("../domains/context/index.js");
138
168
  const wikiEntry = updateWiki ? await import("./wiki-generate.js") : null;
139
169
  const result = await runContextRefresh({
140
170
  cwd: process.cwd(),
@@ -155,11 +185,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
155
185
  );
156
186
  return 1;
157
187
  }
158
- process.stdout.write(
159
- result.wiki.status === "noop"
160
- ? `clio-coder context refresh: wiki unchanged (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`
161
- : `clio-coder context refresh: wiki updated (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`,
162
- );
188
+ printWikiOutcome("clio-coder context refresh: wiki", result.wiki, readWikiMeta(process.cwd()));
163
189
  }
164
190
  return 0;
165
191
  } catch (err) {
@@ -189,10 +215,11 @@ async function runWikiStatusCommand(): Promise<number> {
189
215
  `depth: ${depth} (requested ${requestedDepth}; ${sourceFiles} source files; ` +
190
216
  `${pagesWritten}/${pagesPlanned} planned pages written)`,
191
217
  );
192
- if (pagesWritten < pagesPlanned) {
218
+ if (pagesWritten < pagesPlanned && !meta.plan) {
193
219
  lines.push(`pending: ${pagesPlanned - pagesWritten} page(s); run \`clio-coder context wiki --update\` to finish`);
194
220
  }
195
221
  }
222
+ lines.push(...wikiRecoveryLines(meta));
196
223
  if (currentHead !== meta.gitHead) {
197
224
  lines.push(`staleness: gitHead differs from current HEAD (${currentHead ?? "none"})`);
198
225
  }
@@ -215,6 +242,7 @@ function isThinkingLevel(value: unknown): value is WikiCliThinking {
215
242
 
216
243
  async function runWikiCommand(args: string[]): Promise<number> {
217
244
  let forceUpdate = false;
245
+ let retryPending = false;
218
246
  let status = false;
219
247
  let depth: WikiCliDepth = "auto";
220
248
  let target: string | undefined;
@@ -230,6 +258,10 @@ async function runWikiCommand(args: string[]): Promise<number> {
230
258
  forceUpdate = true;
231
259
  continue;
232
260
  }
261
+ if (arg === "--retry-pending") {
262
+ retryPending = true;
263
+ continue;
264
+ }
233
265
  if (arg === "--status") {
234
266
  status = true;
235
267
  continue;
@@ -277,6 +309,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
277
309
  const result = await context.runWikiGenerate({
278
310
  cwd: process.cwd(),
279
311
  ...(forceUpdate ? { mode: "update" as const } : {}),
312
+ ...(retryPending ? { retryPending: true } : {}),
280
313
  depth,
281
314
  model: await resolveDocumenterModelId(route),
282
315
  generate: modelWikiGenerate({ route }),
@@ -286,11 +319,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
286
319
  process.stderr.write(`clio-coder context wiki failed: ${(result.problems ?? ["unknown failure"]).join("; ")}\n`);
287
320
  return 1;
288
321
  }
289
- process.stdout.write(
290
- result.status === "noop"
291
- ? `clio-coder context wiki: unchanged (${result.pages} page${result.pages === 1 ? "" : "s"})\n`
292
- : `clio-coder context wiki: generated ${result.pages} page${result.pages === 1 ? "" : "s"}\n`,
293
- );
322
+ printWikiOutcome("clio-coder context wiki", result, context.readWikiMeta(process.cwd()));
294
323
  return 0;
295
324
  } catch (err) {
296
325
  process.stderr.write(`clio-coder context wiki failed: ${err instanceof Error ? err.message : String(err)}\n`);
package/src/cli/eval.ts CHANGED
@@ -1,7 +1,9 @@
1
+ import { readFile } from "node:fs/promises";
1
2
  import { resolve } from "node:path";
2
3
  import { InvalidIdError } from "../core/safe-id.js";
4
+ import { shellQuote } from "../core/shell-quote.js";
3
5
  import { clioDataDir } from "../core/xdg.js";
4
- import { loadEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
6
+ import { loadEvalArtifactV4, parseEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
5
7
  import { compareEvalArtifactsV4 } from "../domains/eval/compare/compare.js";
6
8
  import { evaluateGate, renderGateFailure, renderInformationalBudget } from "../domains/eval/compare/gates.js";
7
9
  import { loadThresholds } from "../domains/eval/compare/thresholds.js";
@@ -50,6 +52,7 @@ interface ParsedEvalArgs {
50
52
  out?: string;
51
53
  clioEntry?: string;
52
54
  evalId?: string;
55
+ artifact?: string;
53
56
  format: EvalReportFormat;
54
57
  compareIds: string[];
55
58
  metric?: string;
@@ -133,6 +136,11 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
133
136
  throw new Error(`unknown eval run argument: ${arg}`);
134
137
  }
135
138
  if (parsed.command === "report") {
139
+ if (arg === "--artifact") {
140
+ parsed.artifact = requiredValue(args, index, "--artifact");
141
+ index += 1;
142
+ continue;
143
+ }
136
144
  if (arg === "--format") {
137
145
  parsed.format = reportFormat(requiredValue(args, index, "--format"));
138
146
  index += 1;
@@ -189,7 +197,9 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
189
197
  if (parsed.command === "run" && (parsed.suite === undefined) === (parsed.taskFile === undefined)) {
190
198
  throw new Error("run requires exactly one of --suite or --task-file");
191
199
  }
192
- if (parsed.command === "report" && parsed.evalId === undefined) throw new Error("report requires an eval id");
200
+ if (parsed.command === "report" && (parsed.evalId === undefined) === (parsed.artifact === undefined)) {
201
+ throw new Error("report requires exactly one of an eval id or --artifact <path>");
202
+ }
193
203
  if (parsed.command === "compare" && parsed.compareIds.length !== 2) {
194
204
  throw new Error("compare requires <baselineEvalId> <candidateEvalId>");
195
205
  }
@@ -259,6 +269,7 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
259
269
  );
260
270
  const artifactPath = await writeEvalArtifactV4(clioDataDir(), artifact, parsed.out);
261
271
  process.stdout.write(`${renderEvalTextReportV4(artifact)}artifact: ${artifactPath}\n`);
272
+ process.stdout.write(`report: clio-coder eval report --artifact ${shellQuote(resolve(artifactPath))} --format md\n`);
262
273
  // A suite that declares thresholds is gated by them here, on the artifact
263
274
  // it just produced. Declaring a gate that only a later `eval gate`
264
275
  // invocation enforces means the run that broke it still exited zero.
@@ -280,7 +291,10 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
280
291
  async function runEvalReportCommand(parsed: ParsedEvalArgs): Promise<number> {
281
292
  try {
282
293
  const dataDir = clioDataDir();
283
- const artifact = await loadEvalArtifactV4(dataDir, parsed.evalId ?? "");
294
+ const artifact =
295
+ parsed.artifact === undefined
296
+ ? await loadEvalArtifactV4(dataDir, parsed.evalId ?? "")
297
+ : parseEvalArtifactV4(JSON.parse(await readFile(parsed.artifact, "utf8")) as unknown, parsed.artifact);
284
298
  process.stdout.write(renderArtifactReport(artifact, parsed.format, dataDir));
285
299
  return 0;
286
300
  } catch (error) {
@@ -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();
@@ -6,7 +6,7 @@ export interface DelayedManualCodeInput {
6
6
  }
7
7
 
8
8
  export function createDelayedManualCodeInput(
9
- rl: ReadlineInterface,
9
+ rl: Pick<ReadlineInterface, "question">,
10
10
  prompt: string,
11
11
  options?: { delayMs?: number },
12
12
  ): DelayedManualCodeInput {
package/src/cli/reset.ts CHANGED
@@ -372,6 +372,8 @@ export async function runResetCommand(argv: ReadonlyArray<string>): Promise<numb
372
372
  presenter.finish();
373
373
  return 1;
374
374
  }
375
+ if (args.config || args.all) presenter.commandAdvice("Set up a model again:", "clio-coder configure");
376
+ else if (args.auth) presenter.commandAdvice("Reconnect your providers:", "clio-coder configure --section targets");
375
377
 
376
378
  presenter.done("Done");
377
379
  return 0;
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;
package/src/cli/select.ts CHANGED
@@ -48,6 +48,8 @@ export interface SelectOptions<T> {
48
48
  backLabel?: string;
49
49
  /** Rows to show at once. Defaults to what the terminal has room for. */
50
50
  maxVisible?: number;
51
+ /** Filter a long list by typing; q/j/k are text in this mode. */
52
+ searchable?: boolean;
51
53
  /**
52
54
  * Erase the menu once it is answered, leaving the caller's transcript to say
53
55
  * what was chosen. A wizard that redraws its own answer rows needs this; a
@@ -243,7 +245,7 @@ function viewportFor(output: NodeJS.WriteStream, overhead: number, total: number
243
245
  export async function promptSelect<T>(options: SelectOptions<T>): Promise<SelectResult<T>> {
244
246
  const input = options.input ?? process.stdin;
245
247
  const output = options.output ?? process.stdout;
246
- const choices = options.choices;
248
+ let choices = options.choices;
247
249
  if (choices.length === 0) return { kind: "back" };
248
250
 
249
251
  const rail = options.railPrefix ?? "";
@@ -255,15 +257,25 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
255
257
 
256
258
  let index = Math.min(Math.max(options.initialIndex ?? 0, 0), choices.length - 1);
257
259
  let windowStart = 0;
260
+ let query = "";
261
+ const filter = () => {
262
+ choices = options.choices.filter((choice) => choice.label.toLowerCase().includes(query.toLowerCase()));
263
+ index = 0;
264
+ windowStart = 0;
265
+ render();
266
+ };
258
267
 
259
268
  const render = (): void => {
260
- const viewport = viewportFor(output, head.length + 5, choices.length, options.maxVisible);
269
+ const viewport = viewportFor(output, head.length + (options.searchable ? 6 : 5), choices.length, options.maxVisible);
261
270
  if (index < windowStart) windowStart = index;
262
271
  else if (index >= windowStart + viewport) windowStart = index - viewport + 1;
263
272
  windowStart = Math.max(0, Math.min(windowStart, choices.length - viewport));
264
273
  const lines: string[] = [];
265
274
  for (const line of head) lines.push(`${rail}${line}`.trimEnd());
266
275
  if (head.length > 0) lines.push(rail.trimEnd());
276
+ if (options.searchable)
277
+ lines.push(`${rail}${truncate(`Filter: ${query || "(type to search)"}`, terminalColumns(output) - railWidth)}`);
278
+ if (choices.length === 0) lines.push(`${rail}No matching models`);
267
279
  lines.push(
268
280
  ...choiceRows(
269
281
  {
@@ -284,7 +296,8 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
284
296
  // "quit" reads as two different exits.
285
297
  const legend = ["↑/↓ move", "enter select"];
286
298
  if (options.backLabel !== undefined && options.backLabel !== "quit") legend.push(`esc ${options.backLabel}`);
287
- legend.push(options.backLabel === "quit" ? "esc or q quit" : "q quit");
299
+ if (options.searchable) legend.push("type to filter", "ctrl-u clear", "ctrl-c quit");
300
+ else legend.push(options.backLabel === "quit" ? "esc or q quit" : "q quit");
288
301
  lines.push(`${rail}${chalk.dim(legend.join(" · "))}`);
289
302
  frame.draw(lines);
290
303
  };
@@ -294,11 +307,29 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
294
307
  output,
295
308
  true,
296
309
  render,
297
- (_str, key, finish) => {
310
+ (str, key, finish) => {
298
311
  if (key.ctrl && (key.name === "c" || key.name === "d")) {
299
312
  finish({ kind: "quit" });
300
313
  return;
301
314
  }
315
+ if (options.searchable) {
316
+ if (key.ctrl && key.name === "u") {
317
+ query = "";
318
+ filter();
319
+ return;
320
+ }
321
+ if (key.name === "backspace") {
322
+ query = query.slice(0, -1);
323
+ filter();
324
+ return;
325
+ }
326
+ if (!key.ctrl && !key.meta && str?.length === 1 && str >= " " && str !== "\x7f") {
327
+ query += str;
328
+ filter();
329
+ return;
330
+ }
331
+ if (choices.length === 0 && !["escape", "left"].includes(key.name ?? "")) return;
332
+ }
302
333
  switch (key.name) {
303
334
  case "up":
304
335
  case "k":