@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.
- package/CHANGELOG.md +153 -0
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
- package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
- package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/chunk-5DDOTTG4.js +402 -0
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
- package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/chunk-633EXGZA.js +44 -0
- package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
- package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/chunk-B6UM3OZC.js +15 -0
- package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
- package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/chunk-GXCCHKN6.js +59 -0
- package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
- package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
- package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
- package/dist/chunk-L4N3DWNW.js +539 -0
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/chunk-LVFANMOH.js +466 -0
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/chunk-MDU3C27C.js +674 -0
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/chunk-O2RQ7LCK.js +283 -0
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/chunk-R6MAYTMS.js +108 -0
- package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
- package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
- package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
- package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/chunk-T52TPHYC.js +318 -0
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
- package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/chunk-VLPTKCKT.js +396 -0
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
- package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +45 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
- package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
- package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
- package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
- package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
- package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
- package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
- package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
- package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
- package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
- package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
- package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
- package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
- package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
- package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
- package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
- package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
- package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
- package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
- package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -85
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +10 -8
- package/docs/architecture/acp.md +27 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/artifact-versions.md +1 -1
- package/docs/architecture/context-engine.md +44 -59
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +11 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +22 -12
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +1 -1
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +66 -38
- package/docs/guide/configuration-and-targets.md +10 -3
- package/docs/guide/configuration-reference.md +23 -8
- package/docs/guide/environment-variables.md +8 -4
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +87 -5
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +15 -10
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +33 -33
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +17 -17
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/configure.ts +2 -1
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/eval.ts +17 -3
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -16
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +84 -32
- package/src/cli/tasks.ts +93 -0
- package/src/cli/upgrade.ts +19 -11
- package/src/cli/usage.ts +30 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +240 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +33 -14
- package/src/core/defaults.ts +5 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/run-overrides.ts +0 -5
- package/src/core/settings-layers.ts +21 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/termination.ts +26 -9
- package/src/core/tool-names.ts +5 -2
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +5 -3
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +8 -5
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +97 -11
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +12 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +207 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +85 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +10 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +41 -9
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +4 -0
- package/src/domains/dispatch/extension.ts +240 -132
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +21 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +13 -37
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +21 -5
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +17 -10
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +106 -17
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/marketplace-offer.ts +20 -1
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +54 -9
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +423 -53
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +12 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +36 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +16 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +13 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +211 -34
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +137 -28
- package/src/domains/session/entries.ts +213 -11
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +32 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +60 -10
- package/src/engine/acp/server.ts +22 -4
- package/src/engine/acp/transport.ts +55 -9
- package/src/engine/acp/types.ts +9 -0
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +26 -7
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +64 -17
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +58 -714
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +11 -4
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +63 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +3 -3
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +31 -43
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +14 -10
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +40 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +41 -1
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +33 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +12 -9
- package/src/tools/dispatch-runner.ts +63 -33
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/limitation.ts +76 -0
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +127 -7
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +40 -5
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +303 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-IA7V7FUC.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-BEPZRGGU.js +0 -1560
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-KK4JZPBQ.js +0 -3982
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-NDINPTJ4.js +0 -641
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/chunk-Y3CBHOR6.js +0 -228
- package/dist/clio-CMMK4KRR.js +0 -25
- package/dist/configure-LE3IK2TJ.js +0 -56
- package/dist/context-clear-BW4O37TG.js +0 -176
- package/dist/fleet-view-SWBR3VGQ.js +0 -97
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-S7MBJDQK.js +0 -83
- package/dist/tools-TFGJICCU.js +0 -29
- package/dist/verify-RWE4PPEK.js +0 -27
- 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
|
|
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
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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:
|
|
1413
|
-
elapsedMs:
|
|
1414
|
-
tokenCount: entry.
|
|
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.
|
|
1418
|
-
outputTokens: entry.
|
|
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
|
|
1435
|
-
recentTools: progress
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
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 [...
|
|
1840
|
-
.
|
|
1841
|
-
.
|
|
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
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
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
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
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
|
}
|