@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,19 +1,6 @@
1
- /**
2
- * Exact recall by ref.
3
- *
4
- * A `contextEviction` entry removes a tool-result body from the projection
5
- * and leaves a marker naming the ref. Recall is the reverse move: given a ref
6
- * on the active path whose key the fold still lists as evicted, hand back the
7
- * original body byte-exact and describe the `contextRecall` entry the caller
8
- * appends. The ref stays evicted in the fold: the body rides the recall tool
9
- * result at the tail of the working set, so the marker and the prefix cache
10
- * are untouched and a repeat recall is the churn signal. Pure over entries:
11
- * nothing here reads the session, writes the ledger, or calls a model.
12
- *
13
- * The body is read through the same `payload.ts` readers the projection and
14
- * the marker use, so what recall returns is exactly what the model saw before
15
- * eviction. No truncation happens here; the observation envelope applies the
16
- * per-turn caps.
1
+ /** Exact persisted tool-result recall and bounded discovery on the active path.
2
+ * Bodies return at the tail through the caller's observation envelope; the raw
3
+ * ledger, summary cut, and existing eviction markers remain unchanged.
17
4
  */
18
5
 
19
6
  import { ceilChars } from "../../session/context-accounting.js";
@@ -29,7 +16,14 @@ import {
29
16
  } from "./contract.js";
30
17
  import { parseRefKey, refKey } from "./fold.js";
31
18
  import { callPathsByToolCallId } from "./path-index.js";
32
- import { offloadPathOf, primaryPathOf, toolResultPayload, toolResultText } from "./payload.js";
19
+ import {
20
+ hasLegacyCompactionMarker,
21
+ offloadPathOf,
22
+ primaryPathOf,
23
+ toolResultPayload,
24
+ toolResultText,
25
+ } from "./payload.js";
26
+ import { compactionCut } from "./visible.js";
33
27
 
34
28
  export type RecallOutcome = { ok: true; result: RecallResult } | { ok: false; error: RecallError };
35
29
 
