@iowarp/clio-coder 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -1,36 +1,19 @@
1
- import { performance } from "node:perf_hooks";
2
- import {
3
- BusChannels,
4
- type DispatchCompletedPayload,
5
- type DispatchFailedPayload,
6
- type DispatchProgressPayload,
7
- type DispatchRunIdentity,
8
- } from "../core/bus-events.js";
9
- import { resolveDispatchFailureStatus } from "../core/dispatch-outcome.js";
10
- import type { SafeEventBus } from "../core/event-bus.js";
11
- import { rawDurationMs } from "../core/timers.js";
12
1
  import type { AgentAudience } from "../domains/agents/spec.js";
13
2
  import {
14
- cloneRunToolBudgetEnvelope,
15
3
  formatBudgetPolicy,
16
4
  formatBudgetReasons,
17
5
  formatBudgetRequest,
18
6
  formatEffectiveBudget,
19
7
  type RunToolBudgetEnvelope,
20
8
  } from "../domains/dispatch/budget-envelope.js";
21
- import type { DispatchSnapshot } from "../domains/dispatch/contract.js";
22
- import {
23
- type DispatchRequestOrigin,
24
- type RunKind,
25
- type RunStatus,
26
- runKindSupportsLiveSteering,
27
- } from "../domains/dispatch/types.js";
9
+ import { type DispatchRequestOrigin, type RunKind, runKindSupportsLiveSteering } from "../domains/dispatch/types.js";
28
10
  import { describeWriteBoundaryAttributionDowngrade } from "../domains/dispatch/write-boundary.js";
29
11
  import {
30
- summarizeTrustStatus,
31
12
  type TrustSummaryProjection,
32
13
  type TrustVerdict,
14
+ trustStateWord,
33
15
  } from "../domains/evidence/trust-projection.js";
