@iowarp/clio-coder 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -1,17 +1,30 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import path from "node:path";
3
- import { resolveSafeCwd } from "../../core/safe-exec.js";
3
+ import { resolveSafeCwd, runCommandVector, type SafeCommandResult } from "../../core/safe-exec.js";
4
4
  import { declaredVerificationScripts, VERIFICATION_SCRIPT_FAMILY_HINT } from "../../core/verification-scripts.js";
5
5
  import type { ToolResult } from "../registry.js";
6
6
  import { runVectorTool } from "../safe-exec.js";
7
7
  import {
8
8
  type DeclaredCheck,
9
9
  type DeclaredCheckSource,
10
+ type DeclaredNumericCompare,
11
+ type DeclaredPerfBudget,
10
12
  loadProjectVerifierCatalog,
11
13
  PROJECT_VERIFIER_CATALOG_RELATIVE_PATH,
12
14
  packageDeclaredCheck,
13
15
  resolveProjectVerifierExecutionCwd,
14
16
  } from "./catalog.js";
17
+ import { compareNumeric, type NumericCompareReport, parseNumericPayload, renderNumericReport } from "./numeric.js";
18
+ import {
19
+ evaluatePerfBudget,
20
+ type PerfBaseline,
21
+ type PerfBudgetReport,
22
+ parsePerfBaseline,
23
+ renderPerfBaseline,
24
+ } from "./perf.js";
25
+
26
+ /** The structured verdict a numeric-compare or perf-budget check records beside the command facts. */
27
+ export type DeclaredCheckReport = NumericCompareReport | PerfBudgetReport;
15
28
 
