@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
@@ -9,30 +9,39 @@
9
9
  * mutates in-memory state and marks the projection changed; the actual
10
10
  * snapshot build and listener fan-out happen on a short debounce so a burst
11
11
  * of DispatchProgress events coalesces into one notification.
12
- * - The snapshot never stores raw worker output, tool arguments, or transcript
13
- * text. Run summaries carry compact lifecycle fields; notices carry a short
14
- * rendered message and a reference id, nothing more.
15
- * - Run summaries and notices are bounded rings so a long-lived session cannot
16
- * grow the projection without limit.
12
+ * - Worker progress retains only bounded answer text and redacted action
13
+ * descriptors. Tool arguments and reasoning are never stored.
14
+ * - Terminal history and notices are bounded; active runs remain until settlement.
17
15
  */
18
16
 
19
- import { BusChannels } from "../../core/bus-events.js";
17
+ import { performance } from "node:perf_hooks";
18
+ import { BusChannels, type DispatchRunIdentity } from "../../core/bus-events.js";
20
19
  import { resolveDispatchFailureStatus } from "../../core/dispatch-outcome.js";
21
20
  import type { SafeEventBus } from "../../core/event-bus.js";
21
+ import { truncateToWidth } from "../../engine/tui-primitives.js";
22
+ import type { AgentAudience } from "../agents/spec.js";
23
+ import { cloneRunToolBudgetEnvelope, type RunToolBudgetEnvelope } from "../dispatch/budget-envelope.js";
24
+ import type { DispatchSnapshot } from "../dispatch/contract.js";
25
+ import type { DispatchRequestOrigin, RunKind } from "../dispatch/types.js";
26
+ import { summarizeTrustStatus } from "../evidence/trust-projection.js";
22
27
  import type { TargetStatus } from "../providers/contract.js";
23
- import { resolveCostProvenance } from "../providers/types/cost-provenance.js";
28
+ import { type CostProvenance, resolveCostProvenance } from "../providers/types/cost-provenance.js";
29
+ import { sanitizeCallTargetText } from "../safety/call-target.js";
24
30
  import type { AccountabilitySummary } from "./accountability.js";
25
31
  import type {
26
32
  ObservabilityNotice,
27
33
  ObservabilityRunEvidence,
34
+ ObservabilityRunProjection,
35
+ ObservabilityRunReaders,
28
36
  ObservabilityRunSummary,
29
37
  ObservabilitySnapshot,
30
38
  TokenThroughputSnapshot,
31
39
  } from "./contract.js";
32
40
  import type { CostAggregate, UsageBreakdown } from "./cost.js";
33
41
  import type { MetricsView } from "./metrics.js";
42
+ import { createWorkerProgressFold, type WorkerProgressFold } from "./worker-progress.js";
34
43
 
35
- /** Recent run summaries retained. Mirrors the dispatch board's window. */
44
+ /** Settled run summaries retained, in addition to all active runs. */
36
45
  export const MAX_PROJECTION_RUNS = 50;
37
46
  /** Recent notices retained across all kinds. */
38
47
  export const MAX_PROJECTION_NOTICES = 100;
@@ -46,7 +55,7 @@ export const PROJECTION_FLUSH_DEBOUNCE_MS = 16;
46
55
  * own bus handlers never matters (both run synchronously before the debounced
47
56
  * build).
48
57
  */
