@iowarp/clio-coder 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (555) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
  5. package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
  17. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/{chunk-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  24. package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
  27. package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
  34. package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  43. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  66. package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
  79. package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
  80. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
  93. package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
  101. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
  135. package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
  137. package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
  139. package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/chunk-SD7SHNDW.js +15 -0
  141. package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
  154. package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  177. package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +44 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  195. package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
  198. package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
  206. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  207. package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
  208. package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
  212. package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
  213. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  214. package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
  215. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
  216. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  221. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
  229. package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
  230. package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
  231. package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
  232. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
  233. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  235. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
  239. package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
  241. package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
  242. package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
  243. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
  244. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  256. package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
  257. package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
  258. package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -88
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +7 -6
  267. package/docs/architecture/acp.md +10 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/context-engine.md +44 -59
  270. package/docs/architecture/context-working-set.md +7 -9
  271. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  272. package/docs/architecture/evidence-and-memory.md +10 -0
  273. package/docs/architecture/pi-boundary.md +37 -7
  274. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  275. package/docs/architecture/session-lifecycle.md +4 -4
  276. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  277. package/docs/guide/commands-and-modes.md +49 -36
  278. package/docs/guide/configuration-and-targets.md +7 -2
  279. package/docs/guide/configuration-reference.md +13 -3
  280. package/docs/guide/environment-variables.md +6 -2
  281. package/docs/guide/fleet-dispatch.md +12 -0
  282. package/docs/guide/installation-and-lifecycle.md +35 -9
  283. package/docs/guide/proactive-memory.md +1 -1
  284. package/docs/guide/skills-marketplace.md +11 -3
  285. package/docs/guide/tool-usage.md +9 -2
  286. package/docs/process/development-pipeline.md +10 -10
  287. package/docs/process/documentation-guide.md +2 -2
  288. package/docs/process/eval-runner.md +15 -0
  289. package/docs/process/evals-internal.md +1 -1
  290. package/docs/process/release-cut-checklist.md +6 -6
  291. package/evals/README.md +4 -0
  292. package/evals/behavioral-corpus-grader.mjs +147 -14
  293. package/evals/behavioral-model-negative-control.yaml +1 -0
  294. package/evals/behavioral-model.yaml +266 -1
  295. package/evals/fixtures/docs-retrieval.json +102 -0
  296. package/evals/fixtures/scalar-decision.json +17 -0
  297. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  298. package/evals/fixtures/source-explanation.json +74 -0
  299. package/evals/fixtures/tool-arguments.json +18 -0
  300. package/evals/fixtures/tool-surface/read.txt +4 -0
  301. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  302. package/evals/no-edit-memory-grader.mjs +149 -0
  303. package/evals/scalar-decision-grader.py +41 -0
  304. package/evals/scalar-decision-machinery.ts +145 -0
  305. package/evals/source-explanation-grader.mjs +118 -0
  306. package/evals/tool-surface-grader.mjs +53 -0
  307. package/evals/tool-surface-model.yaml +274 -0
  308. package/package.json +14 -14
  309. package/skills/README.md +6 -6
  310. package/skills/registry.yaml +1 -1
  311. package/skills/skill-marketplace.json +1 -1
  312. package/src/cli/bootstrap-generate.ts +6 -0
  313. package/src/cli/config-inspect.ts +24 -7
  314. package/src/cli/config-trust.ts +62 -0
  315. package/src/cli/config.ts +8 -0
  316. package/src/cli/context-map.ts +75 -14
  317. package/src/cli/context.ts +46 -17
  318. package/src/cli/eval.ts +17 -3
  319. package/src/cli/modes/print.ts +32 -4
  320. package/src/cli/run.ts +16 -14
  321. package/src/cli/skills-eval.ts +10 -8
  322. package/src/cli/steer-channel.ts +31 -18
  323. package/src/cli/targets.ts +83 -31
  324. package/src/cli/tasks.ts +10 -1
  325. package/src/cli/upgrade.ts +9 -6
  326. package/src/cli/usage.ts +24 -0
  327. package/src/cli/wiki-generate.ts +239 -96
  328. package/src/core/bash-exec.ts +43 -15
  329. package/src/core/bus-events.ts +15 -0
  330. package/src/core/config.ts +33 -14
  331. package/src/core/defaults.ts +5 -4
  332. package/src/core/file-references.ts +11 -1
  333. package/src/core/incomplete-installation.ts +3 -1
  334. package/src/core/settings-layers.ts +21 -5
  335. package/src/core/termination.ts +26 -9
  336. package/src/core/untrusted-content.ts +16 -0
  337. package/src/core/workspace-trust.ts +179 -0
  338. package/src/domains/agents/builtins/coder.md +4 -2
  339. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  340. package/src/domains/agents/builtins/documenter.md +7 -4
  341. package/src/domains/agents/builtins/researcher.md +1 -0
  342. package/src/domains/agents/builtins/scout.md +7 -1
  343. package/src/domains/agents/result-contract.ts +199 -26
  344. package/src/domains/context/bootstrap-prompt.ts +11 -9
  345. package/src/domains/context/bootstrap.ts +74 -39
  346. package/src/domains/context/clio-md.ts +88 -26
  347. package/src/domains/context/codewiki/build-operation.ts +121 -0
  348. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  349. package/src/domains/context/codewiki/build-worker.ts +3 -35
  350. package/src/domains/context/codewiki/coordinator.ts +36 -6
  351. package/src/domains/context/codewiki/indexer.ts +59 -19
  352. package/src/domains/context/contract.ts +6 -2
  353. package/src/domains/context/extension.ts +72 -10
  354. package/src/domains/context/fingerprint.ts +39 -34
  355. package/src/domains/context/index.ts +7 -1
  356. package/src/domains/context/prompt-context.ts +55 -14
  357. package/src/domains/context/refresh.ts +9 -57
  358. package/src/domains/context/wiki/assemble.ts +14 -10
  359. package/src/domains/context/wiki/evidence.ts +209 -0
  360. package/src/domains/context/wiki/generate.ts +201 -67
  361. package/src/domains/context/wiki/meta.ts +10 -2
  362. package/src/domains/context/wiki/plan-store.ts +70 -14
  363. package/src/domains/context/wiki/plan.ts +71 -14
  364. package/src/domains/context/wiki/prompts.ts +42 -1
  365. package/src/domains/context/wiki/source-content.ts +106 -0
  366. package/src/domains/context/wiki/staleness.ts +33 -22
  367. package/src/domains/context/working-set/contract.ts +8 -2
  368. package/src/domains/context/working-set/engine.ts +17 -4
  369. package/src/domains/context/working-set/fold.ts +15 -2
  370. package/src/domains/context/working-set/marker.ts +2 -1
  371. package/src/domains/context/working-set/project.ts +18 -7
  372. package/src/domains/context/working-set/recall.ts +82 -56
  373. package/src/domains/dispatch/active-route-planner.ts +6 -3
  374. package/src/domains/dispatch/admission-queue.ts +19 -7
  375. package/src/domains/dispatch/admission.ts +3 -3
  376. package/src/domains/dispatch/budget-envelope.ts +47 -82
  377. package/src/domains/dispatch/capacity-lease.ts +57 -19
  378. package/src/domains/dispatch/contract.ts +10 -2
  379. package/src/domains/dispatch/event-pump.ts +28 -7
  380. package/src/domains/dispatch/execution-role.ts +49 -2
  381. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  382. package/src/domains/dispatch/extension.ts +190 -105
  383. package/src/domains/dispatch/fleet-run.ts +20 -0
  384. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  385. package/src/domains/dispatch/parallel-writers.ts +34 -0
  386. package/src/domains/dispatch/reservation-store.ts +8 -34
  387. package/src/domains/dispatch/route-approval.ts +3 -3
  388. package/src/domains/dispatch/route-observer.ts +4 -2
  389. package/src/domains/dispatch/route-quality.ts +6 -1
  390. package/src/domains/dispatch/types.ts +4 -3
  391. package/src/domains/dispatch/worker-spawn.ts +58 -21
  392. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  393. package/src/domains/eval/compare/behavioral.ts +81 -14
  394. package/src/domains/eval/compare/compare.ts +15 -5
  395. package/src/domains/eval/compare/envelope.ts +12 -5
  396. package/src/domains/eval/metrics/context.ts +24 -1
  397. package/src/domains/eval/metrics/tracked.ts +4 -28
  398. package/src/domains/eval/reports/comparison.ts +9 -9
  399. package/src/domains/eval/runners/clio-run.ts +5 -1
  400. package/src/domains/eval/schema/suite.ts +2 -0
  401. package/src/domains/eval/schema/validate.ts +1 -0
  402. package/src/domains/eval/suites/run.ts +189 -13
  403. package/src/domains/eval/verifiers/integrity.ts +39 -0
  404. package/src/domains/eval/verifiers/patch.ts +58 -2
  405. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  406. package/src/domains/evidence/build.ts +4 -2
  407. package/src/domains/interop/registry.ts +2 -2
  408. package/src/domains/middleware/hooks-io.ts +45 -26
  409. package/src/domains/middleware/hooks.ts +6 -0
  410. package/src/domains/middleware/injection-screen.ts +23 -0
  411. package/src/domains/middleware/rules.ts +5 -1
  412. package/src/domains/middleware/stalled-turn.ts +18 -3
  413. package/src/domains/middleware/task-board-reminder.ts +4 -2
  414. package/src/domains/middleware/task-nudge.ts +4 -1
  415. package/src/domains/mux/contract.ts +34 -1
  416. package/src/domains/mux/dock-controller.ts +8 -1
  417. package/src/domains/mux/index.ts +1 -0
  418. package/src/domains/mux/socket-client.ts +13 -3
  419. package/src/domains/observability/contract.ts +2 -2
  420. package/src/domains/observability/projection.ts +30 -9
  421. package/src/domains/prompts/compiler.ts +10 -2
  422. package/src/domains/prompts/contract.ts +7 -4
  423. package/src/domains/prompts/extension.ts +28 -64
  424. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  425. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  426. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  427. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  428. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  429. package/src/domains/prompts/preload-prefix.ts +31 -0
  430. package/src/domains/prompts/preload.ts +135 -61
  431. package/src/domains/providers/auth/backend-file.ts +15 -11
  432. package/src/domains/providers/auth/storage.ts +3 -5
  433. package/src/domains/providers/catalog.ts +18 -3
  434. package/src/domains/providers/runtime-resolution.ts +11 -9
  435. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  436. package/src/domains/resources/skills/promotion.ts +8 -1
  437. package/src/domains/safety/action-classifier.ts +9 -0
  438. package/src/domains/safety/autonomy.ts +10 -1
  439. package/src/domains/safety/contract.ts +5 -1
  440. package/src/domains/safety/default-path-policy.ts +11 -0
  441. package/src/domains/safety/extension.ts +11 -2
  442. package/src/domains/safety/policy-engine.ts +189 -32
  443. package/src/domains/safety/project-policy.ts +7 -2
  444. package/src/domains/safety/workspace-trust.ts +43 -0
  445. package/src/domains/session/compaction/compact.ts +384 -21
  446. package/src/domains/session/compaction/cut-point.ts +42 -5
  447. package/src/domains/session/compaction/tokens.ts +9 -1
  448. package/src/domains/session/decision-board.ts +43 -33
  449. package/src/domains/session/entries.ts +169 -4
  450. package/src/domains/session/prompt-manifest.ts +47 -8
  451. package/src/domains/session/task-board.ts +21 -3
  452. package/src/domains/user-tasks/handoff.ts +16 -0
  453. package/src/engine/acp/adapter.ts +44 -12
  454. package/src/engine/acp/server.ts +1 -0
  455. package/src/engine/acp/transport.ts +2 -1
  456. package/src/engine/acp/types.ts +6 -1
  457. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  458. package/src/engine/api-registry.ts +19 -2
  459. package/src/engine/apis/openai-completions.ts +13 -6
  460. package/src/engine/apis/output-budget.ts +26 -10
  461. package/src/engine/claude/sdk-runtime.ts +4 -3
  462. package/src/engine/env-api-keys.ts +2 -1
  463. package/src/engine/external-subprocess.ts +14 -3
  464. package/src/engine/loop-guard.ts +19 -2
  465. package/src/engine/provider-diagnostics.ts +129 -0
  466. package/src/engine/provider-payload.ts +3 -1
  467. package/src/engine/worker-runtime.ts +13 -2
  468. package/src/engine/worker-tools.ts +5 -1
  469. package/src/entry/extension-reload.ts +1 -0
  470. package/src/entry/orchestrator.ts +53 -15
  471. package/src/interactive/chat-loop-messages.ts +12 -4
  472. package/src/interactive/chat-loop.ts +115 -45
  473. package/src/interactive/chat-renderer.ts +60 -0
  474. package/src/interactive/context-recall-command.ts +2 -1
  475. package/src/interactive/dispatch-board.ts +17 -2
  476. package/src/interactive/editor-submit.ts +13 -0
  477. package/src/interactive/interactive-application.ts +8 -2
  478. package/src/interactive/interactive-event-projection.ts +7 -1
  479. package/src/interactive/interactive-presentation.ts +15 -7
  480. package/src/interactive/interactive-slash-runtime.ts +2 -0
  481. package/src/interactive/layout.ts +2 -1
  482. package/src/interactive/model-session-replay.ts +2 -2
  483. package/src/interactive/overlay-frame.ts +1 -0
  484. package/src/interactive/overlay-general-openers.ts +3 -1
  485. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  486. package/src/interactive/overlays/ask-user.ts +1 -0
  487. package/src/interactive/overlays/message-picker.ts +1 -1
  488. package/src/interactive/renderers/tool-execution.ts +17 -1
  489. package/src/interactive/renderers/worker-entry.ts +25 -10
  490. package/src/interactive/slash-commands.ts +9 -7
  491. package/src/interactive/turn-context.ts +221 -53
  492. package/src/interactive/turn-middleware.ts +3 -1
  493. package/src/interactive/turn-persistence.ts +3 -0
  494. package/src/interactive/turn-runtime.ts +11 -2
  495. package/src/interactive/turn-state.ts +10 -9
  496. package/src/interactive/watch-pane.ts +18 -4
  497. package/src/interactive/worker-stream.ts +7 -7
  498. package/src/tools/agent-tools.ts +6 -3
  499. package/src/tools/bash.ts +1 -1
  500. package/src/tools/builtin-tool-catalog.ts +9 -2
  501. package/src/tools/codewiki/code-nav.ts +4 -10
  502. package/src/tools/compete-judge-task.ts +71 -0
  503. package/src/tools/compete-worktrees.ts +34 -0
  504. package/src/tools/context/index.ts +32 -7
  505. package/src/tools/context/surface.ts +15 -4
  506. package/src/tools/decide.ts +1 -1
  507. package/src/tools/dispatch-admission.ts +12 -1
  508. package/src/tools/dispatch-arguments.ts +38 -1
  509. package/src/tools/dispatch-plan.ts +7 -7
  510. package/src/tools/dispatch-runner.ts +48 -32
  511. package/src/tools/dispatch-schema.ts +30 -23
  512. package/src/tools/dispatch-scout-admission.ts +10 -44
  513. package/src/tools/dispatch-scout.ts +2 -3
  514. package/src/tools/find.ts +13 -4
  515. package/src/tools/grep.ts +13 -1
  516. package/src/tools/ls.ts +7 -1
  517. package/src/tools/monitor.ts +26 -11
  518. package/src/tools/network-policy.ts +11 -24
  519. package/src/tools/observation.ts +39 -2
  520. package/src/tools/read.ts +112 -15
  521. package/src/tools/registry.ts +54 -17
  522. package/src/tools/result-shaping.ts +110 -2
  523. package/src/tools/tasks.ts +33 -7
  524. package/src/tools/verify/frontend.ts +67 -30
  525. package/src/tools/verify/numeric.ts +6 -1
  526. package/src/tools/web-fetch-network.ts +179 -0
  527. package/src/tools/web-fetch-surface.ts +2 -1
  528. package/src/tools/web-fetch.ts +15 -13
  529. package/src/tools/worker-evidence.ts +27 -0
  530. package/src/worker/spec-contract.ts +12 -8
  531. package/dist/builtins-WGALA46I.js +0 -22
  532. package/dist/chunk-2WZ546HR.js +0 -792
  533. package/dist/chunk-5PSMVOLM.js +0 -56
  534. package/dist/chunk-EL24TAU4.js +0 -1560
  535. package/dist/chunk-IZXGRF7P.js +0 -4048
  536. package/dist/chunk-JVCV3ICN.js +0 -47
  537. package/dist/chunk-MNJGS2IN.js +0 -33
  538. package/dist/chunk-O5CVSAG5.js +0 -122
  539. package/dist/chunk-ODGTEFFI.js +0 -50
  540. package/dist/chunk-OQE5J4C6.js +0 -73
  541. package/dist/chunk-UUVG37B4.js +0 -244
  542. package/dist/chunk-V6HJFQZE.js +0 -228
  543. package/dist/clio-QLICPCF5.js +0 -25
  544. package/dist/configure-VEPX4NMX.js +0 -55
  545. package/dist/context-clear-S4ZJCQUX.js +0 -182
  546. package/dist/detail-A7JAVSIG.js +0 -98
  547. package/dist/evidence-4F5USFKH.js +0 -208
  548. package/dist/fleet-view-MN2VG4MR.js +0 -101
  549. package/dist/inventory-C26CFDRR.js +0 -101
  550. package/dist/preload-P6DGH2PZ.js +0 -13
  551. package/dist/slash-commands-ZXPJD64J.js +0 -92
  552. package/dist/tasks-IPAGMEIX.js +0 -36
  553. package/dist/tools-EFFEAIDP.js +0 -28
  554. package/dist/verify-FWYGPKMR.js +0 -29
  555. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -117,6 +117,15 @@ export function buildAgyArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv =
117
117
  "--disable-slash-commands",
118
118
  ];
