@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,82 +1,156 @@
1
- /**
2
- * Project-context preload classification. One place owns the preload cliff:
3
- * the session compiler uses it to choose a full effective-handbook preload versus compact
4
- * synopsis, and reporting surfaces (context-init output, `clio-coder config
5
- * inspect`, the context-window overlay) use it to make the cliff visible.
6
- */
1
+ import type { ProjectPromptContext } from "../context/contract.js";
2
+ import { renderProjectContextFragment } from "../context/index.js";
3
+ import { sha256 } from "./hash.js";
4
+ import { safePrefixOffsets, sourceLineCount } from "./preload-prefix.js";
7
5
 
6
+ /** Historical limits, measured in UTF-16 code units and rendered lines. */
8
7
  export const FULL_PROJECT_CONTEXT_MAX_CHARS = 8000;
9
8
  export const FULL_PROJECT_CONTEXT_MAX_LINES = 220;
10
-
11
- /** Fraction of a limit at which a full preload is flagged as near the cliff. */
12
- const NEAR_LIMIT_FRACTION = 0.9;
13
-
14
- export type ProjectPreloadMode = "full" | "synopsis" | "none";
9
+ export type ProjectPreloadMode = "full" | "partial" | "synopsis" | "none";
15
10
  export type ProjectPreloadReason = "size" | "lines" | "no-clio-md";
16
-
11
+ export interface ProjectPreloadSource {
12
+ path: string;
13
+ contentHash: string;
14
+ availableChars: number;
15
+ availableLines: number;
16
+ includedChars: number;
17
+ includedLines: number;
18
+ includedRange: [number, number] | null;
19
+ omittedRange: [number, number] | null;
20
+ omissionReason: "budget" | null;
21
+ }
17
22
  export interface ProjectPreloadClass {
18
23
  mode: ProjectPreloadMode;
19
- /** Rendered project-context length in characters (untrimmed, as measured by the cliff). */
24
+ /** Available rendered UTF-16 code units; retained for historical readers. */
20
25
  chars: number;
21
- /** Rendered project-context line count. */
26
+ /** Available rendered lines, including the final split segment. */
22
27
  lines: number;
23
- /** Which limit forced the synopsis; null for full or none. */
24
28
  reason: ProjectPreloadReason | null;
25
- /** True when a full preload is within 10% of either limit. */
26
29
  nearLimit: boolean;
27
- /** Human line, e.g. "full (5.2kB, 130 lines)" or "synopsis (reason: size)". */
28
30
  label: string;
31
+ /** Additive snapshot accounting; absent in historical full/synopsis records. */
32
+ includedChars?: number;
33
+ includedLines?: number;
34
+ sources?: ProjectPreloadSource[];
35
+ omittedSupportFragments?: number;
36
+ providerSupportsTools?: boolean | null;
29
37
  }
38
+ const renderedLines = (text: string): number => (text.length === 0 ? 0 : text.split("\n").length);
30
39
 
