@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,9 +1,11 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
3
  import type { RunReceipt } from "../../dispatch/types.js";
4
+ import type { ProjectPreloadClass } from "../../prompts/preload.js";
4
5
  import { listSessionLedgerRefs, parseSessionEntries } from "../../session/archive-readers.js";
5
6
  import { extractReasoningTokens } from "../../session/context-accounting.js";
6
7
  import type { SessionEntry } from "../../session/entries.js";
8
+ import { isProjectPreloadClass } from "../../session/prompt-manifest.js";
7
9
  import { evalHarnessMetricsFromReceipt } from "../harness-metrics.js";
8
10
  import type {
9
11
  EvalMetricSource,
@@ -22,14 +24,7 @@ export interface EvalLedgerSnapshot {
22
24
  export interface EvalPromptManifestObservation {
23
25
  systemPromptHash: string;
24
26
  thinkingLevel: string | null;
25
- projectPreload: {
26
- mode: "full" | "synopsis" | "none";
27
- chars: number;
28
- lines: number;
29
- reason: string | null;
30
- nearLimit: boolean;
31
- label: string;
32
- } | null;
27
+ projectPreload: ProjectPreloadClass | null;
33
28
  fragments: Array<{ id: string; contentHash: string }>;
34
29
  }
35
30
 
@@ -408,26 +403,7 @@ function promptManifestObservation(record: Record<string, unknown>): EvalPromptM
408
403
  return contentHash === null ? [] : [{ id: entry.id, contentHash }];
409
404
  });
410
405
  const preload = record.projectPreload;