@@ -47,7 +41,7 @@ export function resolveRecall(
47
41
  ref: string,
48
42
  activeLeafTurnId?: string,
49
43
  ): RecallOutcome {
50
- const parsed = parseRefKey(ref);
44
+ const parsed = parseRefKey(ref, view);
51
45
  if (parsed === null) return { ok: false, error: { kind: "invalid_ref", ref } };
52
46
  const key = refKey(parsed);
53
47
  const active = filterEntriesToActivePath(entries, activeLeafTurnId);
@@ -55,11 +49,15 @@ export function resolveRecall(
55
49
  if (entry === undefined) {
56
50
  return { ok: false, error: { kind: "not_on_active_path", ref: key } };
57
51
  }
58
- // Thinking leaves the working set without a marker and is not recallable
59
- // in this slice; `recallErrorMessage` names that case from the entry.
60
- if (isThinkingEntry(entry) || !view.evicted.has(key) || !isToolResultEntry(entry)) {
61
- return { ok: false, error: { kind: "not_evicted", ref: key } };
52
+ if (!isToolResultEntry(entry) || hasLegacyCompactionMarker(entry.payload)) {
53
+ return { ok: false, error: { kind: "unavailable", ref: key } };
62
54
  }
55
+ const state = view.evicted.has(key)
56
+ ? "evicted"
57
+ : compactionCut(active).visible.some((candidate) => candidate.turnId === key)
58
+ ? "visible"
59
+ : "summarized";
60
+ if (state === "visible") return { ok: false, error: { kind: "visible", ref: key } };
63
61
  const payload = toolResultPayload(entry.payload);
64
62
  const body = toolResultText(payload.result);
65
63
  const offloadPath = offloadPathOf(payload);
@@ -67,6 +65,7 @@ export function resolveRecall(
67
65
  ok: true,
68
66
  result: {
69
67
  ref: parsed,
68
+ state,
70
69
  entry,
71
70
  body,
72
71
  tokens: ceilChars(body.length),
@@ -103,50 +102,73 @@ export function buildRecallFields(
103
102
  };
104
103
  }
105
104
 
106
- /** Refs listed in a recall failure before the list is cut with an ellipsis. */
107
- const MAX_LISTED_REFS = 8;
105
+ export interface RecallDiscoveryOptions {
106
+ /** Case-insensitive terms matched against ref, tool name, and path. */
107
+ query?: string;
108
+ /** Default 8, maximum 12. */
109
+ limit?: number;
110
+ /** Zero-based position in matching active-path ledger order. */
111
+ offset?: number;
112
+ activeLeafTurnId?: string;
113
+ }
108
114
 
109
115
  export interface RecallableRefListing {
110
- /** Already-rendered `ref (tool path)` rows, bounded for prompt use. */
116
+ /** Bounded metadata rows; never result bodies or assistant thinking. */
111
117
  refs: string[];
112
- /** Recallable refs omitted after the bounded prefix. */
113
118
  remaining: number;
119
+ total: number;
120
+ offset: number;
121
+ nextOffset?: number;
114
122
  }
115
123
 
116
- /**
117
- * The refs a recall can actually bring back, so the next call can name one of
118
- * them. Thinking refs are evicted too but are not recallable, so listing them
119
- * would hand the caller a ref that fails for a different reason. A guessed
120
- * "nearest" ref was tried first and dropped: over time-ordered ids a prefix
121
- * match names an unrelated result, and the listing is what helps.
122
- */
123
- export function recallableRefListing(entries: ReadonlyArray<SessionEntry>, view: WorkingSetView): RecallableRefListing {
124
- const byTurnId = new Map<string, SessionEntry>();
125
- for (const entry of entries) byTurnId.set(entry.turnId, entry);
126
- const callPaths = callPathsByToolCallId(entries);
124
+ /** Stable ledger-order pages for the same active path and query. */
125
+ export function recallableRefListing(
126
+ entries: ReadonlyArray<SessionEntry>,
127
+ view: WorkingSetView,
128
+ options: RecallDiscoveryOptions = {},
129
+ ): RecallableRefListing {
130
+ const active = filterEntriesToActivePath(entries, options.activeLeafTurnId);
131
+ const visible = new Set(compactionCut(active).visible.map((entry) => entry.turnId));
132
+ const callPaths = callPathsByToolCallId(active);
133
+ const terms = (options.query ?? "").toLowerCase().split(/\s+/).filter(Boolean);
134
+ const limit =
135
+ typeof options.limit === "number" && Number.isFinite(options.limit)
136
+ ? Math.max(1, Math.min(12, Math.floor(options.limit)))
137
+ : 8;
138
+ const offset =
139
+ typeof options.offset === "number" && Number.isSafeInteger(options.offset) ? Math.max(0, options.offset) : 0;
127
140
  const refs: string[] = [];
128
- for (const key of view.evicted.keys()) {
129
- const entry = byTurnId.get(key);
130
- if (entry === undefined || !isToolResultEntry(entry)) continue;
131
- // After a summary compaction the markers before the cut are gone from
132
- // the working set, so the listing is the only place the caller learns
133
- // what a ref was. Tool and path are what it needs to pick one.
141
+ let total = 0;
142
+ for (const entry of active) {
143
+ if (!isToolResultEntry(entry) || hasLegacyCompactionMarker(entry.payload)) continue;
144
+ const state = view.evicted.has(entry.turnId) ? "evicted" : visible.has(entry.turnId) ? "visible" : "summarized";
145
+ if (state === "visible") continue;
134
146
  const payload = toolResultPayload(entry.payload);
135
147
  const toolCallId = typeof payload.obj.toolCallId === "string" ? payload.obj.toolCallId : undefined;
136
148
  const path = primaryPathOf(payload) ?? (toolCallId === undefined ? undefined : callPaths.get(toolCallId));
137
- refs.push(`${key} (${payload.toolName}${path === undefined ? "" : ` ${path}`})`);
149
+ const alias = view.evicted.get(entry.turnId)?.alias;
150
+ const metadata = `${alias ?? ""} ${entry.turnId} ${payload.toolName} ${path ?? ""}`.toLowerCase();
151
+ if (!terms.every((term) => metadata.includes(term))) continue;
152
+ if (total >= offset && refs.length < limit) {
153
+ // Keep each row bounded even for unusual tool/path metadata.
154
+ const label = `${payload.toolName}${path === undefined ? "" : ` ${path}`}`.replace(/\s+/g, " ").slice(0, 240);
155
+ refs.push(`${alias ?? entry.turnId} (${label}) [${state}; ${entry.timestamp}]`);
156
+ }
157
+ total += 1;
138
158
  }
139
- return {
140
- refs: refs.slice(0, MAX_LISTED_REFS),
141
- remaining: Math.max(0, refs.length - MAX_LISTED_REFS),
142
- };
159
+ const remaining = Math.max(0, total - offset - refs.length);
160
+ return { refs, remaining, total, offset, ...(remaining > 0 ? { nextOffset: offset + refs.length } : {}) };
143
161
  }
144
162
 
145
- function recallableRefMessage(entries: ReadonlyArray<SessionEntry>, view: WorkingSetView): string {
146
- const listing = recallableRefListing(entries, view);
163
+ function recallableRefMessage(
164
+ entries: ReadonlyArray<SessionEntry>,
165
+ view: WorkingSetView,
166
+ activeLeafTurnId?: string,
167
+ ): string {
168
+ const listing = recallableRefListing(entries, view, activeLeafTurnId === undefined ? {} : { activeLeafTurnId });
147
169
  if (listing.refs.length === 0) return "No recallable refs on the active path.";
148
170
  const more = listing.remaining > 0 ? `, and ${listing.remaining} more` : "";
149
- return `Recallable refs on the active path: ${listing.refs.join(", ")}${more}.`;
171
+ return `Recallable refs on the active path: ${listing.refs.join(", ")}${more}. Discover all matches with context(scope="recall", limit=8, offset=0), omitting ref; query filters path/tool/ref terms. Follow nextOffset.`;
150
172
  }
151
173
 
152
174
  /**
@@ -159,19 +181,23 @@ export function recallErrorMessage(
159
181
  error: RecallError,
160
182
  entries: ReadonlyArray<SessionEntry> = [],
161
183
  view: WorkingSetView = EMPTY_WORKING_SET_VIEW,
184
+ activeLeafTurnId?: string,
162
185
  ): string {
163
- const listing = ` ${recallableRefMessage(entries, view)}`;
186
+ const active = filterEntriesToActivePath(entries, activeLeafTurnId);
187
+ const listing = ` ${recallableRefMessage(active, view, activeLeafTurnId)}`;
164
188
  switch (error.kind) {
165
189
  case "invalid_ref":
166
- return `recall ref must be a single turnId without whitespace; got '${error.ref}'.`;
190
+ return `recall ref must be a single recall alias or turnId without whitespace; got '${error.ref}'.`;
167
191
  case "not_on_active_path":
168
192
  return `ref ${error.ref} is not on the active path of this session (unknown or on an abandoned branch).${listing}`;
169
- case "not_evicted": {
170
- const entry = entries.find((candidate) => candidate.turnId === error.ref);
193
+ case "visible":
194
+ return `ref ${error.ref} is visible; its content is already in context.${listing}`;
195
+ case "unavailable": {
196
+ const entry = active.find((candidate) => candidate.turnId === error.ref);
171
197
  if (entry !== undefined && isThinkingEntry(entry)) {
172
198
  return `ref ${error.ref} is an assistant turn; thinking is not recallable.${listing}`;
173
199
  }
174
- return `ref ${error.ref} is not evicted; its content is already in context.${listing}`;
200
+ return `ref ${error.ref} has no recallable original tool result (unsupported entry or legacy destructive compaction).${listing}`;
175
201
  }
176
202
  }
177
203
  }
@@ -42,6 +42,7 @@ export function routeValidationProjection(
42
42
  decisionRefs,
43
43
  resolvedVerification,
44
44
  resultContractOverride,
45
+ resultSummary,
45
46
  fleetGateReceipt,
46
47
  taskWorktree,
47
48
  runIdHint,
@@ -68,6 +69,7 @@ export function routeValidationProjection(
68
69
  ? { resolvedVerification: resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
69
70
  : {}),
70
71
  ...(resultContractOverride !== undefined ? { resultContractOverride } : {}),
72
+ ...(resultSummary !== undefined ? { resultSummary: { ...resultSummary } } : {}),
71
73
  ...(fleetGateReceipt !== undefined ? { fleetGateReceipt: { ...fleetGateReceipt } } : {}),
72
74
  ...(taskWorktree !== undefined ? { taskWorktree } : {}),
73
75
  ...(runIdHint !== undefined ? { runIdHint } : {}),
@@ -132,7 +134,7 @@ export function planActiveRoute(
132
134
  version: 1,
133
135
  decision,
134
136
  totalCostUpperBoundUsd: perAttemptUpperBoundUsd * input.maxAttempts,
135
- deadlineMs: input.request.routingIntent?.deadlineMs ?? 60_000,
137
+ deadlineMs: input.request.routingIntent?.deadlineMs ?? null,
136
138
  maxAttempts: input.maxAttempts,
137
139
  };
138
140
  assertApprovedAssignmentRoute(approval);
@@ -163,8 +165,9 @@ export function consumeActiveRouteApproval<T>(
163
165
  throw new Error("dispatch: active recovery requires a resolver-authenticated attempt decision");
164
166
  }
165
167
  const request = applyActiveRouteSelection(input.request, decision);
166
- if (input.request.lineage === undefined) {
167
- request.assignmentDeadlineAt = Date.parse(input.requestedAt) + approval.deadlineMs;
168
+ if (input.request.lineage === undefined && approval.deadlineMs !== null) {
169
+ const deadline = Date.parse(input.requestedAt) + approval.deadlineMs;
170
+ request.assignmentDeadlineAt = Math.min(request.assignmentDeadlineAt ?? deadline, deadline);
168
171
  }
169
172
  return { request, observation: input.observe(request, decision) };
170
173
  }
@@ -5,7 +5,8 @@ export interface AdmissionQueueRequest<T> {
5
5
  assignmentId: string;
6
6
  priority: number;
7
7
  queuedAt: number;
8
- deadlineAt: number;
8
+ /** Explicit caller deadline; absent means wait until capacity, cancellation, or a fault. */
9
+ deadlineAt?: number;
9
10
  planId: string | null;
10
11
  planOrder: number | null;
11
12
  value: T;
@@ -47,6 +48,7 @@ export interface AdmissionQueue<T> {
47
48
  }
48
49
  export function createAdmissionQueue<T>(options: {
49
50
  maxSize: number;
51
+ /** Legacy planning estimate; never shortens an explicit deadline or stops a healthy wait. */
50
52
  finiteCeilingMs: number;
51
53
  /** Reserved concurrent peak for a plan, resolved when the plan is seen. */
52
54
  reservedPlanPeak?: (planId: string) => number | undefined;
@@ -67,7 +69,7 @@ export function createAdmissionQueue<T>(options: {
67
69
  request: AdmissionQueueRequest<T>;
68
70
  resolve: (outcome: AdmissionQueueOutcome<T>) => void;
69
71
  reject: (error: Error) => void;
70
- timer: ReturnType<typeof setTimeout>;
72
+ timer: ReturnType<typeof setTimeout> | undefined;
71
73
  }
72
74
  >();
73
75
  const remove = (requestId: string, state: "canceled" | "timed_out"): boolean => {
@@ -85,12 +87,22 @@ export function createAdmissionQueue<T>(options: {
85
87
  return Promise.reject(new Error(`dispatch: admission queue full (${entries.size}/${options.maxSize})`));
86
88
  if (entries.has(request.requestId))
87
89
  return Promise.reject(new Error(`dispatch: duplicate queued request '${request.requestId}'`));
88
- const effectiveDeadline = Math.min(request.deadlineAt, request.queuedAt + options.finiteCeilingMs);
89
- if (!Number.isFinite(effectiveDeadline))
90
+ const effectiveDeadline = request.deadlineAt;
91
+ if (effectiveDeadline !== undefined && !Number.isFinite(effectiveDeadline))
90
92
  return Promise.reject(new Error("dispatch: queued request requires a finite deadline"));
91
93
  return new Promise((resolve, reject) => {
92
- const bounded = { ...request, deadlineAt: effectiveDeadline };
93
- const timer = setTimeout(() => remove(request.requestId, "timed_out"), Math.max(0, effectiveDeadline - now()));
94
+ const bounded = { ...request };
95
+ const expire = (): void => {
96
+ const entry = entries.get(request.requestId);
97
+ if (!entry || effectiveDeadline === undefined) return;
98
+ const remaining = effectiveDeadline - now();
99
+ if (remaining <= 0) remove(request.requestId, "timed_out");
100
+ else entry.timer = setTimeout(expire, Math.min(2_147_483_647, remaining));
101
+ };
102
+ const timer =
103
+ effectiveDeadline === undefined
104
+ ? undefined
105
+ : setTimeout(expire, Math.min(2_147_483_647, Math.max(0, effectiveDeadline - now())));
94
106
  entries.set(request.requestId, { request: bounded, resolve, reject, timer });
95
107
  });
96
108
  },
@@ -107,7 +119,7 @@ export function createAdmissionQueue<T>(options: {
107
119
  },
108
120
  admitNext(nowMs = now(), canAdmit = () => true) {
109
121
  for (const request of orderAdmissionRequests([...entries.values()].map((entry) => entry.request))) {
110
- if (request.deadlineAt <= nowMs) {
122
+ if (request.deadlineAt !== undefined && request.deadlineAt <= nowMs) {
111
123
  remove(request.requestId, "timed_out");
112
124
  continue;
113
125
  }
@@ -46,7 +46,7 @@ export interface CapacityAdmissionController {
46
46
  assignmentId: string;
47
47
  nodeId: string;
48
48
  endpointKey?: string;
49
- deadlineAt: number;
49
+ deadlineAt?: number;
50
50
  priority?: number;
51
51
  planId?: string;
52
52
  planOrder?: number;
@@ -283,7 +283,7 @@ export function createCapacityAdmissionController(options: {
283
283
  assignmentId: input.assignmentId,
284
284
  priority: input.priority ?? 0,
285
285
  queuedAt,
286
- deadlineAt: input.deadlineAt,
286
+ ...(input.deadlineAt === undefined ? {} : { deadlineAt: input.deadlineAt }),
287
287
  planId: input.planId ?? null,
288
288
  planOrder: input.planOrder ?? null,
289
289
  value: () =>
@@ -313,7 +313,7 @@ export function createCapacityAdmissionController(options: {
313
313
  nodeId: input.nodeId,
314
314
  ...(input.endpointKey !== undefined ? { endpointKey: input.endpointKey } : {}),
315
315
  waitedMs: now() - queuedAt,
316
- overdueAtQueueMs: queuedAt - input.deadlineAt,
316
+ overdueAtQueueMs: input.deadlineAt === undefined ? 0 : queuedAt - input.deadlineAt,
317
317
  queueDepth: queue.size(),
318
318
  limits: options.limits(),
319
319
  usage: options.usage?.() ?? capacityLeaseUsage({ nowMs: now() }),
@@ -7,7 +7,7 @@ export interface DispatchBudgetPhase {
7
7
  readReserve: number;
8
8
  }
9
9
 
10
- /** Typed invocation request. The ceiling preauthorizes growth on a later phase. */
10
+ /** Typed advisory invocation estimate. A later phase may use a different estimate. */
11
11
  export interface DispatchBudgetRequest extends DispatchBudgetPhase {
12
12
  retryRevision?: DispatchBudgetPhase;
13
13
  }
@@ -31,8 +31,10 @@ export interface RunToolBudgetEnvelope {
31
31
  enforcement:
32
32
  | {
33
33
  classification: "native-per-tool";
34
- perTool: "enforced";
35
- clioControls: ReadonlyArray<"tool-calls" | "read-reserve" | "synthesis" | "attempt-cap">;
34
+ perTool: "enforced" | "advisory";
35
+ clioControls: ReadonlyArray<
36
+ "tool-calls" | "read-reserve" | "synthesis" | "attempt-cap" | "tool-observation" | "cancellation"
37
+ >;
36
38
  }
37
39
  | {
38
40
  classification: "external-one-shot";
@@ -50,6 +52,7 @@ export interface RunToolBudgetEnvelope {
50
52
  reasons: ReadonlyArray<BudgetEnvelopeReason>;
51
53
  }
52
54
 
55
+ const ADVISORY_CLIO_CONTROLS = ["tool-observation", "cancellation"] as const;
53
56
  const NATIVE_CLIO_CONTROLS = ["tool-calls", "read-reserve", "synthesis", "attempt-cap"] as const;
54
57
  const EXTERNAL_CLIO_CONTROLS = [
55
58
  "single-launch",
@@ -129,63 +132,10 @@ function freezeEnvelope(envelope: RunToolBudgetEnvelope): RunToolBudgetEnvelope
129
132
  return Object.freeze(envelope);
130
133
  }
131
134
 
132
- function phaseWithin(candidate: DispatchBudgetPhase, maximum: AgentBudgetPhase): boolean {
133
- return candidate.toolCalls <= maximum.toolCalls && candidate.readReserve <= maximum.readReserve;
134
- }
135
-
136
135
  function samePhase(left: DispatchBudgetPhase, right: AgentBudgetPhase): boolean {
137
136
  return left.toolCalls === right.toolCalls && left.readReserve === right.readReserve;
138
137
  }
139
138
 
140
- function assertRequestAdmitted(input: { request: DispatchBudgetRequest; policy: AgentBudget; hardCap: number }): void {
141
- const { request, policy, hardCap } = input;
142
- const authoredMaximum = policy.maximum ?? policy;
143
- if (policy.maximum === undefined && !samePhase(request, policy)) {
144
- throw new BudgetAdmissionError(
145
- "exact-recipe-policy",
146
- `the recipe pins ${policy.toolCalls} tool calls with a read reserve of ${policy.readReserve}`,
147
- );
148
- }
149
- if (!phaseWithin(request, authoredMaximum)) {
150
- throw new BudgetAdmissionError(
151
- "recipe-maximum",
152
- `the requested phase ${request.toolCalls}/${request.readReserve} exceeds recipe maximum ${authoredMaximum.toolCalls}/${authoredMaximum.readReserve}`,
153
- );
154
- }
155
- if (request.toolCalls > hardCap) {
156
- throw new BudgetAdmissionError(
157
- "global-cap",
158
- `the requested ${request.toolCalls} tool calls exceed the operator cap of ${hardCap}`,
159
- );
160
- }
161
- const ceiling = request.retryRevision;
162
- if (ceiling === undefined) return;
163
- if (ceiling.toolCalls < request.toolCalls || ceiling.readReserve < request.readReserve) {
164
- throw new BudgetAdmissionError(
165
- "ceiling-below-request",
166
- `retryRevision ${ceiling.toolCalls}/${ceiling.readReserve} must not be smaller than the requested phase ${request.toolCalls}/${request.readReserve}`,
167
- );
168
- }
169
- if (policy.maximum === undefined && !samePhase(ceiling, policy)) {
170
- throw new BudgetAdmissionError(
171
- "exact-recipe-policy",
172
- `the recipe pins ${policy.toolCalls} tool calls with a read reserve of ${policy.readReserve}`,
173
- );
174
- }
175
- if (!phaseWithin(ceiling, authoredMaximum)) {
176
- throw new BudgetAdmissionError(
177
- "recipe-maximum",
178
- `retryRevision ${ceiling.toolCalls}/${ceiling.readReserve} exceeds recipe maximum ${authoredMaximum.toolCalls}/${authoredMaximum.readReserve}`,
179
- );
180
- }
181
- if (ceiling.toolCalls > hardCap) {
182
- throw new BudgetAdmissionError(
183
- "global-cap",
184
- `retryRevision ${ceiling.toolCalls} exceeds the operator cap of ${hardCap}`,
185
- );
186
- }
187
- }
188
-
189
139
  export interface ResolveToolBudgetEnvelopeInput {
190
140
  recipeId: string;
191
141
  policy: AgentBudget;
@@ -202,10 +152,14 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
202
152
  if (!Number.isSafeInteger(input.hardCap) || input.hardCap <= 0) {
203
153
  throw new Error("dispatch: worker tool-call cap must be a positive safe integer");
204
154
  }
205
- if (input.request !== undefined)
206
- assertRequestAdmitted({ request: input.request, policy: input.policy, hardCap: input.hardCap });
207
155
 
208
156
  const request = input.request === undefined ? null : cloneDispatchBudgetRequest(input.request);
157
+ if (
158
+ request?.retryRevision &&
159
+ (request.retryRevision.toolCalls < request.toolCalls || request.retryRevision.readReserve < request.readReserve)
160
+ ) {
161
+ throw new BudgetAdmissionError("ceiling-below-request", "retryRevision must not be smaller than the requested phase");
162
+ }
209
163
  const base = request ?? input.policy;
210
164
  const reasons: BudgetEnvelopeReason[] = [];
211
165
  let selected: DispatchBudgetPhase = base;
@@ -216,15 +170,7 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
216
170
  selected = ceiling;
217
171
  reasons.push({
218
172
  code: phaseKind === "retry" ? "retry-growth-authorized" : "revision-growth-authorized",
219
- detail: `${phaseKind} phase grew from ${base.toolCalls}/${base.readReserve} to the preauthorized ceiling ${ceiling.toolCalls}/${ceiling.readReserve}`,
220
- });
221
- } else {
222
- reasons.push({
223
- code: phaseKind === "retry" ? "retry-growth-denied" : "revision-growth-denied",
224
- detail:
225
- ceiling === undefined
226
- ? `${phaseKind} phase retained ${base.toolCalls}/${base.readReserve} because the original request declared no ceiling`
227
- : `${phaseKind} phase retained ${base.toolCalls}/${base.readReserve} because the declared ceiling did not authorize growth`,
173
+ detail: `${phaseKind} phase grew from ${base.toolCalls}/${base.readReserve} to the advisory estimate ${ceiling.toolCalls}/${ceiling.readReserve}`,
228
174
  });
229
175
  }
230
176
  }
@@ -232,18 +178,11 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
232
178
  if (revisionCeiling !== undefined && !samePhase(revisionCeiling, selected)) {
233
179
  reasons.push({
234
180
  code: "revision-growth-authorized",
235
- detail: `a result-contract revision may grow from ${selected.toolCalls}/${selected.readReserve} to the preauthorized ceiling ${revisionCeiling.toolCalls}/${revisionCeiling.readReserve}`,
181
+ detail: `a result-contract revision may grow from ${selected.toolCalls}/${selected.readReserve} to the advisory estimate ${revisionCeiling.toolCalls}/${revisionCeiling.readReserve}`,
236
182
  });
237
183
  }
238
184
 
239
- let toolCalls = selected.toolCalls;
240
- if (toolCalls > input.hardCap) {
241
- reasons.push({
242
- code: "global-cap-clamp",
243
- detail: `tool calls were clamped from ${toolCalls} to the operator cap of ${input.hardCap}`,
244
- });
245
- toolCalls = input.hardCap;
246
- }
185
+ const toolCalls = selected.toolCalls;
247
186
  let readReserve = selected.readReserve;
248
187
  if (!input.hasReadTool && readReserve > 0) {
249
188
  reasons.push({
@@ -285,8 +224,8 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
285
224
  }
286
225
  : {
287
226
  classification: "native-per-tool",
288
- perTool: "enforced",
289
- clioControls: [...NATIVE_CLIO_CONTROLS],
227
+ perTool: "advisory",
228
+ clioControls: [...ADVISORY_CLIO_CONTROLS],
290
229
  },
291
230
  policy: {
292
231
  recipeId: input.recipeId,
@@ -300,6 +239,7 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
300
239
  },
301
240
  request,
302
241
  effective: {
242
+ mode: "advisory",
303
243
  toolCalls,
304
244
  readReserve,
305
245
  synthesis: input.policy.synthesis,
@@ -312,6 +252,8 @@ export function resolveToolBudgetEnvelope(input: ResolveToolBudgetEnvelopeInput)
312
252
 
313
253
  export function formatBudgetPolicy(envelope: RunToolBudgetEnvelope): string {
314
254
  const policy = envelope.policy;
255
+ if (envelope.effective.mode === "advisory")
256
+ return `${policy.recipeId} advisory default ${policy.default.toolCalls}/${policy.default.readReserve}, recommended max ${policy.maximum.toolCalls}/${policy.maximum.readReserve}`;
315
257
  const range = policy.exact
316
258
  ? `exact ${policy.default.toolCalls}/${policy.default.readReserve}`
317
259
  : `default ${policy.default.toolCalls}/${policy.default.readReserve}, max ${policy.maximum.toolCalls}/${policy.maximum.readReserve}`;
@@ -322,6 +264,8 @@ export function formatBudgetRequest(envelope: RunToolBudgetEnvelope): string {
322
264
  const request = envelope.request;
323
265
  if (request === null) return "recipe default";
324
266
  const ceiling = request.retryRevision;
267
+ if (envelope.effective.mode === "advisory")
268
+ return `${request.toolCalls}/${request.readReserve} advisory${ceiling ? `, retry/revision estimate ${ceiling.toolCalls}/${ceiling.readReserve}` : ""}`;
325
269
  return ceiling === undefined
326
270
  ? `${request.toolCalls}/${request.readReserve}, no retry/revision growth`
327
271
  : `${request.toolCalls}/${request.readReserve}, retry/revision ceiling ${ceiling.toolCalls}/${ceiling.readReserve}`;
@@ -335,8 +279,10 @@ export function formatEffectiveBudget(envelope: RunToolBudgetEnvelope): string {
335
279
  const enforcement =
336
280
  envelope.enforcement.classification === "external-one-shot"
337
281
  ? "external one-shot; per-tool unobserved/not enforced"
338
- : "native per-tool enforced";
339
- return `${budget.toolCalls}/${budget.readReserve}${revision}, lifetime cap ${budget.hardCap}, synthesis=${budget.synthesis ? "on" : "off"}; ${enforcement}`;
282
+ : envelope.enforcement.perTool === "advisory"
283
+ ? "native per-tool observed/advisory"
284
+ : "native per-tool enforced";
285
+ return `${budget.toolCalls}/${budget.readReserve}${revision}, ${budget.mode === "advisory" ? "advisory baseline" : "lifetime cap"} ${budget.hardCap}, synthesis=${budget.synthesis ? "on" : "off"}; ${enforcement}`;
340
286
  }
341
287
 
342
288
  export function formatBudgetReasons(envelope: RunToolBudgetEnvelope): string {
@@ -391,15 +337,17 @@ export function cloneRunToolBudgetEnvelope(value: unknown): RunToolBudgetEnvelop
391
337
  ) {
392
338
  return undefined;
393
339
  }
340
+ if (value.effective.mode !== undefined && value.effective.mode !== "advisory" && value.effective.mode !== "enforced")
341
+ return undefined;
394
342
  if (
395
343
  maximum.toolCalls < defaultPhase.toolCalls ||
396
344
  maximum.readReserve < defaultPhase.readReserve ||
397
345
  (value.policy.exact && !samePhase(maximum, defaultPhase)) ||
398
- effectivePhase.toolCalls > value.effective.hardCap ||
346
+ (value.effective.mode !== "advisory" && effectivePhase.toolCalls > value.effective.hardCap) ||
399
347
  value.effective.synthesis !== value.policy.default.synthesis ||
400
348
  (revision !== undefined &&
401
349
  (revision.toolCalls < effectivePhase.toolCalls ||
402
- revision.toolCalls > value.effective.hardCap ||
350
+ (value.effective.mode !== "advisory" && revision.toolCalls > value.effective.hardCap) ||
403
351
  (revision.toolCalls === effectivePhase.toolCalls && revision.readReserve <= effectivePhase.readReserve)))
404
352
  ) {
405
353
  return undefined;
@@ -443,6 +391,17 @@ export function cloneRunToolBudgetEnvelope(value: unknown): RunToolBudgetEnvelop
443
391
  clioControls: [...EXTERNAL_CLIO_CONTROLS],
444
392
  };
445
393
  }
394
+ if (
395
+ value.enforcement.classification === "native-per-tool" &&
396
+ value.enforcement.perTool === "advisory" &&
397
+ value.effective.mode === "advisory" &&
398
+ isExactStringArray(value.enforcement.clioControls, ADVISORY_CLIO_CONTROLS)
399
+ )
400
+ return {
401
+ classification: "native-per-tool" as const,
402
+ perTool: "advisory" as const,
403
+ clioControls: [...ADVISORY_CLIO_CONTROLS],
404
+ };
446
405
  if (
447
406
  value.enforcement.classification === "native-per-tool" &&
448
407
  value.enforcement.perTool === "enforced" &&
@@ -457,6 +416,11 @@ export function cloneRunToolBudgetEnvelope(value: unknown): RunToolBudgetEnvelop
457
416
  return null;
458
417
  })();
459
418
  if (enforcement === null) return undefined;
419
+ if (
420
+ enforcement.classification === "native-per-tool" &&
421
+ (enforcement.perTool === "advisory") !== (value.effective.mode === "advisory")
422
+ )
423
+ return undefined;
460
424
  return freezeEnvelope({
461
425
  version: 1,
462
426
  enforcement,
@@ -468,6 +432,7 @@ export function cloneRunToolBudgetEnvelope(value: unknown): RunToolBudgetEnvelop
468
432
  },
469
433
  request,
470
434
  effective: {
435
+ ...(value.effective.mode === undefined ? {} : { mode: value.effective.mode as "advisory" | "enforced" }),
471
436
  ...effectivePhase,
472
437
  synthesis: value.effective.synthesis,
473
438
  hardCap: value.effective.hardCap,