@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
@@ -17,7 +17,7 @@ import {
17
17
  type RunReceipt,
18
18
  type RunReceiptVerification,
19
19
  } from "../domains/dispatch/types.js";
20
- import { summarizeTrustStatus } from "../domains/evidence/trust-projection.js";
20
+ import { summarizeTrustStatus, trustStateWord } from "../domains/evidence/trust-projection.js";
21
21
  import {
22
22
  adaptRunReceiptTrustStatus,
23
23
  type CanonicalTrustStatus,
@@ -100,13 +100,19 @@ function listRuns(deps: MonitorToolDeps, options: ToolInvokeOptions | undefined)
100
100
 
101
101
  function runStatus(deps: MonitorToolDeps, runId: string): ToolResult {
102
102
  const requestedRun = deps.dispatch.getRun(runId);
103
- const rootRunId = requestedRun?.lineage?.rootRunId ?? runId;
104
- const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
103
+ const assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
104
+ const rootRunId = assignment?.assignmentId ?? requestedRun?.lineage?.rootRunId ?? runId;
105
105
  const resolvedRunId = assignment?.terminalRunId ?? runId;
106
106
  const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun;
107
107
  if (!run && !assignment) return { kind: "error", message: `monitor: unknown run or assignment '${runId}'` };
108
108
  if (!run) return { kind: "error", message: `monitor: assignment '${runId}' has no available attempt` };
109
- const live = deps.dispatch.snapshot().running.find((entry) => entry.lineage.rootRunId === rootRunId) ?? null;
109
+ const live =
110
+ deps.dispatch
111
+ .snapshot()
112
+ .running.find(
113
+ (entry) =>
114
+ (deps.dispatch.assignments?.getStored(entry.runId)?.assignmentId ?? entry.lineage.rootRunId) === rootRunId,
115
+ ) ?? null;
110
116
  const reroutes =
111
117
  run.reroutes !== undefined && run.reroutes.length > 0
112
118
  ? ` reroutes=${run.reroutes.map((hop) => `${hop.fromNode}>${hop.toNode}`).join(",")}`
@@ -142,11 +148,18 @@ function runStatus(deps: MonitorToolDeps, runId: string): ToolResult {
142
148
  `live: phase=${live.outcomePhase} heartbeat=${live.heartbeat} elapsed=${Math.round(live.elapsedMs / 1000)}s tokens=${live.tokens.total}`,
143
149
  );
144
150
  }
151
+ const trust = isTerminalRunEnvelope(run) ? summarizeTrustStatus(durableRunEvidence(run).trustStatus) : null;
152
+ if (trust)
153
+ lines.push(
154
+ `quality: ${trustStateWord("validationGrounding", trust.axes.validationGrounding)}`,
155
+ `trust: ${trust.text}`,
156
+ );
145
157
  return {
146
158
  kind: "ok",
147
159
  output: lines.join("\n"),
148
160
  details: {
149
161
  mode: "status",
162
+ ...(trust ? { trust } : {}),
150
163
  ...(assignment
151
164
  ? {
152
165
  assignmentId: assignment.assignmentId,
@@ -289,8 +302,7 @@ function receiptToolLines(receipt: RunReceipt): string[] {
289
302
  */
290
303
  function runTools(deps: MonitorToolDeps, runId: string): ToolResult {
291
304
  const requestedRun = deps.dispatch.getRun(runId);
292
- const rootRunId = requestedRun?.lineage?.rootRunId ?? runId;
293
- const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
305
+ const assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
294
306
  const resolvedRunId = assignment?.terminalRunId ?? runId;
295
307
  const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun ?? null;
296
308
  if (run === null && assignment === null) return { kind: "error", message: `monitor: unknown run '${runId}'` };
@@ -504,8 +516,8 @@ async function runWait(
504
516
  const startedAt = performance.now();
505
517
  let run = deps.dispatch.getRun(runId);
506
518
  if (!run) return { kind: "error", message: `monitor: unknown run '${runId}'` };
507
- const rootRunId = run.lineage?.rootRunId ?? runId;
508
- let assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
519
+ let assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
520
+ const rootRunId = assignment?.assignmentId ?? runId;
509
521
  while (assignment?.status === "running" || (assignment === null && !isTerminalRunEnvelope(run))) {
510
522
  if (signal?.aborted) return { kind: "error", message: "monitor: wait aborted" };
511
523
  const elapsed = Math.round(performance.now() - startedAt);
@@ -587,7 +599,11 @@ function collectRunLine(row: CollectedRunRow): string[] {
587
599
  lines.push(` ${workerTextLabel(row.evidence.trustStatus)}`);
588
600
  const output = row.evidence.output;
589
601
  if (output) {
590
- const capped = truncateUtf8(output.text, COLLECT_TEXT_BYTES, "...");
602
+ const capped = truncateUtf8(
603
+ output.text,
604
+ COLLECT_TEXT_BYTES,
605
+ `\n[preview clipped at ${COLLECT_TEXT_BYTES} bytes; the complete sealed text is output.text in ${row.run?.receiptPath ?? "the receipt"}]`,
606
+ );
591
607
  const qualifier = output.state === "partial" ? " (partial; the run did not complete this message)" : "";
592
608
  const truncatedNote = output.truncated ? ` (stored output truncated; full text was ${output.bytes} bytes)` : "";
593
609
  lines.push(` agent output${qualifier}${truncatedNote}:`, ...capped.split("\n").map((line) => ` ${line}`));
@@ -606,11 +622,10 @@ function collectRunLine(row: CollectedRunRow): string[] {
606
622
 
607
623
  function resolveCollectRow(deps: MonitorToolDeps, originalRunId: string, agentId: string): CollectRow {
608
624
  const original = deps.dispatch.getRun(originalRunId);
609
- const rootRunId = original?.lineage?.rootRunId ?? originalRunId;
610
625
  // The durable assignment record is written asynchronously at admission, so a
611
626
  // collect issued in that window sees none yet and reads the attempt directly.
612
627
  // terminalRunId is null while the assignment is still running.
613
- const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
628
+ const assignment = deps.dispatch.assignments?.getStored(originalRunId) ?? null;
614
629
  const runId = assignment?.terminalRunId ?? originalRunId;
615
630
  const run = deps.dispatch.getRun(runId) ?? original;
616
631
  return {
@@ -1,29 +1,16 @@
1
1
  /**
2
- * Per-process switch for the RETRIEVE plane, the only builtin plane that
3
- * leaves the machine.
4
- *
5
- * There is no per-run tool allowlist on the main-agent path: a headless
6
- * `clio-coder run` gets whatever `registerAllTools` registered, and the registry
7
- * answers an unregistered name with a `not_visible` verdict. So the existing
8
- * lever for "this run has no network" is registration itself, the same lever
9
- * that already keeps `ask_user` out of headless and worker registries. This
10
- * module carries the switch that lever reads.
11
- *
12
- * The channel is an environment variable because the process that needs the
13
- * policy is a child: the skill-eval harness spawns `clio-coder run` for each arm,
14
- * and any worker those runs dispatch is a grandchild. Env inherits down the
15
- * whole tree, so one setting at spawn time covers every registry built below
16
- * it (`src/tools/bootstrap.ts`, `src/engine/worker-tools.ts`) without a flag
17
- * threaded through four call layers.
18
- *
19
- * What this does not cover: a runtime that executes its own tool surface
20
- * outside Clio's mediation (an external CLI subprocess) never consults this
21
- * registry, so its network access is its own to answer for.
2
+ * Process-wide registration switch for the RETRIEVE tool plane (web_fetch).
3
+ * This removes retrieval tools from main and worker registries. It does not
4
+ * restrict bash, hooks, external CLIs, or provider traffic. Hermetic execution
5
+ * requires an OS network sandbox supplied by the operator or eval harness.
6
+ * The environment setting propagates to child registries without per-run wiring.
22
7
  */
8
+ export const NO_NETWORK_TOOLS_ENV = "CLIO_CODER_DISABLE_RETRIEVE_TOOLS";
23
9
 
24
- /** Set to "1" to strip network tools from every registry built in this process. */
25
- export const NO_NETWORK_TOOLS_ENV = "CLIO_CODER_NO_NETWORK_TOOLS";
26
-
10
+ /** Legacy spelling remains accepted for existing harnesses; neither is a sandbox. */
27
11
  export function networkToolsDisabled(env: NodeJS.ProcessEnv = process.env): boolean {
28
- return env[NO_NETWORK_TOOLS_ENV] === "1";
12
+ return env[NO_NETWORK_TOOLS_ENV] === "1" || env.CLIO_CODER_NO_NETWORK_TOOLS === "1";
29
13
  }
14
+
15
+ /** Operator process opt-in; never accepted from model arguments or project settings. */
16
+ export const WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV = "CLIO_CODER_WEB_FETCH_ALLOW_PRIVATE_NETWORK";
@@ -1,4 +1,6 @@
1
1
  import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
2
+ import { createSafetyPolicyEngine } from "../domains/safety/policy-engine.js";
3
+ import type { ImageContent } from "../engine/types.js";
2
4
  import type { ToolInvokeOptions, ToolResult } from "./registry.js";
3
5
  import { offloadPointer, writeToolOffload } from "./result-shaping.js";
4
6
  import { formatSize } from "./truncate.js";
@@ -337,6 +339,8 @@ export function observationBudgetExhausted(input: {
337
339
  }
338
340
 
339
341
  export interface ObservationInput {
342
+ images?: ImageContent[];
343
+ withheldPaths?: number;
340
344
  tool: string;
341
345
  unit: ObservationUnit;
342
346
  format?: ObservationFormat;
@@ -446,7 +450,10 @@ export function finalizeObservation(input: ObservationInput): ToolResult {
446
450
  }
447
451
  }
448
452
 
449
- const shownBytes = byteLength(output);
453
+ if ((input.withheldPaths ?? 0) > 0 && format === "text")
454
+ output += `\n\n[${input.withheldPaths} protected paths withheld by zero-access policy]`;
455
+ const shownBytes =
456
+ byteLength(output) + (input.images ?? []).reduce((bytes, image) => bytes + byteLength(image.data), 0);
450
457
  recordSpentBytes(input.reservation, shownBytes);
451
458
  const budget = budgetDetails(input.reservation);
452
459
  const observation: Observation = {
@@ -466,5 +473,35 @@ export function finalizeObservation(input: ObservationInput): ToolResult {
466
473
  ...(offloadPath !== null ? { offloadPath } : {}),
467
474
  ...(budget !== null ? { budget } : {}),
468
475
  };
469
- return { kind: "ok", output, details: { ...(input.details ?? {}), observation } };
476
+ return {
477
+ kind: "ok",
478
+ output,
479
+ ...(input.images?.length ? { images: input.images } : {}),
480
+ details: { ...(input.details ?? {}), observation },
481
+ };
482
+ }
483
+
484
+ /** Producers pass structured paths before rendering or offloading any content. */
485
+ export function createObservationPathFilter(
486
+ cwd = process.cwd(),
487
+ allowsPath?: (path: string) => boolean,
488
+ ): {
489
+ allows(path: string): boolean;
490
+ readonly withheldPaths: number;
491
+ } {
492
+ const policy = allowsPath ? undefined : createSafetyPolicyEngine({ cwd });
493
+ const allows =
494
+ allowsPath ??
495
+ ((path: string) => policy?.evaluate({ tool: "read", args: { path } }).reasonCode !== "path-policy:zeroAccessPaths");
496
+ const withheld = new Set<string>();
497
+ return {
498
+ allows(path) {
499
+ if (allows(path)) return true;
500
+ withheld.add(path);
501
+ return false;
502
+ },
503
+ get withheldPaths() {
504
+ return withheld.size;
505
+ },
506
+ };
470
507
  }
package/src/tools/read.ts CHANGED
@@ -1,8 +1,15 @@
1
1
  import { readFileSync, statSync } from "node:fs";
2
2
  import { Type } from "typebox";
3
+ import { detectSupportedImageMimeType, prepareBoundedImage } from "../core/file-references.js";
3
4
  import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
4
5
  import { ToolNames } from "../core/tool-names.js";
5
- import { finalizeObservation, observationBudgetExhausted, reserveObservation } from "./observation.js";
6
+ import {
7
+ commitObservationReservation,
8
+ finalizeObservation,
9
+ observationBudgetExhausted,
10
+ releaseObservation,
11
+ reserveObservation,
12
+ } from "./observation.js";
6
13
  import { resolveReadPath } from "./path-utils.js";
7
14
  import type { ToolResult, ToolSpec } from "./registry.js";
8
15
  import { isSessionOffloadPath } from "./result-shaping.js";
@@ -28,13 +35,35 @@ export function readMaxBytes(): number {
28
35
  return Math.max(MIN_READ_CAP_BYTES, resolveGuardrail("readMaxBytes"));
29
36
  }
30
37
 
38
+ // Number only an already bounded slice, retaining its explicit physical line
39
+ // count: a truncated slice ending in a blank line can look like a terminator.
40
+ function numberSourceLines(content: string, firstLine: number, lineCount: number): string {
41
+ return content
42
+ .split("\n")
43
+ .map((line, index) => (index < lineCount ? `${firstLine + index} | ${line}` : line))
44
+ .join("\n");
45
+ }
46
+
47
+ function numberedPrefixBytes(totalLines: number): number {
48
+ let bytes = totalLines * 3; // " | " after each decimal source line number.
49
+ for (let first = 1, digits = 1; first <= totalLines; first *= 10, digits++) {
50
+ bytes += (Math.min(totalLines + 1, first * 10) - first) * digits;
51
+ }
52
+ return bytes;
53
+ }
54
+
31
55
  export const readTool: ToolSpec = {
32
56
  name: ToolNames.Read,
33
- description: `Read a UTF-8 text file. Output is capped at ${DEFAULT_MAX_LINES} lines or ${
57
+ description: `Read a UTF-8 text file or a PNG, JPEG, GIF, or WebP image when the routed model supports vision. Output is capped at ${DEFAULT_MAX_LINES} lines or ${
34
58
  DEFAULT_READ_MAX_BYTES / 1024
35
- }KB per call; truncated results say how to continue with offset/limit. Pass tail=N to read the last N lines (jump to EOF) instead of paging from the top.`,
59
+ }KB per call; truncated results say how to continue with offset/limit. Pass tail=N to read the last N lines (jump to EOF) instead of paging from the top. Set line_numbers=true for citations: each source line is prefixed with its physical 1-based line number and " | "; these labels are not file content.`,
36
60
  parameters: Type.Object({
37
61
  path: Type.String({ description: "File path (relative or absolute)." }),
62
+ line_numbers: Type.Optional(
63
+ Type.Boolean({
64
+ description: "Display physical source line numbers for citations. Default false preserves plain text.",
65
+ }),
66
+ ),
38
67
  offset: Type.Optional(Type.Number({ description: "1-indexed start line." })),
39
68
  limit: Type.Optional(Type.Number({ description: "Max lines to read." })),
40
69
  tail: Type.Optional(
@@ -47,6 +76,7 @@ export const readTool: ToolSpec = {
47
76
  const pathArg = typeof args.path === "string" ? args.path : null;
48
77
  if (!pathArg) return { kind: "error", message: "read: missing path argument" };
49
78
  const filePath = resolveReadPath(pathArg);
79
+ const numbered = args.line_numbers === true;
50
80
  const offset = typeof args.offset === "number" && args.offset > 0 ? Math.floor(args.offset) : 1;
51
81
  const limit = typeof args.limit === "number" && args.limit > 0 ? Math.floor(args.limit) : null;
52
82
  const tail = typeof args.tail === "number" && args.tail > 0 ? Math.floor(args.tail) : null;
@@ -76,13 +106,44 @@ export const readTool: ToolSpec = {
76
106
  hint: "Use offset/limit in a follow-up turn or grep/find for a narrower section.",
77
107
  });
78
108
  }
79
- const content = readFileSync(filePath, "utf8");
109
+ const bytes = readFileSync(filePath);
110
+ if (detectSupportedImageMimeType(bytes) !== null) {
111
+ if (options?.supportsImages !== true)
112
+ return {
113
+ kind: "error",
114
+ message:
115
+ "IMAGE_INPUT_UNSUPPORTED: the routed model does not support image input. Choose a vision-capable model to inspect this file.",
116
+ };
117
+ const output = `Image: ${pathArg}`;
118
+ commitObservationReservation(reservation);
119
+ const image = await prepareBoundedImage(
120
+ bytes,
121
+ Math.min(reservation.callCapBytes, options.toolResultMaxBytes ?? readMaxBytes()) - Buffer.byteLength(output) - 512,
122
+ );
123
+ if (image === null)
124
+ return {
125
+ kind: "error",
126
+ message: "IMAGE_RESULT_TOO_LARGE: image could not be encoded within the tool result byte cap.",
127
+ };
128
+ return finalizeObservation({
129
+ tool: ToolNames.Read,
130
+ unit: "results",
131
+ output,
132
+ images: [image],
133
+ shownCount: 1,
134
+ totalCount: 1,
135
+ truncated: false,
136
+ reservation,
137
+ ...(options ? { options } : {}),
138
+ });
139
+ }
140
+ const content = bytes.toString("utf8");
80
141
  // Slice from the raw split (keeps the trailing newline on selections that
81
142
  // reach EOF); count lines honestly (a trailing "\n" is a terminator, not
82
143
  // a phantom extra line) so continuation notices never over-report by one.
83
144
  const allLines = content.split("\n");
84
145
  const totalLines = splitLinesForCounting(content).length;
85
- const totalBytes = Buffer.byteLength(content, "utf8");
146
+ const totalBytes = Buffer.byteLength(content, "utf8") + (numbered ? numberedPrefixBytes(totalLines) : 0);
86
147
  const startIndex = Math.min(offset - 1, totalLines);
87
148
  if (tail === null && offset > 1 && startIndex >= totalLines) {
88
149
  // The anchor matters for weak models: a bare "beyond end of file"
@@ -104,10 +165,26 @@ export const readTool: ToolSpec = {
104
165
  // the end (reusing truncateTail) so the very tail always survives.
105
166
  const startLine = Math.max(0, totalLines - tail);
106
167
  const tailContent = allLines.slice(startLine).join("\n");
107
- const truncation = truncateTail(tailContent, { maxBytes: cap, maxLines: tail });
168
+ const sourceTruncation = truncateTail(tailContent, { maxBytes: cap, maxLines: tail });
169
+ let truncation = sourceTruncation;
170
+ if (numbered) {
171
+ const numberedContent = numberSourceLines(
172
+ sourceTruncation.content,
173
+ totalLines - sourceTruncation.outputLines + 1,
174
+ sourceTruncation.outputLines,
175
+ );
176
+ truncation = truncateTail(numberedContent, { maxBytes: cap, maxLines: tail });
177
+ if (sourceTruncation.lastLinePartial || truncation.lastLinePartial) {
178
+ // Never return a tail fragment with a lost or fabricated complete
179
+ // line label. Keep the suffix within the cap and mark it partial.
180
+ const label = `${totalLines} | [partial line suffix] `;
181
+ const suffix = truncateTail(allLines[totalLines - 1] ?? "", { maxBytes: cap - Buffer.byteLength(label) });
182
+ truncation = { ...truncation, content: label + suffix.content, outputLines: 0, truncated: true };
183
+ }
184
+ }
108
185
  const shownLines = truncation.outputLines;
109
186
  const firstShown = Math.max(1, totalLines - shownLines + 1);
110
- const truncated = startLine > 0 || truncation.truncated;
187
+ const truncated = startLine > 0 || sourceTruncation.truncated || truncation.truncated;
111
188
  return finalizeObservation({
112
189
  tool: ToolNames.Read,
113
190
  unit: "lines",
@@ -116,19 +193,37 @@ export const readTool: ToolSpec = {
116
193
  totalCount: totalLines,
117
194
  totalBytes,
118
195
  truncated,
119
- ...(truncated ? { next: `offset=${Math.max(1, firstShown - shownLines)} limit=${shownLines}` } : {}),
196
+ ...(truncated && shownLines > 0
197
+ ? {
198
+ next: `offset=${Math.max(1, firstShown - shownLines)} limit=${shownLines}${numbered ? " line_numbers=true" : ""}`,
199
+ }
200
+ : {}),
120
201
  reservation,
121
202
  ...(options ? { options } : {}),
122
203
  });
123
204
  }
124
205
 
206
+ const endIndex = limit !== null ? Math.min(startIndex + limit, totalLines) : totalLines;
207
+ // Preserve the last selected source line's terminator when it exists.
208
+ // Joining a limited slice alone turns ["x", ""] into "x\n", which
209
+ // truncateHead counts as one line; [""] even becomes an empty file.
210
+ // The raw split's final entry tells us whether that newline is real,
211
+ // without inventing a line at EOF or changing shared text counting.
125
212
  const selected =
126
- limit !== null ? allLines.slice(startIndex, startIndex + limit).join("\n") : allLines.slice(startIndex).join("\n");
127
- const truncation: TruncationResult = truncateHead(selected, { maxBytes: cap });
213
+ allLines.slice(startIndex, endIndex).join("\n") + (endIndex > startIndex && endIndex < allLines.length ? "\n" : "");
214
+ const sourceTruncation = truncateHead(selected, { maxBytes: cap });
215
+ const truncation: TruncationResult =
216
+ numbered && !sourceTruncation.firstLineExceedsLimit
217
+ ? truncateHead(numberSourceLines(sourceTruncation.content, startIndex + 1, sourceTruncation.outputLines), {
218
+ maxBytes: cap,
219
+ })
220
+ : sourceTruncation;
128
221
  if (truncation.firstLineExceedsLimit) {
129
- const firstLineSize = formatSize(Buffer.byteLength(allLines[startIndex] ?? "", "utf8"));
130
- const linePrefix = truncateUtf8(allLines[startIndex] ?? "", cap, "\n[line truncated]");
131
- const output = `${linePrefix}\n\n[Line ${startIndex + 1} is ${firstLineSize}, exceeding the ${formatSize(cap)} read limit. Showing the UTF-8 prefix only. Use grep with a narrower literal/regex or edit with exact surrounding text; use shell access only when byte-level inspection is required.]`;
222
+ const label = numbered ? `${startIndex + 1} | ` : "";
223
+ const firstLineSize = formatSize(Buffer.byteLength(label + (allLines[startIndex] ?? ""), "utf8"));
224
+ const linePrefix =
225
+ label + truncateUtf8(allLines[startIndex] ?? "", cap - Buffer.byteLength(label), "\n[line truncated]");
226
+ const output = `${linePrefix}\n\n[${numbered ? "Numbered line" : "Line"} ${startIndex + 1} is ${firstLineSize}, exceeding the ${formatSize(cap)} read limit. Showing the UTF-8 prefix only. Use grep with a narrower literal/regex or edit with exact surrounding text; use shell access only when byte-level inspection is required.]`;
132
227
  return finalizeObservation({
133
228
  tool: ToolNames.Read,
134
229
  unit: "lines",
@@ -144,7 +239,7 @@ export const readTool: ToolSpec = {
144
239
  }
145
240
  const endDisplay = startIndex + truncation.outputLines;
146
241
  const moreAfter = endDisplay < totalLines;
147
- const truncated = truncation.truncated || (limit !== null && moreAfter);
242
+ const truncated = sourceTruncation.truncated || truncation.truncated || (limit !== null && moreAfter);
148
243
  return finalizeObservation({
149
244
  tool: ToolNames.Read,
150
245
  unit: "lines",
@@ -153,7 +248,7 @@ export const readTool: ToolSpec = {
153
248
  totalCount: totalLines,
154
249
  totalBytes,
155
250
  truncated,
156
- ...(truncated && moreAfter ? { next: `offset=${endDisplay + 1}` } : {}),
251
+ ...(truncated && moreAfter ? { next: `offset=${endDisplay + 1}${numbered ? " line_numbers=true" : ""}` } : {}),
157
252
  reservation,
158
253
  ...(options ? { options } : {}),
159
254
  });
@@ -167,6 +262,8 @@ export const readTool: ToolSpec = {
167
262
  };
168
263
  }
169
264
  return { kind: "error", message: `read: ${msg}` };
265
+ } finally {
266
+ releaseObservation(reservation);
170
267
  }
171
268
  },
172
269
  };
@@ -9,9 +9,10 @@ import {
9
9
  type SkillToolSurfaceViolation,
10
10
  } from "../core/skill-activation.js";
11
11
  import { type ToolName, ToolNames } from "../core/tool-names.js";
12
+ import { containsInstructionMarkers, INSTRUCTION_SHAPED_WARNING } from "../core/untrusted-content.js";
12
13
  import type { MiddlewareContract } from "../domains/middleware/contract.js";
13
14
  import type { MiddlewareEffect, MiddlewareHookInput, MiddlewareMetadataValue } from "../domains/middleware/types.js";
14
- import type { ActionClass, ClassifierCall } from "../domains/safety/action-classifier.js";
15
+ import { type ActionClass, type ClassifierCall, webFetchIsOutward } from "../domains/safety/action-classifier.js";
15
16
  import { approvalAxisId } from "../domains/safety/approval-axis.js";
16
17
  import {
17
18
  type AutonomyExposure,
@@ -26,6 +27,7 @@ import type { SafetyContract, SafetyDecision } from "../domains/safety/contract.
26
27
  import type { DecisionPresentation } from "../domains/safety/decision-presentation.js";
27
28
  import { hashToolCall } from "../domains/safety/loop-detector.js";
28
29
  import { detectValidationCommand } from "../domains/safety/protected-artifacts.js";
30
+ import type { ImageContent } from "../engine/types.js";
29
31
  import { askUserExposure } from "./ask-user.js";
30
32
  import { type DispatchPlanView, describeDispatchPlan } from "./dispatch-plan.js";
31
33
  import type { ToolPresentationPolicy } from "./presentation.js";
@@ -171,6 +173,8 @@ export type ToolResult =
171
173
  | {
172
174
  kind: "ok";
173
175
  output: string;
176
+ /** Bounded visual evidence accompanying the mandatory text result. */
177
+ images?: ImageContent[];
174
178
  details?: ToolResultDetails;
175
179
  /** Internal registry projection consumed only by the agent-tool adapter. */
176
180
  modelContext?: string;
@@ -214,6 +218,12 @@ export interface RegistryDeps {
214
218
  }
215
219
 
216
220
  export interface ToolInvokeOptions {
221
+ /** Registry-owned filter bound to the active compiled safety policy. */
222
+ allowsObservationPath?: (path: string) => boolean;
223
+ /** Trusted submitting host identity for nested dispatch; never model arguments. */
224
+ hostRun?: import("../domains/dispatch/contract.js").DispatchPreparationOptions["hostRun"];
225
+ /** Trusted resolved model capability; never read from tool arguments. */
226
+ supportsImages?: boolean;
217
227
  signal?: AbortSignal;
218
228
  runId?: string;
219
229
  sessionId?: string;
@@ -464,7 +474,12 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
464
474
  try {
465
475
  const preparedArgs = prepareToolArgs(spec, call.args ?? {});
466
476
  resultDisposition = resolveToolResultDisposition(spec, preparedArgs);
467
- const result = await spec.run(preparedArgs, options);
477
+ const { allowsObservationPath: _callerPathFilter, ...callerOptions } = options ?? {};
478
+ const allowsObservationPath = deps.safety.policy?.allowsObservationPath;
479
+ const result = await spec.run(preparedArgs, {
480
+ ...callerOptions,
481
+ ...(allowsObservationPath ? { allowsObservationPath } : {}),
482
+ });
468
483
  const digest = toolResultDigestFor(spec, result, resultDisposition, options);
469
484
  const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
470
485
  const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
@@ -583,10 +598,13 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
583
598
  ? (spec.describeDispatchPlan?.(call.args ?? {}) ?? describeDispatchPlan(call.args))
584
599
  : null;
585
600
  const planScale = dispatchPlan?.planScale === true;
586
- // The exposure tier rides on the args of the gate that raised it, so the
587
- // workflow author, not the classifier, decides what counts as outward.
588
- // ask_user is the only tool that declares one today.
589
- const exposure = call.tool === ToolNames.AskUser ? askUserExposure(call.args) : DEFAULT_AUTONOMY_EXPOSURE;
601
+ // Gates declare their tier; write-shaped HTTP requests send data outward.
602
+ const exposure =
603
+ call.tool === ToolNames.AskUser
604
+ ? askUserExposure(call.args)
605
+ : call.tool === ToolNames.WebFetch && webFetchIsOutward(call.args)
606
+ ? "outward"
607
+ : DEFAULT_AUTONOMY_EXPOSURE;
590
608
  const disposition = mapAutonomy(level, actionClass, {
591
609
  executeRecognized: decision.policy?.execRecognition !== "unrecognized",
592
610
  ...(planScale ? { dispatchPlanScale: true } : {}),
@@ -1030,10 +1048,8 @@ const HEADLESS_GUIDANCE_MAX_CHARS = 240;
1030
1048
  * model that hits an unrecognized-bash rail retries the same shape until the run
1031
1049
  * ends. An unrecognized execution decision carries the working form in its
1032
1050
  * reasons, and those reasons reach the audit record and the interactive approval
1033
- * overlay but not the model. The first reason states the axis the denial already
1034
- * implies, so only the reasons after it are candidates, and only the first of
1035
- * those, bounded: this is a nudge toward the recognized spelling, not a dump of
1036
- * the policy's reason list.
1051
+ * overlay but not the model. Preserve one bounded recovery hint separately
1052
+ * from the actual policy cause carried by the terminal denial below.
1037
1053
  */
1038
1054
  function headlessDenialGuidance(decision: SafetyDecision, reason: string): string | null {
1039
1055
  // Interactive denials are left exactly as they were: the operator saw the
@@ -1059,9 +1075,9 @@ function headlessDenialGuidance(decision: SafetyDecision, reason: string): strin
1059
1075
  * it with the standing pivot instruction.
1060
1076
  *
1061
1077
  * A headless answer is the exception: nobody will ever approve it, so the detail
1062
- * carries one line of recovery guidance after the denial sentence. The sentence
1063
- * stays the detail's prefix, which the skill-eval permission-wall recognizer
1064
- * depends on.
1078
+ * carries the policy cause and rule, a terminal settlement statement, and any
1079
+ * recovery guidance. The denial sentence stays the detail's prefix, which the
1080
+ * skill-eval permission-wall recognizer depends on.
1065
1081
  */
1066
1082
  function parkAnsweredBlockedVerdict(
1067
1083
  decision: SafetyDecision,
@@ -1069,12 +1085,25 @@ function parkAnsweredBlockedVerdict(
1069
1085
  reason: string,
1070
1086
  ): Extract<RegistryVerdict, { kind: "blocked" }> {
1071
1087
  const guidance = headlessDenialGuidance(decision, reason);
1088
+ const detail = [reason];
1089
+ if (reason.startsWith(HEADLESS_PERMISSION_DENIED_MARKER)) {
1090
+ if (decision.policy?.ruleId) detail.push(`rule: ${decision.policy.ruleId}`);
1091
+ const cause =
1092
+ decision.policy?.kind === "ask"
1093
+ ? decision.policy.reasons[0]
1094
+ : decision.kind === "allow"
1095
+ ? undefined
1096
+ : decision.rejection.short;
1097
+ if (cause) detail.push(cause);
1098
+ detail.push("This call was denied; no approval is pending.");
1099
+ if (guidance !== null) detail.push(guidance);
1100
+ }
1072
1101
  const blocked: SafetyDecision = {
1073
1102
  kind: "block",
1074
1103
  classification: decision.classification,
1075
1104
  rejection: {
1076
1105
  short: `${tool} blocked: ${decision.classification.actionClass} was not approved`,
1077
- detail: guidance === null ? reason : `${reason}\n${guidance}`,
1106
+ detail: detail.join("\n"),
1078
1107
  hints: [],
1079
1108
  },
1080
1109
  ...(decision.policy !== undefined ? { policy: decision.policy } : {}),
@@ -1206,6 +1235,10 @@ function buildToolHookInput(
1206
1235
  }
1207
1236
  if (call.tool !== spec.name) metadata.requestedToolName = call.tool;
1208
1237
  if (result !== undefined) {
1238
+ if (hook === "after_tool" && ["web_fetch", "read", "bash", "dispatch", "monitor"].includes(spec.name))
1239
+ metadata.untrustedInstructionMarkers = containsInstructionMarkers(
1240
+ result.kind === "ok" ? result.output : result.kind === "error" ? result.message : "",
1241
+ );
1209
1242
  metadata.resultKind = result.kind;
1210
1243
  if (result.kind === "error") metadata.errorMessage = result.message;
1211
1244
  if (result.kind === "ok" && result.terminate === true) metadata.terminate = true;
@@ -1259,14 +1292,18 @@ function firstBlockToolEffect(
1259
1292
  function applyToolResultEffects(result: ToolResult, effects: ReadonlyArray<MiddlewareEffect>): ToolResult {
1260
1293
  const annotations = annotationMessages(effects);
1261
1294
  if (annotations.length === 0) return result;
1262
- const suffix = `\n\n${annotations.join("\n")}`;
1295
+ const warning = `[middleware:warn] ${INSTRUCTION_SHAPED_WARNING}`;
1296
+ const prefix = annotations.includes(warning) ? `${warning}\n\n` : "";
1297
+ const remaining = annotations.filter((annotation) => annotation !== warning);
1298
+ const suffix = remaining.length > 0 ? `\n\n${remaining.join("\n")}` : "";
1263
1299
  if (result.kind === "ok") {
1264
- const annotated: ToolResult = { kind: "ok", output: `${result.output}${suffix}` };
1300
+ const annotated: ToolResult = { kind: "ok", output: `${prefix}${result.output}${suffix}` };
1265
1301
  if (result.details !== undefined) annotated.details = result.details;
1266
1302
  if (result.terminate === true) annotated.terminate = true;
1303
+ if (result.images !== undefined) annotated.images = result.images;
1267
1304
  return annotated;
1268
1305
  }
1269
- const annotated: ToolResult = { kind: "error", message: `${result.message}${suffix}` };
1306
+ const annotated: ToolResult = { kind: "error", message: `${prefix}${result.message}${suffix}` };
1270
1307
  if (result.details !== undefined) annotated.details = result.details;
1271
1308
  return annotated;
1272
1309
  }