119
119
  if (input.wireModelId.trim().length > 0) args.push("--model", input.wireModelId.trim());
120
+ if (typeof input.sessionId === "string" && input.sessionId.length > 0) {
121
+ if (Buffer.byteLength(input.sessionId, "utf8") > MAX_CONVERSATION_ID_BYTES) {
122
+ throw new Error(`Antigravity sessionId exceeded ${MAX_CONVERSATION_ID_BYTES} bytes`);
123
+ }
124
+ if (/\p{Cc}/u.test(input.sessionId)) {
125
+ throw new Error("Antigravity sessionId must not contain control characters");
126
+ }
127
+ args.push("--conversation", input.sessionId);
128
+ }
120
129
  return args;
121
130
  }
122
131
 
@@ -245,7 +254,12 @@ function emitTextDelta(emit: WorkerEventEmit, state: StreamState, delta: string)
245
254
  } as AgentEvent);
246
255
  }
247
256
 
248
- async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit, state: StreamState): Promise<void> {
257
+ async function readStream(
258
+ child: AntigravityChildProcess,
259
+ emit: WorkerEventEmit,
260
+ state: StreamState,
261
+ requestedConversationId: string | undefined,
262
+ ): Promise<void> {
249
263
  for await (const bounded of readBoundedLines(child.stdout, {
250
264
  maxLineBytes: ANTIGRAVITY_MAX_STREAM_LINE_BYTES,
251
265
  maxTotalBytes: ANTIGRAVITY_MAX_STREAM_BYTES,
@@ -272,6 +286,9 @@ async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit,
272
286
  break;
273
287
  }
274
288
  state.initSeen = true;
289
+ if (requestedConversationId && event.conversationId !== requestedConversationId) {
290
+ protocolFailure(state, "requested conversation was not resumed");
291
+ }
275
292
  state.conversationId = boundedConversationId(event.conversationId);
276
293
  if (event.model?.trim()) state.model = event.model.trim();
277
294
  break;
@@ -354,8 +371,7 @@ function buildAssistantMessage(input: {
354
371
  stopReason: input.aborted ? "aborted" : succeeded ? "stop" : "error",
355
372
  timestamp: Date.now(),
356
373
  } as AgentMessage & { role: "assistant" };
357
- // Opaque provider observation only. This runtime never accepts it as a
358
- // resumable Clio session id.
374
+ // Opaque provider observation only; callers must explicitly request resume.
359
375
  if (input.conversationId) message.responseId = input.conversationId;
360
376
  if (input.diagnostic) message.errorMessage = boundedExternalDiagnostic(input.diagnostic);
361
377
  return message;
@@ -414,7 +430,7 @@ export function startAntigravityWorkerRun(
414
430
  emit({ type: "agent_start" } as AgentEvent);
415
431
  try {
416
432
  const stderrPromise = readStderr(child);
417
- const stdoutPromise = readStream(child, emit, streamState).catch((cause) => {
433
+ const stdoutPromise = readStream(child, emit, streamState, input.sessionId).catch((cause) => {
418
434
  streamError = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
419
435
  terminator.terminate();
420
436
  });
@@ -27,6 +27,7 @@ import "@earendil-works/pi-ai/providers/images/register-builtins";
27
27
 
28
28
  import { getEngineEnvApiKey } from "./env-api-keys.js";
29
29
  import { engineModels } from "./models.js";
30
+ import { instrumentProviderCall } from "./provider-diagnostics.js";
30
31
 
31
32
  export interface EngineRegisteredApiProvider extends ProviderStreams {
32
33
  api: Api;
@@ -134,7 +135,7 @@ function hasCloudflareAuth(options?: StreamOptions): boolean {
134
135
  );
135
136
  }
136
137
 
137
- export function engineStream(
138
+ function dispatchEngineStream(
138
139
  model: Model<Api>,
139
140
  context: Context,
140
141
  options?: StreamOptions,
@@ -151,7 +152,7 @@ export function engineStream(
151
152
  return resolved(model.api).stream(model, context, withEnvApiKey(model, options));
152
153
  }
153
154
 
154
- export function engineStreamSimple(
155
+ function dispatchEngineStreamSimple(
155
156
  model: Model<Api>,
156
157
  context: Context,
157
158
  options?: SimpleStreamOptions,
@@ -168,6 +169,22 @@ export function engineStreamSimple(
168
169
  return resolved(model.api).streamSimple(model, context, withEnvApiKey(model, options));
169
170
  }
170
171
 
172
+ export function engineStream(
173
+ model: Model<Api>,
174
+ context: Context,
175
+ options?: StreamOptions,
176
+ ): AssistantMessageEventStream {
177
+ return instrumentProviderCall(model, options, (effective) => dispatchEngineStream(model, context, effective));
178
+ }
179
+
180
+ export function engineStreamSimple(
181
+ model: Model<Api>,
182
+ context: Context,
183
+ options?: SimpleStreamOptions,
184
+ ): AssistantMessageEventStream {
185
+ return instrumentProviderCall(model, options, (effective) => dispatchEngineStreamSimple(model, context, effective));
186
+ }
187
+
171
188
  export async function completeEngineSimple(
172
189
  model: Model<Api>,
173
190
  context: Context,
@@ -297,13 +297,14 @@ function withLiteLLMRouteFailureAdvice(
297
297
  (async () => {
298
298
  try {
299
299
  for await (const event of source) {
300
- if (event.type === "error") {
300
+ if (event.type === "error" && event.reason !== "aborted" && event.error.stopReason !== "aborted") {
301
301
  event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata.targetId, model.id);
302
302
  }
303
303
  advised.push(event as AssistantMessageEvent);
304
304
  }
305
305
  advised.end();
306
306
  } catch (err) {
307
+ if (err instanceof Error && err.name === "AbortError") throw err;
307
308
  const message = err instanceof Error ? err.message : String(err);
308
309
  throw new Error(liteLLMRouteFailureMessage(message, metadata.targetId, model.id));
309
310
  }
@@ -922,11 +923,17 @@ function guardMalformedToolCalls(
922
923
  (async () => {
923
924
  try {
924
925
  for await (const event of source) {
925
- if (event.type === "toolcall_end") {
926
- const required = requiredByTool.get(event.toolCall.name);
927
- if (required && hasEmptyArguments(event.toolCall.arguments)) {
928
- const message = malformedToolArgsMessage(model, event.toolCall.name, required);
929
- const error = finalErrorFromPartial(event.partial, message);
926
+ // The final stop reason distinguishes malformed output from a token
927
+ // limit. pi rejects every call in a length-truncated message (even
928
+ // salvage-parsed arguments) and continues with error tool results.
929
+ // Turning that into an error here aborts the worker before recovery.
930
+ if (event.type === "done" && event.message.stopReason !== "length") {
931
+ const malformed = event.message.content.find(
932
+ (block) => block.type === "toolCall" && requiredByTool.has(block.name) && hasEmptyArguments(block.arguments),
933
+ );
934
+ if (malformed?.type === "toolCall") {
935
+ const message = malformedToolArgsMessage(model, malformed.name, requiredByTool.get(malformed.name) ?? []);
936
+ const error = finalErrorFromPartial(event.message, message);
930
937
  guarded.push({ type: "error", reason: "error", error });
931
938
  guarded.end(error);
932
939
  return;
@@ -32,18 +32,38 @@ export function setGlobalDefaultMaxOutputTokens(value: number): void {
32
32
 
33
33
  /**
34
34
  * Tokens a preflight context check should hold back for the response: the
35
- * smaller of the model's advertised output limit and the default output
36
- * budget. The safety margin is deliberately not added here; at request time
35
+ * smaller of the model's advertised output limit and the configured output
36
+ * budget, falling back to the product default when no budget is configured.
37
+ * The safety margin is deliberately not added here; at request time
37
38
  * {@link remainingContextMaxTokens} subtracts it from the window and degrades
38
39
  * the output budget gracefully, so a hard preflight reservation of
39
40
  * limit + safety would compact earlier than the engine actually needs.
40
41
  */
41
- export function resolveReservedOutputTokens(maxOutputTokens?: number | null): number {
42
+ export function resolveReservedOutputTokens(
43
+ maxOutputTokens?: number | null,
44
+ request?: { api: string; contextWindow: number; inputTokens: number },
45
+ ): number {
46
+ const requested = globalDefaultMaxOutputTokens > 0 ? globalDefaultMaxOutputTokens : DEFAULT_MAX_OUTPUT_TOKENS;
42
47
  const limit =
43
48
  typeof maxOutputTokens === "number" && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0
44
49
  ? maxOutputTokens
45
- : DEFAULT_MAX_OUTPUT_TOKENS;
46
- return Math.min(limit, DEFAULT_MAX_OUTPUT_TOKENS);
50
+ : Number.POSITIVE_INFINITY;
51
+ const ceiling = Math.min(limit, requested);
52
+ // These Clio transports already reduce the wire ceiling to remaining room.
53
+ // Preflight must use that same allocation, rather than demanding room for
54
+ // the entire configured maximum (which may equal the context window).
55
+ // Other transports retain their existing reservation contract.
56
+ return request && (request.api === "openai-completions" || request.api === "ollama-native")
57
+ ? clampOutputToRemainingContext(ceiling, request.contextWindow, request.inputTokens)
58
+ : ceiling;
59
+ }
60
+
61
+ function clampOutputToRemainingContext(ceiling: number, contextWindow: number, inputTokens: number): number {
62
+ const available =
63
+ contextWindow > 0 && Number.isFinite(contextWindow)
64
+ ? Math.max(1, contextWindow - inputTokens - CONTEXT_BUDGET_SAFETY_TOKENS)
65
+ : Number.POSITIVE_INFINITY;
66
+ return Math.min(ceiling, available);
47
67
  }
48
68
 
49
69
  export function estimateInputTokensFromContext(context: Context): number {
@@ -59,15 +79,11 @@ export function remainingContextMaxTokens(
59
79
  options: Pick<StreamOptions, "maxTokens"> | undefined,
60
80
  limits?: { contextWindow?: number; maxOutputTokens?: number },
61
81
  ): number {
62
- const safety = CONTEXT_BUDGET_SAFETY_TOKENS;
63
82
  const inputTokens = estimateInputTokensFromContext(context);
64
83
  const configuredContextWindow = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;
65
84
  const loadedContextWindow =
66
85
  limits?.contextWindow !== undefined && limits.contextWindow > 0 ? limits.contextWindow : Number.POSITIVE_INFINITY;
67
86
  const contextWindow = Math.min(configuredContextWindow, loadedContextWindow);
68
- const budget = Number.isFinite(contextWindow)
69
- ? Math.max(1, contextWindow - inputTokens - safety)
70
- : Number.POSITIVE_INFINITY;
71
87
  const modelLimit = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
72
88
  // Precedence for the requested ceiling when the caller gave no explicit
73
89
  // maxTokens: a more-specific tool-turn limit, then the global default, then
@@ -84,6 +100,6 @@ export function remainingContextMaxTokens(
84
100
  ? modelLimit
85
101
  : DEFAULT_MAX_OUTPUT_TOKENS;
86
102
  const requested = options?.maxTokens ?? defaultLimit;
87
- const resolved = Math.min(requested, modelLimit, budget);
103
+ const resolved = clampOutputToRemainingContext(Math.min(requested, modelLimit), contextWindow, inputTokens);
88
104
  return Number.isFinite(resolved) ? resolved : DEFAULT_MAX_OUTPUT_TOKENS;
89
105
  }
@@ -314,7 +314,7 @@ export interface ClaudeWorkerBudgetGate {
314
314
  }
315
315
 
316
316
  /** Canonical call counter shared by the SDK's PreToolUse/canUseTool mediation seam. */
317
- function createClaudeWorkerBudgetGate(
317
+ export function createClaudeWorkerBudgetGate(
318
318
  budget: WorkerBudget,
319
319
  onBoundary: () => void,
320
320
  onHardCap: () => void,
@@ -330,6 +330,7 @@ function createClaudeWorkerBudgetGate(
330
330
  let admitted = 0;
331
331
  let locked = false;
332
332
  const phaseDecision = (canonicalToolName: string): { kind: "allow" } | { kind: "deny"; reason: string } => {
333
+ if (budget.mode === "advisory") return { kind: "allow" };
333
334
  const reserveAdmits = isReserveAdmittedTool(canonicalToolName, deliveryTools);
334
335
  if (locked || admitted >= budget.toolCalls) {
335
336
  // Same rule the native guard applies: the soft budget ends discovery,
@@ -365,7 +366,7 @@ function createClaudeWorkerBudgetGate(
365
366
  return {
366
367
  attempt(canonicalToolName) {
367
368
  attempts += 1;
368
- if (attempts > budget.hardCap) {
369
+ if (budget.mode !== "advisory" && attempts > budget.hardCap) {
369
370
  onHardCap();
370
371
  return { kind: "deny", reason: `workerToolCallCap reached (${budget.hardCap}); abort run` };
371
372
  }
@@ -381,7 +382,7 @@ function createClaudeWorkerBudgetGate(
381
382
  // Locking here is what ends the work phase. A delivery-capable agent is
382
383
  // not locked at its soft budget: it still owes the files it was
383
384
  // dispatched to write, and hardCap in attempt() is its bound.
384
- if (admitted >= budget.toolCalls && deliveryTools.length === 0) {
385
+ if (budget.mode !== "advisory" && admitted >= budget.toolCalls && deliveryTools.length === 0) {
385
386
  locked = true;
386
387
  onBoundary();
387
388
  }
@@ -12,6 +12,7 @@ const ENV_KEYS: Readonly<Record<string, string>> = {
12
12
  "ant-ling": "ANT_LING_API_KEY",
13
13
  "qwen-token-plan": "QWEN_TOKEN_PLAN_API_KEY",
14
14
  "qwen-token-plan-cn": "QWEN_TOKEN_PLAN_CN_API_KEY",
15
+ "qwen-token-plan-individual": "QWEN_TOKEN_PLAN_API_KEY",
15
16
  openai: "OPENAI_API_KEY",
16
17
  "azure-openai-responses": "AZURE_OPENAI_API_KEY",
17
18
  nvidia: "NVIDIA_API_KEY",
@@ -59,7 +60,7 @@ function apiKeyEnvVars(provider: string): readonly string[] | undefined {
59
60
  return name ? [name] : undefined;
60
61
  }
61
62
 
62
- /** Synchronous provider-key discovery pinned to pi-ai 0.84's public behavior. */
63
+ /** Synchronous provider-key discovery pinned to pi-ai 0.85's public behavior. */
63
64
  export function findEngineEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {
64
65
  const names = apiKeyEnvVars(provider);
65
66
  if (!names) return undefined;
@@ -1,4 +1,4 @@
1
- import type { ChildProcessByStdio } from "node:child_process";
1
+ import { type ChildProcessByStdio, spawn } from "node:child_process";
2
2
  import type { Readable } from "node:stream";
3
3
 
4
4
  import { boundedExternalDiagnostic } from "../core/external-diagnostic.js";
@@ -81,15 +81,18 @@ export interface ProcessTreeTerminator {
81
81
  cleanup(): void;
82
82
  }
83
83
 
84
- /** POSIX process-group termination with a direct-child fallback; Windows is direct-child only. */
84
+ /** POSIX process groups or Windows taskkill trees, with a direct-child fallback. */
85
85
  export function createProcessTreeTerminator(
86
86
  child: { pid?: number | undefined; exitCode: number | null; kill(signal?: NodeJS.Signals): boolean },
87
87
  graceMs = 1500,
88
+ options: { platform?: NodeJS.Platform; spawn?: typeof spawn } = {},
88
89
  ): ProcessTreeTerminator {
90
+ const platform = options.platform ?? process.platform;
91
+ const spawnKiller = options.spawn ?? spawn;
89
92
  let sent = false;
90
93
  let timer: ReturnType<typeof setTimeout> | null = null;
91
94
  const signal = (name: NodeJS.Signals): void => {
92
- if (child.pid && process.platform !== "win32") {
95
+ if (child.pid && platform !== "win32") {
93
96
  try {
94
97
  process.kill(-child.pid, name);
95
98
  return;
@@ -97,6 +100,14 @@ export function createProcessTreeTerminator(
97
100
  // The child may not have established its group yet.
98
101
  }
99
102
  }
103
+ if (platform === "win32" && child.pid !== undefined && Number.isSafeInteger(child.pid) && child.pid > 0) {
104
+ const args = ["/PID", String(child.pid), "/T", ...(name === "SIGKILL" ? ["/F"] : [])];
105
+ const killer = spawnKiller("taskkill.exe", args, { stdio: "ignore", windowsHide: true });
106
+ killer.once("error", () => {
107
+ if (child.exitCode === null) child.kill(name);
108
+ });
109
+ return;
110
+ }
100
111
  if (child.exitCode !== null) return;
101
112
  child.kill(name);
102
113
  };
@@ -441,6 +441,8 @@ export interface CreateLoopGuardRegistrationOptions {
441
441
  * operator who can intervene; workers do not).
442
442
  */
443
443
  toolCallCap?: number;
444
+ /** Observe estimated work without disabling tools; fault-loop detection remains active. */
445
+ toolBudgetAdvisory?: boolean;
444
446
  /**
445
447
  * Worker only: successful exploration attempts allowed before a graceful,
446
448
  * text-only synthesis phase. Unlike {@link toolCallCap}, crossing this soft
@@ -523,8 +525,10 @@ export interface LoopGuardRegistration extends MiddlewareHookRegistration {
523
525
 
524
526
  export function createLoopGuardRegistration(options: CreateLoopGuardRegistrationOptions): LoopGuardRegistration {
525
527
  const budget = options.turnBlockBudget ?? INTERACTIVE_LOOP_BLOCK_BUDGET;
526
- const cap = options.toolCallCap;
528
+ const cap = options.toolBudgetAdvisory ? undefined : options.toolCallCap;
529
+ let advisoryEmitted = false;
527
530
  let softLimit =
531
+ !options.toolBudgetAdvisory &&
528
532
  options.toolCallSoftLimit !== undefined &&
529
533
  Number.isSafeInteger(options.toolCallSoftLimit) &&
530
534
  options.toolCallSoftLimit > 0 &&
@@ -561,7 +565,8 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
561
565
  * has no cap and no bound here; it has an operator instead.
562
566
  */
563
567
  let deniedAttempts = 0;
564
- const denialBudget = cap === undefined ? undefined : Math.max(cap, WIDE_BATCH_DENIAL_FLOOR);
568
+ const denialBudget =
569
+ options.toolCallCap === undefined ? undefined : Math.max(options.toolCallCap, WIDE_BATCH_DENIAL_FLOOR);
565
570
  const boundRunDenials = (
566
571
  effects: ReadonlyArray<MiddlewareEffect>,
567
572
  input: MiddlewareHookInput,
@@ -948,6 +953,18 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
948
953
  recordSuccessfulResult(input);
949
954
  recordResultForStagnation(input);
950
955
  const effects = [...crossArgumentResultEffects(input)];
956
+ if (
957
+ options.toolBudgetAdvisory &&
958
+ !advisoryEmitted &&
959
+ count >= (options.toolCallSoftLimit ?? options.toolCallCap ?? Infinity)
960
+ ) {
961
+ advisoryEmitted = true;
962
+ effects.push({
963
+ kind: "annotate_tool_result",
964
+ message: `Advisory tool estimate reached (${count} calls). Reassess remaining work and finish the assignment; tools remain available. Explicit task requirements still apply.`,
965
+ severity: "warn",
966
+ });
967
+ }
951
968
  if (
952
969
  softReadReserveEntered &&
953
970
  softLockout === null &&
@@ -0,0 +1,129 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { closeSync, constants, fstatSync, openSync, writeFileSync } from "node:fs";
3
+ import { isAbsolute } from "node:path";
4
+ import type { Api, AssistantMessageEventStream, Model, StreamOptions } from "@earendil-works/pi-ai";
5
+ import { findEngineEnvKeys } from "./env-api-keys.js";
6
+
7
+ /** Process-owned opt-in reaches every native engine call, including prewarm and workers. */
8
+ export function instrumentProviderCall<T extends StreamOptions>(
9
+ model: Model<Api>,
10
+ options: T | undefined,
11
+ invoke: (options: T | undefined) => AssistantMessageEventStream,
12
+ ): AssistantMessageEventStream {
13
+ let effective = options;
14
+ if (model.api === "anthropic-messages" && options?.cacheRetention === undefined) {
15
+ const retention = process.env.CLIO_CODER_ANTHROPIC_CACHE_RETENTION;
16
+ if (retention !== undefined && retention !== "") {
17
+ if (retention !== "none" && retention !== "short" && retention !== "long") {
18
+ throw new Error("CLIO_CODER_ANTHROPIC_CACHE_RETENTION must be none, short, or long");
19
+ }
20
+ effective = { ...options, cacheRetention: retention } as T;
21
+ }
22
+ }
23
+ const path = process.env.CLIO_CODER_PROVIDER_DUMP_PATH;
24
+ if (!path) return invoke(effective);
25
+ const sink = openDump(path);
26
+ const payloads: unknown[] = [];
27
+ const redact = diagnosticSerializer(model, effective);
28
+ const callId = randomUUID();
29
+ const onPayload = effective?.onPayload;
30
+ const instrumented = {
31
+ ...effective,
32
+ onPayload: async (payload: unknown, currentModel: Model<Api>) => {
33
+ // Caller-owned thinking/tool/schema patches finish first. Snapshot now:
34
+ // providers and callbacks can retain or mutate their objects afterward.
35
+ const replacement = await onPayload?.(payload, currentModel);
36
+ try {
37
+ payloads.push(JSON.parse(redact(replacement === undefined ? payload : replacement)));
38
+ } catch {
39
+ payloads.push({ diagnosticError: "payload could not be serialized" });
40
+ }
41
+ return replacement;
42
+ },
43
+ } as T;
44
+ const finish = (terminal: { response: unknown } | { error: string }) => {
45
+ try {
46
+ writeFileSync(sink, `${redact({ callId, api: model.api, model: model.id, payloads, ...terminal })}\n`, "utf8");
47
+ } catch {
48
+ // Diagnostics must not turn a completed provider call into a retry or
49
+ // inject content into the ledger. Report only the sink failure category.
50
+ process.emitWarning("Provider diagnostic dump could not be written", { code: "CLIO_CODER_PROVIDER_DUMP_FAILED" });
51
+ } finally {
52
+ try {
53
+ closeSync(sink);
54
+ } catch {
55
+ process.emitWarning("Provider diagnostic dump could not be closed", { code: "CLIO_CODER_PROVIDER_DUMP_FAILED" });
56
+ }
57
+ }
58
+ };
59
+ try {
60
+ const stream = invoke(instrumented);
61
+ // result() observes the existing terminal promise; it never consumes the
62
+ // event iterator that the agent and durable ledger projection own.
63
+ void stream.result().then(
64
+ (response) => finish({ response }),
65
+ (error) => finish({ error: String(error) }),
66
+ );
67
+ return stream;
68
+ } catch (error) {
69
+ finish({ error: error instanceof Error ? error.message : String(error) });
70
+ throw error;
71
+ }
72
+ }
73
+
74
+ /** Refuse insecure existing files instead of silently changing their permissions. */
75
+ function openDump(path: string): number {
76
+ if (!isAbsolute(path)) throw new Error("CLIO_CODER_PROVIDER_DUMP_PATH must be an absolute file path");
77
+ const fd = openSync(
78
+ path,
79
+ constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND | constants.O_NOFOLLOW | constants.O_NONBLOCK,
80
+ 0o600,
81
+ );
82
+ try {
83
+ const stat = fstatSync(fd);
84
+ if (
85
+ !stat.isFile() ||
86
+ (stat.mode & 0o777) !== 0o600 ||
87
+ (process.getuid !== undefined && stat.uid !== process.getuid())
88
+ ) {
89
+ throw new Error("CLIO_CODER_PROVIDER_DUMP_PATH must be an operator-owned regular file with mode 0600");
90
+ }
91
+ return fd;
92
+ } catch (error) {
93
+ closeSync(fd);
94
+ throw error;
95
+ }
96
+ }
97
+
98
+ function diagnosticSerializer(model: Model<Api>, options: StreamOptions | undefined): (value: unknown) => string {
99
+ const secrets = new Set<string>();
100
+ const ambientKeys = (findEngineEnvKeys(model.provider, options?.env) ?? []).map(
101
+ (name) => options?.env?.[name] || process.env[name],
102
+ );
103
+ for (const key of [options?.apiKey, ...ambientKeys]) {
104
+ if (key && key !== "<authenticated>") secrets.add(key);
105
+ }
106
+ for (const headers of [options?.headers, model.headers]) {
107
+ for (const [key, value] of Object.entries(headers ?? {})) {
108
+ if (typeof value === "string" && value.length > 0 && /auth|api[-_]?key|cookie|token|secret/iu.test(key)) {
109
+ secrets.add(value);
110
+ const token = value.match(/^(?:Bearer|Basic)\s+(.+)$/iu)?.[1];
111
+ if (token) secrets.add(token);
112
+ }
113
+ }
114
+ }
115
+ return (value) => {
116
+ // This is a body-level diagnostic, never an HTTP/auth/options dump. Keep
117
+ // nested tool schemas intact, including tools with a parameter named headers.
118
+ const body =
119
+ typeof value === "object" && value !== null && !Array.isArray(value)
120
+ ? Object.fromEntries(
121
+ Object.entries(value).filter(([key]) => !/^(?:headers|env|apiKey|api_key|authorization)$/iu.test(key)),
122
+ )
123
+ : value;
124
+ let serialized = JSON.stringify(body);
125
+ if (serialized === undefined) serialized = "null";
126
+ for (const secret of secrets) serialized = serialized.replaceAll(JSON.stringify(secret).slice(1, -1), "[REDACTED]");
127
+ return serialized;
128
+ };
129
+ }
@@ -150,7 +150,9 @@ export function patchToolChoiceNamedPayload(
150
150
  if (Object.keys(outputConfig).length > 0) patched.output_config = outputConfig;
151
151
  else delete patched.output_config;
152
152
  }
153
- return { ...patched, tools, tool_choice: { type: "tool", name: toolName } };
153
+ // Keep the cacheable schema prefix intact. The request-level choice
154
+ // already identifies the required tool; narrowing changes it twice.
155
+ return { ...patched, tool_choice: { type: "tool", name: toolName } };
154
156
  }
155
157
  if (model.api === "google-generative-ai" || model.api === "google-vertex") {
156
158
  if (!isRecord(payload.config) || payload.config.tools === undefined || payload.config.tools === null)
@@ -215,6 +215,14 @@ function assistantMessageText(message: AgentMessage | undefined): string | null
215
215
  */
216
216
  function isTerminalAssistantMessage(message: AgentMessage | undefined): boolean {
217
217
  if (!isAssistantMessage(message)) return false;
218
+ // pi refuses truncated tool calls and continues with their error results.
219
+ // That turn has no final artifact/report to repair yet.
220
+ if (
221
+ message.stopReason === "length" &&
222
+ Array.isArray(message.content) &&
223
+ message.content.some((block) => block.type === "toolCall")
224
+ )
225
+ return false;
218
226
  return message.stopReason !== "toolUse" && message.stopReason !== "error";
219
227
  }
220
228
 
@@ -442,6 +450,7 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
442
450
  const loopGuardRegistration = createLoopGuardRegistration({
443
451
  safety,
444
452
  toolCallCap: workerBudget.hardCap,
453
+ toolBudgetAdvisory: workerBudget.mode === "advisory",
445
454
  toolCallSoftLimit: workerBudget.toolCalls,
446
455
  // A worker's blocks all land in one run-long bucket, so the bound on
447
456
  // them is a statement about this run's length, not about a turn.
@@ -600,6 +609,7 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
600
609
  invokeOptions: () => ({
601
610
  correlationId: `worker-model-round-${workerModelRound}`,
602
611
  toolResultMaxBytes: workerSettings.context.toolResultMaxBytes,
612
+ supportsImages: model.input.includes("image"),
603
613
  ...(agentSkillPolicy ? { pendingSkillPolicy: agentSkillPolicy } : {}),
604
614
  }),
605
615
  });
@@ -724,8 +734,9 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
724
734
  stopAfterToolResultCallId = null;
725
735
  }
726
736
  }
727
- const revisionToolsAvailable = resultContractRevisionActive && !synthesisToolLock;
728
- // A repair without preauthorized growth remains terminal and text-only.
737
+ const revisionToolsAvailable =
738
+ (workerBudget.mode === "advisory" || resultContractRevisionActive) && !synthesisToolLock;
739
+ // Legacy enforced budgets need preauthorized growth to retain repair tools.
729
740
  if (!revisionToolsAvailable) synthesisToolLock = true;
730
741
  // Delivered as a paired tool exchange, never a user turn. Templates
731
742
  // that key history rendering off the last `user` message re-render
@@ -114,7 +114,11 @@ export function createWorkerSafety(options: WorkerSafetyOptions = {}): SafetyCon
114
114
  },
115
115
  scopes: { readonly: READONLY_SCOPE, workspace: WORKSPACE_SCOPE, confirmed: CONFIRMED_SCOPE },
116
116
  isSubset,
117
- policy: { metadata: (posture) => policyEngine.metadata(posture) },
117
+ policy: {
118
+ metadata: (posture) => policyEngine.metadata(posture),
119
+ allowsObservationPath: (path) =>
120
+ policyEngine.evaluate({ tool: "read", args: { path } }).reasonCode !== "path-policy:zeroAccessPaths",
121
+ },
118
122
  audit: { recordCount: () => 0 },
119
123
  };
120
124
  }
@@ -125,6 +125,7 @@ export function createExtensionReloadCoordinator(deps: ExtensionReloadCoordinato
125
125
  workspaceRoot: workspace,
126
126
  ...(captured !== null ? { capturedSources: captured } : {}),
127
127
  recordReceipt: deps.recordReceipt,
128
+ report: deps.report,
128
129
  ...(deps.runCommand !== undefined ? { runCommand: deps.runCommand } : {}),
129
130
  ...(deps.now !== undefined ? { now: deps.now } : {}),
130
131
  });