16
29
  /**
17
30
  * Package scripts and the project catalog meet here as one canonical check
@@ -197,6 +210,7 @@ function withDeclaredEvidence(result: ToolResult, check: DeclaredCheck): ToolRes
197
210
  ...result.details,
198
211
  action: "verify",
199
212
  check: check.id,
213
+ kind: check.kind,
200
214
  source: { ...check.source },
201
215
  description: check.description,
202
216
  declaredCommand: [...check.command],
@@ -207,15 +221,228 @@ function withDeclaredEvidence(result: ToolResult, check: DeclaredCheck): ToolRes
207
221
  };
208
222
  }
209
223
 
224
+ /**
225
+ * The JSON object a numeric-compare command printed. The whole text is tried
226
+ * first; when the command also wrote diagnostics around it, the span from the
227
+ * first `{` to the last `}` is tried once more, so a preamble line does not
228
+ * turn a correct payload into a parse failure.
229
+ */
230
+ export function extractNumericPayloadText(output: string): string {
231
+ const trimmed = output.trim();
232
+ try {
233
+ JSON.parse(trimmed);
234
+ return trimmed;
235
+ } catch {
236
+ const start = trimmed.indexOf("{");
237
+ const end = trimmed.lastIndexOf("}");
238
+ return start >= 0 && end > start ? trimmed.slice(start, end + 1) : trimmed;
239
+ }
240
+ }
241
+
242
+ /** Read a repository-relative check file inside the workspace root, as text. */
243
+ function readCheckFile(workspaceRoot: string, relative: string, label: string): string | Error {
244
+ let resolved: string;
245
+ try {
246
+ resolved = resolveSafeCwd(relative, workspaceRoot);
247
+ } catch (error) {
248
+ return new Error(`${label} ${error instanceof Error ? error.message : String(error)}`);
249
+ }
250
+ if (!existsSync(resolved)) return new Error(`${label} '${relative}' does not exist`);
251
+ try {
252
+ return readFileSync(resolved, "utf8");
253
+ } catch (error) {
254
+ return new Error(`${label} '${relative}' cannot be read (${error instanceof Error ? error.message : String(error)})`);
255
+ }
256
+ }
257
+
258
+ /** Judge a numeric-compare command's stdout against reference text already read from disk. Pure. */
259
+ export function judgeNumericTexts(
260
+ stdout: string,
261
+ referenceText: string,
262
+ tolerance: DeclaredNumericCompare["tolerance"],
263
+ referenceLabel: string,
264
+ ): NumericCompareReport | Error {
265
+ const reference = parseNumericPayload(referenceText, referenceLabel);
266
+ if (reference instanceof Error) return reference;
267
+ const actual = parseNumericPayload(extractNumericPayloadText(stdout), "command output");
268
+ if (actual instanceof Error) return actual;
269
+ return compareNumeric(actual, reference, tolerance);
270
+ }
271
+
272
+ /** Judge a numeric-compare command's stdout against the declared reference under the workspace root. */
273
+ function judgeNumericCompare(
274
+ stdout: string,
275
+ numeric: DeclaredNumericCompare,
276
+ workspaceRoot: string,
277
+ ): NumericCompareReport | Error {
278
+ const referenceText = readCheckFile(workspaceRoot, numeric.reference, "reference");
279
+ if (referenceText instanceof Error) return referenceText;
280
+ return judgeNumericTexts(stdout, referenceText, numeric.tolerance, `reference '${numeric.reference}'`);
281
+ }
282
+
283
+ /** Judge a measured wall time against a budget, or against baseline text already read from disk. Pure. */
284
+ export function judgePerfTexts(
285
+ measuredMs: number,
286
+ perf: DeclaredPerfBudget,
287
+ baselineText: string | undefined,
288
+ baselineLabel: string,
289
+ ): PerfBudgetReport | Error {
290
+ let baseline: PerfBaseline | undefined;
291
+ if (perf.baseline !== undefined) {
292
+ if (baselineText === undefined) {
293
+ return new Error(`${baselineLabel} is missing; record it with \`clio-coder verifiers baseline <id>\``);
294
+ }
295
+ const parsed = parsePerfBaseline(baselineText, baselineLabel);
296
+ if (parsed instanceof Error) return parsed;
297
+ baseline = parsed;
298
+ }
299
+ return evaluatePerfBudget(measuredMs, {
300
+ ...(perf.budget !== undefined ? { budget: perf.budget } : {}),
301
+ ...(baseline !== undefined ? { baseline } : {}),
302
+ ...(perf.tolerance?.relative !== undefined ? { relative: perf.tolerance.relative } : {}),
303
+ });
304
+ }
305
+
306
+ /** Judge a measured wall time against the declared budget or the recorded baseline under the workspace root. */
307
+ function judgePerfBudget(
308
+ measuredMs: number,
309
+ perf: DeclaredPerfBudget,
310
+ workspaceRoot: string,
311
+ ): PerfBudgetReport | Error {
312
+ let baselineText: string | undefined;
313
+ if (perf.baseline !== undefined) {
314
+ const text = readCheckFile(workspaceRoot, perf.baseline, "baseline");
315
+ if (text instanceof Error) {
316
+ return new Error(`${text.message}; record it with \`clio-coder verifiers baseline <id>\``);
317
+ }
318
+ baselineText = text;
319
+ }
320
+ return judgePerfTexts(measuredMs, perf, baselineText, `baseline '${perf.baseline ?? ""}'`);
321
+ }
322
+
323
+ function commandFacts(result: SafeCommandResult): Record<string, unknown> {
324
+ return {
325
+ command: [result.file, ...result.args].join(" "),
326
+ argv: [result.file, ...result.args],
327
+ cwd: result.cwd,
328
+ exitCode: result.exitCode,
329
+ durationMs: result.durationMs,
330
+ aborted: result.aborted,
331
+ timedOut: result.timedOut,
332
+ outputCapped: result.outputCapped,
333
+ };
334
+ }
335
+
336
+ /**
337
+ * Run a numeric-compare or perf-budget check: the command through the same
338
+ * safe-exec spine as a command check, then the pure judgement. A command that
339
+ * exits non-zero, times out, or is aborted fails before any comparison, so a
340
+ * crashed validator never reads as a tolerance verdict.
341
+ */
342
+ async function runJudgedCheck(
343
+ check: DeclaredCheck,
344
+ file: string,
345
+ vector: ReadonlyArray<string>,
346
+ cwd: string,
347
+ options?: { signal?: AbortSignal },
348
+ ): Promise<ToolResult> {
349
+ let result: SafeCommandResult;
350
+ try {
351
+ result = await runCommandVector(file, vector, {
352
+ cwd,
353
+ timeoutMs: check.timeoutMs,
354
+ ...(options?.signal !== undefined ? { signal: options.signal } : {}),
355
+ });
356
+ } catch (error) {
357
+ return { kind: "error", message: `verify: ${error instanceof Error ? error.message : String(error)}` };
358
+ }
359
+ const facts = commandFacts(result);
360
+ const tail = `${result.stdout}${result.stderr}`.trim().slice(-2_000);
361
+ if (result.aborted) return { kind: "error", message: "verify: aborted", details: facts };
362
+ if (result.timedOut) return { kind: "error", message: `verify: timed out after ${check.timeoutMs}ms`, details: facts };
363
+ if (result.exitCode !== 0) {
364
+ return {
365
+ kind: "error",
366
+ message: `verify: ${check.kind} command exited with code ${result.exitCode ?? "?"} before judgement: ${tail}`,
367
+ details: facts,
368
+ };
369
+ }
370
+ const report =
371
+ check.kind === "numeric-compare" && check.numeric !== undefined
372
+ ? judgeNumericCompare(result.stdout, check.numeric, process.cwd())
373
+ : check.kind === "perf-budget" && check.perf !== undefined
374
+ ? judgePerfBudget(result.durationMs, check.perf, process.cwd())
375
+ : new Error(`declared check '${check.id}' has kind ${check.kind} without its parameters`);
376
+ if (report instanceof Error) return { kind: "error", message: `verify: ${report.message}`, details: facts };
377
+ const rendered = report.kind === "numeric-compare" ? renderNumericReport(report) : report.summary;
378
+ const details = { ...facts, report };
379
+ if (!report.passed) return { kind: "error", message: `verify: ${rendered}`, details };
380
+ return { kind: "ok", output: `${rendered}\n`, details };
381
+ }
382
+
210
383
  export async function runProjectCheck(check: DeclaredCheck, options?: { signal?: AbortSignal }): Promise<ToolResult> {
211
384
  const [file, ...vector] = check.command;
212
385
  if (file === undefined) return { kind: "error", message: `verify: declared check '${check.id}' has empty argv` };
213
386
  const cwd = resolveProjectVerifierExecutionCwd(check.cwd, process.cwd());
214
387
  if (cwd instanceof Error) return { kind: "error", message: `verify: ${cwd.message}` };
388
+ if (check.kind !== "command") {
389
+ return withDeclaredEvidence(await runJudgedCheck(check, file, vector, cwd, options), check);
390
+ }
215
391
  const result = await runVectorTool("verify", file, vector, { cwd, timeout_ms: check.timeoutMs }, options);
216
392
  return withDeclaredEvidence(result, check);
217
393
  }