49
- export interface ProjectionReadModel {
58
+ export interface ProjectionReadModel extends ObservabilityRunReaders {
50
59
  metrics(): MetricsView;
51
60
  sessionCost(): number;
52
61
  sessionCostSummary(): CostAggregate;
@@ -55,15 +64,13 @@ export interface ProjectionReadModel {
55
64
  readAccountability(): AccountabilitySummary;
56
65
  }
57
66
 
58
- export interface ObservabilityProjection {
67
+ export interface ObservabilityProjection extends ObservabilityRunProjection {
59
68
  snapshot(): ObservabilitySnapshot;
60
69
  subscribe(listener: (snapshot: ObservabilitySnapshot) => void): () => void;
61
70
  /** Recompute after a direct session mutation (recordTokens/resetSession/safety counter). */
62
71
  refresh(): void;
63
72
  /** A forensic evidence build for `runId` has started. */
64
73
  evidenceBuildStarted(runId: string): void;
65
- /** The evidence bundle for `runId` finalized and its index row landed. */
66
- evidenceBuildSucceeded(runId: string, evidence: ObservabilityRunEvidence): void;
67
74
  /** The evidence build for `runId` failed; surface a bounded notice. */
68
75
  evidenceBuildFailed(runId: string, message: string): void;
69
76
  /** Detach bus listeners and cancel any pending flush. */
@@ -105,17 +112,183 @@ function makeRef(parts: Record<string, unknown>): ObservabilityNotice["ref"] | u
105
112
  return Object.keys(ref).length > 0 ? (ref as ObservabilityNotice["ref"]) : undefined;
106
113
  }
107
114
 
108
- /** Shared identity fields carried on every dispatch lifecycle event. */
109
- interface RunIdentityLike {
110
- agentId?: unknown;
111
- targetId?: unknown;
112
- wireModelId?: unknown;
113
- runtimeId?: unknown;
114
- runtimeKind?: unknown;
115
+ interface RunEntry extends ObservabilityRunSummary {
116
+ progressFold: WorkerProgressFold;
117
+ startedAtClockMs: number | null;
118
+ }
119
+
120
+ const TASK_SUMMARY_MAX_WIDTH = 240;
121
+
122
+ function finiteOrZero(value: unknown): number {
123
+ return num(value, 0);
124
+ }
125
+
126
+ function parseRuntimeKind(value: unknown): RunKind {
127
+ if (value === "sdk" || value === "subprocess" || value === "acp-delegation") return value;
128
+ return "http";
129
+ }
130
+
131
+ function parseAgentAudience(value: unknown, fallback: AgentAudience | undefined): AgentAudience | undefined {
132
+ if (value === "base" || value === "shadow" || value === "custom" || value === "internal") return value;
133
+ return fallback;
134
+ }
135
+
136
+ function parseRequestOrigin(
137
+ value: unknown,
138
+ fallback: DispatchRequestOrigin | undefined,
139
+ ): DispatchRequestOrigin | undefined {
140
+ if (value === "user" || value === "agent" || value === "internal") return value;
141
+ return fallback;
142
+ }
143
+
144
+ function parseNonEmptyString(value: unknown): string | undefined {
145
+ return typeof value === "string" && value.length > 0 ? value : undefined;
146
+ }
147
+
148
+ function parseTaskSummary(
149
+ raw: Partial<DispatchRunIdentity> & { task?: unknown; taskSummary?: unknown },
150
+ fallback: string | undefined,
151
+ ): string | undefined {
152
+ return sanitizeDispatchTaskSummary(raw.task) ?? sanitizeDispatchTaskSummary(raw.taskSummary) ?? fallback;
153
+ }
154
+
155
+ function parsePositiveInt(value: unknown): number | undefined {
156
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
157
+ }
158
+
159
+ function parseGateBadge(value: unknown): { role: string; cycle: number } | undefined {
160
+ if (typeof value !== "object" || value === null) return undefined;
161
+ const record = value as { role?: unknown; cycle?: unknown };
162
+ if (typeof record.role !== "string" || record.role.length === 0) return undefined;
163
+ const cycle = parsePositiveInt(record.cycle) ?? 1;
164
+ return { role: record.role, cycle };
165
+ }
166
+
167
+ function parseEndpointCapacity(value: unknown): ObservabilityRunSummary["endpoint"] | undefined {
168
+ if (typeof value !== "object" || value === null) return undefined;
169
+ const record = value as { key?: unknown; label?: unknown; limit?: unknown };
170
+ const key = parseNonEmptyString(record.key);
171
+ const label = parseNonEmptyString(record.label);
172
+ const limit = parsePositiveInt(record.limit);
173
+ return key === undefined || label === undefined || limit === undefined ? undefined : { key, label, limit };
174
+ }
175
+
176
+ function parseCouncilBadge(value: unknown): ObservabilityRunSummary["council"] | undefined {
177
+ if (typeof value !== "object" || value === null) return undefined;
178
+ const record = value as { group?: unknown; label?: unknown; color?: unknown; round?: unknown };
179
+ const group = parseNonEmptyString(record.group);
180
+ const label = parseNonEmptyString(record.label);
181
+ const round = parsePositiveInt(record.round);
182
+ if (group === undefined || label === undefined || round === undefined) return undefined;
183
+ return {
184
+ group,
185
+ label,
186
+ ...(typeof record.color === "string" && record.color.length > 0 ? { color: record.color } : {}),
187
+ round,
188
+ };
189
+ }
190
+
191
+ function sanitizeDispatchTaskSummary(value: unknown): string | undefined {
192
+ if (typeof value !== "string") return undefined;
193
+ const sanitized = sanitizeCallTargetText(value);
194
+ if (sanitized.length === 0) return undefined;
195
+ // pi-tui's truncator appends reset sequences when it elides. Strip those
196
+ // again so the stored projection remains plain text, not terminal styling.
197
+ return sanitizeCallTargetText(truncateToWidth(sanitized, TASK_SUMMARY_MAX_WIDTH, "…", false));
198
+ }
199
+
200
+ function parseRetrySnapshot(
201
+ value: DispatchSnapshot["retrying"][number],
202
+ ): NonNullable<ObservabilityRunSummary["retry"]> | null {
203
+ const attempt = parsePositiveInt(value.attempt);
204
+ const dueAtMs = Date.parse(value.dueAt);
205
+ if (attempt === undefined || !Number.isFinite(dueAtMs)) return null;
206
+ return {
207
+ attempt,
208
+ dueAtMs,
209
+ reason: sanitizeCallTargetText(value.reason),
210
+ };
211
+ }
212
+
213
+ function readRetrySnapshot(
214
+ snapshot: DispatchSnapshot,
215
+ ): Map<string, { agentId: string; taskSummary?: string; retry: NonNullable<ObservabilityRunSummary["retry"]> }> {
216
+ const retrying = new Map<
217
+ string,
218
+ { agentId: string; taskSummary?: string; retry: NonNullable<ObservabilityRunSummary["retry"]> }
219
+ >();
220
+ try {
221
+ for (const value of snapshot.retrying) {
222
+ const runId = asRunId(value.runId);
223
+ const agentId = parseNonEmptyString(value.agentId);
224
+ const retry = parseRetrySnapshot(value);
225
+ const taskSummary = sanitizeDispatchTaskSummary(value.task);
226
+ if (runId && agentId && retry) {
227
+ retrying.set(runId, {
228
+ agentId,
229
+ ...(taskSummary !== undefined ? { taskSummary } : {}),
230
+ retry,
231
+ });
232
+ }
233
+ }
234
+ } catch {
235
+ // The projection remains lifecycle-event driven if an optional snapshot fails.
236
+ }
237
+ return retrying;
238
+ }
239
+
240
+ function readRunningSnapshot(snapshot: DispatchSnapshot): Map<
241
+ string,
242
+ {
243
+ inputTokens: number;
244
+ outputTokens: number;
245
+ tokenCount: number;
246
+ costUsd: number;
247
+ costProvenance: CostProvenance;
248
+ outcomePhase: string;
249
+ budget?: RunToolBudgetEnvelope;
250
+ }
251
+ > {
252
+ const running = new Map<
253
+ string,
254
+ {
255
+ inputTokens: number;
256
+ outputTokens: number;
257
+ tokenCount: number;
258
+ costUsd: number;
259
+ costProvenance: CostProvenance;
260
+ outcomePhase: string;
261
+ budget?: RunToolBudgetEnvelope;
262
+ }
263
+ >();
264
+ try {
265
+ for (const value of snapshot.running) {
266
+ const runId = asRunId(value.runId);
267
+ if (!runId) continue;
268
+ const budget = cloneRunToolBudgetEnvelope(value.budget);
269
+ running.set(runId, {
270
+ inputTokens: finiteOrZero(value.tokens.input),
271
+ outputTokens: finiteOrZero(value.tokens.output),
272
+ tokenCount: finiteOrZero(value.tokens.total),
273
+ costUsd: finiteOrZero(value.costUsd),
274
+ costProvenance: value.costProvenance ?? "unknown",
275
+ outcomePhase: value.outcomePhase,
276
+ ...(budget !== undefined ? { budget } : {}),
277
+ });
278
+ }
279
+ } catch {
280
+ // Lifecycle/progress events remain authoritative if the optional snapshot fails.
281
+ }
282
+ return running;
115
283
  }
116
284
 
117
285
  export function createObservabilityProjection(bus: SafeEventBus, deps: ProjectionReadModel): ObservabilityProjection {
118
- const runs = new Map<string, ObservabilityRunSummary>();
286
+ const runs = new Map<string, RunEntry>();
287
+ // Settlement order is independent of enqueue order: an old active run
288
+ // becomes the newest history entry when it finally settles.
289
+ const terminalHistory = new Set<string>();
290
+ const fleetPhases = new Map<string, NonNullable<ObservabilityRunSummary["phase"]>>();
291
+ let runReaders: ObservabilityRunReaders = deps;
119
292
  const notices: ObservabilityNotice[] = [];
120
293
  const providerHealth = new Map<string, TargetStatus>();
121
294
  const pendingEvidence = new Set<string>();
@@ -142,7 +315,14 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
142
315
  accountability,
143
316
  // Newest-first: Map preserves first-seen (enqueue) order, so reversing
144
317
  // surfaces the most recently started runs at the head of the list.
145
- runs: [...runs.values()].reverse(),
318
+ runs: [...runs.values()].reverse().map((entry) => {
319
+ const { progressFold, startedAtClockMs: _clock, ...summary } = entry;
320
+ return structuredClone({
321
+ ...summary,
322
+ status: entry.retry ? "retrying" : entry.status,
323
+ progress: progressFold.snapshot(),
324
+ });
325
+ }),
146
326
  providerHealth: providerHealthRecord,
147
327
  notices: [...notices],
148
328
  pendingEvidenceBuildRunIds: [...pendingEvidence],
@@ -171,23 +351,42 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
171
351
  }
172
352
 
173
353
  function markChanged(): void {
354
+ for (const [runId, summary] of runs) {
355
+ // A dead heartbeat is provisional until dispatch finalization. A failed
356
+ // retry parent restored from the queue is terminal even when its finish
357
+ // time was evicted; only its pending retry keeps it outside the cap.
358
+ if (isTerminal(summary.status) && (summary.status !== "dead" || summary.finishedAtMs !== null) && !summary.retry) {
359
+ terminalHistory.add(runId);
360
+ } else {
361
+ terminalHistory.delete(runId);
362
+ }
363
+ }
364
+ while (terminalHistory.size > MAX_PROJECTION_RUNS) {
365
+ const oldest = terminalHistory.values().next().value;
366
+ if (oldest === undefined) break;
367
+ terminalHistory.delete(oldest);
368
+ runs.delete(oldest);
369
+ fleetPhases.delete(oldest);
370
+ }
174
371
  revision += 1;
175
372
  scheduleFlush();
176
373
  }
177
374
 
178
- function putRun(runId: string, summary: ObservabilityRunSummary): void {
375
+ function putRun(runId: string, summary: RunEntry): void {
179
376
  runs.set(runId, summary);
180
- while (runs.size > MAX_PROJECTION_RUNS) {
181
- const oldest = runs.keys().next().value;
182
- if (oldest === undefined) break;
183
- runs.delete(oldest);
184
- }
185
377
  }
186
378
 
187
- function emptyRun(runId: string, now: number): ObservabilityRunSummary {
379
+ function emptyRun(runId: string, now: number): RunEntry {
380
+ const phase = fleetPhases.get(runId);
188
381
  return {
189
382
  runId,
190
383
  agentId: "-",
384
+ runtimeKind: "http",
385
+ progressFold: createWorkerProgressFold(),
386
+ startedAtClockMs: null,
387
+ ttftMs: null,
388
+ lastContextTokens: 0,
389
+ ...(phase !== undefined ? { phase: { ...phase } } : {}),
191
390
  status: "enqueued",
192
391
  startedAtMs: now,
193
392
  updatedAtMs: now,
@@ -199,12 +398,27 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
199
398
  };
200
399
  }
201
400
 
202
- function applyIdentity(summary: ObservabilityRunSummary, id: RunIdentityLike): void {
401
+ function applyIdentity(summary: RunEntry, id: Partial<DispatchRunIdentity>): void {
402
+ // A lifecycle update must earn its trust again from the current receipt.
403
+ delete summary.trust;
203
404
  if (typeof id.agentId === "string" && id.agentId.length > 0) summary.agentId = id.agentId;
204
405
  if (typeof id.targetId === "string" && id.targetId.length > 0) summary.targetId = id.targetId;
205
406
  if (typeof id.wireModelId === "string" && id.wireModelId.length > 0) summary.modelId = id.wireModelId;
206
407
  if (typeof id.runtimeId === "string" && id.runtimeId.length > 0) summary.runtimeId = id.runtimeId;
207
- if (typeof id.runtimeKind === "string" && id.runtimeKind.length > 0) summary.runtimeKind = id.runtimeKind;
408
+ summary.runtimeKind = parseRuntimeKind(id.runtimeKind ?? summary.runtimeKind);
409
+ const additions = {
410
+ agentAudience: parseAgentAudience(id.agentAudience, summary.agentAudience),
411
+ requestOrigin: parseRequestOrigin(id.requestOrigin, summary.requestOrigin),
412
+ node: parseNonEmptyString(id.node) ?? summary.node,
413
+ endpoint: parseEndpointCapacity(id.endpoint) ?? summary.endpoint,
414
+ gate: parseGateBadge(id.gate) ?? summary.gate,
415
+ council: parseCouncilBadge(id.council) ?? summary.council,
416
+ rerouteCount: parsePositiveInt(id.rerouteCount) ?? summary.rerouteCount,
417
+ contextWindow: parsePositiveInt(id.contextWindow) ?? summary.contextWindow,
418
+ taskSummary: parseTaskSummary(id, summary.taskSummary),
419
+ budget: cloneRunToolBudgetEnvelope(id.budget) ?? summary.budget,
420
+ };
421
+ Object.assign(summary, Object.fromEntries(Object.entries(additions).filter(([, value]) => value !== undefined)));
208
422
  }
209
423
 
210
424
  // num()'s Number.isFinite check matters here specifically: a NaN or
@@ -244,6 +458,85 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
244
458
  markChanged();
245
459
  }
246
460
 
461
+ function settleFromReceipt(summary: RunEntry): void {
462
+ try {
463
+ const facts = runReaders.readReceipt?.(summary.runId);
464
+ // A failed or retired seal cannot supply the board's terminal answer.
465
+ const text = facts?.trust?.artifactIntegrity.state === "verified" ? facts.text : undefined;
466
+ summary.progressFold.settle(typeof text === "string" && text.trim().length > 0 ? text : undefined);
467
+ if (facts?.trust !== undefined) summary.trust = summarizeTrustStatus(facts.trust);
468
+ } catch {
469
+ summary.progressFold.settle();
470
+ }
471
+ }
472
+
473
+ function applyTerminalDetail(summary: RunEntry, payload: Record<string, unknown>): void {
474
+ const host = payload.hostVerification;
475
+ if (host === "verified" || host === "rejected" || host === "skipped" || host === "not_implicated")
476
+ summary.hostVerification = host;
477
+ if (payload.reason !== "retry_denied") summary.receiptId = summary.runId;
478
+ delete summary.retry;
479
+ settleFromReceipt(summary);
480
+ }
481
+
482
+ function reconcileRuns(): void {
483
+ if (!runReaders.dispatchSnapshot) return;
484
+ let current: DispatchSnapshot;
485
+ try {
486
+ current = runReaders.dispatchSnapshot();
487
+ } catch {
488
+ return;
489
+ }
490
+ if (!Array.isArray(current?.retrying) || !Array.isArray(current?.running)) return;
491
+ const retrying = readRetrySnapshot(current);
492
+ const running = readRunningSnapshot(current);
493
+ const now = Date.now();
494
+ let changed = false;
495
+ for (const entry of runs.values()) {
496
+ if (entry.retry && !retrying.has(entry.runId)) {
497
+ delete entry.retry;
498
+ changed = true;
499
+ }
500
+ }
501
+ for (const [runId, retry] of retrying) {
502
+ const existing = runs.get(runId);
503
+ if (existing && existing.status !== "failed" && existing.status !== "dead") continue;
504
+ const entry = existing ?? emptyRun(runId, now);
505
+ if (!existing) {
506
+ entry.agentId = retry.agentId;
507
+ entry.status = "failed";
508
+ }
509
+ entry.retry = { ...retry.retry };
510
+ if (entry.taskSummary === undefined && retry.taskSummary !== undefined) entry.taskSummary = retry.taskSummary;
511
+ putRun(runId, entry);
512
+ changed = true;
513
+ }
514
+ for (const [runId, live] of running) {
515
+ const entry = runs.get(runId);
516
+ if (!entry || (isTerminal(entry.status) && live.outcomePhase !== "aborting")) continue;
517
+ entry.tokens.input = live.inputTokens;
518
+ entry.tokens.output = live.outputTokens;
519
+ entry.tokens.total = live.tokenCount;
520
+ entry.costUsd = live.costUsd;
521
+ entry.costProvenance = live.costProvenance;
522
+ if (live.budget !== undefined) entry.budget = live.budget;
523
+ if (live.outcomePhase === "aborting" && entry.status !== "completed" && entry.status !== "aborted") {
524
+ entry.status = "cancelling";
525
+ delete entry.retry;
526
+ }
527
+ changed = true;
528
+ }
529
+ if (changed) markChanged();
530
+ }
531
+
532
+ function evidenceBuildSucceeded(runId: string, evidence: ObservabilityRunEvidence): void {
533
+ pendingEvidence.delete(runId);
534
+ const summary = runs.get(runId);
535
+ if (summary) summary.evidence = { ...evidence, tags: [...evidence.tags] };
536
+ accountability = deps.readAccountability();
537
+ markChanged();
538
+ }
539
+
247
540
  const unsubscribes: Array<() => void> = [
248
541
  bus.on(BusChannels.DispatchEnqueued, (raw: unknown) => {
249
542
  const payload = (raw ?? {}) as Record<string, unknown>;
@@ -251,8 +544,9 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
251
544
  if (!runId) return;
252
545
  const now = Date.now();
253
546
  const summary = runs.get(runId) ?? emptyRun(runId, now);
254
- applyIdentity(summary, payload);
547
+ applyIdentity(summary, payload as Partial<DispatchRunIdentity>);
255
548
  summary.status = "enqueued";
549
+ delete summary.retry;
256
550
  summary.updatedAtMs = now;
257
551
  putRun(runId, summary);
258
552
  markChanged();
@@ -263,9 +557,11 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
263
557
  if (!runId) return;
264
558
  const now = Date.now();
265
559
  const summary = runs.get(runId) ?? emptyRun(runId, now);
266
- applyIdentity(summary, payload);
560
+ applyIdentity(summary, payload as Partial<DispatchRunIdentity>);
267
561
  summary.status = "running";
268
562
  summary.startedAtMs = now;
563
+ summary.startedAtClockMs = performance.now();
564
+ delete summary.retry;
269
565
  summary.updatedAtMs = now;
270
566
  summary.finishedAtMs = null;
271
567
  summary.durationMs = null;
@@ -276,8 +572,6 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
276
572
  const payload = (raw ?? {}) as Record<string, unknown>;
277
573
  const runId = asRunId(payload.runId);
278
574
  if (!runId) return;
279
- // Only track progress for a run we already know; a bare progress relay
280
- // carries no identity to seed a summary from.
281
575
  const summary = runs.get(runId);
282
576
  if (!summary) return;
283
577
  const now = Date.now();
@@ -286,10 +580,56 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
286
580
  const type = typeof event.type === "string" ? event.type : "";
287
581
  if (type === "heartbeat_status") {
288
582
  const status = resolveHeartbeat(event.status);
289
- if (status && !isTerminal(summary.status)) summary.status = status;
583
+ if (status && !isTerminal(summary.status) && summary.status !== "cancelling") summary.status = status;
584
+ if (status === "dead") summary.progressFold.settle();
290
585
  markChanged();
291
586
  return;
292
587
  }
588
+ if (type === "attempt_start") {
589
+ summary.failoverHops = (summary.failoverHops ?? 0) + 1;
590
+ const attemptRunId = asRunId(event.runId);
591
+ if (attemptRunId && attemptRunId !== runId) {
592
+ // Assignment notifications are relayed on the root run. The child
593
+ // has its own lifecycle row; starting it cannot revive this parent.
594
+ delete summary.retry;
595
+ markChanged();
596
+ return;
597
+ }
598
+ summary.status = "running";
599
+ summary.finishedAtMs = null;
600
+ summary.durationMs = null;
601
+ summary.progressFold.restart();
602
+ delete summary.retry;
603
+ markChanged();
604
+ return;
605
+ }
606
+ // Agent startup provides the monotonic origin for TTFT. Lifecycle
607
+ // timestamps remain owned by DispatchStarted.
608
+ if (type === "agent_start") summary.startedAtClockMs = performance.now();
609
+ if (type === "message_update") {
610
+ const assistantEvent = (event.assistantMessageEvent ?? {}) as Record<string, unknown>;
611
+ const hasDelta = ["text_delta", "thinking_delta", "toolcall_start", "toolcall_delta"].includes(
612
+ String(assistantEvent.type),
613
+ );
614
+ if (hasDelta && summary.ttftMs === null && summary.startedAtClockMs !== null)
615
+ summary.ttftMs = Math.round(performance.now() - summary.startedAtClockMs);
616
+ }
617
+ if (type === "clio_coder_write_record_downgraded") {
618
+ const detail = (event.payload ?? {}) as Record<string, unknown>;
619
+ const tool = parseNonEmptyString(detail.tool);
620
+ const toolCallId = parseNonEmptyString(detail.toolCallId);
621
+ if (detail.reason === "opaque_tool_succeeded" && tool !== undefined && toolCallId !== undefined)
622
+ summary.writeRecordDowngrade = {
623
+ reason: "opaque_tool_succeeded",
624
+ tool: sanitizeCallTargetText(tool),
625
+ toolCallId: sanitizeCallTargetText(toolCallId),
626
+ };
627
+ }
628
+ summary.progressFold.observe(payload.event);
629
+ if (type === "clio_coder_steer_received") {
630
+ const detail = (event.payload ?? {}) as Record<string, unknown>;
631
+ summary.steerAcknowledgement = { receivedAtMs: now, chars: Math.max(0, Math.floor(num(detail.chars, 0))) };
632
+ }
293
633
  if (type === "message_end" && !isTerminal(summary.status)) {
294
634
  const message = (event.message ?? {}) as { role?: unknown; usage?: Record<string, unknown> };
295
635
  if (message.role === "assistant" && message.usage) {
@@ -298,8 +638,12 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
298
638
  summary.tokens.input += input;
299
639
  summary.tokens.output += output;
300
640
  summary.tokens.total += input + output + num(message.usage.cacheWrite, 0);
641
+ summary.lastContextTokens = input + output;
301
642
  }
302
643
  }
644
+ // A worker's agent_end settles its displayed progress; only a terminal
645
+ // dispatch event changes the canonical run outcome.
646
+ if (type === "agent_end") summary.progressFold.settle();
303
647
  markChanged();
304
648
  }),
305
649
  bus.on(BusChannels.DispatchCompleted, (raw: unknown) => {
@@ -308,12 +652,13 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
308
652
  if (!runId) return;
309
653
  const now = Date.now();
310
654
  const summary = runs.get(runId) ?? emptyRun(runId, now);
311
- applyIdentity(summary, payload);
655
+ applyIdentity(summary, payload as Partial<DispatchRunIdentity>);
312
656
  summary.status = "completed";
313
657
  summary.updatedAtMs = now;
314
658
  summary.finishedAtMs = now;
315
659
  summary.durationMs = num(payload.durationMs, Math.max(0, now - summary.startedAtMs));
316
660
  applyTerminalTokens(summary, payload);
661
+ applyTerminalDetail(summary, payload);
317
662
  summary.outcome = str(payload.outcome, "succeeded");
318
663
  summary.outcomeDetail = typeof payload.outcomeDetail === "string" ? payload.outcomeDetail : null;
319
664
  putRun(runId, summary);
@@ -325,17 +670,40 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
325
670
  if (!runId) return;
326
671
  const now = Date.now();
327
672
  const summary = runs.get(runId) ?? emptyRun(runId, now);
328
- applyIdentity(summary, payload);
673
+ applyIdentity(summary, payload as Partial<DispatchRunIdentity>);
329
674
  summary.status = resolveDispatchFailureStatus(payload.reason);
330
675
  summary.updatedAtMs = now;
331
676
  summary.finishedAtMs = now;
332
677
  summary.durationMs = num(payload.durationMs, Math.max(0, now - summary.startedAtMs));
333
678
  applyTerminalTokens(summary, payload);
679
+ applyTerminalDetail(summary, payload);
334
680
  summary.outcome = str(payload.outcome, str(payload.reason, "failed"));
335
681
  summary.outcomeDetail = typeof payload.outcomeDetail === "string" ? payload.outcomeDetail : null;
336
682
  putRun(runId, summary);
337
683
  markChanged();
338
684
  }),
685
+ bus.on(BusChannels.RunAborted, (raw) => {
686
+ const runId = asRunId(raw?.runId);
687
+ const summary = runId ? runs.get(runId) : undefined;
688
+ if (!summary) return;
689
+ const wasRetrying = summary.retry !== undefined;
690
+ delete summary.retry;
691
+ if (wasRetrying && raw.startedAt === null) {
692
+ summary.status = "aborted";
693
+ summary.finishedAtMs = Date.now();
694
+ summary.progressFold.settle();
695
+ } else {
696
+ if (isTerminal(summary.status) && !wasRetrying) return;
697
+ summary.status = "cancelling";
698
+ }
699
+ summary.outcomeDetail = typeof raw.reason === "string" ? raw.reason : (summary.outcomeDetail ?? null);
700
+ summary.updatedAtMs = Date.now();
701
+ markChanged();
702
+ }),
703
+ bus.on(BusChannels.AccountabilityEvidenceReady, (payload) => {
704
+ const runId = asRunId(payload?.runId);
705
+ if (runId) evidenceBuildSucceeded(runId, payload);
706
+ }),
339
707
  bus.on(BusChannels.ProviderHealth, (raw: unknown) => {
340
708
  const payload = (raw ?? {}) as Record<string, unknown>;
341
709
  if (typeof payload.id !== "string" || payload.id.length === 0) return;
@@ -348,6 +716,24 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
348
716
 
349
717
  return {
350
718
  snapshot: buildSnapshot,
719
+ bindRunReaders(readers) {
720
+ runReaders = readers;
721
+ return () => {
722
+ if (runReaders === readers) runReaders = deps;
723
+ };
724
+ },
725
+ reconcileRuns,
726
+ setFleetPhase(runId, phase) {
727
+ fleetPhases.set(runId, { ...phase });
728
+ while (fleetPhases.size > MAX_PROJECTION_RUNS) {
729
+ const oldest = fleetPhases.keys().next().value;
730
+ if (oldest === undefined) break;
731
+ fleetPhases.delete(oldest);
732
+ }
733
+ const summary = runs.get(runId);
734
+ if (summary) summary.phase = { ...phase };
735
+ markChanged();
736
+ },
351
737
  subscribe(listener) {
352
738
  listeners.add(listener);
353
739
  listener(buildSnapshot());
@@ -363,22 +749,6 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
363
749
  pendingEvidence.add(runId);
364
750
  markChanged();
365
751
  },
366
- evidenceBuildSucceeded(runId, evidence) {
367
- pendingEvidence.delete(runId);
368
- const summary = runs.get(runId);
369
- if (summary) {
370
- summary.evidence = {
371
- evidenceId: evidence.evidenceId,
372
- firstPassSuccess: evidence.firstPassSuccess,
373
- findingCount: evidence.findingCount,
374
- tags: [...evidence.tags],
375
- };
376
- }
377
- // The index row that feeds accountability was written before this fires,
378
- // so refresh the cached summary from the sidecar index.
379
- accountability = deps.readAccountability();
380
- markChanged();
381
- },
382
752
  evidenceBuildFailed(runId, message) {
383
753
  pendingEvidence.delete(runId);
384
754
  pushNotice(
@@ -28,9 +28,9 @@
28
28
  * should measure the rate window against, so every sequence below is testable.
29
29
  */
30
30
 
31
- import { durableAssistantTextFromEvent, WORKER_OUTPUT_MAX_BYTES } from "../domains/dispatch/event-pump.js";
32
- import type { CallActionDescriptor } from "../domains/safety/call-target.js";
33
- import { truncateUtf8 } from "../tools/truncate-utf8.js";
31
+ import { truncateUtf8 } from "../../tools/truncate-utf8.js";
32
+ import { durableAssistantTextFromEvent, WORKER_OUTPUT_MAX_BYTES } from "../dispatch/event-pump.js";
33
+ import type { CallActionDescriptor } from "../safety/call-target.js";
34
34
 
35
35
  /**
36
36
  * Lines of worker prose kept while a run is live. The tail is what a streaming