31
- export interface ClassifyProjectPreloadInput {
32
- /** True when at least one selected project handbook contributed to the rendered text. */
33
- hasClioMd: boolean;
34
- /** The rendered project prompt context (ProjectPromptContext.text). */
35
- text: string;
36
- }
37
-
38
- function formatKb(chars: number): string {
39
- return `${(chars / 1000).toFixed(1)}kB`;
40
+ function coverage(path: string, source: string, included: string): ProjectPreloadSource {
41
+ const availableLines = sourceLineCount(source);
42
+ const includedLines = sourceLineCount(included);
43
+ return {
44
+ path,
45
+ contentHash: sha256(source),
46
+ availableChars: source.length,
47
+ availableLines,
48
+ includedChars: included.length,
49
+ includedLines,
50
+ includedRange: includedLines === 0 ? null : [1, includedLines],
51
+ omittedRange: included.length === source.length ? null : [includedLines + 1, availableLines],
52
+ omissionReason: included.length === source.length ? null : "budget",
53
+ };
40
54
  }
41
55
 
42
- /**
43
- * Classify how the session compiler will treat this project context. Must
44
- * mirror the selection in prompts/extension.ts exactly: full preload only
45
- * when a selected project handbook parses and the rendered text is within both the
46
- * char and line limits; empty text preloads nothing.
47
- */
48
- export function classifyProjectPreload(input: ClassifyProjectPreloadInput): ProjectPreloadClass {
49
- const chars = input.text.length;
50
- const lines = input.text.length === 0 ? 0 : input.text.split("\n").length;
51
- if (input.text.trim().length === 0) {
52
- return { mode: "none", chars, lines, reason: null, nearLimit: false, label: "none (no project context)" };
53
- }
54
- const reason: ProjectPreloadReason | null = !input.hasClioMd
55
- ? "no-clio-md"
56
- : chars > FULL_PROJECT_CONTEXT_MAX_CHARS
57
- ? "size"
58
- : lines > FULL_PROJECT_CONTEXT_MAX_LINES
59
- ? "lines"
60
- : null;
61
- if (reason !== null) {
56
+ /** One selector owns delivered text and reporting; it never re-parses authored markers. */
57
+ export function selectProjectPreload(
58
+ context: ProjectPromptContext,
59
+ providerSupportsTools: boolean | null = null,
60
+ options: { maxChars?: number; externalReadTools?: boolean } = {},
61
+ ): { text: string; classification: ProjectPreloadClass } {
62
+ const maxChars = options.maxChars ?? FULL_PROJECT_CONTEXT_MAX_CHARS;
63
+ const fits = (text: string): boolean =>
64
+ text.length <= maxChars && renderedLines(text) <= FULL_PROJECT_CONTEXT_MAX_LINES;
65
+ const chars = context.text.length;
66
+ const lines = renderedLines(context.text);
67
+ const classify = (
68
+ text: string,
69
+ mode: ProjectPreloadMode,
70
+ sources: ProjectPreloadSource[],
71
+ omittedSupportFragments: number,
72
+ ): ProjectPreloadClass => {
73
+ const includedChars = text.length;
74
+ const includedLines = renderedLines(text);
75
+ const incomplete = sources.filter((source) => source.omissionReason !== null).length;
62
76
  return {
63
- mode: "synopsis",
77
+ mode,
64
78
  chars,
65
79
  lines,
66
- reason,
67
- nearLimit: false,
68
- label: `synopsis (reason: ${reason})`,
80
+ includedChars,
81
+ includedLines,
82
+ sources,
83
+ omittedSupportFragments,
84
+ providerSupportsTools,
85
+ reason: mode !== "partial" ? null : chars > maxChars ? "size" : "lines",
86
+ nearLimit: mode === "full" && (chars > maxChars * 0.9 || lines > FULL_PROJECT_CONTEXT_MAX_LINES * 0.9),
87
+ label: `${mode} (included ${includedChars}/${chars} UTF-16 units, ${includedLines}/${lines} rendered lines; ${incomplete} of ${sources.length} handbook sources incomplete${providerSupportsTools === null ? "; tool capability unknown" : ""})`,
69
88
  };
70
- }
71
- const nearLimit =
72
- chars > FULL_PROJECT_CONTEXT_MAX_CHARS * NEAR_LIMIT_FRACTION ||
73
- lines > FULL_PROJECT_CONTEXT_MAX_LINES * NEAR_LIMIT_FRACTION;
74
- return {
75
- mode: "full",
76
- chars,
77
- lines,
78
- reason: null,
79
- nearLimit,
80
- label: `full (${formatKb(chars)}, ${lines} lines)`,
81
89
  };
90
+ if (fits(context.text)) {
91
+ const sources = context.handbookSources.map(({ path, source }) => coverage(path, source, source));
92
+ return {
93
+ text: context.text,
94
+ classification: classify(context.text, context.text.length === 0 ? "none" : "full", sources, 0),
95
+ };
96
+ }
97
+ const retrieval =
98
+ providerSupportsTools === false
99
+ ? "Remaining source text is unavailable to this target and cannot be recovered with tools in this session. Paths are source references."
100
+ : options.externalReadTools
101
+ ? "External read tools are unknown. If available and permitted, read the listed omitted physical lines with your file-reading tool. Otherwise report the missing guidance to the parent. Reads use current disk content, which may differ from the captured source."
102
+ : `${providerSupportsTools === null ? "If tools are available, read" : "Read"} each omitted suffix with read({path: ABSOLUTE_PATH, offset: FIRST_OMITTED_LINE, limit: 200}); continue as needed. Reads use current disk content, which may differ from the captured source.`;
103
+ const header = [
104
+ "<project-preload>",
105
+ "Incomplete authored prefixes/excerpts: omitted guidance is not known from this preload. Read the selected sources before relying on project guidance.",
106
+ retrieval,
107
+ ];
108
+ const totals = context.handbookSources.map(({ source }) => sourceLineCount(source));
109
+ const sourceRecord = (path: string, included: string, omitted: string): string =>
110
+ `${JSON.stringify(path)}: included physical lines ${included}; omitted physical lines ${omitted}.`;
111
+ const reservedRecords = context.handbookSources.map(({ path }, index) =>
112
+ sourceRecord(path, `none/${totals[index]}-${totals[index]}`, `none/${totals[index]}-${totals[index]} (budget)`),
113
+ );
114
+ const notice = (records: string[], omitted: number): string =>
115
+ [...header, ...records, `Support fragments omitted: ${omitted}.`, "</project-preload>"].join("\n");
116
+ const reservedNotice = notice(reservedRecords, context.supportFragments.length);
117
+ if (!fits(reservedNotice))
118
+ throw new Error(`project preload metadata-budget overflow for ${context.handbookSources.length} handbook sources`);
119
+ const excerpts = context.handbookSources.map(() => "");
120
+ const fragments = context.handbookSources.map(() => "");
121
+ const assemble = (metadata: string, support: readonly string[] = []): string =>
122
+ [metadata, ...fragments.filter(Boolean), ...support].join("\n\n");
123
+ // Allocate nearest first, while fragments retain the original ancestor-first order.
124
+ for (let index = context.handbookSources.length - 1; index >= 0; index--) {
125
+ const entry = context.handbookSources[index];
126
+ if (!entry) continue;
127
+ const { path, source } = entry;
128
+ for (const offset of safePrefixOffsets(source, maxChars).slice(1)) {
129
+ const previous = fragments[index] ?? "";
130
+ fragments[index] = renderProjectContextFragment(source.slice(0, offset), path);
131
+ if (!fits(assemble(reservedNotice))) {
132
+ fragments[index] = previous;
133
+ break;
134
+ }
135
+ excerpts[index] = source.slice(0, offset);
136
+ }
137
+ }
138
+ const support: string[] = [];
139
+ for (const fragment of context.supportFragments) {
140
+ if (fits(assemble(reservedNotice, [...support, fragment]))) support.push(fragment);
141
+ }
142
+ const sources = context.handbookSources.map(({ path, source }, index) =>
143
+ coverage(path, source, excerpts[index] ?? ""),
144
+ );
145
+ const records = sources.map((source) =>
146
+ sourceRecord(
147
+ source.path,
148
+ source.includedRange?.join("-") ?? "none",
149
+ source.omittedRange ? `${source.omittedRange.join("-")} (budget)` : "none",
150
+ ),
151
+ );
152
+ const omitted = context.supportFragments.length - support.length;
153
+ const text = assemble(notice(records, omitted), support);
154
+ if (!fits(text)) throw new Error("project preload budget postcondition failed");
155
+ return { text, classification: classify(text, "partial", sources, omitted) };
82
156
  }
@@ -1,9 +1,9 @@
1
- import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync } from "node:fs";
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
4
  import { safeResourceWrite } from "../../../core/safe-resource-write.js";
5
5
  import { withStateFileLock, withStateFileLockSync } from "../../../core/state-file-lock.js";
6
- import { clioConfigDir } from "../../../core/xdg.js";
6
+ import { resolveClioDirs } from "../../../core/xdg.js";
7
7
  import type { AuthOperationOptions } from "../../../engine/types.js";
8
8
 
9
9
  import type { AuthStorageBackend, LockResult } from "./storage.js";
@@ -20,7 +20,7 @@ function atomicWriteSecret(absPath: string, contents: string): void {
20
20
  }
21
21
 
22
22
  export function authStoragePath(): string {
23
- return join(clioConfigDir(), "credentials.yaml");
23
+ return join(resolveClioDirs().config, "credentials.yaml");
24
24
  }
25
25
 
26
26
  export class FileAuthStorageBackend implements AuthStorageBackend {
@@ -34,18 +34,23 @@ export class FileAuthStorageBackend implements AuthStorageBackend {
34
34
  mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
35
35
  }
36
36
 
37
- private ensureFileExists(): void {
38
- if (existsSync(this.path)) return;
39
- const fd = openSync(this.path, "a", 0o600);
40
- closeSync(fd);
41
- chmodSync(this.path, 0o600);
37
+ // Writers publish complete files with an atomic rename, so a reader sees
38
+ // either the prior or next committed snapshot without creating a lockfile or
39
+ // initializing a missing home. Read-modify-write operations still take the
40
+ // exclusive lock below and read again inside it before merging changes.
41
+ read(): string | undefined {
42
+ try {
43
+ return readFileSync(this.path, "utf8");
44
+ } catch (error) {
45
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined;
46
+ throw error;
47
+ }
42
48
  }
43
49
 
44
50
  withLock<T>(fn: (current: string | undefined) => LockResult<T>): T {
45
51
  this.ensureParentDir();
46
- this.ensureFileExists();
47
52
  return withStateFileLockSync(this.path, () => {
48
- const current = existsSync(this.path) ? readFileSync(this.path, "utf8") : undefined;
53
+ const current = this.read();
49
54
  const { result, next } = fn(current);
50
55
  if (next !== undefined) {
51
56
  atomicWriteSecret(this.path, next);
@@ -60,7 +65,6 @@ export class FileAuthStorageBackend implements AuthStorageBackend {
60
65
  ): Promise<T> {
61
66
  options?.signal?.throwIfAborted();
62
67
  this.ensureParentDir();
63
- this.ensureFileExists();
64
68
  return withStateFileLock(
65
69
  this.path,
66
70
  async () => {
@@ -38,6 +38,8 @@ export interface LockResult<T> {
38
38
  }
39
39
 
40
40
  export interface AuthStorageBackend {
41
+ /** A committed snapshot without creating storage or acquiring a write lock. */
42
+ read?(): string | undefined;
41
43
  withLock<T>(fn: (current: string | undefined) => LockResult<T>): T;
42
44
  withLockAsync<T>(
43
45
  fn: (current: string | undefined) => Promise<LockResult<T>>,
@@ -305,11 +307,7 @@ export class AuthStorage {
305
307
 
306
308
  reload(): void {
307
309
  try {
308
- let content: string | undefined;
309
- this.backend.withLock((current) => {
310
- content = current;
311
- return { result: undefined };
312
- });
310
+ const content = this.backend.read ? this.backend.read() : this.backend.withLock((current) => ({ result: current }));
313
311
  const read = readStorageData(content);
314
312
  this.data = read.data;
315
313
  this.damage = read.damage;
@@ -122,6 +122,8 @@ export interface CatalogBackedSynthesisInput {
122
122
  runtimeId: string;
123
123
  provider: string;
124
124
  api: Api;
125
+ /** Use the catalog transport and its endpoint when no explicit target URL is configured. */
126
+ preferCatalogTransport?: boolean;
125
127
  defaultBaseUrl: string;
126
128
  defaultHeaders?: Record<string, string>;
127
129
  }
@@ -134,15 +136,28 @@ export function synthesizeCatalogBackedModel(input: CatalogBackedSynthesisInput)
134
136
  null,
135
137
  input.target.capabilities ?? null,
136
138
  );
139
+ const api = input.preferCatalogTransport && input.target.url === undefined ? (builtin?.api ?? input.api) : input.api;
140
+ // A catalog endpoint, compatibility flags, and effort map describe one API.
141
+ // Explicit endpoints keep the runtime's API contract, even when a catalog
142
+ // model has moved to another transport (for example OpenRouter Claude).
143
+ const sameTransport = builtin?.api === api;
144
+ const catalogFields = { ...builtin };
145
+ if (input.preferCatalogTransport && !sameTransport) {
146
+ delete catalogFields.compat;
147
+ delete catalogFields.thinkingLevelMap;
148
+ }
137
149
  const pricing = input.target.pricing;
138
150
  const targetHeaders = input.target.auth?.headers;
139
151
  const model: Model<Api> = {
140
- ...(builtin ?? {}),
152
+ ...catalogFields,
141
153
  id: input.wireModelId,
142
154
  name: `${input.wireModelId} (${input.target.id})`,
143
- api: input.api,
155
+ api,
144
156
  provider: input.provider,
145
- baseUrl: input.target.url ?? builtin?.baseUrl ?? input.defaultBaseUrl,
157
+ baseUrl:
158
+ input.target.url ??
159
+ (input.preferCatalogTransport && !sameTransport ? undefined : builtin?.baseUrl) ??
160
+ input.defaultBaseUrl,
146
161
  reasoning: caps.reasoning,
147
162
  input: caps.vision ? (builtin?.input.includes("image") ? builtin.input : ["text", "image"]) : ["text"],
148
163
  cost: {
@@ -3,11 +3,15 @@ export interface NativeRuntimeFingerprint {
3
3
  displayName: string;
4
4
  }
5
5
 
6
- async function fetchWithTimeout(url: string, timeoutMs: number): Promise<Response | null> {
6
+ async function fetchWithTimeout(
7
+ url: string,
8
+ timeoutMs: number,
9
+ headers: Record<string, string>,
10
+ ): Promise<Response | null> {
7
11
  const controller = new AbortController();
8
12
  const timer = setTimeout(() => controller.abort(), timeoutMs);
9
13
  try {
10
- return await fetch(url, { signal: controller.signal });
14
+ return await fetch(url, { signal: controller.signal, headers });
11
15
  } catch {
12
16
  return null;
13
17
  } finally {
@@ -22,10 +26,13 @@ async function fetchWithTimeout(url: string, timeoutMs: number): Promise<Respons
22
26
  * by doctor + configure wizard to steer users onto native runtimes for
23
27
  * resident-model lifecycle.
24
28
  */
25
- export async function fingerprintNativeRuntime(baseUrl: string): Promise<NativeRuntimeFingerprint | null> {
29
+ export async function fingerprintNativeRuntime(
30
+ baseUrl: string,
31
+ headers: Record<string, string> = {},
32
+ ): Promise<NativeRuntimeFingerprint | null> {
26
33
  const normalized = baseUrl.replace(/^ws:/u, "http:").replace(/^wss:/u, "https:");
27
34
  const trimmed = normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
28
- const greeting = await fetchWithTimeout(`${trimmed}/lmstudio-greeting`, 750);
35
+ const greeting = await fetchWithTimeout(`${trimmed}/lmstudio-greeting`, 750, headers);
29
36
  if (greeting?.ok) {
30
37
  try {
31
38
  const data = (await greeting.json()) as { lmstudio?: unknown };
@@ -34,7 +41,7 @@ export async function fingerprintNativeRuntime(baseUrl: string): Promise<NativeR
34
41
  // The exact JSON body is the fingerprint.
35
42
  }
36
43
  }
37
- const lmStudioV0 = await fetchWithTimeout(`${trimmed}/api/v0/models`, 750);
44
+ const lmStudioV0 = await fetchWithTimeout(`${trimmed}/api/v0/models`, 750, headers);
38
45
  if (lmStudioV0?.ok) {
39
46
  try {
40
47
  const data = (await lmStudioV0.json()) as { data?: unknown };
@@ -48,7 +55,7 @@ export async function fingerprintNativeRuntime(baseUrl: string): Promise<NativeR
48
55
  // A malformed v0 body is not an LM Studio fingerprint.
49
56
  }
50
57
  }
51
- const ollama = await fetchWithTimeout(`${trimmed}/api/version`, 750);
58
+ const ollama = await fetchWithTimeout(`${trimmed}/api/version`, 750, headers);
52
59
  if (ollama?.ok) {
53
60
  try {
54
61
  const data = (await ollama.json()) as { version?: unknown };
@@ -19,6 +19,7 @@ export interface ProbeReasoningOptions {
19
19
  modelId: string;
20
20
  timeoutMs: number;
21
21
  apiKey?: string;
22
+ headers?: Record<string, string>;
22
23
  signal?: AbortSignal;
23
24
  }
24
25
 
@@ -72,6 +73,7 @@ export async function probeOpenAICompatReasoning(opts: ProbeReasoningOptions): P
72
73
 
73
74
  const headers: Record<string, string> = { "content-type": "application/json" };
74
75
  if (opts.apiKey && opts.apiKey.length > 0) headers.authorization = `Bearer ${opts.apiKey}`;
76
+ Object.assign(headers, opts.headers);
75
77
 
76
78
  const body = JSON.stringify({
77
79
  model: opts.modelId,
@@ -665,14 +665,16 @@ function positiveWindow(value: number | null | undefined): number | undefined {
665
665
  * (live model hint > knowledge base > catalog > runtime default > 8192).
666
666
  * - `desired`: what Clio wants for coding. Local-native tiers still get a
667
667
  * 128k recommendation, but this is advisory only.
668
- * - `effective`: what the target actually offers, most live source first:
669
- * loaded > probe > target config override > model-specific knowledge >
670
- * runtime descriptor default. Clio no longer invents a 128k effective
668
+ * - `effective`: the configured target limit, capped by a known loaded window;
669
+ * otherwise loaded > probe > model-specific knowledge > runtime descriptor
670
+ * default. Clio no longer invents a 128k effective
671
671
  * window for unknown local models; providers must probe it or users must
672
672
  * configure an explicit override.
673
673
  *
674
- * The loaded window outranks everything below it because it is the only figure
675
- * that describes what the backend will serve this turn. A model whose weights
674
+ * A loaded window prevents configuration from overstating what the backend can
675
+ * serve this turn. An operator can also configure a smaller limit, including
676
+ * when a gateway advertises training capacity instead of serving capacity.
677
+ * A model whose weights
676
678
  * allow 262k but which is open at 100k fails at 100k, so planning against the
677
679
  * declared number means autocompact never fires in time.
678
680
  *
@@ -718,18 +720,18 @@ export function resolveContextWindowDetails(
718
720
  const overrideWindow = positiveWindow(target.capabilities?.contextWindow);
719
721
  let effective: number;
720
722
  let source: ContextWindowSource;
721
- if (loadedWindow !== undefined) {
723
+ if (loadedWindow !== undefined && (overrideWindow === undefined || loadedWindow <= overrideWindow)) {
722
724
  effective = loadedWindow;
723
725
  source = "loaded";
726
+ } else if (overrideWindow !== undefined) {
727
+ effective = overrideWindow;
728
+ source = "target-override";
724
729
  } else if (probeWindow !== undefined) {
725
730
  effective = probeWindow;
726
731
  // Not "loaded": a probed window is what the target reported for the
727
732
  // model, and only a runtime that names its resident instance's window
728
733
  // has said anything about what is serving right now.
729
734
  source = "probe";
730
- } else if (overrideWindow !== undefined) {
731
- effective = overrideWindow;
732
- source = "target-override";
733
735
  } else if (modelDeclared !== undefined) {
734
736
  effective = modelDeclared;
735
737
  source = modelDeclaredSource;
@@ -82,6 +82,7 @@ const openrouterRuntime: RuntimeDescriptor = {
82
82
  displayName: "OpenRouter",
83
83
  kind: "http",
84
84
  tier: "cloud",
85
+ // Runtime fallback and explicit-URL contract; dispatch uses each synthesized model.api.
85
86
  apiFamily: "openai-completions",
86
87
  auth: "api-key",
87
88
  credentialsEnvVar: "OPENROUTER_API_KEY",
@@ -101,6 +102,7 @@ const openrouterRuntime: RuntimeDescriptor = {
101
102
  defaultCapabilities,
102
103
  runtimeId: "openrouter",
103
104
  api: "openai-completions",
105
+ preferCatalogTransport: true,
104
106
  provider: "openrouter",
105
107
  defaultBaseUrl: OPENROUTER_BASE_URL,
106
108
  defaultHeaders: OPENROUTER_HEADERS,
@@ -8,13 +8,27 @@ export interface OpenAIModelsResponse {
8
8
  data?: Array<Record<string, unknown> & { id?: unknown; status?: unknown }>;
9
9
  }
10
10
 
11
- export async function probeUrl(url: string, ctx: ProbeContext, method: "GET" | "HEAD" = "GET"): Promise<ProbeResult> {
12
- const base = { url, timeoutMs: ctx.httpTimeoutMs, method } as const;
11
+ function bearerHeaders(ctx: ProbeContext): Record<string, string> {
12
+ return ctx.authToken ? { Authorization: `Bearer ${ctx.authToken}` } : {};
13
+ }
14
+
15
+ export async function probeUrl(
16
+ url: string,
17
+ ctx: ProbeContext,
18
+ method: "GET" | "HEAD" = "GET",
19
+ headers: Record<string, string> = bearerHeaders(ctx),
20
+ ): Promise<ProbeResult> {
21
+ const base = { url, timeoutMs: ctx.httpTimeoutMs, method, headers } as const;
13
22
  return ctx.signal ? probeHttp({ ...base, signal: ctx.signal }) : probeHttp(base);
14
23
  }
15
24
 
16
- export async function probeOpenAIModels(base: string, ctx: ProbeContext, modelsPath = "/v1/models"): Promise<string[]> {
17
- return (await probeOpenAIModelCatalog(base, ctx, modelsPath)).models;
25
+ export async function probeOpenAIModels(
26
+ base: string,
27
+ ctx: ProbeContext,
28
+ modelsPath = "/v1/models",
29
+ headers: Record<string, string> = bearerHeaders(ctx),
30
+ ): Promise<string[]> {
31
+ return (await probeOpenAIModelCatalog(base, ctx, modelsPath, headers)).models;
18
32
  }
19
33
 
20
34
  export interface OpenAIModelCatalogProbe {
@@ -38,11 +52,12 @@ async function probeModelDetailRows(
38
52
  base: string,
39
53
  ctx: ProbeContext,
40
54
  modelsPath: string,
55
+ headers: Record<string, string>,
41
56
  ): Promise<Map<string, Record<string, unknown>>> {
42
57
  const rows = new Map<string, Record<string, unknown>>();
43
58
  for (const detailPath of OPENAI_COMPAT_DETAIL_PATHS) {
44
59
  if (detailPath === modelsPath) continue;
45
- const opts = { url: `${base}${detailPath}`, timeoutMs: ctx.httpTimeoutMs } as const;
60
+ const opts = { url: `${base}${detailPath}`, timeoutMs: ctx.httpTimeoutMs, headers } as const;
46
61
  const result = await (ctx.signal
47
62
  ? probeJson<OpenAIModelsResponse>({ ...opts, signal: ctx.signal })
48
63
  : probeJson<OpenAIModelsResponse>(opts));
@@ -60,13 +75,14 @@ export async function probeOpenAIModelCatalog(
60
75
  base: string,
61
76
  ctx: ProbeContext,
62
77
  modelsPath = "/v1/models",
78
+ headers: Record<string, string> = bearerHeaders(ctx),
63
79
  ): Promise<OpenAIModelCatalogProbe> {
64
- const opts = { url: `${base}${modelsPath}`, timeoutMs: ctx.httpTimeoutMs } as const;
80
+ const opts = { url: `${base}${modelsPath}`, timeoutMs: ctx.httpTimeoutMs, headers } as const;
65
81
  const result = await (ctx.signal
66
82
  ? probeJson<OpenAIModelsResponse>({ ...opts, signal: ctx.signal })
67
83
  : probeJson<OpenAIModelsResponse>(opts));
68
84
  if (!result.ok || !result.data?.data) return { models: [], modelCapabilities: {}, modelStates: {} };
69
- const detail = await probeModelDetailRows(base, ctx, modelsPath);
85
+ const detail = await probeModelDetailRows(base, ctx, modelsPath, headers);
70
86
  const models: string[] = [];
71
87
  const modelCapabilities: Record<string, Partial<CapabilityFlags>> = {};
72
88
  const modelStates: Record<string, ProbeModelStatus> = {};
@@ -49,6 +49,11 @@ function synthesizeAnthropicCompatModel(input: AnthropicCompatSynthesisInput): M
49
49
  export function makeAnthropicCompatRuntime(spec: AnthropicCompatSpec): RuntimeDescriptor {
50
50
  const messagesPath = spec.messagesPath ?? "/v1/messages";
51
51
  const modelsPath = spec.modelsPath ?? "/v1/models";
52
+ const headers = (target: TargetDescriptor, ctx: ProbeContext): Record<string, string> => ({
53
+ "anthropic-version": "2023-06-01",
54
+ ...(ctx.authToken ? { "x-api-key": ctx.authToken } : {}),
55
+ ...target.auth?.headers,
56
+ });
52
57
  return {
53
58
  id: spec.id,
54
59
  displayName: spec.displayName,
@@ -61,12 +66,12 @@ export function makeAnthropicCompatRuntime(spec: AnthropicCompatSpec): RuntimeDe
61
66
  async probe(target: TargetDescriptor, ctx: ProbeContext): Promise<ProbeResult> {
62
67
  const base = targetBaseUrl(target);
63
68
  if (!base) return { ok: false, error: "target has no url" };
64
- return probeUrl(`${base}${messagesPath}`, ctx, "HEAD");
69
+ return probeUrl(`${base}${messagesPath}`, ctx, "HEAD", headers(target, ctx));
65
70
  },
66
71
  async probeModels(target: TargetDescriptor, ctx: ProbeContext): Promise<string[]> {
67
72
  const base = targetBaseUrl(target);
68
73
  if (!base) return [];
69
- return probeOpenAIModels(base, ctx, modelsPath);
74
+ return probeOpenAIModels(base, ctx, modelsPath, headers(target, ctx));
70
75
  },
71
76
  synthesizeModel(target: TargetDescriptor, wireModelId: string, kb: KnowledgeBaseHit | null): Model<Api> {
72
77
  return synthesizeAnthropicCompatModel({
@@ -61,6 +61,10 @@ export function makeOpenAICompatRuntime(spec: OpenAICompatSpec): RuntimeDescript
61
61
  // root and a target naming the `/v1` mount point has to be reduced to it. An
62
62
  // `asIs` spec sends the URL verbatim, so it keeps whatever the user typed.
63
63
  const probeBase = asIs ? targetBaseUrl : targetRootUrl;
64
+ const headers = (target: TargetDescriptor, ctx: ProbeContext): Record<string, string> => ({
65
+ ...(ctx.authToken ? { Authorization: `Bearer ${ctx.authToken}` } : {}),
66
+ ...target.auth?.headers,
67
+ });
64
68
  return {
65
69
  id: spec.id,
66
70
  displayName: spec.displayName,
@@ -72,9 +76,9 @@ export function makeOpenAICompatRuntime(spec: OpenAICompatSpec): RuntimeDescript
72
76
  async probe(target: TargetDescriptor, ctx: ProbeContext): Promise<ProbeResult> {
73
77
  const base = probeBase(target);
74
78
  if (!base) return { ok: false, error: "target has no url" };
75
- const health = await probeUrl(`${base}${healthPath}`, ctx);
79
+ const health = await probeUrl(`${base}${healthPath}`, ctx, "GET", headers(target, ctx));
76
80
  if (!health.ok) return health;
77
- const catalog = await probeOpenAIModelCatalog(base, ctx, modelsPath);
81
+ const catalog = await probeOpenAIModelCatalog(base, ctx, modelsPath, headers(target, ctx));
78
82
  const result: ProbeResult = { ...health };
79
83
  if (catalog.models.length > 0) result.models = catalog.models;
80
84
  if (Object.keys(catalog.modelStates).length > 0) result.modelStates = catalog.modelStates;
@@ -92,19 +96,21 @@ export function makeOpenAICompatRuntime(spec: OpenAICompatSpec): RuntimeDescript
92
96
  async probeModels(target: TargetDescriptor, ctx: ProbeContext): Promise<string[]> {
93
97
  const base = probeBase(target);
94
98
  if (!base) return [];
95
- return probeOpenAIModels(base, ctx, modelsPath);
99
+ return probeOpenAIModels(base, ctx, modelsPath, headers(target, ctx));
96
100
  },
97
101
  async probeReasoning(target: TargetDescriptor, modelId: string, ctx: ProbeContext): Promise<ReasoningProbeResult> {
98
102
  const base = probeBase(target);
99
103
  if (!base) return { reasoning: false, latencyMs: 0, error: "target has no url" };
100
104
  const apiKeyEnv = target.auth?.apiKeyEnvVar;
101
- const apiKey = apiKeyEnv && ctx.credentialsPresent.has(apiKeyEnv) ? process.env[apiKeyEnv] : undefined;
105
+ const apiKey =
106
+ ctx.authToken ?? (apiKeyEnv && ctx.credentialsPresent.has(apiKeyEnv) ? process.env[apiKeyEnv] : undefined);
102
107
  const probeOpts: Parameters<typeof probeOpenAICompatReasoning>[0] = {
103
108
  baseUrl: base,
104
109
  modelId,
105
110
  timeoutMs: Math.max(ctx.httpTimeoutMs, 8000),
106
111
  };
107
112
  if (apiKey) probeOpts.apiKey = apiKey;
113
+ if (target.auth?.headers) probeOpts.headers = target.auth.headers;
108
114
  if (ctx.signal) probeOpts.signal = ctx.signal;
109
115
  return probeOpenAICompatReasoning(probeOpts);
110
116
  },
@@ -109,6 +109,8 @@ export function scorePromotionEntry(userText: string, entry: MarketplaceSkill):
109
109
 
110
110
  /**
111
111
  * The uninstalled marketplace entries that match the request, best first.
112
+ * Authored trigger hits precede token fallbacks, even when incidental
113
+ * description overlap ties or exceeds the trigger's numeric score.
112
114
  * `excludedNames` carries installed skills plus every decline scope the
113
115
  * caller tracks; the matcher itself is stateless.
114
116
  */
@@ -123,7 +125,12 @@ export function matchMarketplaceSkills(
123
125
  const match = scorePromotionEntry(userText, entry);
124
126
  if (match) matches.push(match);
125
127
  }
126
- return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
128
+ return matches.sort(
129
+ (a, b) =>
130
+ Number(b.matchedTrigger !== undefined) - Number(a.matchedTrigger !== undefined) ||
131
+ b.score - a.score ||
132
+ a.entry.name.localeCompare(b.entry.name),
133
+ );
127
134
  }
128
135
 
129
136
  /**
@@ -210,7 +210,16 @@ function extractWritePath(tool: string, args: Record<string, unknown> | undefine
210
210
  return tool === ToolNames.Artifact ? artifactDefaultPath(args?.kind) : null;
211
211
  }
212
212
 
213
+ /** Shared by classification and registry exposure; an empty body still sends data. */
214
+ export function webFetchIsOutward(args: Record<string, unknown> | undefined): boolean {
215
+ const method = typeof args?.method === "string" && args.method.length > 0 ? args.method.toUpperCase() : "GET";
216
+ return (method !== "GET" && method !== "HEAD") || args?.body !== undefined;
217
+ }
218
+
213
219
  export function classify(call: ClassifierCall): Classification {
220
+ if (call.tool === ToolNames.WebFetch && webFetchIsOutward(call.args)) {
221
+ return { actionClass: "write", reasons: ["web-fetch:outward"] };
222
+ }
214
223
  const base = baseClassify(call.tool);
215
224
  if (base === null) {
216
225
  return { actionClass: "unknown", reasons: [`unknown tool: ${call.tool}`] };