218
394
 
395
+ /**
396
+ * Run a perf-budget check once and write its wall time as the baseline the
397
+ * check's `baseline` path names. The command must exit cleanly; a failed run
398
+ * records nothing, so a baseline never encodes a broken command's timing.
399
+ */
400
+ export async function recordPerfBaseline(
401
+ check: DeclaredCheck,
402
+ options?: { signal?: AbortSignal; now?: () => Date },
403
+ ): Promise<{ ok: true; path: string; wallTimeMs: number } | { ok: false; message: string }> {
404
+ if (check.kind !== "perf-budget" || check.perf?.baseline === undefined) {
405
+ return { ok: false, message: `check '${check.id}' is not a perf-budget check with a baseline path` };
406
+ }
407
+ const [file, ...vector] = check.command;
408
+ if (file === undefined) return { ok: false, message: `declared check '${check.id}' has empty argv` };
409
+ const cwd = resolveProjectVerifierExecutionCwd(check.cwd, process.cwd());
410
+ if (cwd instanceof Error) return { ok: false, message: cwd.message };
411
+ let result: SafeCommandResult;
412
+ try {
413
+ result = await runCommandVector(file, vector, {
414
+ cwd,
415
+ timeoutMs: check.timeoutMs,
416
+ ...(options?.signal !== undefined ? { signal: options.signal } : {}),
417
+ });
418
+ } catch (error) {
419
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
420
+ }
421
+ if (result.aborted || result.timedOut || result.exitCode !== 0) {
422
+ return {
423
+ ok: false,
424
+ message: `command ${result.timedOut ? "timed out" : result.aborted ? "was aborted" : `exited with code ${result.exitCode ?? "?"}`}; no baseline recorded`,
425
+ };
426
+ }
427
+ let target: string;
428
+ try {
429
+ target = resolveSafeCwd(check.perf.baseline, process.cwd());
430
+ } catch (error) {
431
+ return { ok: false, message: `baseline ${error instanceof Error ? error.message : String(error)}` };
432
+ }
433
+ const recordedAt = (options?.now?.() ?? new Date()).toISOString();
434
+ try {
435
+ mkdirSync(path.dirname(target), { recursive: true });
436
+ writeFileSync(target, renderPerfBaseline({ wallTimeMs: result.durationMs, check: check.id, recordedAt }), "utf8");
437
+ } catch (error) {
438
+ return {
439
+ ok: false,
440
+ message: `cannot write baseline '${check.perf.baseline}' (${error instanceof Error ? error.message : String(error)})`,
441
+ };
442
+ }
443
+ return { ok: true, path: check.perf.baseline, wallTimeMs: result.durationMs };
444
+ }
445
+
219
446
  export async function runScriptCheck(
220
447
  check: string,
221
448
  args: Record<string, unknown>,
@@ -0,0 +1,179 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { request as httpRequest } from "node:http";
3
+ import { request as httpsRequest } from "node:https";
4
+ import { BlockList, isIP } from "node:net";
5
+ import { Readable } from "node:stream";
6
+ import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
7
+ import { WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV } from "./network-policy.js";
8
+
9
+ const blocked = new BlockList();
10
+ for (const [address, prefix] of [
11
+ ["0.0.0.0", 8],
12
+ ["10.0.0.0", 8],
13
+ ["100.64.0.0", 10],
14
+ ["127.0.0.0", 8],
15
+ ["169.254.0.0", 16],
16
+ ["172.16.0.0", 12],
17
+ ["192.168.0.0", 16],
18
+ ["192.0.0.0", 24],
19
+ ["192.0.2.0", 24],
20
+ ["198.18.0.0", 15],
21
+ ["198.51.100.0", 24],
22
+ ["203.0.113.0", 24],
23
+ ["224.0.0.0", 4],
24
+ ["240.0.0.0", 4],
25
+ ] as const)
26
+ blocked.addSubnet(address, prefix, "ipv4");
27
+ // Permit only global unicast IPv6. Block transition mechanisms that can embed
28
+ // an IPv4 destination and local/documentation allocations within that range.
29
+ for (const [address, prefix] of [
30
+ ["2001::", 32],
31
+ ["2001:db8::", 32],
32
+ ["2002::", 16],
33
+ ] as const)
34
+ blocked.addSubnet(address, prefix, "ipv6");
35
+ const globalV6 = new BlockList();
36
+ globalV6.addSubnet("2000::", 3, "ipv6");
37
+ export function isPublicWebAddress(address: string): boolean {
38
+ const family = isIP(address);
39
+ if (family === 4) return !blocked.check(address, "ipv4");
40
+ return family === 6 && globalV6.check(address, "ipv6") && !blocked.check(address, "ipv6");
41
+ }
42
+
43
+ export class WebFetchNetworkError extends Error {
44
+ constructor(message: string) {
45
+ super(`WEB_FETCH_PRIVATE_NETWORK: ${message}`);
46
+ this.name = "WebFetchNetworkError";
47
+ }
48
+ }
49
+
50
+ interface Address {
51
+ address: string;
52
+ family: number;
53
+ }
54
+ export interface WebFetchNetworkDependencies {
55
+ resolve?: (hostname: string) => Promise<Address[]>;
56
+ request?: (url: URL, init: RequestInit, address: Address) => Promise<Response>;
57
+ allowPrivateNetwork?: boolean;
58
+ }
59
+
60
+ /** Pin the checked address in the socket lookup while retaining the URL host
61
+ * for Host, TLS SNI and certificate verification. No second DNS resolution,
62
+ * proxy, pooled socket, or automatic redirect can bypass admission. */
63
+ async function requestPinnedWebUrl(url: URL, init: RequestInit, address: Address): Promise<Response> {
64
+ return new Promise((resolve, reject) => {
65
+ const headers = new Headers(init.headers);
66
+ headers.delete("host");
67
+ const request = (url.protocol === "https:" ? httpsRequest : httpRequest)(
68
+ url,
69
+ {
70
+ method: init.method ?? "GET",
71
+ headers: Object.fromEntries(headers),
72
+ agent: false,
73
+ ...(init.signal ? { signal: init.signal } : {}),
74
+ lookup: (_hostname, options, callback) => {
75
+ if (options.all) callback(null, [address]);
76
+ else callback(null, address.address, address.family);
77
+ },
78
+ },
79
+ (response) => {
80
+ const responseHeaders = new Headers();
81
+ for (const [key, value] of Object.entries(response.headers)) {
82
+ if (value !== undefined) responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : value);
83
+ }
84
+ const status = response.statusCode ?? 500;
85
+ let stream: Readable = response;
86
+ const encoding = responseHeaders.get("content-encoding");
87
+ const decoder =
88
+ encoding === "gzip"
89
+ ? createGunzip()
90
+ : encoding === "br"
91
+ ? createBrotliDecompress()
92
+ : encoding === "deflate"
93
+ ? createInflate()
94
+ : null;
95
+ if (decoder) {
96
+ response.on("error", (error) => decoder.destroy(error));
97
+ decoder.on("close", () => response.destroy());
98
+ stream = response.pipe(decoder);
99
+ responseHeaders.delete("content-encoding");
100
+ responseHeaders.delete("content-length");
101
+ }
102
+ const noBody = init.method === "HEAD" || [204, 205, 304].includes(status);
103
+ if (noBody) response.resume();
104
+ const result = new Response(noBody ? null : (Readable.toWeb(stream) as ReadableStream<Uint8Array>), {
105
+ status,
106
+ statusText: response.statusMessage ?? "",
107
+ headers: responseHeaders,
108
+ });
109
+ Object.defineProperty(result, "url", { value: url.toString() });
110
+ resolve(result);
111
+ },
112
+ );
113
+ request.on("error", reject);
114
+ request.end(typeof init.body === "string" ? init.body : undefined);
115
+ });
116
+ }
117
+
118
+ /** DNS lookup itself is not cancellable; stop awaiting it on turn cancellation. */
119
+ async function abortableLookup(
120
+ pending: Promise<Address[]>,
121
+ signal: AbortSignal | null | undefined,
122
+ ): Promise<Address[]> {
123
+ if (!signal) return pending;
124
+ signal.throwIfAborted();
125
+ return new Promise((resolve, reject) => {
126
+ const onAbort = (): void => reject(signal.reason);
127
+ signal.addEventListener("abort", onAbort, { once: true });
128
+ pending.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
129
+ });
130
+ }
131
+
132
+ /** Every hop, including helper URLs, resolves and validates before connecting. */
133
+ export async function fetchWebUrl(
134
+ input: string | URL,
135
+ initial: RequestInit = {},
136
+ dependencies: WebFetchNetworkDependencies = {},
137
+ ): Promise<Response> {
138
+ let url = new URL(input);
139
+ const init = { ...initial, headers: new Headers(initial.headers) };
140
+ const allowPrivate = dependencies.allowPrivateNetwork ?? process.env[WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV] === "1";
141
+ for (let hop = 0; hop <= 10; hop++) {
142
+ init.signal?.throwIfAborted();
143
+ if (!["http:", "https:"].includes(url.protocol) || url.username || url.password)
144
+ throw new Error("web_fetch: unsupported URL scheme or embedded credentials");
145
+ const hostname = url.hostname.replace(/^\[|\]$/g, "");
146
+ const addresses = isIP(hostname)
147
+ ? [{ address: hostname, family: isIP(hostname) }]
148
+ : await abortableLookup((dependencies.resolve ?? ((host) => lookup(host, { all: true })))(hostname), init.signal);
149
+ init.signal?.throwIfAborted();
150
+ const address = addresses[0];
151
+ if (address === undefined) throw new Error("web_fetch: DNS returned no addresses");
152
+ if (!allowPrivate && addresses.some((address) => !isPublicWebAddress(address.address)))
153
+ throw new WebFetchNetworkError(
154
+ `destination ${url.hostname} is not public; operator opt-in ${WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV}=1 is required`,
155
+ );
156
+ const response = await (dependencies.request ?? requestPinnedWebUrl)(url, init, address);
157
+ const location = response.headers.get("location");
158
+ if (![301, 302, 303, 307, 308].includes(response.status) || location === null) return response;
159
+ await response.body?.cancel();
160
+ if (hop === 10) throw new Error("web_fetch: too many redirects");
161
+ const next = new URL(location, url);
162
+ if (next.origin !== url.origin) {
163
+ // Custom headers can carry credentials too. A cross-origin redirect gets
164
+ // no caller headers; the target still receives the ordinary Host header.
165
+ init.headers = new Headers();
166
+ }
167
+ if (
168
+ (response.status === 303 && init.method !== "HEAD") ||
169
+ ([301, 302].includes(response.status) && init.method === "POST")
170
+ ) {
171
+ init.method = "GET";
172
+ delete init.body;
173
+ init.headers.delete("content-type");
174
+ init.headers.delete("content-length");
175
+ }
176
+ url = next;
177
+ }
178
+ throw new Error("web_fetch: too many redirects");
179
+ }
@@ -4,7 +4,8 @@ import type { ToolSurface } from "./lazy-tool.js";
4
4
 
