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