@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
@@ -117,6 +117,15 @@ export function buildAgyArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv =
117
117
  "--disable-slash-commands",
118
118
  ];
119
119
  if (input.wireModelId.trim().length > 0) args.push("--model", input.wireModelId.trim());
120
+ if (typeof input.sessionId === "string" && input.sessionId.length > 0) {
121
+ if (Buffer.byteLength(input.sessionId, "utf8") > MAX_CONVERSATION_ID_BYTES) {
122
+ throw new Error(`Antigravity sessionId exceeded ${MAX_CONVERSATION_ID_BYTES} bytes`);
123
+ }
124
+ if (/\p{Cc}/u.test(input.sessionId)) {
125
+ throw new Error("Antigravity sessionId must not contain control characters");
126
+ }
127
+ args.push("--conversation", input.sessionId);
128
+ }
120
129
  return args;
121
130
  }
122
131
 
@@ -245,7 +254,12 @@ function emitTextDelta(emit: WorkerEventEmit, state: StreamState, delta: string)
245
254
  } as AgentEvent);
246
255
  }
247
256
 
248
- async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit, state: StreamState): Promise<void> {
257
+ async function readStream(
258
+ child: AntigravityChildProcess,
259
+ emit: WorkerEventEmit,
260
+ state: StreamState,
261
+ requestedConversationId: string | undefined,
262
+ ): Promise<void> {
249
263
  for await (const bounded of readBoundedLines(child.stdout, {
250
264
  maxLineBytes: ANTIGRAVITY_MAX_STREAM_LINE_BYTES,
251
265
  maxTotalBytes: ANTIGRAVITY_MAX_STREAM_BYTES,
@@ -272,6 +286,9 @@ async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit,
272
286
  break;
273
287
  }
274
288
  state.initSeen = true;
289
+ if (requestedConversationId && event.conversationId !== requestedConversationId) {
290
+ protocolFailure(state, "requested conversation was not resumed");
291
+ }
275
292
  state.conversationId = boundedConversationId(event.conversationId);
276
293
  if (event.model?.trim()) state.model = event.model.trim();
277
294
  break;
@@ -354,8 +371,7 @@ function buildAssistantMessage(input: {
354
371
  stopReason: input.aborted ? "aborted" : succeeded ? "stop" : "error",
355
372
  timestamp: Date.now(),
356
373
  } as AgentMessage & { role: "assistant" };
357
- // Opaque provider observation only. This runtime never accepts it as a
358
- // resumable Clio session id.
374
+ // Opaque provider observation only; callers must explicitly request resume.
359
375
  if (input.conversationId) message.responseId = input.conversationId;
360
376
  if (input.diagnostic) message.errorMessage = boundedExternalDiagnostic(input.diagnostic);
361
377
  return message;
@@ -414,7 +430,7 @@ export function startAntigravityWorkerRun(
414
430
  emit({ type: "agent_start" } as AgentEvent);
415
431
  try {
416
432
  const stderrPromise = readStderr(child);
417
- const stdoutPromise = readStream(child, emit, streamState).catch((cause) => {
433
+ const stdoutPromise = readStream(child, emit, streamState, input.sessionId).catch((cause) => {
418
434
  streamError = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
419
435
  terminator.terminate();
420
436
  });
@@ -27,6 +27,7 @@ import "@earendil-works/pi-ai/providers/images/register-builtins";
27
27
 
28
28
  import { getEngineEnvApiKey } from "./env-api-keys.js";
29
29
  import { engineModels } from "./models.js";
30
+ import { instrumentProviderCall } from "./provider-diagnostics.js";
30
31
 
31
32
  export interface EngineRegisteredApiProvider extends ProviderStreams {
32
33
  api: Api;
@@ -134,7 +135,7 @@ function hasCloudflareAuth(options?: StreamOptions): boolean {
134
135
  );
135
136
  }
136
137
 
137
- export function engineStream(
138
+ function dispatchEngineStream(
138
139
  model: Model<Api>,
139
140
  context: Context,
140
141
  options?: StreamOptions,
@@ -151,7 +152,7 @@ export function engineStream(
151
152
  return resolved(model.api).stream(model, context, withEnvApiKey(model, options));
152
153
  }
153
154
 
154
- export function engineStreamSimple(
155
+ function dispatchEngineStreamSimple(
155
156
  model: Model<Api>,
156
157
  context: Context,
157
158
  options?: SimpleStreamOptions,
@@ -168,6 +169,22 @@ export function engineStreamSimple(
168
169
  return resolved(model.api).streamSimple(model, context, withEnvApiKey(model, options));
169
170
  }
170
171
 
172
+ export function engineStream(
173
+ model: Model<Api>,
174
+ context: Context,
175
+ options?: StreamOptions,
176
+ ): AssistantMessageEventStream {
177
+ return instrumentProviderCall(model, options, (effective) => dispatchEngineStream(model, context, effective));
178
+ }
179
+
180
+ export function engineStreamSimple(
181
+ model: Model<Api>,
182
+ context: Context,
183
+ options?: SimpleStreamOptions,
184
+ ): AssistantMessageEventStream {
185
+ return instrumentProviderCall(model, options, (effective) => dispatchEngineStreamSimple(model, context, effective));
186
+ }
187
+
171
188
  export async function completeEngineSimple(
172
189
  model: Model<Api>,
173
190
  context: Context,
@@ -41,6 +41,7 @@ import { mergeSamplingOverride } from "./sampling-overrides.js";
41
41
  import type { EngineApiProvider } from "./types.js";
42
42
 
43
43
  const REASONING_CHARS_PER_TOKEN = 4;
44
+ const ownedModelsByTarget = new Map<string, Set<string>>();
44
45
 
45
46
  interface ClioRuntimeMetadata {
46
47
  clioCoder?: {
@@ -293,7 +294,10 @@ async function listResidentOllamaModels(client: OllamaEvictClient): Promise<Resi
293
294
  * weights release.
294
295
  */
295
296
  async function unloadOllamaModel(baseUrl: string, modelId: string, headers?: Record<string, string>): Promise<void> {
297
+ const owned = ownedModelsByTarget.get(residencyTargetKey("ollama-native", baseUrl));
298
+ if (!owned?.has(modelId)) return;
296
299
  await ollamaEvictClient(baseUrl, headers).generate({ model: modelId, prompt: "", keep_alive: 0, stream: false });
300
+ owned.delete(modelId);
297
301
  }
298
302
 
299
303
  function mapStopReason(reason: string | undefined, hadToolCall: boolean): AssistantMessage["stopReason"] {
@@ -466,8 +470,19 @@ function runStream(
466
470
  else emitText(segment.content);
467
471
  }
468
472
  };
473
+ let recordedOwnership = false;
469
474
  for await (const chunk of iterator) {
470
475
  const response = chunk as ChatResponse;
476
+ if (!recordedOwnership && model.baseUrl) {
477
+ const targetKey = residencyTargetKey("ollama-native", model.baseUrl);
478
+ let owned = ownedModelsByTarget.get(targetKey);
479
+ if (!owned) {
480
+ owned = new Set<string>();
481
+ ownedModelsByTarget.set(targetKey, owned);
482
+ }
483
+ owned.add(response.model || model.id);
484
+ recordedOwnership = true;
485
+ }
471
486
  const msg = response.message;
472
487
  if (msg?.thinking && msg.thinking.length > 0) {
473
488
  emitThinking(msg.thinking);
@@ -297,13 +297,14 @@ function withLiteLLMRouteFailureAdvice(
297
297
  (async () => {
298
298
  try {
299
299
  for await (const event of source) {
300
- if (event.type === "error") {
300
+ if (event.type === "error" && event.reason !== "aborted" && event.error.stopReason !== "aborted") {
301
301
  event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata.targetId, model.id);
302
302
  }
303
303
  advised.push(event as AssistantMessageEvent);
304
304
  }
305
305
  advised.end();
306
306
  } catch (err) {
307
+ if (err instanceof Error && err.name === "AbortError") throw err;
307
308
  const message = err instanceof Error ? err.message : String(err);
308
309
  throw new Error(liteLLMRouteFailureMessage(message, metadata.targetId, model.id));
309
310
  }
@@ -922,11 +923,17 @@ function guardMalformedToolCalls(
922
923
  (async () => {
923
924
  try {
924
925
  for await (const event of source) {
925
- if (event.type === "toolcall_end") {
926
- const required = requiredByTool.get(event.toolCall.name);
927
- if (required && hasEmptyArguments(event.toolCall.arguments)) {
928
- const message = malformedToolArgsMessage(model, event.toolCall.name, required);
929
- const error = finalErrorFromPartial(event.partial, message);
926
+ // The final stop reason distinguishes malformed output from a token
927
+ // limit. pi rejects every call in a length-truncated message (even
928
+ // salvage-parsed arguments) and continues with error tool results.
929
+ // Turning that into an error here aborts the worker before recovery.
930
+ if (event.type === "done" && event.message.stopReason !== "length") {
931
+ const malformed = event.message.content.find(
932
+ (block) => block.type === "toolCall" && requiredByTool.has(block.name) && hasEmptyArguments(block.arguments),
933
+ );
934
+ if (malformed?.type === "toolCall") {
935
+ const message = malformedToolArgsMessage(model, malformed.name, requiredByTool.get(malformed.name) ?? []);
936
+ const error = finalErrorFromPartial(event.message, message);
930
937
  guarded.push({ type: "error", reason: "error", error });
931
938
  guarded.end(error);
932
939
  return;
@@ -32,18 +32,38 @@ export function setGlobalDefaultMaxOutputTokens(value: number): void {
32
32
 
33
33
  /**
34
34
  * Tokens a preflight context check should hold back for the response: the
35
- * smaller of the model's advertised output limit and the default output
36
- * budget. The safety margin is deliberately not added here; at request time
35
+ * smaller of the model's advertised output limit and the configured output
36
+ * budget, falling back to the product default when no budget is configured.
37
+ * The safety margin is deliberately not added here; at request time
37
38
  * {@link remainingContextMaxTokens} subtracts it from the window and degrades
38
39
  * the output budget gracefully, so a hard preflight reservation of
39
40
  * limit + safety would compact earlier than the engine actually needs.
40
41
  */
41
- export function resolveReservedOutputTokens(maxOutputTokens?: number | null): number {
42
+ export function resolveReservedOutputTokens(
43
+ maxOutputTokens?: number | null,
44
+ request?: { api: string; contextWindow: number; inputTokens: number },
45
+ ): number {
46
+ const requested = globalDefaultMaxOutputTokens > 0 ? globalDefaultMaxOutputTokens : DEFAULT_MAX_OUTPUT_TOKENS;
42
47
  const limit =
43
48
  typeof maxOutputTokens === "number" && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0
44
49
  ? maxOutputTokens
45
- : DEFAULT_MAX_OUTPUT_TOKENS;
46
- return Math.min(limit, DEFAULT_MAX_OUTPUT_TOKENS);
50
+ : Number.POSITIVE_INFINITY;
51
+ const ceiling = Math.min(limit, requested);
52
+ // These Clio transports already reduce the wire ceiling to remaining room.
53
+ // Preflight must use that same allocation, rather than demanding room for
54
+ // the entire configured maximum (which may equal the context window).
55
+ // Other transports retain their existing reservation contract.
56
+ return request && (request.api === "openai-completions" || request.api === "ollama-native")
57
+ ? clampOutputToRemainingContext(ceiling, request.contextWindow, request.inputTokens)
58
+ : ceiling;
59
+ }
60
+
61
+ function clampOutputToRemainingContext(ceiling: number, contextWindow: number, inputTokens: number): number {
62
+ const available =
63
+ contextWindow > 0 && Number.isFinite(contextWindow)
64
+ ? Math.max(1, contextWindow - inputTokens - CONTEXT_BUDGET_SAFETY_TOKENS)
65
+ : Number.POSITIVE_INFINITY;
66
+ return Math.min(ceiling, available);
47
67
  }
48
68
 
49
69
  export function estimateInputTokensFromContext(context: Context): number {
@@ -59,15 +79,11 @@ export function remainingContextMaxTokens(
59
79
  options: Pick<StreamOptions, "maxTokens"> | undefined,
60
80
  limits?: { contextWindow?: number; maxOutputTokens?: number },
61
81
  ): number {
62
- const safety = CONTEXT_BUDGET_SAFETY_TOKENS;
63
82
  const inputTokens = estimateInputTokensFromContext(context);
64
83
  const configuredContextWindow = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;
65
84
  const loadedContextWindow =
66
85
  limits?.contextWindow !== undefined && limits.contextWindow > 0 ? limits.contextWindow : Number.POSITIVE_INFINITY;
67
86
  const contextWindow = Math.min(configuredContextWindow, loadedContextWindow);
68
- const budget = Number.isFinite(contextWindow)
69
- ? Math.max(1, contextWindow - inputTokens - safety)
70
- : Number.POSITIVE_INFINITY;
71
87
  const modelLimit = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
72
88
  // Precedence for the requested ceiling when the caller gave no explicit
73
89
  // maxTokens: a more-specific tool-turn limit, then the global default, then
@@ -84,6 +100,6 @@ export function remainingContextMaxTokens(
84
100
  ? modelLimit
85
101
  : DEFAULT_MAX_OUTPUT_TOKENS;
86
102
  const requested = options?.maxTokens ?? defaultLimit;
87
- const resolved = Math.min(requested, modelLimit, budget);
103
+ const resolved = clampOutputToRemainingContext(Math.min(requested, modelLimit), contextWindow, inputTokens);
88
104
  return Number.isFinite(resolved) ? resolved : DEFAULT_MAX_OUTPUT_TOKENS;
89
105
  }
@@ -314,7 +314,7 @@ export interface ClaudeWorkerBudgetGate {
314
314
  }
315
315
 
316
316
  /** Canonical call counter shared by the SDK's PreToolUse/canUseTool mediation seam. */
317
- function createClaudeWorkerBudgetGate(
317
+ export function createClaudeWorkerBudgetGate(
318
318
  budget: WorkerBudget,
319
319
  onBoundary: () => void,
320
320
  onHardCap: () => void,
@@ -330,6 +330,7 @@ function createClaudeWorkerBudgetGate(
330
330
  let admitted = 0;
331
331
  let locked = false;
332
332
  const phaseDecision = (canonicalToolName: string): { kind: "allow" } | { kind: "deny"; reason: string } => {
333
+ if (budget.mode === "advisory") return { kind: "allow" };
333
334
  const reserveAdmits = isReserveAdmittedTool(canonicalToolName, deliveryTools);
334
335
  if (locked || admitted >= budget.toolCalls) {
335
336
  // Same rule the native guard applies: the soft budget ends discovery,
@@ -365,7 +366,7 @@ function createClaudeWorkerBudgetGate(
365
366
  return {
366
367
  attempt(canonicalToolName) {
367
368
  attempts += 1;
368
- if (attempts > budget.hardCap) {
369
+ if (budget.mode !== "advisory" && attempts > budget.hardCap) {
369
370
  onHardCap();
370
371
  return { kind: "deny", reason: `workerToolCallCap reached (${budget.hardCap}); abort run` };
371
372
  }
@@ -381,7 +382,7 @@ function createClaudeWorkerBudgetGate(
381
382
  // Locking here is what ends the work phase. A delivery-capable agent is
382
383
  // not locked at its soft budget: it still owes the files it was
383
384
  // dispatched to write, and hardCap in attempt() is its bound.
384
- if (admitted >= budget.toolCalls && deliveryTools.length === 0) {
385
+ if (budget.mode !== "advisory" && admitted >= budget.toolCalls && deliveryTools.length === 0) {
385
386
  locked = true;
386
387
  onBoundary();
387
388
  }
@@ -1,17 +1,30 @@
1
1
  import { type ChildProcessByStdio, spawn } from "node:child_process";
2
- import { createInterface } from "node:readline";
3
- import type { Readable } from "node:stream";
2
+ import type { Readable, Writable } from "node:stream";
4
3
 
4
+ import { boundedExternalDiagnostic } from "../../core/external-diagnostic.js";
5
+ import { buildSafeToolEnv, resolveSafeCwd } from "../../core/safe-exec.js";
5
6
  import type { AutonomyLevel } from "../../domains/safety/autonomy.js";
6
7
  import { assertToolProfileEnforceable } from "../../tools/profiles.js";
7
- import { readStderr, waitForClose } from "../external-subprocess.js";
8
+ import { createProcessTreeTerminator, readBoundedLines, readStderr, waitForClose } from "../external-subprocess.js";
8
9
  import type { AgentEvent, AgentMessage, Usage } from "../types.js";
9
10
  import type { WorkerEventEmit, WorkerRunHandle, WorkerRunInput, WorkerRunResult } from "../worker-runtime.js";
10
11
  import { isClaudeCodeSessionId } from "./session-id.js";
11
12
 
12
13
  const READ_ONLY_CLAUDE_TOOLS = ["Read", "Grep", "Glob", "LS", "WebFetch", "WebSearch"] as const;
13
14
 
14
- type ClaudeChildProcess = ChildProcessByStdio<null, Readable, Readable>;
15
+ /** Official CLI binary, resolved from the operator's PATH. */
16
+ const CLAUDE_BINARY = "claude";
17
+ export const CLAUDE_MAX_STREAM_LINE_BYTES = 1024 * 1024;
18
+ export const CLAUDE_MAX_STREAM_BYTES = 8 * 1024 * 1024;
19
+
20
+ type ClaudeChildProcess = ChildProcessByStdio<Writable, Readable, Readable>;
21
+
22
+ export interface ClaudeRuntimeDependencies {
23
+ binary?: string;
24
+ workspaceRoot?: string;
25
+ environment?: NodeJS.ProcessEnv;
26
+ killGraceMs?: number;
27
+ }
15
28
 
16
29
  export interface ClaudeSubprocessPermissionConfig {
17
30
  permissionMode: "plan" | "dontAsk" | "acceptEdits" | "default" | "bypassPermissions";
@@ -48,15 +61,20 @@ export function claudeSubprocessPermissionConfigForAutonomy(
48
61
  return { permissionMode: "default", extraArgs: [], dangerousBypass: false };
49
62
  }
50
63
 
51
- function buildClaudeCodePrompt(input: WorkerRunInput): string {
64
+ export function buildClaudeCodePrompt(input: WorkerRunInput): string {
52
65
  const parts = (input.dynamicPromptMessages ?? []).map((message) => message.body.trim()).filter(Boolean);
53
66
  parts.push(input.task);
54
67
  return parts.join("\n\n");
55
68
  }
56
69
 
57
- function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
70
+ /**
71
+ * `claude -p` reads the user prompt from stdin when no positional prompt is
72
+ * given, so the prompt never appears in argv. The system prompt stays on
73
+ * `--append-system-prompt`: stdin carries only the user turn.
74
+ */
75
+ export function buildClaudeCodeArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv = process.env): string[] {
58
76
  assertToolProfileEnforceable(input.toolProfile, "claude-code");
59
- const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy);
77
+ const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy, gateEnv);
60
78
  const args = [
61
79
  "-p",
62
80
  "--output-format",
@@ -71,7 +89,6 @@ function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
71
89
  const systemPrompt = input.systemPrompt.trim();
72
90
  if (systemPrompt.length > 0) args.push("--append-system-prompt", systemPrompt);
73
91
  if (isClaudeCodeSessionId(input.sessionId)) args.push("--session-id", input.sessionId.trim());
74
- args.push(buildClaudeCodePrompt(input));
75
92
  return args;
76
93
  }
77
94
 
@@ -170,8 +187,11 @@ function buildAssistantMessage(input: {
170
187
  exitCode: number;
171
188
  aborted: boolean;
172
189
  stderr: string;
190
+ transportError?: string;
173
191
  }): AgentMessage & { role: "assistant" } {
174
- const errorMessage = input.exitCode === 0 ? "" : resultError(input.result, input.stderr);
192
+ const transportError = input.transportError ?? "";
193
+ const failed = input.exitCode !== 0 || transportError.length > 0;
194
+ const errorMessage = !failed ? "" : transportError || resultError(input.result, input.stderr);
175
195
  const message: AgentMessage & { role: "assistant" } = {
176
196
  role: "assistant",
177
197
  content: [{ type: "text", text: input.text }],
@@ -179,12 +199,12 @@ function buildAssistantMessage(input: {
179
199
  provider: "anthropic",
180
200
  model: input.model,
181
201
  usage: normalizeUsage(input.result?.usage, finite(input.result?.total_cost_usd)),
182
- stopReason: input.aborted ? "aborted" : input.exitCode === 0 ? "stop" : "error",
202
+ stopReason: input.aborted ? "aborted" : failed ? "error" : "stop",
183
203
  timestamp: Date.now(),
184
204
  } as AgentMessage & { role: "assistant" };
185
205
  if (typeof input.result?.request_id === "string") message.responseId = input.result.request_id;
186
206
  if (typeof input.result?.model === "string") message.responseModel = input.result.model;
187
- if (errorMessage.length > 0) message.errorMessage = errorMessage;
207
+ if (errorMessage.length > 0) message.errorMessage = boundedExternalDiagnostic(errorMessage);
188
208
  return message;
189
209
  }
190
210
 
@@ -224,9 +244,14 @@ async function readJsonLines(
224
244
  emit: WorkerEventEmit,
225
245
  state: { started: boolean; text: string; model: string; result: Record<string, unknown> | null },
226
246
  ): Promise<void> {
227
- const rl = createInterface({ input: child.stdout });
228
- for await (const line of rl) {
229
- const trimmed = line.trim();
247
+ for await (const bounded of readBoundedLines(child.stdout, {
248
+ maxLineBytes: CLAUDE_MAX_STREAM_LINE_BYTES,
249
+ maxTotalBytes: CLAUDE_MAX_STREAM_BYTES,
250
+ })) {
251
+ if (bounded.kind === "oversized") {
252
+ throw new Error(`claude stream-json line exceeded ${CLAUDE_MAX_STREAM_LINE_BYTES} bytes`);
253
+ }
254
+ const trimmed = bounded.line.trim();
230
255
  if (trimmed.length === 0) continue;
231
256
  let parsed: unknown;
232
257
  try {
@@ -250,12 +275,21 @@ async function readJsonLines(
250
275
  }
251
276
  }
252
277
 
253
- export function startClaudeCodeWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): WorkerRunHandle {
254
- const args = buildClaudeCodeArgs(input);
255
- const child = spawn("claude", args, {
256
- cwd: process.cwd(),
257
- env: process.env,
258
- stdio: ["ignore", "pipe", "pipe"],
278
+ export function startClaudeCodeWorkerRun(
279
+ input: WorkerRunInput,
280
+ emit: WorkerEventEmit,
281
+ dependencies: ClaudeRuntimeDependencies = {},
282
+ ): WorkerRunHandle {
283
+ const sourceEnv = dependencies.environment ?? process.env;
284
+ const args = buildClaudeCodeArgs(input, sourceEnv);
285
+ const prompt = buildClaudeCodePrompt(input);
286
+ const workspaceRoot = dependencies.workspaceRoot ?? process.cwd();
287
+ const cwd = resolveSafeCwd(input.cwd, workspaceRoot);
288
+ const child: ClaudeChildProcess = spawn(dependencies.binary ?? CLAUDE_BINARY, args, {
289
+ cwd,
290
+ env: buildSafeToolEnv({}, sourceEnv),
291
+ detached: process.platform !== "win32",
292
+ stdio: ["pipe", "pipe", "pipe"],
259
293
  });
260
294
  const streamState = {
261
295
  started: false,
@@ -264,53 +298,66 @@ export function startClaudeCodeWorkerRun(input: WorkerRunInput, emit: WorkerEven
264
298
  result: null as Record<string, unknown> | null,
265
299
  };
266
300
  let aborted = false;
267
- let killTimer: NodeJS.Timeout | null = null;
268
-
301
+ let settled = false;
302
+ let transportError = "";
303
+ const terminator = createProcessTreeTerminator(child, dependencies.killGraceMs ?? 1500);
269
304
  const abort = (): void => {
305
+ if (settled) return;
270
306
  aborted = true;
271
- if (child.killed) return;
272
- child.kill("SIGTERM");
273
- killTimer = setTimeout(() => {
274
- if (!child.killed) child.kill("SIGKILL");
275
- }, 1500);
307
+ terminator.terminate();
276
308
  };
277
- if (input.signal) {
278
- if (input.signal.aborted) abort();
279
- else input.signal.addEventListener("abort", abort, { once: true });
280
- }
309
+ const onAbort = (): void => abort();
310
+ if (input.signal?.aborted) abort();
311
+ else input.signal?.addEventListener("abort", onAbort, { once: true });
312
+ child.once("error", (cause) => {
313
+ transportError ||=
314
+ (cause as NodeJS.ErrnoException).code === "ENOENT"
315
+ ? "Claude Code CLI (`claude`) is not installed or not on PATH."
316
+ : cause.message;
317
+ });
318
+ child.stdin.on("error", (cause) => {
319
+ if (!aborted) transportError ||= `could not send prompt to Claude Code CLI: ${cause.message}`;
320
+ });
321
+ child.stdin.end(prompt);
281
322
 
282
323
  const promise = (async (): Promise<WorkerRunResult> => {
283
324
  emit({ type: "agent_start" } as AgentEvent);
284
- const stderrPromise = readStderr(child);
285
- const stdoutPromise = readJsonLines(child, emit, streamState);
286
- const exitCode = await waitForClose(child);
287
- await stdoutPromise.catch(() => {});
288
- const stderr = await stderrPromise.catch(() => "");
289
- if (killTimer) clearTimeout(killTimer);
290
- const finalText =
291
- streamState.text ||
292
- resultText(streamState.result) ||
293
- (exitCode === 0 ? "" : resultError(streamState.result, stderr));
294
- const finalMessage = buildAssistantMessage({
295
- model: streamState.model,
296
- text: finalText,
297
- result: streamState.result,
298
- exitCode,
299
- aborted,
300
- stderr,
301
- });
302
- if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
303
- emit({ type: "message_end", message: finalMessage } as AgentEvent);
304
- const messages: AgentMessage[] = [finalMessage];
305
- emit({ type: "agent_end", messages } as AgentEvent);
306
- if (exitCode !== 0 && stderr.trim().length > 0 && !aborted) {
307
- process.stderr.write(`[worker:claude-code] ${stderr.trim()}\n`);
325
+ try {
326
+ const stderrPromise = readStderr(child);
327
+ const stdoutPromise = readJsonLines(child, emit, streamState).catch((cause) => {
328
+ transportError ||= cause instanceof Error ? cause.message : String(cause);
329
+ terminator.terminate();
330
+ });
331
+ const exitCode = await waitForClose(child);
332
+ await stdoutPromise;
333
+ const stderr = await stderrPromise.catch(() => "");
334
+ const finalText =
335
+ streamState.text ||
336
+ resultText(streamState.result) ||
337
+ (exitCode === 0 ? "" : resultError(streamState.result, stderr));
338
+ const finalMessage = buildAssistantMessage({
339
+ model: streamState.model,
340
+ text: finalText,
341
+ result: streamState.result,
342
+ exitCode,
343
+ aborted,
344
+ stderr,
345
+ transportError,
346
+ });
347
+ if (!streamState.started) emit({ type: "message_start", message: finalMessage } as AgentEvent);
348
+ emit({ type: "message_end", message: finalMessage } as AgentEvent);
349
+ const messages: AgentMessage[] = [finalMessage];
350
+ emit({ type: "agent_end", messages } as AgentEvent);
351
+ if (finalMessage.stopReason === "error" && finalMessage.errorMessage && !aborted) {
352
+ process.stderr.write(`[worker:claude-code] ${finalMessage.errorMessage}\n`);
353
+ }
354
+ return { messages, exitCode: finalMessage.stopReason === "stop" ? 0 : 1 };
355
+ } finally {
356
+ settled = true;
357
+ terminator.cleanup();
358
+ input.signal?.removeEventListener("abort", onAbort);
308
359
  }
309
- return { messages, exitCode: exitCode === 0 ? 0 : 1 };
310
360
  })();
311
361
 
312
- return {
313
- promise,
314
- abort,
315
- };
362
+ return { promise, abort };
316
363
  }
@@ -12,6 +12,7 @@ const ENV_KEYS: Readonly<Record<string, string>> = {
12
12
  "ant-ling": "ANT_LING_API_KEY",
13
13
  "qwen-token-plan": "QWEN_TOKEN_PLAN_API_KEY",
14
14
  "qwen-token-plan-cn": "QWEN_TOKEN_PLAN_CN_API_KEY",
15
+ "qwen-token-plan-individual": "QWEN_TOKEN_PLAN_API_KEY",
15
16
  openai: "OPENAI_API_KEY",
16
17
  "azure-openai-responses": "AZURE_OPENAI_API_KEY",
17
18
  nvidia: "NVIDIA_API_KEY",
@@ -59,7 +60,7 @@ function apiKeyEnvVars(provider: string): readonly string[] | undefined {
59
60
  return name ? [name] : undefined;
60
61
  }
61
62
 
62
- /** Synchronous provider-key discovery pinned to pi-ai 0.84's public behavior. */
63
+ /** Synchronous provider-key discovery pinned to pi-ai 0.85's public behavior. */
63
64
  export function findEngineEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {
64
65
  const names = apiKeyEnvVars(provider);
65
66
  if (!names) return undefined;
@@ -1,4 +1,4 @@
1
- import type { ChildProcessByStdio } from "node:child_process";
1
+ import { type ChildProcessByStdio, spawn } from "node:child_process";
2
2
  import type { Readable } from "node:stream";
3
3
 
4
4
  import { boundedExternalDiagnostic } from "../core/external-diagnostic.js";
@@ -81,16 +81,18 @@ export interface ProcessTreeTerminator {
81
81
  cleanup(): void;
82
82
  }
83
83
 
84
- /** POSIX process-group termination with a direct-child fallback; Windows is direct-child only. */
84
+ /** POSIX process groups or Windows taskkill trees, with a direct-child fallback. */
85
85
  export function createProcessTreeTerminator(
86
86
  child: { pid?: number | undefined; exitCode: number | null; kill(signal?: NodeJS.Signals): boolean },
87
87
  graceMs = 1500,
88
+ options: { platform?: NodeJS.Platform; spawn?: typeof spawn } = {},
88
89
  ): ProcessTreeTerminator {
90
+ const platform = options.platform ?? process.platform;
91
+ const spawnKiller = options.spawn ?? spawn;
89
92
  let sent = false;
90
93
  let timer: ReturnType<typeof setTimeout> | null = null;
91
94
  const signal = (name: NodeJS.Signals): void => {
92
- if (child.exitCode !== null) return;
93
- if (child.pid && process.platform !== "win32") {
95
+ if (child.pid && platform !== "win32") {
94
96
  try {
95
97
  process.kill(-child.pid, name);
96
98
  return;
@@ -98,6 +100,15 @@ export function createProcessTreeTerminator(
98
100
  // The child may not have established its group yet.
99
101
  }
100
102
  }
103
+ if (platform === "win32" && child.pid !== undefined && Number.isSafeInteger(child.pid) && child.pid > 0) {
104
+ const args = ["/PID", String(child.pid), "/T", ...(name === "SIGKILL" ? ["/F"] : [])];
105
+ const killer = spawnKiller("taskkill.exe", args, { stdio: "ignore", windowsHide: true });
106
+ killer.once("error", () => {
107
+ if (child.exitCode === null) child.kill(name);
108
+ });
109
+ return;
110
+ }
111
+ if (child.exitCode !== null) return;
101
112
  child.kill(name);
102
113
  };
103
114
  return {
@@ -105,11 +116,19 @@ export function createProcessTreeTerminator(
105
116
  if (sent) return;
106
117
  sent = true;
107
118
  signal("SIGTERM");
108
- timer = setTimeout(() => signal("SIGKILL"), graceMs);
119
+ timer = setTimeout(() => {
120
+ timer = null;
121
+ signal("SIGKILL");
122
+ }, graceMs);
109
123
  },
110
124
  cleanup() {
111
- if (timer) clearTimeout(timer);
112
- timer = null;
125
+ if (timer) {
126
+ clearTimeout(timer);
127
+ timer = null;
128
+ // A closed leader can leave descendants with independent stdio.
129
+ // Finish the requested cancellation before releasing its escalation.
130
+ signal("SIGKILL");
131
+ }
113
132
  },
114
133
  };
115
134
  }