@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
@@ -0,0 +1,39 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile } from "node:fs/promises";
3
+ import { isAbsolute, relative, resolve, sep } from "node:path";
4
+
5
+ export class EvalGraderIntegrityError extends Error {}
6
+
7
+ /** Explicit dependencies avoid guessing executable paths from arbitrary shell commands. */
8
+ export async function protectGraderFiles(cwd: string, files: readonly string[]): Promise<() => Promise<void>> {
9
+ const paths = files.map((file) => {
10
+ const path = resolve(cwd, file);
11
+ const rel = relative(cwd, path);
12
+ if (isAbsolute(file) || rel === ".." || rel.startsWith(`..${sep}`))
13
+ throw new EvalGraderIntegrityError(`grader dependency escapes workspace: ${file}`);
14
+ return path;
15
+ });
16
+ const fingerprint = async (path: string) => {
17
+ // Do not follow a replacement symlink to content chosen outside the fixture.
18
+ let current = path;
19
+ while (current !== resolve(cwd)) {
20
+ if ((await lstat(current)).isSymbolicLink())
21
+ throw new EvalGraderIntegrityError(`grader dependency is a symlink: ${path}`);
22
+ current = resolve(current, "..");
23
+ }
24
+ return createHash("sha256")
25
+ .update(await readFile(path))
26
+ .digest("hex");
27
+ };
28
+ const hashes = await Promise.all(paths.map(fingerprint));
29
+ return async () => {
30
+ for (const [index, path] of paths.entries()) {
31
+ try {
32
+ if ((await fingerprint(path)) === hashes[index]) continue;
33
+ } catch {
34
+ /* Missing, unreadable, and replaced dependencies all invalidate grading. */
35
+ }
36
+ throw new EvalGraderIntegrityError(`grader dependency changed during trial: ${relative(cwd, path)}`);
37
+ }
38
+ };
39
+ }
@@ -1,4 +1,43 @@
1
1
  import { spawnSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { readdirSync, readFileSync, readlinkSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
5
+
6
+ type FileBaseline = Map<string, { hash: string; bytes: number }>;
7
+ const baselines = new Map<string, FileBaseline>();
8
+
9
+ /** Held by the harness process so a runner cannot rewrite its own baseline. */
10
+ export function recordPatchBaseline(cwd: string): void {
11
+ baselines.set(resolve(cwd), snapshotFiles(cwd));
12
+ }
13
+
14
+ export function forgetPatchBaseline(cwd: string): void {
15
+ baselines.delete(resolve(cwd));
16
+ }
17
+
18
+ function snapshotFiles(cwd: string): FileBaseline {
19
+ const files: FileBaseline = new Map();
20
+ function walk(dir: string, prefix: string): void {
21
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
22
+ if (entry.name === ".git") continue;
23
+ const path = join(dir, entry.name);
24
+ const relative = prefix + entry.name;
25
+ if (entry.isDirectory()) walk(path, `${relative}/`);
26
+ else if (entry.isFile() || entry.isSymbolicLink()) {
27
+ const bytes = entry.isSymbolicLink() ? Buffer.from(readlinkSync(path)) : readFileSync(path);
28
+ files.set(relative, {
29
+ hash: createHash("sha256")
30
+ .update(entry.isSymbolicLink() ? "link:" : "file:")
31
+ .update(bytes)
32
+ .digest("hex"),
33
+ bytes: bytes.length,
34
+ });
35
+ }
36
+ }
37
+ }
38
+ walk(cwd, "");
39
+ return files;
40
+ }
2
41
 
3
42
  export interface PatchMetrics {
4
43
  bytes: number;
@@ -6,9 +45,26 @@ export interface PatchMetrics {
6
45
  testFilesModified: number;
7
46
  }
8
47
 
9
- export function collectPatchMetrics(cwd: string): PatchMetrics {
48
+ export function collectPatchMetrics(cwd: string): PatchMetrics | null {
49
+ const baseline = baselines.get(resolve(cwd));
50
+ if (baseline !== undefined) {
51
+ const current = snapshotFiles(cwd);
52
+ const changed = [...new Set([...baseline.keys(), ...current.keys()])].filter(
53
+ (path) => baseline.get(path)?.hash !== current.get(path)?.hash,
54
+ );
55
+ return {
56
+ // For hash baselines this is changed file content bytes, including deleted
57
+ // content, rather than a textual Git diff (which cannot represent all files).
58
+ bytes: changed.reduce((sum, path) => sum + (current.get(path)?.bytes ?? baseline.get(path)?.bytes ?? 0), 0),
59
+ filesChanged: changed.length,
60
+ testFilesModified: changed.filter((file) => /(^|\/)(test|tests|spec|__tests__)(\/|$)|\.(test|spec)\./.test(file))
61
+ .length,
62
+ };
63
+ }
64
+
10
65
  const diff = spawnSync("git", ["diff", "--", "."], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
11
- const text = diff.status === 0 && typeof diff.stdout === "string" ? diff.stdout : "";
66
+ if (diff.status !== 0 || typeof diff.stdout !== "string") return null;
67
+ const text = diff.stdout;
12
68
  const files = text
13
69
  .split(/\r?\n/)
14
70
  .filter((line) => line.startsWith("diff --git "))
@@ -4,6 +4,7 @@ import { tmpdir } from "node:os";
4
4
  import { relative, resolve } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  import type { EvalWorkspaceV2 } from "../schema/suite.js";
7
+ import { forgetPatchBaseline, recordPatchBaseline } from "../verifiers/patch.js";
7
8
  import type { PreparedEvalWorkspace } from "./local.js";
8
9
 
9
10
  const execFileAsync = promisify(execFile);
@@ -42,9 +43,11 @@ export async function prepareTempCopyWorkspace(
42
43
  recursive: true,
43
44
  filter: (path) => shouldCopy(relative(source, path), excludes, selection),
44
45
  });
46
+ recordPatchBaseline(dest);
45
47
  return {
46
48
  dir: dest,
47
49
  cleanup: async () => {
50
+ forgetPatchBaseline(dest);
48
51
  await rm(dest, { recursive: true, force: true });
49
52
  },
50
53
  };
@@ -12,6 +12,8 @@ import type {
12
12
  } from "../dispatch/index.js";
13
13
  import { type ExecutionRole, isExecutionRole, readGateDecisionArtifactsForRunIds } from "../dispatch/index.js";
14
14
  import { detectValidationCommand } from "../safety/protected-artifacts.js";
15
+ import { foldDecisionBoard } from "../session/decision-board.js";
16
+ import { type DecisionLedgerEntry, decisionRef } from "../session/entries.js";
15
17
  import {
16
18
  type AuditJsonRow,
17
19
  type BashExecutionEntry,
@@ -23,6 +25,7 @@ import {
23
25
  readSessionEntriesForId,
24
26
  type SessionEntry,
25
27
  } from "../session/index.js";
28
+ import { filterEntriesToActivePath } from "../session/tree/active-path.js";
26
29
  import { attributeEvidenceFailure } from "./failure-attribution.js";
27
30
  import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
28
31
  import { compareCodepoints as compareStrings } from "./ordering.js";
@@ -37,6 +40,7 @@ import {
37
40
  type EvidenceAuditLinkedRow,
38
41
  type EvidenceBuildResult,
39
42
  type EvidenceCleanTraceRow,
43
+ type EvidenceDecision,
40
44
  type EvidenceFinding,
41
45
  type EvidenceGateDecisionsFile,
42
46
  type EvidenceLinkConfidence,
@@ -94,6 +98,7 @@ interface LinkedSessionEntry {
94
98
  }
95
99
 
96
100
  interface SessionLinkResult {
101
+ decisionBoards: Map<string, DecisionLedgerEntry[]>;
97
102
  entries: LinkedSessionEntry[];
98
103
  attemptedSessionIds: string[];
99
104
  missingSessionIds: string[];
@@ -163,7 +168,10 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
163
168
  gateDecisions: gateDecisions.decisions,
164
169
  validationEvidence,
165
170
  });
166
- const findings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
171
+ const decisionLinks = resolveReceiptDecisions(runSources, sessionLinks);
172
+ const rawFindings = buildFindings(runSources, trustStatusRaw, sessionLinks, auditLinks, protectedArtifactsRaw);
173
+ for (const row of decisionLinks.findings)
174
+ rawFindings.push({ ...row, id: `finding-${String(rawFindings.length + 1).padStart(3, "0")}` });
167
175
  // Export-boundary redaction (cold path): secret-shaped values are scrubbed
168
176
  // from everything the bundle serializes: envelopes, receipts (including
169
177
  // delegation toolCallLog arguments), tool-event previews, audit rows,
@@ -171,6 +179,7 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
171
179
  // session files are untouched; the bundle is the boundary, and the
172
180
  // overview's redactionCount keeps the bundle honest about its filtering.
173
181
  const tally = createRedactionTally();
182
+ const findings = redactSecretsDeep(rawFindings, tally);
174
183
  const redactedRunSources: EvidenceRunSource[] = runSources.map((item) => ({
175
184
  ...item,
176
185
  envelope: redactSecretsDeep(item.envelope, tally),
@@ -187,18 +196,21 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
187
196
  };
188
197
  const protectedArtifacts = redactSecretsDeep(protectedArtifactsRaw, tally);
189
198
  const trustStatus = redactSecretsDeep(trustStatusRaw, tally);
190
- const overview = buildOverview(
191
- evidenceId,
192
- source,
193
- redactedRunSources,
194
- findings,
195
- sessionLinks,
196
- redactedAuditLinks,
197
- redactedToolEvents,
198
- protectedArtifacts,
199
- );
199
+ const overview: EvidenceOverview = {
200
+ ...buildOverview(
201
+ evidenceId,
202
+ source,
203
+ redactedRunSources,
204
+ findings,
205
+ sessionLinks,
206
+ redactedAuditLinks,
207
+ redactedToolEvents,
208
+ protectedArtifacts,
209
+ ),
210
+ decisions: redactSecretsDeep(decisionLinks.decisions, tally),
211
+ };
200
212
  const transcript = redactSecretsText(
201
- renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw),
213
+ renderTranscript(overview, redactedRunSources, sessionLinks, trustStatusRaw, findings),
202
214
  tally,
203
215
  );
204
216
  const finalOverview: EvidenceOverview = { ...overview, redactionCount: tally.count };
@@ -215,7 +227,17 @@ export async function buildEvidence(options: BuildEvidenceOptions): Promise<Evid
215
227
  protectedArtifacts,
216
228
  transcript,
217
229
  );
218
- return { evidenceId, directory, overview: finalOverview, findings, trustStatus };
230
+ return {
231
+ evidenceId,
232
+ directory,
233
+ overview: finalOverview,
234
+ findings,
235
+ trustStatus,
236
+ ungroundedClaims: runSources.reduce((total, source) => {
237
+ const grounding = authenticatedReceipt(source)?.validationGrounding;
238
+ return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
239
+ }, 0),
240
+ };
219
241
  }
220
242
 
221
243
  function buildOverview(
@@ -229,7 +251,10 @@ function buildOverview(
229
251
  protectedArtifacts: EvidenceProtectedArtifactsFile,
230
252
  ): EvidenceOverview {
231
253
  const envelopes = runSources.map((item) => item.envelope);
232
- const receipts = runSources.flatMap((item) => (item.receipt === null ? [] : [item.receipt]));
254
+ const receipts = runSources.flatMap((item) => {
255
+ const receipt = authenticatedReceipt(item);
256
+ return receipt === null ? [] : [receipt];
257
+ });
233
258
  const toolStats = receipts.flatMap((receipt) => receipt.toolStats);
234
259
  const runIds = envelopes.map((envelope) => envelope.id).sort(compareStrings);
235
260
  const sessionIds = uniqueStrings(
@@ -619,7 +644,7 @@ async function writeEvidenceFiles(
619
644
  await writeJson(join(directory, "overview.json"), overview);
620
645
  await writeFile(
621
646
  join(directory, "transcript.md"),
622
- transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus),
647
+ transcript ?? renderTranscript(overview, runSources, sessionLinks, trustStatus, findings),
623
648
  "utf8",
624
649
  );
625
650
  await writeJsonl(join(directory, "trace.raw.jsonl"), rawTraceRows(runSources));
@@ -736,6 +761,7 @@ async function linkSessionEntries(
736
761
  const attemptedSessionIds = sourceSessionIds(source, runSources);
737
762
  const windows = attributionWindows(ledger, runSources, attemptedSessionIds);
738
763
  const result: SessionLinkResult = {
764
+ decisionBoards: new Map(),
739
765
  entries: [],
740
766
  attemptedSessionIds,
741
767
  missingSessionIds: [],
@@ -748,6 +774,7 @@ async function linkSessionEntries(
748
774
  continue;
749
775
  }
750
776
  result.readErrors.push(...read.errors);
777
+ result.decisionBoards.set(sessionId, foldDecisionBoard(filterEntriesToActivePath(read.entries, read.leafTurnId)));
751
778
  for (const entry of read.entries) {
752
779
  const link = linkSessionEntry(entry, windows);
753
780
  if (source.kind === "run" && !linkCoversRun(link, source.runId)) continue;
@@ -1280,6 +1307,7 @@ function renderTranscript(
1280
1307
  runSources: ReadonlyArray<EvidenceRunSource>,
1281
1308
  sessionLinks: SessionLinkResult,
1282
1309
  trustStatus: EvidenceTrustStatusFile,
1310
+ findings: ReadonlyArray<EvidenceFinding>,
1283
1311
  ): string {
1284
1312
  const trustByRun = new Map(trustStatus.runs.map((entry) => [entry.runId, entry.status]));
1285
1313
  const lines = [
@@ -1306,6 +1334,21 @@ function renderTranscript(
1306
1334
  }
1307
1335
  }
1308
1336
  }
1337
+ const decisionFindings = findings.filter(
1338
+ (row) => row.tag === "context-provenance" && row.message.startsWith("Decision ref "),
1339
+ );
1340
+ if (decisionFindings.length > 0) {
1341
+ lines.push("", "## Decision provenance");
1342
+ for (const row of decisionFindings) lines.push(`- [${row.severity}] ${row.runId}: ${row.message}`);
1343
+ for (const decision of overview.decisions ?? []) {
1344
+ lines.push(
1345
+ `\n### ${decision.ref} (run ${decision.runId}, session ${decision.sessionId})`,
1346
+ "```json",
1347
+ JSON.stringify(decision.record, null, 2),
1348
+ "```",
1349
+ );
1350
+ }
1351
+ }
1309
1352
  if (sessionLinks.entries.length > 0) {
1310
1353
  lines.push("", "## Linked Session Transcript");
1311
1354
  for (const linked of sessionLinks.entries) {
@@ -1430,11 +1473,13 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
1430
1473
  const label = decision.label === undefined ? "" : ` label=${previewUnknown(decision.label)}`;
1431
1474
  const sourceQuestion =
1432
1475
  decision.source_question === undefined ? "" : ` sourceQuestion=${previewUnknown(decision.source_question)}`;
1433
- const revision = decision.revisedAt === undefined ? "" : ` revisedAt=${decision.revisedAt} revisionSource=operator`;
1476
+ const revisionSource = decision.revisionSource ?? "unknown";
1477
+ const revision =
1478
+ decision.revisedAt === undefined ? "" : ` revisedAt=${decision.revisedAt} revisionSource=${revisionSource}`;
1434
1479
  const correction =
1435
1480
  decision.correction === undefined
1436
1481
  ? ""
1437
- : ` correctionSource=operator correction=${previewUnknown(decision.correction)}`;
1482
+ : ` correctionSource=${revisionSource} correction=${previewUnknown(decision.correction)}`;
1438
1483
  return ` decision key=${decision.key} status=${decision.status} decidedAt=${decision.decidedAt}${revision}${label}${sourceQuestion} value=${previewUnknown(decision.value)}${correction}`;
1439
1484
  }),
1440
1485
  ];
@@ -1577,6 +1622,7 @@ function parseRunEnvelope(value: unknown, source: string): RunEnvelope {
1577
1622
  // tampered. The validated reads below still gate the fields evidence uses.
1578
1623
  return {
1579
1624
  ...(value as Partial<RunEnvelope>),
1625
+ version: 1,
1580
1626
  id: readString(value, source, "id"),
1581
1627
  agentId: readString(value, source, "agentId"),
1582
1628
  executionRole: readExecutionRole(value, source),
@@ -1874,3 +1920,46 @@ function sanitizeEvidenceId(value: string): string {
1874
1920
  const clean = value.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
1875
1921
  return clean.length === 0 ? "unknown" : clean;
1876
1922
  }
1923
+
1924
+ /** Receipt refs authenticate the link, while the session ledger supplies the recorded argument. */
1925
+ function resolveReceiptDecisions(
1926
+ runSources: ReadonlyArray<EvidenceRunSource>,
1927
+ sessions: SessionLinkResult,
1928
+ ): {
1929
+ decisions: EvidenceDecision[];
1930
+ findings: EvidenceFinding[];
1931
+ } {
1932
+ const decisions: EvidenceDecision[] = [];
1933
+ const findings: EvidenceFinding[] = [];
1934
+ for (const source of runSources) {
1935
+ const receipt = authenticatedReceipt(source);
1936
+ if (!receipt?.decisionRefs?.length) continue;
1937
+ const sessionId = receipt.sessionId;
1938
+ const board = sessionId === null ? [] : (sessions.decisionBoards.get(sessionId) ?? []);
1939
+ const records = new Map(
1940
+ board.flatMap((entry) =>
1941
+ entry.decisions.map(
1942
+ (record) =>
1943
+ [
1944
+ decisionRef(entry.interviewId, record.key),
1945
+ { ...record, source: record.source ?? (entry.origin === "agent" ? ("agent" as const) : ("operator" as const)) },
1946
+ ] as const,
1947
+ ),
1948
+ ),
1949
+ );
1950
+ for (const ref of new Set(receipt.decisionRefs)) {
1951
+ const record = records.get(ref);
1952
+ if (record && sessionId !== null) decisions.push({ runId: receipt.runId, sessionId, ref, record });
1953
+ findings.push(
1954
+ finding(
1955
+ findings.length,
1956
+ record ? "info" : "warn",
1957
+ "context-provenance",
1958
+ receipt.runId,
1959
+ `Decision ref ${ref} ${record ? "resolved" : "does not resolve"} on session ${sessionId ?? "(unlinked)"} active path`,
1960
+ ),
1961
+ );
1962
+ }
1963
+ }
1964
+ return { decisions, findings };
1965
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Fixed machine-readable projection of one evidence bundle's trust record.
3
+ *
4
+ * `evidence inspect <id>` prints an operator record that quotes the task text,
5
+ * the bundle's file list, and per-finding prose. This is the same bundle read
6
+ * down to the one thing a GUI can carry safely and usefully: which runs the
7
+ * bundle covers, what verdict each run earned, and which axis produced it.
8
+ *
9
+ * Every value here comes from a closed vocabulary. The axis names, the axis
10
+ * states, and the verdicts are all enumerations the harness owns, so there is
11
+ * no free-form text on this surface at all, which is what lets it answer the
12
+ * question the inventory raises without reopening the boundary the inventory
13
+ * closed.
14
+ *
15
+ * Unlike the other fixed reads this one takes an identifier, because an
16
+ * operator names the bundle. The GUI host may only pass back an id it served
17
+ * inside its current bounded window; see `apps/workbench/artifact-allowlist.ts`.
18
+ */
19
+
20
+ import { clioDataDir } from "../../core/xdg.js";
21
+ import { inspectEvidence, TRUST_STATUS_AXES, type TrustStatusAxis, type TrustVerdict, trustVerdict } from "./index.js";
22
+
23
+ export const EVIDENCE_DETAIL_MAX_RUNS = 16;
24
+
25
+ export interface EvidenceDetailRun {
26
+ readonly runId: string;
27
+ readonly verdict: TrustVerdict;
28
+ /** Every axis, always all six, so an absent axis is stated rather than missing. */
29
+ readonly axes: Readonly<Record<TrustStatusAxis, string>>;
30
+ }
31
+
32
+ export interface EvidenceDetailSnapshot {
33
+ readonly version: 1;
34
+ readonly generatedAt: string;
35
+ readonly evidenceId: string;
36
+ readonly sourceKind: "run" | "session" | "eval";
37
+ /** False when the bundle predates the canonical trust projection. */
38
+ readonly canonical: boolean;
39
+ readonly runs: readonly EvidenceDetailRun[];
40
+ readonly runsTruncated: boolean;
41
+ }
42
+
43
+ export async function evidenceDetailSnapshot(
44
+ evidenceId: string,
45
+ now: () => number = Date.now,
46
+ dataDir: string = clioDataDir(),
47
+ ): Promise<EvidenceDetailSnapshot> {
48
+ const inspected = await inspectEvidence(dataDir, evidenceId);
49
+ const all = inspected.trustStatus.runs;
50
+ const window = all.slice(0, EVIDENCE_DETAIL_MAX_RUNS);
51
+ return {
52
+ version: 1,
53
+ generatedAt: new Date(now()).toISOString(),
54
+ evidenceId: inspected.overview.evidenceId,
55
+ sourceKind: inspected.overview.source.kind,
56
+ canonical: inspected.trustStatus.projection === "canonical",
57
+ runs: window.map(
58
+ (run): EvidenceDetailRun => ({
59
+ runId: run.runId,
60
+ verdict: trustVerdict(run.status),
61
+ axes: Object.fromEntries(TRUST_STATUS_AXES.map((axis) => [axis, run.status[axis].state])) as Record<
62
+ TrustStatusAxis,
63
+ string
64
+ >,
65
+ }),
66
+ ),
67
+ runsTruncated: all.length > window.length,
68
+ };
69
+ }
@@ -9,6 +9,7 @@ import { renderEvidenceFindingsMarkdown } from "./findings-markdown.js";
9
9
  import { compareCodepoints as compareStrings } from "./ordering.js";
10
10
  import { buildEvidenceTrustStatusFile } from "./run-trust.js";
11
11
  import { evidenceDirectory, findingsFile } from "./store.js";
12
+ import { inspectRunReceiptTrustStatus } from "./trust-status.js";
12
13
  import {
13
14
  EVIDENCE_VERSION,
14
15
  type EvidenceAuditLinkedRow,
@@ -107,7 +108,18 @@ export async function buildEvalEvidence(options: BuildEvalEvidenceOptions): Prom
107
108
  gateDecisions,
108
109
  trustStatus,
109
110
  );
110
- return { evidenceId, directory, overview, findings, trustStatus };
111
+ return {
112
+ evidenceId,
113
+ directory,
114
+ overview,
115
+ findings,
116
+ trustStatus,
117
+ ungroundedClaims: linkedRuns.runSources.reduce((total, source) => {
118
+ if (!inspectRunReceiptTrustStatus(source.receipt, source.envelope).integrity.ok) return total;
119
+ const grounding = source.receipt?.validationGrounding;
120
+ return total + (grounding === undefined ? 0 : Math.max(0, grounding.claimed - grounding.grounded));
121
+ }, 0),
122
+ };
111
123
  }
112
124
 
113
125
  export function evalEvidenceId(evalId: string): string {
@@ -7,7 +7,7 @@ import type { EvidenceTag } from "./types.js";
7
7
  *
8
8
  * The forensic layer (`evidence/build.ts`) speaks the canonical 23-tag
9
9
  * `EVIDENCE_TAGS` vocabulary over durable artifacts. The live layer
10
- * (`safety/finish-contract.ts`) speaks a 3-kind in-loop vocabulary
10
+ * (`safety/finish-contract.ts`) speaks a 4-kind in-loop vocabulary
11
11
  * (`FinishContractEvidenceKind`) over the last ~80 session entries. They are
12
12
  * the same accountability concept observed at two depths.
13
13
  *
@@ -29,11 +29,15 @@ import type { EvidenceTag } from "./types.js";
29
29
  * - dispatch_receipt: a passed dispatch receipt, whose forensic concerns are
30
30
  * `receipt-integrity` (the receipt verifies) and `session-linked` (the run
31
31
  * is linked to its session).
32
+ * - limitation: a successful `limitation` tool receipt, which the forensic
33
+ * layer records as the `completion-evidence` info row for a run that
34
+ * finished limited instead of evidenced.
32
35
  */
33
36
  export const FINISH_CONTRACT_EVIDENCE_TAGS: Record<FinishContractEvidenceKind, readonly EvidenceTag[]> = {
34
37
  validation_command: ["no-validation", "proxy-validation"],
35
38
  protected_artifact: ["protected-artifact"],
36
39
  dispatch_receipt: ["receipt-integrity", "session-linked"],
40
+ limitation: ["completion-evidence"],
37
41
  } as const;
38
42
 
39
43
  /** The canonical tags a single live finish-contract kind projects onto. */
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Fixed machine-readable projection of recent evidence artifacts.
3
+ *
4
+ * `evidence list` is an operator table and `evidence inspect <id>` needs an id,
5
+ * so neither is a transport a GUI host can invoke blind. This command accepts
6
+ * no identifier, path, or limit, selects a bounded newest-first window itself,
7
+ * and emits provenance, tags, totals, and a trust verdict.
8
+ *
9
+ * An overview carries the working directories the runs executed in, the task
10
+ * text the operator typed, and the file names inside the bundle. None of that
11
+ * appears here. What does is the shape of the artifact and how far it can be
12
+ * trusted, which is what an operator picks a bundle by.
13
+ */
14
+
15
+ import { clioDataDir } from "../../core/xdg.js";
16
+ import { truncateToWidth } from "../../engine/tui-primitives.js";
17
+ import { sanitizeCallTargetText } from "../safety/call-target.js";
18
+ import {
19
+ EVIDENCE_TAGS,
20
+ type EvidenceOverview,
21
+ type EvidenceTag,
22
+ listEvidenceOverviews,
23
+ loadEvidenceTrustStatus,
24
+ type TrustVerdict,
25
+ trustVerdict,
26
+ } from "./index.js";
27
+
28
+ export const EVIDENCE_INVENTORY_MAX_ARTIFACTS = 12;
29
+ export const EVIDENCE_INVENTORY_MAX_IDS = 8;
30
+
31
+ const IDENTITY_WIDTH = 128;
32
+
33
+ /**
34
+ * Worst verdict first.
35
+ *
36
+ * An artifact covering several runs is only as trustworthy as its weakest run,
37
+ * so the fold takes the worst rather than the newest or the most common. A
38
+ * `compromised` run inside an otherwise clean bundle is the fact the operator
39
+ * needs, and averaging it away would be the one summary worth not printing.
40
+ */
41
+ const VERDICT_SEVERITY: ReadonlyArray<TrustVerdict> = ["compromised", "unverified", "unknown", "grounded", "reviewed"];
42
+
43
+ export interface EvidenceInventoryArtifact {
44
+ readonly evidenceId: string;
45
+ readonly sourceKind: "run" | "session" | "eval";
46
+ readonly generatedAt: string;
47
+ readonly startedAt: string | null;
48
+ readonly endedAt: string | null;
49
+ readonly runIds: readonly string[];
50
+ readonly runIdsTruncated: boolean;
51
+ readonly agentIds: readonly string[];
52
+ readonly statuses: readonly string[];
53
+ readonly tags: readonly EvidenceTag[];
54
+ readonly totals: Readonly<{
55
+ runs: number;
56
+ receipts: number;
57
+ toolCalls: number;
58
+ toolErrors: number;
59
+ blockedToolCalls: number;
60
+ protectedArtifacts: number;
61
+ tokens: number;
62
+ costUsd: number;
63
+ wallTimeMs: number;
64
+ }>;
65
+ /** Secret-shaped values the builder replaced across the bundle's exports. */
66
+ readonly redactionCount: number;
67
+ readonly trust: Readonly<{
68
+ verdict: TrustVerdict;
69
+ /** Runs whose canonical trust status the bundle actually recorded. */
70
+ runsCovered: number;
71
+ /** True when the bundle predates the canonical trust projection. */
72
+ historical: boolean;
73
+ }>;
74
+ }
75
+
76
+ export interface EvidenceInventorySnapshot {
77
+ readonly version: 1;
78
+ readonly generatedAt: string;
79
+ readonly artifacts: readonly EvidenceInventoryArtifact[];
80
+ readonly truncated: boolean;
81
+ }
82
+
83
+ function bounded(value: string, width: number): string {
84
+ const sanitized = sanitizeCallTargetText(value);
85
+ if (sanitized.length === 0) return "unavailable";
86
+ return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
87
+ }
88
+
89
+ /** Distinct, sanitized, bounded, in first-seen order. */
90
+ function identities(values: ReadonlyArray<string>): string[] {
91
+ const seen: string[] = [];
92
+ for (const value of values) {
93
+ const text = bounded(value, IDENTITY_WIDTH);
94
+ if (!seen.includes(text)) seen.push(text);
95
+ if (seen.length >= EVIDENCE_INVENTORY_MAX_IDS) break;
96
+ }
97
+ return seen;
98
+ }
99
+
100
+ function tally(value: number | undefined): number {
101
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
102
+ }
103
+
104
+ function amount(value: number | undefined): number {
105
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
106
+ }
107
+
108
+ /** Newest generation first. An unparseable stamp sorts oldest rather than throwing. */
109
+ function byNewest(a: EvidenceOverview, b: EvidenceOverview): number {
110
+ return (Date.parse(b.generatedAt) || 0) - (Date.parse(a.generatedAt) || 0);
111
+ }
112
+
113
+ export async function evidenceInventorySnapshot(
114
+ now: () => number = Date.now,
115
+ dataDir: string = clioDataDir(),
116
+ ): Promise<EvidenceInventorySnapshot> {
117
+ const all = (await listEvidenceOverviews(dataDir)).sort(byNewest);
118
+ const window = all.slice(0, EVIDENCE_INVENTORY_MAX_ARTIFACTS);
119
+ const artifacts: EvidenceInventoryArtifact[] = [];
120
+ for (const overview of window) {
121
+ // One unreadable trust file costs that artifact its verdict, never the
122
+ // whole inventory: the bundle itself is still the thing being listed.
123
+ let verdict: TrustVerdict = "unknown";
124
+ let runsCovered = 0;
125
+ let historical = true;
126
+ try {
127
+ const status = await loadEvidenceTrustStatus(dataDir, overview.evidenceId);
128
+ historical = status.projection !== "canonical";
129
+ runsCovered = status.runs.length;
130
+ const verdicts = status.runs.map((run) => trustVerdict(run.status));
131
+ verdict = VERDICT_SEVERITY.find((candidate) => verdicts.includes(candidate)) ?? "unknown";
132
+ } catch {
133
+ verdict = "unknown";
134
+ }
135
+ artifacts.push({
136
+ evidenceId: bounded(overview.evidenceId, IDENTITY_WIDTH),
137
+ sourceKind: overview.source.kind,
138
+ generatedAt: overview.generatedAt,
139
+ startedAt: overview.startedAt,
140
+ endedAt: overview.endedAt,
141
+ runIds: identities(overview.runIds),
142
+ runIdsTruncated: overview.runIds.length > EVIDENCE_INVENTORY_MAX_IDS,
143
+ agentIds: identities(overview.agentIds),
144
+ statuses: identities(overview.statuses),
145
+ tags: overview.tags.filter((tag) => EVIDENCE_TAGS.includes(tag)),
146
+ totals: {
147
+ runs: tally(overview.totals.runs),
148
+ receipts: tally(overview.totals.receipts),
149
+ toolCalls: tally(overview.totals.toolCalls),
150
+ toolErrors: tally(overview.totals.toolErrors),
151
+ blockedToolCalls: tally(overview.totals.blockedToolCalls),
152
+ protectedArtifacts: tally(overview.totals.protectedArtifacts),
153
+ tokens: tally(overview.totals.tokens),
154
+ costUsd: amount(overview.totals.costUsd),
155
+ wallTimeMs: tally(overview.totals.wallTimeMs),
156
+ },
157
+ redactionCount: tally(overview.redactionCount),
158
+ trust: { verdict, runsCovered, historical },
159
+ });
160
+ }
161
+ return {
162
+ version: 1,
163
+ generatedAt: new Date(now()).toISOString(),
164
+ artifacts,
165
+ truncated: all.length > window.length,
166
+ };
167
+ }