411
- const projectPreload: EvalPromptManifestObservation["projectPreload"] =
412
- preload === null
413
- ? null
414
- : isRecord(preload) &&
415
- (preload.mode === "full" || preload.mode === "synopsis" || preload.mode === "none") &&
416
- typeof preload.chars === "number" &&
417
- Number.isInteger(preload.chars) &&
418
- typeof preload.lines === "number" &&
419
- Number.isInteger(preload.lines) &&
420
- typeof preload.nearLimit === "boolean" &&
421
- typeof preload.label === "string"
422
- ? {
423
- mode: preload.mode as "full" | "synopsis" | "none",
424
- chars: preload.chars,
425
- lines: preload.lines,
426
- reason: nullableString(preload.reason),
427
- nearLimit: preload.nearLimit,
428
- label: preload.label,
429
- }
430
- : null;
406
+ const projectPreload = isProjectPreloadClass(preload) ? preload : null;
431
407
  return {
432
408
  systemPromptHash,
433
409
  thinkingLevel: nullableString(record.thinkingLevel),
@@ -1,5 +1,5 @@
1
1
  import type { EvalCompareV4Summary } from "../compare/compare.js";
2
- import { renderEvalComparisonV4 } from "../compare/compare.js";
2
+ import { renderEvalComparisonRoutesV1, renderEvalComparisonV4 } from "../compare/compare.js";
3
3
 
4
4
  export type EvalComparisonReportFormat = "text" | "json" | "md" | "junit";
5
5
 
@@ -16,7 +16,7 @@ export function renderEvalComparisonReportV1(
16
16
  function renderMarkdown(summary: EvalCompareV4Summary): string {
17
17
  const rows = summary.behavioralMetrics.map(
18
18
  (row) =>
19
- `| ${cell(row.scenarioId)} | ${cell(row.role)} | ${cell(`${row.target.id}/${row.target.model ?? "none"}`)} | ${row.family} | ${row.metric} | ${format(row.baseline.mean)} | ${format(row.baseline.variance)} | ${row.baseline.measured}/${row.baseline.observations} | ${format(row.candidate.mean)} | ${format(row.candidate.variance)} | ${row.candidate.measured}/${row.candidate.observations} | ${row.change} | ${row.varianceChange} | ${row.comparability.comparable ? "comparable" : cell(row.comparability.mismatchedFields.join(", "))} | ${row.hardGate ? "hard" : "informational"} |`,
19
+ `| ${cell(row.scenarioId)} | ${cell(row.role)} | ${cell(renderEvalComparisonRoutesV1(row))} | ${row.family} | ${row.metric} | ${format(row.baseline.mean)} | ${format(row.baseline.variance)} | ${row.baseline.measured}/${row.baseline.observations} | ${format(row.candidate.mean)} | ${format(row.candidate.variance)} | ${row.candidate.measured}/${row.candidate.observations} | ${format(row.noiseBand)} | ${row.change} | ${row.varianceChange} | ${row.comparability.comparable ? "comparable" : cell(row.comparability.mismatchedFields.join(", "))} | ${row.hardGate ? "hard" : "informational"} |`,
20
20
  );
21
21
  const scenarioRows = summary.scenarioReports.map(
22
22
  (report) => `| ${cell(report.id)} | ${changeCounts(report.metrics)} | ${changeCounts(report.variance)} |`,
@@ -30,11 +30,11 @@ function renderMarkdown(summary: EvalCompareV4Summary): string {
30
30
  `Behavioral hard gate: **${summary.hardGate.pass ? "pass" : "fail"}**`,
31
31
  ...summary.hardGate.failures.map(
32
32
  (failure) =>
33
- `- Hard failure: ${failure.scenarioId} / ${failure.role} / ${failure.target.id}/${failure.target.model ?? "none"} / ${failure.metric}: ${failure.change}`,
33
+ `- Hard failure: ${failure.scenarioId} / ${failure.role} / ${renderEvalComparisonRoutesV1(failure)} / ${failure.metric}: ${failure.change}`,
34
34
  ),
35
35
  ...summary.envelopeMismatches.map(
36
36
  (mismatch) =>
37
- `- Incomparable envelope: ${mismatch.scenarioId} / ${mismatch.role} / ${mismatch.target.id}/${mismatch.target.model ?? "none"}: ${mismatch.fields.join(", ")}`,
37
+ `- Incomparable envelope: ${mismatch.scenarioId} / ${mismatch.role} / ${renderEvalComparisonRoutesV1(mismatch)}: ${mismatch.fields.join(", ")}`,
38
38
  ),
39
39
  ...summary.affectedCorpusResults.map(
40
40
  (result) => `- Affected corpus result: ${result.scenarioId} / ${result.role}: ${result.changedFields.join(", ")}`,
@@ -43,8 +43,8 @@ function renderMarkdown(summary: EvalCompareV4Summary): string {
43
43
  `Token delta: ${summary.tokenDelta === null ? "unmeasured" : summary.tokenDelta}`,
44
44
  `Wall-time delta ms: ${summary.wallTimeDelta}`,
45
45
  "",
46
- "| Scenario | Role | Target/model | Family | Metric | Baseline mean | Baseline variance | Baseline measured | Candidate mean | Candidate variance | Candidate measured | Change | Variance | Comparability | Gate |",
47
- "|---|---|---|---|---|---:|---:|---:|---:|---:|---:|---|---|---|---|",
46
+ "| Scenario | Role | Baseline -> candidate target/model | Family | Metric | Baseline mean | Baseline variance | Baseline measured | Candidate mean | Candidate variance | Candidate measured | Noise band | Change | Variance | Comparability | Gate |",
47
+ "|---|---|---|---|---|---:|---:|---:|---:|---:|---:|---:|---|---|---|---|",
48
48
  ...rows,
49
49
  "",
50
50
  "## Per-scenario baseline/candidate report",
@@ -70,7 +70,7 @@ function renderJunit(summary: EvalCompareV4Summary): string {
70
70
  );
71
71
  const represented = new Set<string>();
72
72
  const cases = summary.behavioralMetrics.map((row) => {
73
- const name = `${row.scenarioId}[${row.role}:${row.target.id}:${row.target.model ?? "none"}].${row.metric}`;
73
+ const name = `${row.scenarioId}[${row.role}:${renderEvalComparisonRoutesV1(row)}].${row.metric}`;
74
74
  const key = JSON.stringify([row.scenarioId, row.role, row.target.id, row.target.model, row.metric]);
75
75
  represented.add(key);
76
76
  const detail = `change=${row.change} variance=${row.varianceChange} baseline=${format(row.baseline.mean)} candidate=${format(row.candidate.mean)}`;
@@ -87,13 +87,13 @@ function renderJunit(summary: EvalCompareV4Summary): string {
87
87
  failure.metric,
88
88
  ]);
89
89
  if (represented.has(key)) continue;
90
- const name = `${failure.scenarioId}[${failure.role}:${failure.target.id}:${failure.target.model ?? "none"}].${failure.metric}`;
90
+ const name = `${failure.scenarioId}[${failure.role}:${renderEvalComparisonRoutesV1(failure)}].${failure.metric}`;
91
91
  cases.push(
92
92
  ` <testcase classname="eval.behavior.hard" name="${escapeXml(name)}"><failure message="${escapeXml(failure.change)}">hard behavioral gate</failure></testcase>`,
93
93
  );
94
94
  }
95
95
  for (const failure of summary.hardGate.envelopeFailures) {
96
- const name = `${failure.scenarioId}[${failure.role}:${failure.target.id}:${failure.target.model ?? "none"}].execution-envelope`;
96
+ const name = `${failure.scenarioId}[${failure.role}:${renderEvalComparisonRoutesV1(failure)}].execution-envelope`;
97
97
  cases.push(
98
98
  ` <testcase classname="eval.behavior.envelope" name="${escapeXml(name)}"><failure message="incomparable">${escapeXml(failure.fields.join(", "))}</failure></testcase>`,
99
99
  );
@@ -1,6 +1,6 @@
1
1
  import { isAbsolute, relative, resolve, sep } from "node:path";
2
2
  import { normalizeClioCoderEventRecord } from "../../../core/naming-events.js";
3
- import { shellQuote } from "../../../core/shell-quote.js";
3
+ import { ALL_TOOL_NAMES } from "../../../core/tool-names.js";
4
4
  import { clioStateDir } from "../../../core/xdg.js";
5
5
  import {
6
6
  evidenceMetricsFromReceipt,
@@ -22,19 +22,23 @@ export async function runClioRunRunner(
22
22
  readObservation?: { allowedPaths: string[]; decoyPaths: string[] },
23
23
  ): Promise<EvalRunnerOutput> {
24
24
  const prompt = runner.prompt ?? "";
25
- const args = [
26
- shellQuote(clioEntry),
25
+ // Spawned as an argv, not a shell line: the task timeout has to reach the
26
+ // Clio process itself so the receipt it seals and the exit code this
27
+ // runner reports describe the same ending. See runShellCommand.
28
+ const args: [string, ...string[]] = [
29
+ process.execPath,
30
+ clioEntry,
27
31
  "run",
28
32
  "--json",
29
- ...(runner.agent === undefined ? [] : ["--agent", shellQuote(runner.agent)]),
33
+ ...(runner.agent === undefined ? [] : ["--agent", runner.agent]),
30
34
  "--target",
31
- shellQuote(target.id),
32
- ...(target.model === undefined ? [] : ["--model", shellQuote(target.model)]),
33
- ...(target.thinking === undefined ? [] : ["--thinking", shellQuote(target.thinking)]),
35
+ target.id,
36
+ ...(target.model === undefined ? [] : ["--model", target.model]),
37
+ ...(target.thinking === undefined ? [] : ["--thinking", target.thinking]),
34
38
  ...(runner.autonomy === undefined ? [] : ["--autonomy", runner.autonomy]),
35
- shellQuote(prompt),
39
+ prompt,
36
40
  ];
37
- const result = await runShellCommand(`${process.execPath} ${args.join(" ")}`, cwd, runner.timeoutMs ?? timeoutMs, env);
41
+ const result = await runShellCommand(args, cwd, runner.timeoutMs ?? timeoutMs, env);
38
42
  // Usage is folded from the live stream, not from the bounded stdout
39
43
  // artifact: a verbose run's `message_end` events do not survive truncation.
40
44
  const tokens = result.usage;
@@ -202,19 +206,22 @@ export function toolBehaviorMetricEntriesFromJsonl(
202
206
  const terminals = canonicalFinishes.length > 0 ? canonicalFinishes : executionEnds;
203
207
  const calls = new Map<string, number>();
204
208
  const succeeded = new Map<string, number>();
209
+ const failed = new Map<string, number>();
205
210
  const blocked = new Map<string, number>();
206
211
  for (const terminal of terminals) {
207
212
  const tool = metricToolName(terminal.tool);
208
213
  calls.set(tool, (calls.get(tool) ?? 0) + 1);
209
214
  if (terminal.outcome === "ok") succeeded.set(tool, (succeeded.get(tool) ?? 0) + 1);
210
215
  if (terminal.outcome === "blocked") blocked.set(tool, (blocked.get(tool) ?? 0) + 1);
216
+ if (terminal.outcome === "error") failed.set(tool, (failed.get(tool) ?? 0) + 1);
211
217
  }
212
- const namedTools = new Set(["bash", "dispatch", "read", ...calls.keys(), ...succeeded.keys(), ...blocked.keys()]);
218
+ const namedTools = new Set([...ALL_TOOL_NAMES, ...calls.keys()]);
213
219
  const entries: Record<string, number> = { "tools.read.distinctPaths": readPaths.size };
214
220
  for (const tool of [...namedTools].sort()) {
215
221
  entries[`tools.calls.${tool}`] = calls.get(tool) ?? 0;
216
222
  entries[`tools.succeeded.${tool}`] = succeeded.get(tool) ?? 0;
217
223
  entries[`tools.blocked.${tool}`] = blocked.get(tool) ?? 0;
224
+ entries[`tools.failed.${tool}`] = failed.get(tool) ?? 0;
218
225
  }
219
226
  if (readObservation !== undefined) {
220
227
  const allowed = readObservation.allowedPaths.map((path) => normalizeObservedPath(cwd, path));
@@ -1,4 +1,3 @@
1
- import { shellQuote } from "../../../core/shell-quote.js";
2
1
  import type { EvalSuiteTargetV2 } from "../schema/suite.js";
3
2
  import { type EvalRunnerOutput, runShellCommand } from "./external-command.js";
4
3
 
@@ -9,12 +8,8 @@ export async function runContextIndexRunner(
9
8
  target: EvalSuiteTargetV2,
10
9
  env?: NodeJS.ProcessEnv,
11
10
  ): Promise<EvalRunnerOutput> {
12
- const result = await runShellCommand(
13
- `${shellQuote(process.execPath)} ${shellQuote(clioEntry)} context index --json`,
14
- cwd,
15
- timeoutMs,
16
- env,
17
- );
11
+ const args: [string, ...string[]] = [process.execPath, clioEntry, "context", "index", "--json"];
12
+ const result = await runShellCommand(args, cwd, timeoutMs, env);
18
13
  const parsed = parseContextIndexOutput(result.stdout);
19
14
  return {
20
15
  assignmentId: null,
@@ -1,6 +1,5 @@
1
1
  import { existsSync, statSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { shellQuote } from "../../../core/shell-quote.js";
4
3
  import type { EvalRunnerV2, EvalSuiteTargetV2 } from "../schema/suite.js";
5
4
  import { type EvalRunnerOutput, runShellCommand } from "./external-command.js";
6
5
 
@@ -13,7 +12,7 @@ export async function runContextInitRunner(
13
12
  env?: NodeJS.ProcessEnv,
14
13
  ): Promise<EvalRunnerOutput> {
15
14
  const extraArgs = runner.args ?? [];
16
- const command = [
15
+ const args: [string, ...string[]] = [
17
16
  process.execPath,
18
17
  clioEntry,
19
18
  "context",
@@ -25,10 +24,8 @@ export async function runContextInitRunner(
25
24
  ...(target.model === undefined ? [] : ["--model", target.model]),
26
25
  ...(target.thinking === undefined ? [] : ["--thinking", target.thinking]),
27
26
  ...extraArgs,
28
- ]
29
- .map(shellQuote)
30
- .join(" ");
31
- const result = await runShellCommand(command, cwd, runner.timeoutMs ?? timeoutMs, env);
27
+ ];
28
+ const result = await runShellCommand(args, cwd, runner.timeoutMs ?? timeoutMs, env);
32
29
  const payload = parseInitPayload(result.stdout);
33
30
  const candidateGeneration = recordField(payload, "generation");
34
31
  const generation = isValidGenerationPayload(payload, candidateGeneration) ? candidateGeneration : null;
@@ -65,6 +65,11 @@ const OUTPUT_HEAD_LIMIT = 20_000;
65
65
  const OUTPUT_TRUNCATION_MARKER = "\n[output middle truncated; tail preserved]\n";
66
66
  const METRIC_JSONL_LIMIT = 256_000;
67
67
  const METRIC_JSONL_LINE_LIMIT = 64_000;
68
+ // After the deadline's SIGTERM, how long a run gets to end on its own terms
69
+ // before SIGKILL. Clio seals the interrupted run's receipt inside its
70
+ // coordinated shutdown, which budgets 500ms per hook across several hooks; a
71
+ // one-second grace killed it mid-seal and the timed-out run left no receipt.
72
+ const TIMEOUT_KILL_GRACE_MS = 5_000;
68
73
 
69
74
  export async function runExternalCommandRunner(
70
75
  runner: EvalRunnerV2,
@@ -133,8 +138,23 @@ export async function runExternalCommandRunner(
133
138
  };
134
139
  }
135
140
 
141
+ /**
142
+ * Run one eval subprocess to completion or to the timeout.
143
+ *
144
+ * A string runs through the shell, which is what an operator's
145
+ * `external-command` line and the verifier commands are. An argv array spawns
146
+ * the program directly, with no shell between the runner and the process
147
+ * whose exit code it reports. That distinction matters on the timeout path:
148
+ * `/bin/sh -c` on dash keeps the shell as the parent, so SIGTERM to the shell
149
+ * stops the shell alone while the program runs on to completion. A
150
+ * `clio-coder run` spawned that way finished its turn after the deadline,
151
+ * sealed a succeeded receipt with exit 0, and exited 0, and this runner
152
+ * reported the shell's signal death as exit 124 (issue #275). With an argv the
153
+ * signal reaches Clio itself, which seals the run as canceled with the exit
154
+ * status it then reports, so the receipt and the exit code agree either way.
155
+ */
136
156
  export function runShellCommand(
137
- command: string,
157
+ command: string | readonly [string, ...string[]],
138
158
  cwd: string,
139
159
  timeoutMs: number,
140
160
  env?: NodeJS.ProcessEnv,
@@ -153,14 +173,12 @@ export function runShellCommand(
153
173
  const callLedgerFold = createEvalCallLedgerFold();
154
174
  let timedOut = false;
155
175
  let settled = false;
156
- const child = spawn(command, {
157
- cwd,
158
- shell: true,
159
- stdio: ["ignore", "pipe", "pipe"],
160
- // The overlay is additive: an eval item pins where Clio writes its
161
- // journal, and inherits everything else the operator's shell provides.
162
- env: env === undefined ? process.env : { ...process.env, ...env },
163
- });
176
+ // The overlay is additive: an eval item pins where Clio writes its
177
+ // journal, and inherits everything else the operator's shell provides.
178
+ const spawnEnv = env === undefined ? process.env : { ...process.env, ...env };
179
+ const [file, args, shell] = typeof command === "string" ? [command, [], true] : [command[0], command.slice(1), false];
180
+ const child = spawn(file, args, { cwd, shell, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });
181
+ const commandLine = typeof command === "string" ? command : command.join(" ");
164
182
  child.stdout.setEncoding("utf8");
165
183
  child.stderr.setEncoding("utf8");
166
184
  child.stdout.on("data", (chunk: string) => {
@@ -177,14 +195,14 @@ export function runShellCommand(
177
195
  const timer = setTimeout(() => {
178
196
  timedOut = true;
179
197
  child.kill("SIGTERM");
180
- setTimeout(() => child.kill("SIGKILL"), 1000);
198
+ setTimeout(() => child.kill("SIGKILL"), TIMEOUT_KILL_GRACE_MS);
181
199
  }, timeoutMs);
182
200
  const finish = (exitCode: number): void => {
183
201
  if (settled) return;
184
202
  settled = true;
185
203
  clearTimeout(timer);
186
204
  resolve({
187
- command,
205
+ command: commandLine,
188
206
  exitCode,
189
207
  stdout,
190
208
  metricJsonl: metricCapture.finish(),
@@ -230,6 +230,8 @@ export interface EvalRunnerV2 {
230
230
  }
231
231
 
232
232
  export interface EvalVerifyV2 {
233
+ /** Workspace-relative grader code and dependencies that the runner must not change. */
234
+ protectedFiles?: string[];
233
235
  commands?: string[];
234
236
  /**
235
237
  * Commands that grade the task outcome. They run in the workspace before the
@@ -247,6 +247,7 @@ function readVerify(
247
247
  return {
248
248
  commands: readOptionalStringArray(value, "commands", `${path}.commands`, issues),
249
249
  measure: readOptionalStringArray(value, "measure", `${path}.measure`, issues),
250
+ protectedFiles: readOptionalStringArray(value, "protectedFiles", `${path}.protectedFiles`, issues),
250
251
  assertions: readAssertions(value.assertions, `${path}.assertions`, issues),
251
252
  forbidPaths: readOptionalStringArray(value, "forbidPaths", `${path}.forbidPaths`, issues),
252
253
  };
@@ -1,7 +1,9 @@
1
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
1
+ import { constants } from "node:fs";
2
+ import { lstat, mkdir, mkdtemp, open, readdir, realpath, rm, writeFile } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
- import { resolve } from "node:path";
4
+ import { isAbsolute, relative, resolve, sep } from "node:path";
4
5
  import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
6
+ import { clioDataDir } from "../../../core/xdg.js";
5
7
  import { resolveMetricAssertion } from "../compare/thresholds.js";
6
8
  import { buildEvalExecutionEnvelopeV1, type EvalExecutionObservationV1 } from "../execution-provenance.js";
7
9
  import { aggregateEvalVerdicts } from "../metrics/aggregate.js";
@@ -44,7 +46,8 @@ import type { EvalMetricAssertion, EvalSuiteTargetV2, LoadedEvalSuiteV2 } from "
44
46
  import { createEvalId } from "../store.js";
45
47
  import { runCommandVerifiers } from "../verifiers/command.js";
46
48
  import { forbiddenPathHits } from "../verifiers/file-exists.js";
47
- import { collectPatchMetrics } from "../verifiers/patch.js";
49
+ import { EvalGraderIntegrityError, protectGraderFiles } from "../verifiers/integrity.js";
50
+ import { collectPatchMetrics, forgetPatchBaseline, recordPatchBaseline } from "../verifiers/patch.js";
48
51
  import { prepareGitWorkspace } from "../workspaces/git.js";
49
52
  import { type PreparedEvalWorkspace, prepareLocalWorkspace } from "../workspaces/local.js";
50
53
  import { type PrepareTempCopyWorkspaceOptions, prepareTempCopyWorkspace } from "../workspaces/temp-copy.js";
@@ -99,6 +102,7 @@ export async function runEvalSuiteV2(
99
102
  options.clioEntry,
100
103
  options.freshWorkspaces === true,
101
104
  options.tempCopy,
105
+ resolve(clioDataDir(), "evals", evalId, "transcripts", String(results.length)),
102
106
  );
103
107
  spentUsd += resultCostUsd(completed.result);
104
108
  results.push(completed.result);
@@ -154,10 +158,13 @@ async function runMatrixItem(
154
158
  clioEntry: string,
155
159
  freshWorkspace: boolean,
156
160
  tempCopy: PrepareTempCopyWorkspaceOptions | undefined,
161
+ transcriptDir: string,
157
162
  ): Promise<CompletedMatrixItem> {
158
163
  let workspace: PreparedEvalWorkspace | null = null;
159
164
  let receipt: EvalRunnerOutput["receipt"] = null;
160
165
  let runnerWallTimeMs = 0;
166
+ let runnerEvidence: EvalRunnerOutput | null = null;
167
+ let retention: Promise<RetainedSessionLedgers> | undefined;
161
168
  let executionObservation: EvalExecutionObservationV1 | undefined;
162
169
  // One matrix item, one Clio journal. An item measures Clio, and a shared
163
170
  // state directory would mix sibling processes' runs and yesterday's sessions
@@ -170,20 +177,24 @@ async function runMatrixItem(
170
177
  // A fixture that never came up measured nothing, so the item fails as a
171
178
  // harness failure rather than reporting an invariant it never observed.
172
179
  if (!setup.pass) throw new EvalWorkspaceSetupError(setup.exitCode, setup.stderr);
180
+ if (task.workspace.kind !== "local" || freshWorkspace) recordPatchBaseline(workspace.dir);
181
+ const checkGraderIntegrity = await protectGraderFiles(workspace.dir, task.verify.protectedFiles ?? []);
173
182
  const runner = await runTaskRunner(task, target, workspace.dir, clioEntry, {
174
183
  CLIO_CODER_STATE_DIR: stateDir,
175
184
  CLIO_CODER_ENTRY: clioEntry,
176
185
  });
177
- const runnerStdoutFile = resolve(stateDir, "eval-runner-output.jsonl");
178
- await writeFile(runnerStdoutFile, runner.stdout, "utf8");
186
+ runnerEvidence = runner;
179
187
  receipt = runner.receipt ?? null;
180
188
  runnerWallTimeMs = runner.wallTimeMs;
189
+ const runnerStdoutFile = resolve(stateDir, "eval-runner-output.jsonl");
190
+ await writeFile(runnerStdoutFile, runner.stdout, { encoding: "utf8", mode: 0o600, flag: "wx" });
181
191
  const patch = collectPatchMetrics(workspace.dir);
182
192
  const receiptExitCode = runner.exitCode;
183
193
  // Read after the runner returned and before the journal is removed: what
184
194
  // Clio sealed for this item, judged against its own ledger, and whether
185
195
  // the workers it attested are still running.
186
196
  const journalMetrics = invariantMetrics(stateDir, receiptExitCode);
197
+ await checkGraderIntegrity();
187
198
  const measurement = await measureTaskOutcome(task, workspace.dir, {
188
199
  ...namingCompatibilityEnvironment(
189
200
  "CLIO_CODER_EVAL_RUNNER_STDOUT_FILE",
@@ -202,14 +213,20 @@ async function runMatrixItem(
202
213
  // The one reading that needs both sides: what the loop reported it
203
214
  // spent, and what the journal shows it sealed.
204
215
  ...fleetLoopReceiptAgreement(runner.metrics as Record<string, number | boolean>, journalMetrics),
205
- "patch.bytes": patch.bytes,
206
- "patch.filesChanged": patch.filesChanged,
207
- "patch.testFilesModified": patch.testFilesModified,
216
+ ...(patch === null
217
+ ? {}
218
+ : {
219
+ "patch.bytes": patch.bytes,
220
+ "patch.filesChanged": patch.filesChanged,
221
+ "patch.testFilesModified": patch.testFilesModified,
222
+ }),
208
223
  "result.pass": runner.exitCode === 0,
209
224
  "result.failureClass": runner.exitCode === 0 ? null : "runner_failed",
210
225
  ...measurement.metrics,
211
226
  };
227
+ await checkGraderIntegrity();
212
228
  const verifier = await runVerifiers(task, workspace.dir, metrics);
229
+ await checkGraderIntegrity();
213
230
  const graderFailed = metrics["task.solved"] === false;
214
231
  const pass = runner.exitCode === 0 && verifier.pass && !graderFailed;
215
232
  const failureClass = pass
@@ -238,7 +255,10 @@ async function runMatrixItem(
238
255
  ...(verifier.stderr.length > 0 ? { verifierStderr: verifier.stderr } : {}),
239
256
  },
240
257
  };
241
- const snapshot = await readEvalLedgerSnapshot(stateDir);
258
+ retention ??= retainSessionLedgers(stateDir, transcriptDir, runnerEvidence?.stdout);
259
+ const retained = await retention;
260
+ applyRetainedSessionLedgers(result, retained);
261
+ const snapshot = retained.errors.length > 0 ? emptyLedgerSnapshot() : await readEvalLedgerSnapshot(stateDir);
242
262
  const selected = selectEvalLedgerEntries(snapshot.entries, runner.ledgerEntries ?? []);
243
263
  result.artifacts.trackedMetricSources = JSON.stringify({
244
264
  assistantCalls: selected.source,
@@ -271,10 +291,15 @@ async function runMatrixItem(
271
291
  serving: evalServingObservationFrom(target, receipt ?? null, snapshot.compiledPromptHashes),
272
292
  };
273
293
  } catch (error) {
274
- const failureClass = error instanceof EvalWorkspaceSetupError ? "setup_failed" : "command_error";
294
+ const failureClass =
295
+ error instanceof EvalGraderIntegrityError
296
+ ? "grader_integrity"
297
+ : error instanceof EvalWorkspaceSetupError
298
+ ? "setup_failed"
299
+ : "command_error";
275
300
  const result: EvalArtifactResultV4 = {
276
- assignmentId: null,
277
- terminalReceiptDigest: null,
301
+ assignmentId: runnerEvidence?.assignmentId ?? null,
302
+ terminalReceiptDigest: runnerEvidence?.terminalReceiptDigest ?? null,
278
303
  taskId: task.id,
279
304
  repeatIndex,
280
305
  target: { id: target.id, model: target.model ?? null, thinking: target.thinking ?? null },
@@ -287,11 +312,15 @@ async function runMatrixItem(
287
312
  "latency.wallMs": 0,
288
313
  },
289
314
  artifacts: {
315
+ ...runnerEvidence?.artifacts,
290
316
  error: error instanceof Error ? error.message : String(error),
291
317
  ...(workspace === null ? {} : { workspace: workspace.dir }),
292
318
  },
293
319
  };
294
- const snapshot = await readEvalLedgerSnapshot(stateDir);
320
+ retention ??= retainSessionLedgers(stateDir, transcriptDir, runnerEvidence?.stdout);
321
+ const retained = await retention;
322
+ applyRetainedSessionLedgers(result, retained);
323
+ const snapshot = retained.errors.length > 0 ? emptyLedgerSnapshot() : await readEvalLedgerSnapshot(stateDir);
295
324
  result.verdict = adaptSuiteV2ResultToVerdictV1(
296
325
  result,
297
326
  buildEvalTrackedMetrics({
@@ -316,6 +345,7 @@ async function runMatrixItem(
316
345
  };
317
346
  } finally {
318
347
  try {
348
+ if (workspace !== null) forgetPatchBaseline(workspace.dir);
319
349
  await workspace?.cleanup();
320
350
  } finally {
321
351
  // A workspace cleanup error must not strand the suite-owned journal.
@@ -575,3 +605,149 @@ function nullableNonNegativeInteger(value: unknown): number | null {
575
605
  function stringArray(value: unknown): string[] {
576
606
  return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === "string") : [];
577
607
  }
608
+
609
+ interface RetainedSessionLedgers {
610
+ runnerStdoutPath?: string;
611
+ paths: string[];
612
+ errors: string[];
613
+ }
614
+
615
+ function applyRetainedSessionLedgers(result: EvalArtifactResultV4, retained: RetainedSessionLedgers): void {
616
+ if (retained.runnerStdoutPath !== undefined) result.artifacts.runnerStdoutFile = retained.runnerStdoutPath;
617
+ if (retained.paths.length > 0 || retained.errors.length > 0) result.artifacts.sessionLedgers = retained.paths;
618
+ if (retained.errors.length === 0) return;
619
+ result.artifacts.sessionLedgerErrors = retained.errors;
620
+ result.metrics["evidence.retentionComplete"] = false;
621
+ // Keep a runner/integrity failure as the primary cause; an otherwise healthy
622
+ // task outcome cannot claim successful grading with unsafe or missing evidence.
623
+ if (result.pass || result.failureClass === "grader_failed") {
624
+ result.artifacts.outcomeBeforeEvidenceFailure = result.failureClass ?? "pass";
625
+ result.pass = false;
626
+ result.failureClass = "evidence_integrity";
627
+ result.metrics["result.pass"] = false;
628
+ result.metrics["result.failureClass"] = "evidence_integrity";
629
+ }
630
+ }
631
+
632
+ /** Reject symlinks at every component inside the owned source directory. */
633
+ async function plainLedgerPath(root: string, path: string): Promise<void> {
634
+ const rel = relative(root, path);
635
+ if (isAbsolute(rel) || rel === ".." || rel.startsWith(`..${sep}`)) throw new Error("unsafe ledger path");
636
+ let current = root;
637
+ for (const part of ["", ...rel.split(sep)]) {
638
+ current = resolve(current, part);
639
+ if ((await lstat(current)).isSymbolicLink()) throw new Error("unsafe ledger symlink");
640
+ }
641
+ }
642
+
643
+ async function readOwnedLedger(root: string, path: string): Promise<Buffer> {
644
+ await plainLedgerPath(root, path);
645
+ const before = await lstat(path);
646
+ if (!before.isFile()) throw new Error("ledger is not a regular file");
647
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
648
+ try {
649
+ const opened = await file.stat();
650
+ await plainLedgerPath(root, path);
651
+ if (opened.dev !== before.dev || opened.ino !== before.ino) throw new Error("ledger changed while opening");
652
+ return await file.readFile();
653
+ } finally {
654
+ await file.close();
655
+ }
656
+ }
657
+
658
+ /** Create a private, unique capture below the operator's artifact root. */
659
+ async function transcriptCaptureDirectory(destination: string): Promise<string> {
660
+ const base = clioDataDir();
661
+ await mkdir(base, { recursive: true, mode: 0o700 });
662
+ let current = await realpath(base);
663
+ const rel = relative(base, destination);
664
+ if (isAbsolute(rel) || rel === ".." || rel.startsWith(`..${sep}`)) throw new Error("unsafe transcript destination");
665
+ for (const part of rel.split(sep)) {
666
+ current = resolve(current, part);
667
+ try {
668
+ await mkdir(current, { mode: 0o700 });
669
+ } catch (error) {
670
+ if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
671
+ }
672
+ const info = await lstat(current);
673
+ if (info.isSymbolicLink() || !info.isDirectory()) throw new Error("unsafe transcript destination");
674
+ }
675
+ return mkdtemp(resolve(current, "capture-"));
676
+ }
677
+
678
+ /** Enumerate only ordinary directories; never traverse a runner-created alias. */
679
+ async function discoverOwnedLedgers(stateDir: string, errors: string[]): Promise<string[]> {
680
+ const root = resolve(stateDir, "sessions");
681
+ try {
682
+ await plainLedgerPath(stateDir, root);
683
+ } catch (error) {
684
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
685
+ throw error;
686
+ }
687
+ const paths: string[] = [];
688
+ for (const cwd of await readdir(root, { withFileTypes: true })) {
689
+ if (cwd.isSymbolicLink()) {
690
+ errors.push("session directory rejected: symlink");
691
+ continue;
692
+ }
693
+ if (!cwd.isDirectory()) continue;
694
+ const cwdPath = resolve(root, cwd.name);
695
+ try {
696
+ await plainLedgerPath(stateDir, cwdPath);
697
+ for (const session of await readdir(cwdPath, { withFileTypes: true })) {
698
+ if (session.isSymbolicLink()) {
699
+ errors.push("session directory rejected: symlink");
700
+ continue;
701
+ }
702
+ if (session.isDirectory()) paths.push(resolve(cwdPath, session.name, "current.jsonl"));
703
+ }
704
+ } catch {
705
+ errors.push("session directory unreadable or unsafe");
706
+ }
707
+ }
708
+ return paths.sort();
709
+ }
710
+
711
+ /** Best-effort evidence collection never throws into (or retries) the failure path. */
712
+ async function retainSessionLedgers(
713
+ stateDir: string,
714
+ destination: string,
715
+ runnerStdout?: string,
716
+ ): Promise<RetainedSessionLedgers> {
717
+ const retained: RetainedSessionLedgers = { paths: [], errors: [] };
718
+ try {
719
+ const refs = await discoverOwnedLedgers(stateDir, retained.errors);
720
+ if (refs.length === 0 && !runnerStdout) return retained;
721
+ const directory = await transcriptCaptureDirectory(destination);
722
+ if (runnerStdout) {
723
+ const path = resolve(directory, "runner-stdout.jsonl");
724
+ await writeFile(path, runnerStdout, { mode: 0o600, flag: "wx" });
725
+ retained.runnerStdoutPath = path;
726
+ }
727
+ for (const [index, pathToLedger] of refs.entries()) {
728
+ try {
729
+ let content: Buffer;
730
+ try {
731
+ content = await readOwnedLedger(stateDir, pathToLedger);
732
+ } catch (error) {
733
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
734
+ content = await readOwnedLedger(stateDir, `${pathToLedger}.tmp`);
735
+ retained.errors.push(`ledger ${index}: incomplete current ledger; temporary evidence retained`);
736
+ }
737
+ const path = resolve(directory, `${index}.jsonl`);
738
+ await writeFile(path, content, { mode: 0o600, flag: "wx" });
739
+ retained.paths.push(path);
740
+ } catch (error) {
741
+ // Error codes describe missing/unreadable/unsafe evidence without echoing
742
+ // runner-controlled paths or external file contents into the artifact.
743
+ const code = (error as NodeJS.ErrnoException).code;
744
+ retained.errors.push(
745
+ `ledger ${index}: retention failed (${code === "ENOENT" ? "missing" : "unsafe or unreadable"})`,
746
+ );
747
+ }
748
+ }
749
+ } catch {
750
+ retained.errors.push("session ledger retention failed: artifact storage unavailable or unsafe");
751
+ }
752
+ return retained;
753
+ }