16
+ import type { ObservabilityContract, ObservabilityRunSummary } from "../domains/observability/contract.js";
34
17
  import {
35
18
  COST_NOT_MEASURED,
36
19
  costAggregateForAmount,
@@ -38,7 +21,8 @@ import {
38
21
  type ObservabilityNotice,
39
22
  type ObservabilitySnapshot,
40
23
  } from "../domains/observability/index.js";
41
- import { type CostProvenance, foregroundStreamUsage, resolveCostProvenance } from "../domains/providers/index.js";
24
+ import type { WorkerAction, WorkerProgressSnapshot } from "../domains/observability/worker-progress.js";
25
+ import { type CostProvenance, foregroundStreamUsage } from "../domains/providers/index.js";
42
26
  import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
43
27
  import { type Component, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "../engine/tui.js";
44
28
  import { formatWorkerContextMeter } from "./context-meter.js";
@@ -59,20 +43,8 @@ import {
59
43
  screenTitle,
60
44
  spinnerFrame,
61
45
  } from "./theme/index.js";
62
- import {
63
- createWorkerProgressFold,
64
- type WorkerAction,
65
- type WorkerProgressFold,
66
- type WorkerProgressSnapshot,
67
- } from "./worker-progress.js";
68
- import type { WorkerReceiptReader } from "./worker-stream.js";
69
-
70
- export type DispatchBoardStatus =
71
- | Extract<RunStatus, "running" | "completed" | "failed" | "stale" | "dead">
72
- | "aborted"
73
- | "cancelling"
74
- | "enqueued"
75
- | "retrying";
46
+
47
+ export type DispatchBoardStatus = ObservabilityRunSummary["status"];
76
48
 
77
49
  export interface DispatchRetryPresentation {
78
50
  attempt: number;
@@ -206,56 +178,9 @@ export function isDispatchBoardRowCancellable(row: DispatchBoardRow): boolean {
206
178
  return row.status === "running" || row.status === "stale" || row.status === "enqueued" || row.status === "retrying";
207
179
  }
208
180
 
209
- interface DispatchBoardEntry
210
- extends Omit<
211
- DispatchBoardRow,
212
- "elapsedMs" | "recentTools" | "lastContextTokens" | "currentTool" | "retry" | "progress"
213
- > {
214
- sequence: number;
215
- enqueuedAtMs: number;
216
- startedAtMs: number | null;
217
- /**
218
- * The monotonic twin of `startedAtMs`, set from the same observation. TTFT
219
- * is a span, so it is measured against this and never against the wall
220
- * stamps, which exist to order and label rows.
221
- */
222
- startedAtClockMs: number | null;
223
- finishedAtMs: number | null;
224
- durationMs: number | null;
225
- lastContextTokens: number;
226
- /**
227
- * The one fold that reads this run's worker events. Tool activity and the
228
- * answer tail are its output, so the board no longer interprets the stream
229
- * alongside the transcript.
230
- */
231
- progress: WorkerProgressFold;
232
- retry?: DispatchRetryPresentation;
233
- }
234
-
235
- /** Keep raw task text out of long-lived TUI rows and bound hostile/user-sized input. */
236
- const TASK_SUMMARY_MAX_WIDTH = 240;
237
181
  /** Rows of worker prose an expanded card shows before it defers to `/view`. */
238
182
  const WORKER_PROGRESS_CARD_ROWS = 6;
239
183
 
240
- interface WorkerEventShape {
241
- type?: unknown;
242
- message?: {
243
- role?: unknown;
244
- usage?: {
245
- input?: unknown;
246
- output?: unknown;
247
- cacheRead?: unknown;
248
- cacheWrite?: unknown;
249
- };
250
- };
251
- messages?: unknown;
252
- }
253
-
254
- interface AssistantMessageShape {
255
- role?: unknown;
256
- stopReason?: unknown;
257
- }
258
-
259
184
  export const TASK_ISLAND_WIDTH = 44;
260
185
 
261
186
  const STATUS_ORDER: Record<DispatchBoardStatus, number> = {
@@ -269,7 +194,6 @@ const STATUS_ORDER: Record<DispatchBoardStatus, number> = {
269
194
  aborted: 7,
270
195
  completed: 8,
271
196
  };
272
- const MAX_DISPATCH_BOARD_ROWS = 50;
273
197
 
274
198
  /**
275
199
  * The agent's own name, unadorned. Audience is carried by
@@ -511,16 +435,6 @@ function evidenceCardLine(theme: ClioTheme, evidence: RunEvidencePresentation, c
511
435
  return cardUnitsLine(theme, "proof", units, contentWidth);
512
436
  }
513
437
 
514
- /** Sanitize lifecycle task text at the terminal boundary and collapse it to one bounded line. */
515
- function sanitizeDispatchTaskSummary(value: unknown): string | undefined {
516
- if (typeof value !== "string") return undefined;
517
- const sanitized = sanitizeCallTargetText(value);
518
- if (sanitized.length === 0) return undefined;
519
- // pi-tui's truncator appends reset sequences when it elides. Strip those
520
- // again so the stored projection remains plain text, not terminal styling.
521
- return sanitizeCallTargetText(truncateToWidth(sanitized, TASK_SUMMARY_MAX_WIDTH, "…", false));
522
- }
523
-
524
438
  function retryCountdown(retry: DispatchRetryPresentation, now = Date.now()): string {
525
439
  const remainingMs = Math.max(0, retry.dueAtMs - now);
526
440
  return remainingMs === 0 ? "now" : `in ${formatCompactMs(remainingMs)}`;
@@ -864,7 +778,18 @@ function renderTaskIslandRow(row: DispatchBoardRow, width: number): string[] {
864
778
  ? ` ${theme.fg("muted", truncateToWidth(row.taskSummary, Math.max(1, width - 2), "…", false))}`
865
779
  : null;
866
780
 
867
- return [padAnsi(line1, width), ...(task ? [padAnsi(task, width)] : []), padAnsi(telemetry, width)];
781
+ const quality = isTerminalStatus(row.status)
782
+ ? wrapTextWithAnsi(
783
+ ` quality: ${trustStateWord("validationGrounding", row.trust?.axes.validationGrounding ?? "unknown")}`,
784
+ width,
785
+ )
786
+ : [];
787
+ return [
788
+ padAnsi(line1, width),
789
+ ...quality.map((line) => padAnsi(theme.fg("muted", line), width)),
790
+ ...(task ? [padAnsi(task, width)] : []),
791
+ padAnsi(telemetry, width),
792
+ ];
868
793
  }
869
794
 
870
795
  /**
@@ -1154,87 +1079,6 @@ export function formatTaskIslandLines(rows: ReadonlyArray<DispatchBoardRow>, max
1154
1079
  return frame(clioTheme(), "Fleet runs", body, TASK_ISLAND_WIDTH + 4);
1155
1080
  }
1156
1081
 
1157
- function parseRunId(value: unknown): string | null {
1158
- return typeof value === "string" && value.length > 0 ? value : null;
1159
- }
1160
-
1161
- function parseText(value: unknown, fallback: string): string {
1162
- return typeof value === "string" && value.length > 0 ? value : fallback;
1163
- }
1164
-
1165
- function parseRuntimeKind(value: unknown): RunKind {
1166
- if (value === "sdk" || value === "subprocess" || value === "acp-delegation") return value;
1167
- return "http";
1168
- }
1169
-
1170
- function parseAgentAudience(value: unknown, fallback: AgentAudience | undefined): AgentAudience | undefined {
1171
- if (value === "base" || value === "shadow" || value === "custom" || value === "internal") return value;
1172
- return fallback;
1173
- }
1174
-
1175
- function parseRequestOrigin(
1176
- value: unknown,
1177
- fallback: DispatchRequestOrigin | undefined,
1178
- ): DispatchRequestOrigin | undefined {
1179
- if (value === "user" || value === "agent" || value === "internal") return value;
1180
- return fallback;
1181
- }
1182
-
1183
- function parseFiniteNumber(value: unknown, fallback: number): number {
1184
- return typeof value === "number" && Number.isFinite(value) ? value : fallback;
1185
- }
1186
-
1187
- function parseNonEmptyString(value: unknown): string | undefined {
1188
- return typeof value === "string" && value.length > 0 ? value : undefined;
1189
- }
1190
-
1191
- function parseTaskSummary(
1192
- raw: Partial<DispatchRunIdentity> & { task?: unknown; taskSummary?: unknown },
1193
- fallback: string | undefined,
1194
- ): string | undefined {
1195
- return sanitizeDispatchTaskSummary(raw.task) ?? sanitizeDispatchTaskSummary(raw.taskSummary) ?? fallback;
1196
- }
1197
-
1198
- function parsePositiveInt(value: unknown): number | undefined {
1199
- return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
1200
- }
1201
-
1202
- function parseGateBadge(value: unknown): { role: string; cycle: number } | undefined {
1203
- if (typeof value !== "object" || value === null) return undefined;
1204
- const record = value as { role?: unknown; cycle?: unknown };
1205
- if (typeof record.role !== "string" || record.role.length === 0) return undefined;
1206
- const cycle = parsePositiveInt(record.cycle) ?? 1;
1207
- return { role: record.role, cycle };
1208
- }
1209
-
1210
- function parseEndpointCapacity(value: unknown): DispatchBoardRow["endpoint"] | undefined {
1211
- if (typeof value !== "object" || value === null) return undefined;
1212
- const record = value as { key?: unknown; label?: unknown; limit?: unknown };
1213
- const key = parseNonEmptyString(record.key);
1214
- const label = parseNonEmptyString(record.label);
1215
- const limit = parsePositiveInt(record.limit);
1216
- return key === undefined || label === undefined || limit === undefined ? undefined : { key, label, limit };
1217
- }
1218
-
1219
- function parseCouncilBadge(value: unknown): DispatchBoardRow["council"] | undefined {
1220
- if (typeof value !== "object" || value === null) return undefined;
1221
- const record = value as { group?: unknown; label?: unknown; color?: unknown; round?: unknown };
1222
- const group = parseNonEmptyString(record.group);
1223
- const label = parseNonEmptyString(record.label);
1224
- const round = parsePositiveInt(record.round);
1225
- if (group === undefined || label === undefined || round === undefined) return undefined;
1226
- return {
1227
- group,
1228
- label,
1229
- ...(typeof record.color === "string" && record.color.length > 0 ? { color: record.color } : {}),
1230
- round,
1231
- };
1232
- }
1233
-
1234
- function parseFiniteNumberOrZero(value: unknown): number {
1235
- return typeof value === "number" && Number.isFinite(value) ? value : 0;
1236
- }
1237
-
1238
1082
  function parseOptionalDetail(value: unknown): string | null {
1239
1083
  if (typeof value !== "string") return null;
1240
1084
  const detail = value.replace(/\s+/g, " ").trim();
@@ -1273,150 +1117,34 @@ function terminalDetail(row: DispatchBoardRow): string | null {
1273
1117
  return parseOptionalDetail(row.outcomeDetail);
1274
1118
  }
1275
1119
 
1276
- function resolveAgentEndStatus(rawMessages: unknown): DispatchBoardStatus | null {
1277
- if (!Array.isArray(rawMessages)) return null;
1278
- for (let index = rawMessages.length - 1; index >= 0; index -= 1) {
1279
- const message = (rawMessages[index] ?? {}) as AssistantMessageShape;
1280
- if (message.role !== "assistant") continue;
1281
- if (message.stopReason === "stop") return "completed";
1282
- if (message.stopReason === "error") return "failed";
1283
- if (message.stopReason === "aborted") return "aborted";
1284
- return null;
1285
- }
1286
- return null;
1287
- }
1288
-
1289
- function resolveFailureDetail(
1290
- payload: Partial<DispatchFailedPayload>,
1291
- fallback: string | null | undefined,
1292
- ): string | null {
1293
- const detail = parseOptionalDetail(payload.outcomeDetail);
1294
- if (detail !== null) return detail;
1295
- if (payload.reason === "timed_out") return "turn timeout exceeded";
1296
- return fallback ?? null;
1297
- }
1298
-
1299
- function resolveHeartbeatStatus(status: unknown): DispatchBoardStatus | null {
1300
- if (status === "alive") return "running";
1301
- if (status === "stale" || status === "dead") return status;
1302
- return null;
1303
- }
1304
-
1305
1120
  function isTerminalStatus(status: DispatchBoardStatus): boolean {
1306
1121
  return status === "completed" || status === "failed" || status === "aborted" || status === "dead";
1307
1122
  }
1308
1123
 
1309
- function parseRetrySnapshot(value: DispatchSnapshot["retrying"][number]): DispatchRetryPresentation | null {
1310
- const attempt = parsePositiveInt(value.attempt);
1311
- const dueAtMs = Date.parse(value.dueAt);
1312
- if (attempt === undefined || !Number.isFinite(dueAtMs)) return null;
1313
- return {
1314
- attempt,
1315
- dueAtMs,
1316
- reason: sanitizeCallTargetText(value.reason),
1317
- };
1318
- }
1319
-
1320
- function readRetrySnapshot(
1321
- snapshot: DispatchSnapshot,
1322
- ): Map<string, { agentId: string; taskSummary?: string; retry: DispatchRetryPresentation }> {
1323
- const retrying = new Map<string, { agentId: string; taskSummary?: string; retry: DispatchRetryPresentation }>();
1324
- try {
1325
- for (const value of snapshot.retrying) {
1326
- const runId = parseRunId(value.runId);
1327
- const agentId = parseNonEmptyString(value.agentId);
1328
- const retry = parseRetrySnapshot(value);
1329
- const taskSummary = sanitizeDispatchTaskSummary(value.task);
1330
- if (runId && agentId && retry) {
1331
- retrying.set(runId, {
1332
- agentId,
1333
- ...(taskSummary !== undefined ? { taskSummary } : {}),
1334
- retry,
1335
- });
1336
- }
1337
- }
1338
- } catch {
1339
- // The board remains lifecycle-event driven if an optional snapshot fails.
1340
- }
1341
- return retrying;
1342
- }
1343
-
1344
- function readRunningSnapshot(snapshot: DispatchSnapshot): Map<
1345
- string,
1346
- {
1347
- inputTokens: number;
1348
- outputTokens: number;
1349
- tokenCount: number;
1350
- costUsd: number;
1351
- costProvenance: CostProvenance;
1352
- outcomePhase: string;
1353
- budget?: RunToolBudgetEnvelope;
1354
- }
1355
- > {
1356
- const running = new Map<
1357
- string,
1358
- {
1359
- inputTokens: number;
1360
- outputTokens: number;
1361
- tokenCount: number;
1362
- costUsd: number;
1363
- costProvenance: CostProvenance;
1364
- outcomePhase: string;
1365
- budget?: RunToolBudgetEnvelope;
1366
- }
1367
- >();
1368
- try {
1369
- for (const value of snapshot.running) {
1370
- const runId = parseRunId(value.runId);
1371
- if (!runId) continue;
1372
- const budget = cloneRunToolBudgetEnvelope(value.budget);
1373
- running.set(runId, {
1374
- inputTokens: parseFiniteNumberOrZero(value.tokens.input),
1375
- outputTokens: parseFiniteNumberOrZero(value.tokens.output),
1376
- tokenCount: parseFiniteNumberOrZero(value.tokens.total),
1377
- costUsd: parseFiniteNumberOrZero(value.costUsd),
1378
- costProvenance: value.costProvenance ?? "unknown",
1379
- outcomePhase: value.outcomePhase,
1380
- ...(budget !== undefined ? { budget } : {}),
1381
- });
1382
- }
1383
- } catch {
1384
- // Lifecycle/progress events remain authoritative if the optional snapshot fails.
1385
- }
1386
- return running;
1387
- }
1388
-
1389
- function resolveElapsedMs(entry: DispatchBoardEntry, now: number): number {
1390
- const startedAtMs = entry.startedAtMs ?? entry.enqueuedAtMs;
1391
- if (entry.durationMs !== null) return entry.durationMs;
1392
- const endMs = entry.finishedAtMs ?? now;
1393
- return Math.max(0, rawDurationMs(startedAtMs, endMs));
1394
- }
1395
-
1396
- function toRow(entry: DispatchBoardEntry, now: number): DispatchBoardRow {
1124
+ function toRow(entry: ObservabilityRunSummary, now: number): DispatchBoardRow {
1397
1125
  const retry = entry.retry;
1398
- const progress = entry.progress.snapshot();
1126
+ const progress = entry.progress;
1399
1127
  return {
1400
- progress,
1128
+ ...(progress !== undefined ? { progress } : {}),
1401
1129
  runId: entry.runId,
1402
1130
  agentId: entry.agentId,
1403
1131
  ...(entry.agentAudience !== undefined ? { agentAudience: entry.agentAudience } : {}),
1404
1132
  ...(entry.requestOrigin !== undefined ? { requestOrigin: entry.requestOrigin } : {}),
1405
- runtimeKind: entry.runtimeKind,
1406
- runtimeId: entry.runtimeId,
1407
- targetId: entry.targetId,
1408
- wireModelId: entry.wireModelId,
1133
+ runtimeKind: entry.runtimeKind ?? "http",
1134
+ runtimeId: entry.runtimeId ?? "-",
1135
+ targetId: entry.targetId ?? "-",
1136
+ wireModelId: entry.modelId ?? "-",
1409
1137
  ...(entry.endpoint !== undefined ? { endpoint: { ...entry.endpoint } } : {}),
1410
1138
  ...(entry.taskSummary !== undefined ? { taskSummary: entry.taskSummary } : {}),
1411
1139
  ...(entry.budget !== undefined ? { budget: entry.budget } : {}),
1412
- status: retry ? "retrying" : entry.status,
1413
- elapsedMs: resolveElapsedMs(entry, now),
1414
- tokenCount: entry.tokenCount,
1140
+ status: entry.status,
1141
+ elapsedMs: entry.durationMs ?? Math.max(0, (entry.finishedAtMs ?? now) - entry.startedAtMs),
1142
+ tokenCount: entry.tokens.total,
1415
1143
  costUsd: entry.costUsd,
1416
1144
  ...(entry.costProvenance !== undefined ? { costProvenance: entry.costProvenance } : {}),
1417
- inputTokens: entry.inputTokens,
1418
- outputTokens: entry.outputTokens,
1419
- ttftMs: entry.ttftMs,
1145
+ inputTokens: entry.tokens.input,
1146
+ outputTokens: entry.tokens.output,
1147
+ ttftMs: entry.ttftMs ?? null,
1420
1148
  ...(entry.outcomeDetail !== undefined ? { outcomeDetail: entry.outcomeDetail } : {}),
1421
1149
  ...(entry.node !== undefined ? { node: entry.node } : {}),
1422
1150
  ...(entry.gate !== undefined ? { gate: { ...entry.gate } } : {}),
@@ -1426,439 +1154,55 @@ function toRow(entry: DispatchBoardEntry, now: number): DispatchBoardRow {
1426
1154
  ...(entry.rerouteCount !== undefined ? { rerouteCount: entry.rerouteCount } : {}),
1427
1155
  ...(entry.failoverHops !== undefined ? { failoverHops: entry.failoverHops } : {}),
1428
1156
  ...(entry.contextWindow !== undefined ? { contextWindow: entry.contextWindow } : {}),
1429
- lastContextTokens: entry.lastContextTokens,
1157
+ lastContextTokens: entry.lastContextTokens ?? 0,
1430
1158
  ...(entry.receiptId !== undefined ? { receiptId: entry.receiptId } : {}),
1431
1159
  ...(entry.phase !== undefined ? { phase: { ...entry.phase } } : {}),
1432
1160
  // Both tool fields are views of the one projection, so the compact card and
1433
1161
  // the expanded detail can never disagree about what is running.
1434
- currentTool: retry ? null : (progress.currentAction?.tool ?? null),
1435
- recentTools: progress.recentActions.map((action) => action.tool),
1162
+ currentTool: retry ? null : (progress?.currentAction?.tool ?? null),
1163
+ recentTools: progress?.recentActions.map((action) => action.tool) ?? [],
1436
1164
  ...(retry ? { retry: { ...retry } } : {}),
1437
1165
  ...(entry.steerAcknowledgement ? { steerAcknowledgement: { ...entry.steerAcknowledgement } } : {}),
1438
1166
  ...(entry.writeRecordDowngrade ? { writeRecordDowngrade: { ...entry.writeRecordDowngrade } } : {}),
1439
1167
  };
1440
1168
  }
1441
1169
 
1442
- function sortEntries(a: DispatchBoardEntry, b: DispatchBoardEntry): number {
1443
- const aStatus = a.retry ? "retrying" : a.status;
1444
- const bStatus = b.retry ? "retrying" : b.status;
1445
- const rank = STATUS_ORDER[aStatus] - STATUS_ORDER[bStatus];
1446
- if (rank !== 0) return rank;
1447
- const aTime = a.finishedAtMs ?? a.startedAtMs ?? a.enqueuedAtMs;
1448
- const bTime = b.finishedAtMs ?? b.startedAtMs ?? b.enqueuedAtMs;
1449
- if (aTime !== bTime) return bTime - aTime;
1450
- return a.sequence - b.sequence;
1451
- }
1452
-
1453
- function pruneEntries(entries: Map<string, DispatchBoardEntry>, onEvict?: (runId: string) => void): void {
1454
- if (entries.size <= MAX_DISPATCH_BOARD_ROWS) return;
1455
- const terminalEntries = [...entries.values()]
1456
- .filter((entry) => !entry.retry && isTerminalStatus(entry.status))
1457
- .sort((a, b) => a.sequence - b.sequence);
1458
- const evictionQueue =
1459
- terminalEntries.length > 0 ? terminalEntries : [...entries.values()].sort((a, b) => a.sequence - b.sequence);
1460
- for (const entry of evictionQueue) {
1461
- if (entries.size <= MAX_DISPATCH_BOARD_ROWS) break;
1462
- entries.delete(entry.runId);
1463
- onEvict?.(entry.runId);
1464
- }
1465
- }
1466
-
1170
+ /** The board keeps display order and reads every run fact from observability. */
1467
1171
  export function createDispatchBoardStore(
1468
- bus: SafeEventBus,
1469
- snapshot?: () => DispatchSnapshot,
1470
- /**
1471
- * Sealed terminal facts for a finished run. Settlement replaces the
1472
- * provisional live tail with the receipt's answer where one can be read; the
1473
- * run's own durable message stands in where it cannot.
1474
- */
1475
- readReceipt?: WorkerReceiptReader,
1172
+ projection: Pick<ObservabilityContract, "snapshot" | "subscribe" | "reconcileRuns" | "setFleetPhase">,
1476
1173
  ): {
1477
1174
  rows(): ReadonlyArray<DispatchBoardRow>;
1478
1175
  activeRows(): ReadonlyArray<DispatchBoardRow>;
1479
1176
  reconcile(): void;
1480
- /**
1481
- * Record the fleet-plan position of a run the caller just dispatched. The
1482
- * board never infers a position: a run carries one only because whoever
1483
- * dispatched the plan said so, which is why a non-fleet run can never grow
1484
- * a phase cell.
1485
- */
1486
1177
  setFleetPhase(runId: string, phase: DispatchBoardPhase): void;
1487
1178
  unsubscribe(): void;
1488
1179
  } {
1489
- const entries = new Map<string, DispatchBoardEntry>();
1490
- // Positions arrive from the fleet-run path, which may hand one over before
1491
- // the run's first lifecycle event creates the entry.
1492
- const fleetPhases = new Map<string, DispatchBoardPhase>();
1493
- let nextSequence = 0;
1494
- let reconciledAtMs = Date.now();
1495
-
1496
- /**
1497
- * Seal a run's projection on the sealed receipt's answer. Only for the
1498
- * terminal bus events: the dispatch domain writes `receipts/<runId>.json`
1499
- * before it publishes one, so this is the first moment the file exists.
1500
- */
1501
- const settleFromReceipt = (entry: DispatchBoardEntry): void => {
1502
- const facts = readReceipt?.(entry.runId);
1503
- const text = facts?.text;
1504
- entry.progress.settle(typeof text === "string" && text.trim().length > 0 ? text : undefined);
1505
- if (facts?.trust !== undefined) entry.trust = summarizeTrustStatus(facts.trust);
1506
- };
1507
-
1508
- // Payloads arrive typed off the bus, but the board keeps its runtime
1509
- // parsing (parse* helpers) because events are not validated at runtime.
1510
- const upsertBase = (
1511
- raw: Partial<DispatchRunIdentity>,
1512
- status: DispatchBoardStatus,
1513
- now: number,
1514
- ): DispatchBoardEntry | null => {
1515
- const runId = parseRunId(raw.runId);
1516
- if (!runId) return null;
1517
- const previous = entries.get(runId);
1518
- const agentAudience = parseAgentAudience(raw.agentAudience, previous?.agentAudience);
1519
- const requestOrigin = parseRequestOrigin(raw.requestOrigin, previous?.requestOrigin);
1520
- const node = parseNonEmptyString(raw.node) ?? previous?.node;
1521
- const endpoint = parseEndpointCapacity(raw.endpoint) ?? previous?.endpoint;
1522
- const gate = parseGateBadge(raw.gate) ?? previous?.gate;
1523
- const council = parseCouncilBadge(raw.council) ?? previous?.council;
1524
- const rerouteCount = parsePositiveInt(raw.rerouteCount) ?? previous?.rerouteCount;
1525
- const contextWindow = parsePositiveInt(raw.contextWindow) ?? previous?.contextWindow;
1526
- const taskSummary = parseTaskSummary(raw, previous?.taskSummary);
1527
- const budget = cloneRunToolBudgetEnvelope(raw.budget) ?? previous?.budget;
1528
- const phase = fleetPhases.get(runId) ?? previous?.phase;
1529
- const entry: DispatchBoardEntry = {
1530
- runId,
1531
- agentId: parseText(raw.agentId, previous?.agentId ?? "-"),
1532
- ...(agentAudience !== undefined ? { agentAudience } : {}),
1533
- ...(requestOrigin !== undefined ? { requestOrigin } : {}),
1534
- runtimeKind: parseRuntimeKind(raw.runtimeKind ?? previous?.runtimeKind),
1535
- runtimeId: parseText(raw.runtimeId, previous?.runtimeId ?? "-"),
1536
- targetId: parseText(raw.targetId, previous?.targetId ?? "-"),
1537
- wireModelId: parseText(raw.wireModelId, previous?.wireModelId ?? "-"),
1538
- ...(endpoint !== undefined ? { endpoint } : {}),
1539
- ...(taskSummary !== undefined ? { taskSummary } : {}),
1540
- ...(budget !== undefined ? { budget } : {}),
1541
- status,
1542
- tokenCount: previous?.tokenCount ?? 0,
1543
- costUsd: previous?.costUsd ?? 0,
1544
- costProvenance: previous?.costProvenance ?? "unknown",
1545
- sequence: previous?.sequence ?? nextSequence++,
1546
- enqueuedAtMs: previous?.enqueuedAtMs ?? now,
1547
- startedAtMs: previous?.startedAtMs ?? null,
1548
- startedAtClockMs: previous?.startedAtClockMs ?? null,
1549
- finishedAtMs: previous?.finishedAtMs ?? null,
1550
- durationMs: previous?.durationMs ?? null,
1551
- inputTokens: previous?.inputTokens ?? 0,
1552
- outputTokens: previous?.outputTokens ?? 0,
1553
- ttftMs: previous?.ttftMs ?? null,
1554
- outcomeDetail: previous?.outcomeDetail ?? null,
1555
- ...(node !== undefined ? { node } : {}),
1556
- ...(gate !== undefined ? { gate } : {}),
1557
- ...(council !== undefined ? { council } : {}),
1558
- ...(previous?.hostVerification !== undefined ? { hostVerification: previous.hostVerification } : {}),
1559
- ...(rerouteCount !== undefined ? { rerouteCount } : {}),
1560
- ...(contextWindow !== undefined ? { contextWindow } : {}),
1561
- lastContextTokens: previous?.lastContextTokens ?? 0,
1562
- ...(previous?.receiptId !== undefined ? { receiptId: previous.receiptId } : {}),
1563
- ...(phase !== undefined ? { phase } : {}),
1564
- progress: previous?.progress ?? createWorkerProgressFold(),
1565
- ...(previous?.retry ? { retry: { ...previous.retry } } : {}),
1566
- ...(previous?.steerAcknowledgement ? { steerAcknowledgement: { ...previous.steerAcknowledgement } } : {}),
1567
- ...(previous?.writeRecordDowngrade ? { writeRecordDowngrade: { ...previous.writeRecordDowngrade } } : {}),
1568
- };
1569
- entries.set(runId, entry);
1570
- pruneEntries(entries, (evicted) => fleetPhases.delete(evicted));
1571
- return entry;
1572
- };
1573
-
1574
- const unsubscribers = [
1575
- bus.on(BusChannels.DispatchEnqueued, (raw) => {
1576
- const entry = upsertBase(raw ?? {}, "enqueued", Date.now());
1577
- if (entry) delete entry.retry;
1578
- }),
1579
- bus.on(BusChannels.DispatchStarted, (raw) => {
1580
- const now = Date.now();
1581
- const entry = upsertBase(raw ?? {}, "running", now);
1582
- if (!entry) return;
1583
- entry.startedAtMs ??= now;
1584
- entry.startedAtClockMs ??= performance.now();
1585
- entry.finishedAtMs = null;
1586
- entry.durationMs = null;
1587
- delete entry.retry;
1588
- }),
1589
- bus.on(BusChannels.DispatchCompleted, (raw) => {
1590
- const now = Date.now();
1591
- const payload: Partial<DispatchCompletedPayload> = raw ?? {};
1592
- const entry = upsertBase(payload, "completed", now);
1593
- if (!entry) return;
1594
- entry.startedAtMs ??= entry.enqueuedAtMs;
1595
- entry.finishedAtMs = now;
1596
- entry.durationMs = parseFiniteNumber(payload.durationMs, Math.max(0, rawDurationMs(entry.startedAtMs, now)));
1597
- entry.tokenCount = parseFiniteNumber(payload.tokenCount, entry.tokenCount);
1598
- entry.costUsd = parseFiniteNumber(payload.costUsd, entry.costUsd);
1599
- entry.costProvenance = resolveCostProvenance(payload.costProvenance, entry.costProvenance ?? "unknown");
1600
- entry.outcomeDetail = null;
1601
- if (payload.hostVerification !== undefined) entry.hostVerification = payload.hostVerification;
1602
- settleFromReceipt(entry);
1603
- // A terminal dispatch event is published only after the run's receipt is
1604
- // sealed at receipts/<runId>.json, so the run id is the receipt id here.
1605
- entry.receiptId = entry.runId;
1606
- delete entry.retry;
1607
- if (typeof payload.inputTokenCount === "number") {
1608
- entry.inputTokens = payload.inputTokenCount + parseFiniteNumberOrZero(payload.cacheReadTokenCount);
1609
- }
1610
- if (typeof payload.outputTokenCount === "number") {
1611
- entry.outputTokens = payload.outputTokenCount;
1612
- }
1613
- }),
1614
- bus.on(BusChannels.DispatchFailed, (raw) => {
1615
- const now = Date.now();
1616
- const payload: Partial<DispatchFailedPayload> = raw ?? {};
1617
- const runId = parseRunId(payload.runId);
1618
- const previousStatus = runId !== null ? entries.get(runId)?.status : undefined;
1619
- const resolvedStatus = resolveDispatchFailureStatus(payload.reason);
1620
- const status = previousStatus === "dead" && resolvedStatus === "failed" ? "dead" : resolvedStatus;
1621
- const entry = upsertBase(payload, status, now);
1622
- if (!entry) return;
1623
- entry.startedAtMs ??= entry.enqueuedAtMs;
1624
- entry.finishedAtMs = now;
1625
- entry.durationMs = parseFiniteNumber(payload.durationMs, Math.max(0, rawDurationMs(entry.startedAtMs, now)));
1626
- entry.tokenCount = parseFiniteNumber(payload.tokenCount, entry.tokenCount);
1627
- entry.costUsd = parseFiniteNumber(payload.costUsd, entry.costUsd);
1628
- entry.costProvenance = resolveCostProvenance(payload.costProvenance, entry.costProvenance ?? "unknown");
1629
- entry.outcomeDetail = resolveFailureDetail(payload, entry.outcomeDetail);
1630
- if (payload.hostVerification !== undefined) entry.hostVerification = payload.hostVerification;
1631
- settleFromReceipt(entry);
1632
- // A denied retry never reached a run, so no receipt was sealed for it;
1633
- // every other failure finalized through recordReceipt like a success.
1634
- if (payload.reason !== "retry_denied") entry.receiptId = entry.runId;
1635
- delete entry.retry;
1636
- if (typeof payload.inputTokenCount === "number") {
1637
- entry.inputTokens = payload.inputTokenCount + parseFiniteNumberOrZero(payload.cacheReadTokenCount);
1638
- }
1639
- if (typeof payload.outputTokenCount === "number") {
1640
- entry.outputTokens = payload.outputTokenCount;
1641
- }
1642
- }),
1643
- bus.on(BusChannels.RunAborted, (raw) => {
1644
- const runId = parseRunId(raw?.runId);
1645
- if (!runId) return;
1646
- const entry = entries.get(runId);
1647
- if (!entry) return;
1648
- const wasRetrying = entry.retry !== undefined;
1649
- delete entry.retry;
1650
- if (wasRetrying && raw?.startedAt === null) {
1651
- // Canceling a retry timer is synchronous: there is no worker left to
1652
- // wind down, so the history row can become terminal immediately.
1653
- entry.status = "aborted";
1654
- entry.finishedAtMs = Date.now();
1655
- entry.progress.settle();
1656
- } else {
1657
- if (isTerminalStatus(entry.status) && !wasRetrying) return;
1658
- entry.status = "cancelling";
1659
- }
1660
- entry.outcomeDetail = parseOptionalDetail(raw?.reason) ?? entry.outcomeDetail ?? null;
1661
- }),
1662
- bus.on(BusChannels.DispatchProgress, (raw) => {
1663
- const payload: Partial<DispatchProgressPayload> = raw ?? {};
1664
- const runId = parseRunId(payload.runId);
1665
- if (!runId) return;
1666
- const entry = entries.get(runId);
1667
- if (!entry) return;
1668
- const workerEvent = (payload.event ?? {}) as WorkerEventShape;
1669
- const type = typeof workerEvent.type === "string" ? workerEvent.type : "";
1670
- if (type === "heartbeat_status") {
1671
- if (isTerminalStatus(entry.status) || entry.status === "cancelling") return;
1672
- const status = resolveHeartbeatStatus((workerEvent as { status?: unknown }).status);
1673
- if (!status) return;
1674
- entry.status = status;
1675
- if (status === "dead") {
1676
- entry.finishedAtMs ??= Date.now();
1677
- // A worker-side terminal signal arrives before any receipt is
1678
- // sealed, so the run's own last durable message is the best truth
1679
- // there is; the terminal bus event replaces it with the sealed one.
1680
- entry.progress.settle();
1681
- delete entry.retry;
1682
- }
1683
- return;
1684
- }
1685
- if (type === "attempt_start") {
1686
- // The assignment stream hands the root run a failover hop: a later
1687
- // attempt took over, so the row is live again on the new route.
1688
- entry.failoverHops = (entry.failoverHops ?? 0) + 1;
1689
- entry.status = "running";
1690
- entry.finishedAtMs = null;
1691
- // The projection keeps the tail the operator is reading and drops the
1692
- // finished attempt's live state, exactly as the transcript block does.
1693
- entry.progress.restart();
1694
- delete entry.retry;
1695
- return;
1696
- }
1697
- if (type === "agent_start") {
1698
- entry.startedAtMs = Date.now();
1699
- entry.startedAtClockMs = performance.now();
1700
- }
1701
- if (type === "message_update") {
1702
- const assistantEvent =
1703
- "assistantMessageEvent" in workerEvent &&
1704
- typeof workerEvent.assistantMessageEvent === "object" &&
1705
- workerEvent.assistantMessageEvent !== null
1706
- ? (workerEvent.assistantMessageEvent as { type?: unknown })
1707
- : {};
1708
- const hasDelta =
1709
- assistantEvent.type === "text_delta" ||
1710
- assistantEvent.type === "thinking_delta" ||
1711
- assistantEvent.type === "toolcall_start" ||
1712
- assistantEvent.type === "toolcall_delta";
1713
- if (hasDelta && entry.ttftMs === null && entry.startedAtClockMs !== null) {
1714
- entry.ttftMs = Math.round(performance.now() - entry.startedAtClockMs);
1715
- }
1716
- }
1717
- if (type === "clio_coder_write_record_downgraded") {
1718
- const rawPayload = (workerEvent as { payload?: unknown }).payload;
1719
- const payload =
1720
- typeof rawPayload === "object" && rawPayload !== null ? (rawPayload as Record<string, unknown>) : null;
1721
- const tool = payload === null ? undefined : parseNonEmptyString(payload.tool);
1722
- const toolCallId = payload === null ? undefined : parseNonEmptyString(payload.toolCallId);
1723
- if (payload?.reason === "opaque_tool_succeeded" && tool !== undefined && toolCallId !== undefined) {
1724
- entry.writeRecordDowngrade = {
1725
- reason: "opaque_tool_succeeded",
1726
- tool: sanitizeCallTargetText(tool),
1727
- toolCallId: sanitizeCallTargetText(toolCallId),
1728
- };
1729
- }
1730
- }
1731
- // The one fold that reads worker prose and tool activity. Everything the
1732
- // board says about what a worker is saying or touching comes from here,
1733
- // so the board and the transcript block cannot tell two stories.
1734
- entry.progress.observe(payload.event);
1735
- if (type === "clio_coder_steer_received") {
1736
- const steerPayload = (workerEvent as { payload?: { chars?: unknown } }).payload;
1737
- entry.steerAcknowledgement = {
1738
- receivedAtMs: Date.now(),
1739
- chars: Math.max(0, Math.floor(parseFiniteNumberOrZero(steerPayload?.chars))),
1740
- };
1741
- }
1742
- if (isTerminalStatus(entry.status)) return;
1743
- if (type === "message_end" && workerEvent.message?.role === "assistant") {
1744
- const usage = workerEvent.message.usage;
1745
- const input = parseFiniteNumberOrZero(usage?.input) + parseFiniteNumberOrZero(usage?.cacheRead);
1746
- const output = parseFiniteNumberOrZero(usage?.output);
1747
- entry.inputTokens += input;
1748
- entry.outputTokens += output;
1749
- entry.tokenCount += input + output + parseFiniteNumberOrZero(usage?.cacheWrite);
1750
- // The last assistant message's input+cacheRead+output approximates the
1751
- // worker's current context occupancy for the per-worker meter.
1752
- entry.lastContextTokens = input + output;
1753
- }
1754
- if (type === "agent_end") {
1755
- const status = resolveAgentEndStatus(workerEvent.messages);
1756
- if (!status) return;
1757
- entry.status = status;
1758
- entry.finishedAtMs ??= Date.now();
1759
- // The worker says it is done before the domain seals its receipt. Settle
1760
- // on the durable message now so the card stops reading as live; the
1761
- // terminal bus event seals it on the receipt shortly after.
1762
- entry.progress.settle();
1763
- delete entry.retry;
1764
- }
1765
- }),
1766
- ];
1767
-
1768
- let closed = false;
1769
- const reconcile = (): void => {
1770
- const now = Date.now();
1771
- if (!snapshot) {
1772
- reconciledAtMs = now;
1773
- return;
1774
- }
1775
- let currentSnapshot: DispatchSnapshot;
1776
- try {
1777
- currentSnapshot = snapshot();
1778
- } catch {
1779
- // Lifecycle and progress events remain authoritative if snapshot polling fails.
1780
- return;
1781
- }
1782
- if (!Array.isArray(currentSnapshot?.retrying) || !Array.isArray(currentSnapshot?.running)) return;
1783
- reconciledAtMs = now;
1784
- const retrying = readRetrySnapshot(currentSnapshot);
1785
- const running = readRunningSnapshot(currentSnapshot);
1786
- for (const entry of entries.values()) {
1787
- if (entry.retry && !retrying.has(entry.runId)) {
1788
- // The timer left the queue (launched or was otherwise consumed). The
1789
- // parent attempt's original terminal state becomes visible again; the
1790
- // successor gets its own row.
1791
- delete entry.retry;
1792
- }
1793
- }
1794
- for (const [runId, projection] of retrying) {
1795
- const existing = entries.get(runId);
1796
- if (existing && existing.status !== "failed" && existing.status !== "dead") {
1797
- continue;
1798
- }
1799
- const entry =
1800
- existing ??
1801
- upsertBase(
1802
- {
1803
- runId,
1804
- agentId: projection.agentId,
1805
- ...(projection.taskSummary !== undefined ? { task: projection.taskSummary } : {}),
1806
- },
1807
- "failed",
1808
- now,
1809
- );
1810
- if (entry) {
1811
- // A waiting retry has no live worker; the row projection already
1812
- // renders a retrying row with no current tool.
1813
- entry.retry = { ...projection.retry };
1814
- if (entry.taskSummary === undefined && projection.taskSummary !== undefined) {
1815
- entry.taskSummary = projection.taskSummary;
1816
- }
1817
- }
1818
- }
1819
- for (const [runId, live] of running) {
1820
- const entry = entries.get(runId);
1821
- if (!entry) continue;
1822
- if (isTerminalStatus(entry.status) && live.outcomePhase !== "aborting") continue;
1823
- entry.inputTokens = live.inputTokens;
1824
- entry.outputTokens = live.outputTokens;
1825
- entry.tokenCount = live.tokenCount;
1826
- entry.costUsd = live.costUsd;
1827
- entry.costProvenance = live.costProvenance;
1828
- if (live.budget !== undefined) entry.budget = live.budget;
1829
- if (live.outcomePhase === "aborting") {
1830
- if (entry.status !== "completed" && entry.status !== "aborted") {
1831
- entry.status = "cancelling";
1832
- delete entry.retry;
1833
- }
1834
- }
1835
- }
1836
- };
1837
-
1180
+ let current = projection.snapshot();
1181
+ const unsubscribe = projection.subscribe((snapshot) => {
1182
+ current = snapshot;
1183
+ });
1838
1184
  const projectRows = (activeOnly: boolean): ReadonlyArray<DispatchBoardRow> => {
1839
- return [...entries.values()]
1840
- .sort(sortEntries)
1841
- .map((entry) => toRow(entry, reconciledAtMs))
1185
+ return [...current.runs]
1186
+ .reverse()
1187
+ .sort(
1188
+ (a, b) =>
1189
+ STATUS_ORDER[a.status] - STATUS_ORDER[b.status] ||
1190
+ (b.finishedAtMs ?? b.startedAtMs) - (a.finishedAtMs ?? a.startedAtMs),
1191
+ )
1192
+ .map((run) => toRow(run, current.generatedAt))
1842
1193
  .filter((row) => !activeOnly || !isTerminalStatus(row.status));
1843
1194
  };
1844
-
1845
1195
  return {
1846
- rows() {
1847
- return projectRows(false);
1848
- },
1849
- activeRows() {
1850
- return projectRows(true);
1851
- },
1852
- reconcile,
1853
- setFleetPhase(runId: string, phase: DispatchBoardPhase): void {
1854
- fleetPhases.set(runId, phase);
1855
- const entry = entries.get(runId);
1856
- if (entry) entry.phase = { ...phase };
1196
+ rows: () => projectRows(false),
1197
+ activeRows: () => projectRows(true),
1198
+ reconcile() {
1199
+ projection.reconcileRuns();
1200
+ current = projection.snapshot();
1857
1201
  },
1858
- unsubscribe() {
1859
- if (closed) return;
1860
- closed = true;
1861
- for (const unsubscribe of unsubscribers) unsubscribe();
1202
+ setFleetPhase(runId, phase) {
1203
+ projection.setFleetPhase(runId, phase);
1204
+ current = projection.snapshot();
1862
1205
  },
1206
+ unsubscribe,
1863
1207
  };
1864
1208
  }