@iowarp/clio-coder 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -13,13 +13,14 @@
13
13
  * below the payload is ever mutated, so a deep clone of the body about to be
14
14
  * replaced would only cost the pricing loop the body's size.
15
15
  *
16
- * Callers may pass raw ledger entries: only entries whose `turnId` is a key in
17
- * `view.evicted` change, and the view was already narrowed to the active path
18
- * by the fold, so an eviction recorded on an abandoned branch cannot reach a
19
- * live one (issue #94).
16
+ * Callers may pass raw ledger entries. Eviction bodies follow the active-path
17
+ * view; usage anchors preceding an eviction or selected compaction checkpoint
18
+ * are invalidated in projection. Live callers pass their selected leaf so an
19
+ * abandoned branch checkpoint cannot invalidate the current prompt's usage.
20
20
  */
21
21
 
22
22
  import type { MessageEntry, SessionEntry } from "../../session/entries.js";
23
+ import { filterEntriesToActivePath } from "../../session/tree/active-path.js";
23
24
  import type { EvictedState, WorkingSetView } from "./contract.js";
24
25
  import { hasThinking, isRecord, toolResultPayload, withoutThinkingBlocks } from "./payload.js";
25
26
 
@@ -110,9 +111,19 @@ function eventIndex(entries: ReadonlyArray<SessionEntry>, lastEvictionTurnId: st
110
111
  return index < 0 ? entries.length : index;
111
112
  }
112
113
 
113
- export function projectWorkingSet(entries: ReadonlyArray<SessionEntry>, view: WorkingSetView): SessionEntry[] {
114
- if (view.evicted.size === 0 && view.evictionEvents === 0) return [...entries];
115
- const cutoff = view.evictionEvents > 0 ? eventIndex(entries, view.lastEvictionTurnId) : -1;
114
+ export function projectWorkingSet(
115
+ entries: ReadonlyArray<SessionEntry>,
116
+ view: WorkingSetView,
117
+ activeLeafTurnId?: string,
118
+ ): SessionEntry[] {
119
+ // A checkpoint also replaces the prompt described by retained assistant
120
+ // usage. Invalidate that anchor only in projection; ledger cost stays exact.
121
+ const checkpoint = filterEntriesToActivePath(entries, activeLeafTurnId)
122
+ .reverse()
123
+ .find((entry) => entry.kind === "compactionSummary");
124
+ const compactionIndex = checkpoint ? entries.indexOf(checkpoint) : -1;
125
+ if (view.evicted.size === 0 && view.evictionEvents === 0 && compactionIndex < 0) return [...entries];
126
+ const cutoff = Math.max(compactionIndex, view.evictionEvents > 0 ? eventIndex(entries, view.lastEvictionTurnId) : -1);
116
127
  const out: SessionEntry[] = [];
117
128
  for (let index = 0; index < entries.length; index += 1) {
118
129
  const entry = entries[index];
@@ -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
  }
@@ -37,8 +37,12 @@ export function routeValidationProjection(
37
37
  // Presentation-only parentage stamped by the calling tool, on the same
38
38
  // terms: a model must not be able to author it.
39
39
  parentToolCallId,
40
+ // Sealed from the parent decision board by the dispatch tool; a model
41
+ // must not be able to author which decisions a receipt claims.
42
+ decisionRefs,
40
43
  resolvedVerification,
41
44
  resultContractOverride,
45
+ resultSummary,
42
46
  fleetGateReceipt,
43
47
  taskWorktree,
44
48
  runIdHint,
@@ -60,10 +64,12 @@ export function routeValidationProjection(
60
64
  ...(assignmentDeadlineAt !== undefined ? { assignmentDeadlineAt } : {}),
61
65
  ...(ledger !== undefined ? { ledger } : {}),
62
66
  ...(parentToolCallId !== undefined ? { parentToolCallId } : {}),
67
+ ...(decisionRefs !== undefined ? { decisionRefs } : {}),
63
68
  ...(resolvedVerification !== undefined
64
69
  ? { resolvedVerification: resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
65
70
  : {}),
66
71
  ...(resultContractOverride !== undefined ? { resultContractOverride } : {}),
72
+ ...(resultSummary !== undefined ? { resultSummary: { ...resultSummary } } : {}),
67
73
  ...(fleetGateReceipt !== undefined ? { fleetGateReceipt: { ...fleetGateReceipt } } : {}),
68
74
  ...(taskWorktree !== undefined ? { taskWorktree } : {}),
69
75
  ...(runIdHint !== undefined ? { runIdHint } : {}),
@@ -128,7 +134,7 @@ export function planActiveRoute(
128
134
  version: 1,
129
135
  decision,
130
136
  totalCostUpperBoundUsd: perAttemptUpperBoundUsd * input.maxAttempts,
131
- deadlineMs: input.request.routingIntent?.deadlineMs ?? 60_000,
137
+ deadlineMs: input.request.routingIntent?.deadlineMs ?? null,
132
138
  maxAttempts: input.maxAttempts,
133
139
  };
134
140
  assertApprovedAssignmentRoute(approval);
@@ -159,8 +165,9 @@ export function consumeActiveRouteApproval<T>(
159
165
  throw new Error("dispatch: active recovery requires a resolver-authenticated attempt decision");
160
166
  }
161
167
  const request = applyActiveRouteSelection(input.request, decision);
162
- if (input.request.lineage === undefined) {
163
- 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);
164
171
  }
165
172
  return { request, observation: input.observe(request, decision) };
166
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,