5
5
  export const webFetchToolSurface = {
6
6
  name: ToolNames.WebFetch,
7
- description: "Fetch an http(s) URL; HTML is cleaned and converted to Markdown. Non-2xx responses are errors.",
7
+ description:
8
+ "Fetch an http(s) URL; HTML is cleaned and converted to Markdown. Non-2xx responses are errors. Non-GET/HEAD methods or any body require outward-action approval; private networks require operator opt-in.",
8
9
  parameters: Type.Object({
9
10
  url: Type.String({ description: "Fully-qualified http(s) URL." }),
10
11
  method: Type.Optional(Type.String({ description: "HTTP method (default GET)." })),
@@ -1,5 +1,7 @@
1
+ import { UNTRUSTED_CONTENT_BANNER } from "../core/untrusted-content.js";
1
2
  import type { ToolResult, ToolSpec } from "./registry.js";
2
3
  import { truncateUtf8 } from "./truncate-utf8.js";
4
+ import { fetchWebUrl } from "./web-fetch-network.js";
3
5
  import { webFetchToolSurface } from "./web-fetch-surface.js";
4
6
 
5
7
  const DEFAULT_TIMEOUT_MS = 30_000;
@@ -374,7 +376,7 @@ async function fetchArxivPaperSummary(
374
376
  maxBytes: number,
375
377
  ): Promise<ToolResult | null> {
376
378
  const metadataUrl = `https://export.arxiv.org/api/query?id_list=${encodeURIComponent(paperId)}`;
377
- const response = await fetch(metadataUrl, init);
379
+ const response = await fetchWebUrl(metadataUrl, init);
378
380
  if (response.status < 200 || response.status >= 300) return null;
379
381
  const read = await readResponseText(response, Math.min(120_000, maxBytes));
380
382
  const entry = /<entry\b[^>]*>([\s\S]*?)<\/entry>/i.exec(read.text)?.[1];
@@ -384,7 +386,7 @@ async function fetchArxivPaperSummary(
384
386
  let alphaxivRead: ReadResult | null = null;
385
387
  const alphaUrl = `https://alphaxiv.org/overview/${encodeURIComponent(paperId)}.md`;
386
388
  try {
387
- const alpha = await fetch(alphaUrl, init);
389
+ const alpha = await fetchWebUrl(alphaUrl, init);
388
390
  if (alpha.status >= 200 && alpha.status < 300) {
389
391
  alphaxivRead = await readResponseText(alpha, Math.min(80_000, Math.max(0, maxBytes - read.bytesRead)));
390
392
  if (alphaxivRead.text.trim().length > 0) paper.alphaxivOverview = alphaxivRead.text.trim();
@@ -416,7 +418,7 @@ async function fetchArxivPaperSummary(
416
418
  const bytesRead = read.bytesRead + (alphaxivRead?.bytesRead ?? 0);
417
419
  return {
418
420
  kind: "ok",
419
- output: truncate(lines.join("\n"), maxBytes),
421
+ output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, maxBytes),
420
422
  details: {
421
423
  url: `https://arxiv.org/abs/${paper.id}`,
422
424
  status: 200,
@@ -437,7 +439,7 @@ async function fetchArxivApiSummary(
437
439
  init: Parameters<typeof fetch>[1],
438
440
  maxBytes: number,
439
441
  ): Promise<ToolResult | null> {
440
- const response = await fetch(url, init);
442
+ const response = await fetchWebUrl(url, init);
441
443
  if (response.status < 200 || response.status >= 300) return null;
442
444
  const read = await readResponseText(response, Math.min(240_000, maxBytes));
443
445
  const entries = Array.from(read.text.matchAll(/<entry\b[^>]*>([\s\S]*?)<\/entry>/gi))
@@ -469,7 +471,7 @@ async function fetchArxivApiSummary(
469
471
  }
470
472
  return {
471
473
  kind: "ok",
472
- output: truncate(lines.join("\n"), maxBytes),
474
+ output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, maxBytes),
473
475
  details: {
474
476
  url: url.toString(),
475
477
  status: 200,
@@ -553,7 +555,7 @@ async function fetchRepoTreeSummary(
553
555
  init: Parameters<typeof fetch>[1],
554
556
  maxBytes: number,
555
557
  ): Promise<ToolResult | null> {
556
- const apiResponse = await fetch(target.apiUrl, init);
558
+ const apiResponse = await fetchWebUrl(target.apiUrl, init);
557
559
  if (apiResponse.status < 200 || apiResponse.status >= 300) return null;
558
560
  const apiRead = await readResponseText(apiResponse, Math.min(200_000, maxBytes));
559
561
  let entries: unknown[];
@@ -581,7 +583,7 @@ async function fetchRepoTreeSummary(
581
583
  for (const file of files) {
582
584
  if (remaining <= 2000) break;
583
585
  const rawUrl = `${target.rawBaseUrl}/${file}`;
584
- const rawResponse = await fetch(rawUrl, init);
586
+ const rawResponse = await fetchWebUrl(rawUrl, init);
585
587
  if (rawResponse.status < 200 || rawResponse.status >= 300) continue;
586
588
  const rawRead = await readResponseText(rawResponse, Math.min(80_000, remaining));
587
589
  sections.push("", `--- ${file} ---`, rawRead.text.trim());
@@ -589,7 +591,7 @@ async function fetchRepoTreeSummary(
589
591
  }
590
592
  return {
591
593
  kind: "ok",
592
- output: truncate(sections.join("\n"), maxBytes),
594
+ output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${sections.join("\n")}`, maxBytes),
593
595
  details: {
594
596
  url: target.apiUrl,
595
597
  status: 200,
@@ -621,7 +623,7 @@ function formatOutput(args: {
621
623
  if (args.extracted.description) lines.push(`Description: ${args.extracted.description}`);
622
624
  if (args.extracted.canonical) lines.push(`Canonical: ${args.extracted.canonical}`);
623
625
  lines.push("", "Content:", args.extracted.content || "[empty]");
624
- return truncate(lines.join("\n"), args.maxBytes);
626
+ return truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, args.maxBytes);
625
627
  }
626
628
 
627
629
  export const webFetchTool: ToolSpec = {
@@ -683,10 +685,10 @@ export const webFetchTool: ToolSpec = {
683
685
  method,
684
686
  headers,
685
687
  signal: controller.signal,
686
- redirect: "follow",
688
+ redirect: "manual",
687
689
  };
688
690
  if (body !== undefined) init.body = body;
689
- if (method === "GET" && body === undefined && format !== "raw") {
691
+ if (method === "GET" && body === undefined && format !== "raw" && Object.keys(userHeaders).length === 0) {
690
692
  if (arxivApiUrl(parsed)) {
691
693
  const arxivApiSummary = await fetchArxivApiSummary(parsed, init, maxBytes);
692
694
  if (arxivApiSummary) return arxivApiSummary;
@@ -702,7 +704,7 @@ export const webFetchTool: ToolSpec = {
702
704
  if (repoSummary) return repoSummary;
703
705
  }
704
706
  }
705
- const response = await fetch(parsed, init);
707
+ const response = await fetchWebUrl(parsed, init);
706
708
  const contentType = headerValue(response, "content-type");
707
709
  const readLimit =
708
710
  response.status >= 200 && response.status < 300 ? maxBytes : Math.min(ERROR_PREVIEW_BYTES, maxBytes);
@@ -711,7 +713,7 @@ export const webFetchTool: ToolSpec = {
711
713
  const preview = extractWebFetchContent(read.text, contentType, response.url || parsed.toString(), "auto").content;
712
714
  return {
713
715
  kind: "error",
714
- message: `web_fetch: HTTP ${response.status}: ${response.statusText}${preview ? `\nPreview:\n${truncate(preview, ERROR_PREVIEW_BYTES)}` : ""}`,
716
+ message: `web_fetch: HTTP ${response.status}: ${response.statusText}${preview ? `\n${UNTRUSTED_CONTENT_BANNER}\nPreview:\n${truncate(preview, ERROR_PREVIEW_BYTES)}` : ""}`,
715
717
  };
716
718
  }
717
719
  if (isProbablyBinary(contentType, read.text)) {
@@ -1,4 +1,5 @@
1
1
  import { mentionsWorkerToolCallCap } from "../core/guardrails.js";
2
+ import { RESULT_SUMMARY_MAX_BYTES_CEILING, resultContractAuthorship } from "../domains/agents/result-contract.js";
2
3
  import {
3
4
  formatBudgetPolicy,
4
5
  formatBudgetReasons,
@@ -158,6 +159,7 @@ export function receiptEvidenceLabels(
158
159
  return [
159
160
  ...canonical,
160
161
  `receipt_integrity=verified/v${receipt.integrity.version}/${receipt.integrity.algorithm}`,
162
+ ...documenterDeliveryLabels(receipt),
161
163
  `evidence_verification=${verification.state}/${verification.basis}`,
162
164
  `host_verification=${receipt.hostVerification?.status ?? "not_requested"}`,
163
165
  ...(responseModelIdObservation ? [responseModelIdObservation] : []),
@@ -170,6 +172,31 @@ export function receiptEvidenceLabels(
170
172
  ];
171
173
  }
172
174
 
175
+ /** Delivery guidance uses only an authenticated, terminal mutation report. */
176
+ function documenterDeliveryLabels(receipt: RunReceipt): string[] {
177
+ if (
178
+ receipt.agentId !== "documenter" ||
179
+ !receipt.quality.resultContract?.sourceId.startsWith("agent-result-contract:mutation-report:")
180
+ )
181
+ return [];
182
+ const output = receipt.output;
183
+ // Read at the ceiling: the receipt already sealed conformance under the
184
+ // run's own allowance, which this reader does not know; any conforming
185
+ // summary is within the ceiling, and a reader that re-applied the default
186
+ // would report a delivered 20 KB summary as absent.
187
+ const summary =
188
+ output?.state === "final"
189
+ ? resultContractAuthorship(
190
+ { kind: "mutation-report", maxSummaryBytes: RESULT_SUMMARY_MAX_BYTES_CEILING },
191
+ output.text,
192
+ ).summary
193
+ : null;
194
+ return [
195
+ `terminal Documenter result: ${summary === null ? "no inline summary is available" : "the inline deliverable or limitation is in output.text JSON field summary"}. Execution success and contract conformance alone do not prove the requested explanation was delivered.`,
196
+ "Read the summary or the task-authorized artifact once and check it against the requested deliverable. If it is absent, incomplete, or states a limitation, report the specific limitation and the run ID; do not repeatedly read this unchanged terminal receipt or poll it for new output. Keep any separately authorized recovery and its outcome distinct from the original run.",
197
+ ];
198
+ }
199
+
173
200
  /**
174
201
  * The compact projection first, then the canonical axis line, both from the
175
202
  * shared projection so the dispatch and monitor text can never spell a state