@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
|
@@ -71,10 +71,11 @@ import {
|
|
|
71
71
|
resolveAgentToolCompatibility,
|
|
72
72
|
} from "../agents/spec.js";
|
|
73
73
|
import type { ConfigContract } from "../config/contract.js";
|
|
74
|
-
import type { ContextContract, ProjectStructuredContext } from "../context/contract.js";
|
|
74
|
+
import type { ContextContract, ProjectPromptContext, ProjectStructuredContext } from "../context/contract.js";
|
|
75
75
|
import type { MiddlewareContract } from "../middleware/contract.js";
|
|
76
76
|
import { workerSafetyOneLiner } from "../prompts/compiler.js";
|
|
77
77
|
import type { PromptsContract } from "../prompts/contract.js";
|
|
78
|
+
import { selectProjectPreload } from "../prompts/preload.js";
|
|
78
79
|
import { type EffectivePricing, resolveEffectivePricing } from "../providers/catalog.js";
|
|
79
80
|
import {
|
|
80
81
|
type CapabilityFlags,
|
|
@@ -153,7 +154,7 @@ import {
|
|
|
153
154
|
import { type BatchState, createBatch, onRunComplete, snapshotBatch } from "./batch-tracker.js";
|
|
154
155
|
import { type RunToolBudgetEnvelope, resolveToolBudgetEnvelope } from "./budget-envelope.js";
|
|
155
156
|
import { assessCapabilityMismatch, type CapabilityMismatch } from "./capability-match.js";
|
|
156
|
-
import { capacityLeaseUsage, createNodeLeaseUsageReader } from "./capacity-lease.js";
|
|
157
|
+
import { capacityLeaseUsage, capacityLeaseUsageAsync, createNodeLeaseUsageReader } from "./capacity-lease.js";
|
|
157
158
|
import { acquireCheckoutWriterLease, type CheckoutWriterLease } from "./checkout-writer-lease.js";
|
|
158
159
|
import type {
|
|
159
160
|
DispatchAdmissionObserver,
|
|
@@ -163,9 +164,9 @@ import type {
|
|
|
163
164
|
DispatchRequest,
|
|
164
165
|
DispatchSnapshot,
|
|
165
166
|
} from "./contract.js";
|
|
166
|
-
import { createWorkerOutputCapture, startDispatchEventPump } from "./event-pump.js";
|
|
167
|
+
import { createWorkerOutputCapture, startDispatchEventPump, workerOutputCaptureBytes } from "./event-pump.js";
|
|
167
168
|
import type { ExecutionHandoff } from "./execution-handoff.js";
|
|
168
|
-
import {
|
|
169
|
+
import { dispatchResultContract, routeCorrelationFactsForRun, withAttemptRole } from "./execution-role.js";
|
|
169
170
|
import {
|
|
170
171
|
affectsTargetBreaker,
|
|
171
172
|
classifyFailure,
|
|
@@ -231,7 +232,6 @@ import {
|
|
|
231
232
|
rebindDispatchReservationMember,
|
|
232
233
|
releaseDispatchReservation,
|
|
233
234
|
releaseDispatchReservationMember,
|
|
234
|
-
reservedBudgetUsd,
|
|
235
235
|
reservedPlanPeakSlots,
|
|
236
236
|
rollbackDispatchReservation,
|
|
237
237
|
rollbackUnconsumedDispatchReservation,
|
|
@@ -364,7 +364,9 @@ interface ActiveRun {
|
|
|
364
364
|
stallKilled: boolean;
|
|
365
365
|
/** ACP event-inactivity window; null for native runs (heartbeat spec governs those). */
|
|
366
366
|
stallTimeoutMs: number | null;
|
|
367
|
+
/** Internal logical assignment/retry lineage, independent of published host ancestry. */
|
|
367
368
|
lineage: RunLineage;
|
|
369
|
+
hostRun?: DispatchPreparationOptions["hostRun"];
|
|
368
370
|
heartbeatAt: HeartbeatStamp | null;
|
|
369
371
|
heartbeatStatus: HeartbeatStatus;
|
|
370
372
|
meter: RunTokenMeter;
|
|
@@ -777,6 +779,11 @@ function workerDiagnosticsText(result: SpawnedWorkerResult, maxChars: number): s
|
|
|
777
779
|
if (malformedStdoutLines > 0) {
|
|
778
780
|
parts.push(`malformed stdout lines: ${malformedStdoutLines}`);
|
|
779
781
|
}
|
|
782
|
+
if (result.signal) {
|
|
783
|
+
// Keep the observed close signal beside contract failures, and at the
|
|
784
|
+
// tail so bounded stderr diagnostics cannot truncate it away.
|
|
785
|
+
parts.push(`worker process signal: ${result.signal}`);
|
|
786
|
+
}
|
|
780
787
|
if (parts.length === 0) return null;
|
|
781
788
|
return truncateDiagnosticText(parts.join("; "), maxChars);
|
|
782
789
|
}
|
|
@@ -844,14 +851,19 @@ function renderBoundSkillBlock(recipe: AgentRecipe): string {
|
|
|
844
851
|
].join("\n");
|
|
845
852
|
}
|
|
846
853
|
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
854
|
+
/**
|
|
855
|
+
* Whether Clio's canonical `context` tool is attached to this worker. A
|
|
856
|
+
* subprocess runtime runs its own tool loop and never receives Clio's tool
|
|
857
|
+
* surface, so the recipe's `context` entry does not make the tool available
|
|
858
|
+
* there, and bound skills must not be promised through it.
|
|
859
|
+
*/
|
|
860
|
+
function canonicalContextAttached(runtime: Pick<RuntimeDescriptor, "kind">, tools: ReadonlyArray<ToolName>): boolean {
|
|
861
|
+
return runtime.kind !== "subprocess" && tools.includes(ToolNames.Context);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
function workerPersonaBody(req: DispatchRequest, recipe: AgentRecipe | null, contextAttached: boolean): string {
|
|
852
865
|
const base = req.systemPrompt && req.systemPrompt.length > 0 ? req.systemPrompt : (recipe?.body ?? "");
|
|
853
|
-
const skillBlock =
|
|
854
|
-
recipe && req.noSkills !== true && allowedTools.includes(ToolNames.Context) ? renderBoundSkillBlock(recipe) : "";
|
|
866
|
+
const skillBlock = recipe && req.noSkills !== true && contextAttached ? renderBoundSkillBlock(recipe) : "";
|
|
855
867
|
return [base, skillBlock].filter((part) => part.trim().length > 0).join("\n\n");
|
|
856
868
|
}
|
|
857
869
|
|
|
@@ -1102,6 +1114,12 @@ export interface WorkerDynamicContext {
|
|
|
1102
1114
|
autonomy?: AutonomyLevel | null;
|
|
1103
1115
|
/** Effective approval routing; defaults to deny for legacy direct callers. */
|
|
1104
1116
|
onPermission?: WorkerPermissionMode | null;
|
|
1117
|
+
/** Captured authored handbooks; preferred over the legacy structured projection. */
|
|
1118
|
+
projectPrompt?: ProjectPromptContext | null;
|
|
1119
|
+
/** Admitted native read capability; null for an unknown external inventory. */
|
|
1120
|
+
projectReadTools?: boolean | null;
|
|
1121
|
+
/** External runtimes do not promise the native read schema. */
|
|
1122
|
+
projectExternalReadTools?: boolean;
|
|
1105
1123
|
/** Structured CLIO-CODER.md fields; null when CLIO-CODER.md is absent or malformed. */
|
|
1106
1124
|
project?: ProjectStructuredContext | null;
|
|
1107
1125
|
/** The run's own working directory and top-level layout; sent at every tier. */
|
|
@@ -1155,10 +1173,10 @@ function renderWorkerProjectContext(
|
|
|
1155
1173
|
|
|
1156
1174
|
/** True when the rendered project message body includes the verification block. */
|
|
1157
1175
|
function workerProjectContextIncludesVerification(body: string): boolean {
|
|
1158
|
-
return body.includes("\nVerification expectations:\n");
|
|
1176
|
+
return body.startsWith("# Project Context\n") && body.includes("\nVerification expectations:\n");
|
|
1159
1177
|
}
|
|
1160
1178
|
|
|
1161
|
-
function buildDynamicPromptMessages(
|
|
1179
|
+
export function buildDynamicPromptMessages(
|
|
1162
1180
|
req: DispatchRequest,
|
|
1163
1181
|
dynamicContext: WorkerDynamicContext = {},
|
|
1164
1182
|
): WorkerPromptMessage[] {
|
|
@@ -1167,10 +1185,22 @@ function buildDynamicPromptMessages(
|
|
|
1167
1185
|
const body = renderWorkerWorkspaceContext(dynamicContext.workspace);
|
|
1168
1186
|
messages.push({ id: "dispatch-workspace", body, contentHash: sha256(body) });
|
|
1169
1187
|
}
|
|
1170
|
-
if (dynamicContext.
|
|
1171
|
-
const
|
|
1172
|
-
|
|
1173
|
-
|
|
1188
|
+
if (dynamicContext.projectContextTier === "bounded") {
|
|
1189
|
+
const authored = dynamicContext.projectPrompt;
|
|
1190
|
+
// Authored instructions remain verbatim, including test guidance. Never
|
|
1191
|
+
// duplicate them with a second projection of conventions or verification.
|
|
1192
|
+
const body = authored
|
|
1193
|
+
? authored.handbookSources.length > 0
|
|
1194
|
+
? selectProjectPreload(authored, dynamicContext.projectReadTools ?? null, {
|
|
1195
|
+
maxChars: WORKER_PROJECT_CONTEXT_MAX_CHARS,
|
|
1196
|
+
externalReadTools: dynamicContext.projectExternalReadTools === true,
|
|
1197
|
+
}).text
|
|
1198
|
+
: ""
|
|
1199
|
+
: dynamicContext.project
|
|
1200
|
+
? renderWorkerProjectContext(dynamicContext.project, {
|
|
1201
|
+
includeVerification: dynamicContext.capabilityClass === "verification",
|
|
1202
|
+
})
|
|
1203
|
+
: "";
|
|
1174
1204
|
if (body.length > 0) {
|
|
1175
1205
|
messages.push({ id: "dispatch-project-context", body, contentHash: sha256(body) });
|
|
1176
1206
|
}
|
|
@@ -1350,6 +1380,8 @@ interface DispatchLifecycleStage {
|
|
|
1350
1380
|
pipeline: RunPipelineProvenance | null;
|
|
1351
1381
|
briefing: RunBriefingProvenance | null;
|
|
1352
1382
|
personaOverride: RunPersonaOverride | null;
|
|
1383
|
+
/** Decision refs sealed on the request by the dispatch tool; null when the parent board was empty. */
|
|
1384
|
+
decisionRefs: ReadonlyArray<string> | null;
|
|
1353
1385
|
projectContext: RunProjectContextProvenance;
|
|
1354
1386
|
/** Rule ids the worker prompt compiler selected into this run's system prompt; [] when none matched. */
|
|
1355
1387
|
rulesApplied: string[];
|
|
@@ -1382,6 +1414,8 @@ interface AcpDelegationLifecycleStage {
|
|
|
1382
1414
|
pipeline: RunPipelineProvenance | null;
|
|
1383
1415
|
briefing: RunBriefingProvenance | null;
|
|
1384
1416
|
personaOverride: RunPersonaOverride | null;
|
|
1417
|
+
/** Decision refs sealed on the request by the dispatch tool; null when the parent board was empty. */
|
|
1418
|
+
decisionRefs: ReadonlyArray<string> | null;
|
|
1385
1419
|
projectContext: RunProjectContextProvenance;
|
|
1386
1420
|
/** ACP delegation bypasses the worker prompt compiler entirely, so this is always []. */
|
|
1387
1421
|
rulesApplied: string[];
|
|
@@ -1445,7 +1479,7 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
|
|
|
1445
1479
|
if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
|
|
1446
1480
|
return [
|
|
1447
1481
|
"Antigravity CLI owns its internal tools, network activity, prompts, and approvals; Clio observes only structured stream output and does not provide per-tool mediation or complete tool telemetry",
|
|
1448
|
-
"Antigravity
|
|
1482
|
+
"Antigravity resumes a conversation only when the caller supplies its id explicitly",
|
|
1449
1483
|
"Antigravity runs are one-shot and never retried automatically",
|
|
1450
1484
|
];
|
|
1451
1485
|
}
|
|
@@ -1617,22 +1651,6 @@ function workerToolCallHardCap(settings: EffectiveSettings): number {
|
|
|
1617
1651
|
return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
|
|
1618
1652
|
}
|
|
1619
1653
|
|
|
1620
|
-
/**
|
|
1621
|
-
* Only a runtime that declares its external agent loop may accept a declared
|
|
1622
|
-
* per-tool budget: Clio records that budget as unobserved rather than enforced.
|
|
1623
|
-
* Any other subprocess runtime cannot mediate tool calls, so a declared budget
|
|
1624
|
-
* would be a claim nobody enforces.
|
|
1625
|
-
*/
|
|
1626
|
-
export function assertWorkerBudgetEnforceable(
|
|
1627
|
-
runtime: Pick<RuntimeDescriptor, "id" | "kind" | "externalAgentLoop">,
|
|
1628
|
-
hasDeclaredBudget: boolean,
|
|
1629
|
-
): void {
|
|
1630
|
-
if (!hasDeclaredBudget || runtime.kind !== "subprocess" || runtime.externalAgentLoop !== undefined) return;
|
|
1631
|
-
throw new Error(
|
|
1632
|
-
`dispatch: runtime '${runtime.id}' cannot enforce an explicit dispatch budget because subprocess workers do not expose per-tool mediation; choose a native or claude-sdk worker`,
|
|
1633
|
-
);
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
1654
|
/** Per-tool budget enforcement is real only where Clio observes each tool call. */
|
|
1637
1655
|
export function budgetEnforcementForRuntime(
|
|
1638
1656
|
runtime: Pick<RuntimeDescriptor, "kind">,
|
|
@@ -1648,7 +1666,6 @@ function resolveEffectiveWorkerBudget(input: {
|
|
|
1648
1666
|
settings: EffectiveSettings;
|
|
1649
1667
|
runtime: RuntimeDescriptor;
|
|
1650
1668
|
}): RunToolBudgetEnvelope {
|
|
1651
|
-
assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
|
|
1652
1669
|
const hardCap = workerToolCallHardCap(input.settings);
|
|
1653
1670
|
const declared = input.declared ?? {
|
|
1654
1671
|
toolCalls: hardCap,
|
|
@@ -1728,15 +1745,6 @@ function assertPlannedNodeIdentity(req: DispatchRequest, actual: RunNodeIdentity
|
|
|
1728
1745
|
);
|
|
1729
1746
|
}
|
|
1730
1747
|
|
|
1731
|
-
function assertApprovedCostCeiling(req: DispatchRequest, liveCeilingUsd: number): void {
|
|
1732
|
-
const approved = req.plan?.costCeilingUsd;
|
|
1733
|
-
if (approved === undefined) return;
|
|
1734
|
-
if (Object.is(approved, liveCeilingUsd)) return;
|
|
1735
|
-
throw new Error(
|
|
1736
|
-
`dispatch: scheduling cost ceiling drifted after plan approval (approved $${approved.toFixed(4)}, current $${liveCeilingUsd.toFixed(4)}); re-plan before launch`,
|
|
1737
|
-
);
|
|
1738
|
-
}
|
|
1739
|
-
|
|
1740
1748
|
/** Fail closed until another runtime has an explicitly tested JSON-schema wire contract. */
|
|
1741
1749
|
function assertResponseSchemaEnforceable(
|
|
1742
1750
|
runtime: RuntimeDescriptor,
|
|
@@ -1920,10 +1928,9 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
|
|
|
1920
1928
|
// Requiring a recipe contract here meant a caller-supplied override against a
|
|
1921
1929
|
// recipe with none was sealed but never sent, so the worker spent no repair
|
|
1922
1930
|
// round on a contract it was never told about and the run failed on a shape
|
|
1923
|
-
// nothing had asked it for.
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
: undefined;
|
|
1931
|
+
// nothing had asked it for. A caller's summary allowance is folded in by
|
|
1932
|
+
// the same resolver the seal uses, so the two never disagree.
|
|
1933
|
+
const workerResultContract = dispatchResultContract(input.req, input.recipe);
|
|
1927
1934
|
if (workerResultContract) spec.resultContract = workerResultContract;
|
|
1928
1935
|
const product = input.req.product ?? input.recipe?.product;
|
|
1929
1936
|
if (product) spec.product = product;
|
|
@@ -1954,7 +1961,7 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
|
|
|
1954
1961
|
if (
|
|
1955
1962
|
input.req.noSkills !== true &&
|
|
1956
1963
|
recipeSkills.length > 0 &&
|
|
1957
|
-
input.admission.allowedTools
|
|
1964
|
+
canonicalContextAttached(input.target.runtime, input.admission.allowedTools)
|
|
1958
1965
|
) {
|
|
1959
1966
|
spec.agentSkills = [...new Set(recipeSkills)];
|
|
1960
1967
|
}
|
|
@@ -2577,10 +2584,17 @@ export function createDispatchBundle(
|
|
|
2577
2584
|
return configuredEndpointCapacities()[endpoint.key] ?? endpoint;
|
|
2578
2585
|
}
|
|
2579
2586
|
|
|
2580
|
-
|
|
2587
|
+
/** Initial plan preparation has a synchronous host contract. */
|
|
2588
|
+
function reservationCapacitySnapshotSync(settings: EffectiveSettings): ReservationCapacitySnapshot {
|
|
2589
|
+
return reservationCapacitySnapshot(settings, capacityLeaseUsage());
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
function reservationCapacitySnapshot(
|
|
2593
|
+
settings: EffectiveSettings,
|
|
2594
|
+
usage: ReturnType<typeof capacityLeaseUsage>,
|
|
2595
|
+
): ReservationCapacitySnapshot {
|
|
2596
|
+
// Read budget after the capacity lock wait too; concurrent callbacks may spend.
|
|
2581
2597
|
const preflight = scheduling.preflight();
|
|
2582
|
-
// Reservation planning compares against a fresh read, never the display cache.
|
|
2583
|
-
const usage = capacityLeaseUsage();
|
|
2584
2598
|
const nodes: Record<string, { active: number; limit: number }> = {
|
|
2585
2599
|
local: { active: usage.nodes.local ?? 0, limit: configuredGlobalCapacity(settings) },
|
|
2586
2600
|
};
|
|
@@ -2615,7 +2629,7 @@ export function createDispatchBundle(
|
|
|
2615
2629
|
...(task.resolution.endpoint !== undefined ? { endpointKey: task.resolution.endpoint.key } : {}),
|
|
2616
2630
|
costUpperBoundUsd: task.resolution.routeApproval?.totalCostUpperBoundUsd ?? task.resolution.costUpperBoundUsd,
|
|
2617
2631
|
})),
|
|
2618
|
-
capacity:
|
|
2632
|
+
capacity: reservationCapacitySnapshotSync(getEffectiveSettings()),
|
|
2619
2633
|
nowMs: now(),
|
|
2620
2634
|
});
|
|
2621
2635
|
ownedReservations.add(record.ownerId);
|
|
@@ -2646,20 +2660,10 @@ export function createDispatchBundle(
|
|
|
2646
2660
|
}
|
|
2647
2661
|
|
|
2648
2662
|
function assertBudgetAdmitsRoute(req: DispatchRequest, pricing: EffectivePricing, settings: EffectiveSettings): void {
|
|
2649
|
-
const preflight = scheduling.preflight();
|
|
2650
|
-
assertApprovedCostCeiling(req, preflight.ceilingUsd);
|
|
2651
|
-
if (preflight.verdict === "over" || preflight.verdict === "at") {
|
|
2652
|
-
denyDispatchForBudget(preflight, req.agentId);
|
|
2653
|
-
}
|
|
2654
2663
|
const estimateUsd = conservativeRouteAdmissionEstimateUsd(pricing, admissionMaxOutputTokens(settings));
|
|
2655
2664
|
const intentCeiling = req.routingIntent?.maxCostUsd;
|
|
2656
2665
|
if (intentCeiling !== null && intentCeiling !== undefined && estimateUsd > intentCeiling)
|
|
2657
2666
|
denyDispatchForBudget({ currentUsd: estimateUsd, ceilingUsd: intentCeiling }, req.agentId, estimateUsd);
|
|
2658
|
-
const heldUsd = reservedBudgetUsd();
|
|
2659
|
-
const projectedUsd = preflight.currentUsd + heldUsd + (req.reservation === undefined ? estimateUsd : 0);
|
|
2660
|
-
if (scheduling.checkCeiling(projectedUsd) !== "under") {
|
|
2661
|
-
denyDispatchForBudget({ currentUsd: projectedUsd, ceilingUsd: preflight.ceilingUsd }, req.agentId, estimateUsd);
|
|
2662
|
-
}
|
|
2663
2667
|
}
|
|
2664
2668
|
|
|
2665
2669
|
function configuredGlobalCapacity(settings: EffectiveSettings): number {
|
|
@@ -2707,7 +2711,12 @@ export function createDispatchBundle(
|
|
|
2707
2711
|
const assignmentId =
|
|
2708
2712
|
req.lineage?.rootRunId ?? req.runIdHint ?? `pending-${queuedAt.toString(36)}-${randomBytes(6).toString("hex")}`;
|
|
2709
2713
|
const requestedAt = Date.parse(timing.requestedAt ?? timing.queuedAt);
|
|
2710
|
-
const deadlineAt =
|
|
2714
|
+
const deadlineAt =
|
|
2715
|
+
req.assignmentDeadlineAt ??
|
|
2716
|
+
(req.routingIntent?.deadlineMs === undefined || req.routingIntent.deadlineMs === null
|
|
2717
|
+
? undefined
|
|
2718
|
+
: requestedAt + req.routingIntent.deadlineMs);
|
|
2719
|
+
if (deadlineAt !== undefined) req.assignmentDeadlineAt = deadlineAt;
|
|
2711
2720
|
if (req.lineage === undefined) await registerAssignment(assignmentId);
|
|
2712
2721
|
// A plan's queued members keep their wave order and their reserved peak.
|
|
2713
2722
|
const plan =
|
|
@@ -2726,7 +2735,7 @@ export function createDispatchBundle(
|
|
|
2726
2735
|
assignmentId,
|
|
2727
2736
|
nodeId,
|
|
2728
2737
|
...(endpoint !== null && endpoint !== undefined ? { endpointKey: endpoint.key } : {}),
|
|
2729
|
-
deadlineAt,
|
|
2738
|
+
...(deadlineAt === undefined ? {} : { deadlineAt }),
|
|
2730
2739
|
...plan,
|
|
2731
2740
|
// A fleet's first attempt carries lineage and still owns the held
|
|
2732
2741
|
// reservation member that admission must transfer into its lease.
|
|
@@ -2750,15 +2759,16 @@ export function createDispatchBundle(
|
|
|
2750
2759
|
}
|
|
2751
2760
|
|
|
2752
2761
|
/** Retries only: the first attempt's member was consumed with the planned bound. */
|
|
2753
|
-
function rebindReservationSlot(
|
|
2762
|
+
async function rebindReservationSlot(
|
|
2754
2763
|
req: DispatchRequest,
|
|
2755
2764
|
nodeId: string,
|
|
2756
2765
|
endpoint: EndpointCapacity | null,
|
|
2757
2766
|
costUsd: number,
|
|
2758
2767
|
settings: EffectiveSettings,
|
|
2759
|
-
): void {
|
|
2768
|
+
): Promise<void> {
|
|
2760
2769
|
if (req.reservation === undefined || req.lineage === undefined) return;
|
|
2761
|
-
|
|
2770
|
+
// Retries can await fresh capacity; the advisory display cache is never admission data.
|
|
2771
|
+
const capacity = reservationCapacitySnapshot(settings, await capacityLeaseUsageAsync());
|
|
2762
2772
|
const rebind = {
|
|
2763
2773
|
...req.reservation,
|
|
2764
2774
|
nodeId,
|
|
@@ -2767,7 +2777,7 @@ export function createDispatchBundle(
|
|
|
2767
2777
|
capacity,
|
|
2768
2778
|
nowMs: now(),
|
|
2769
2779
|
};
|
|
2770
|
-
rebindDispatchReservationMember(rebind);
|
|
2780
|
+
await rebindDispatchReservationMember(rebind);
|
|
2771
2781
|
}
|
|
2772
2782
|
|
|
2773
2783
|
/** Process-local retry queue keyed by finished run; backoff is keyed by assignment root. */
|
|
@@ -2786,6 +2796,7 @@ export function createDispatchBundle(
|
|
|
2786
2796
|
const retryQueue = new Map<string, RetryQueueEntry>();
|
|
2787
2797
|
const retryBackoff = new Map<string, BackoffState>();
|
|
2788
2798
|
const retryReasons = new Map<string, string>();
|
|
2799
|
+
const assignmentRootsByAttempt = new Map<string, string>();
|
|
2789
2800
|
const assignments = new AssignmentRegistry({
|
|
2790
2801
|
onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
|
|
2791
2802
|
});
|
|
@@ -2815,8 +2826,19 @@ export function createDispatchBundle(
|
|
|
2815
2826
|
}
|
|
2816
2827
|
|
|
2817
2828
|
function lineageFor(req: DispatchRequest, runId: string): RunLineage {
|
|
2818
|
-
|
|
2819
|
-
|
|
2829
|
+
const lineage = req.lineage ? { ...req.lineage } : { parentRunId: null, rootRunId: runId, attempt: 0, depth: 0 };
|
|
2830
|
+
assignmentRootsByAttempt.set(runId, lineage.rootRunId);
|
|
2831
|
+
return lineage;
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2834
|
+
function publishedLineage(lineage: RunLineage, hostRun: DispatchPreparationOptions["hostRun"]): RunLineage {
|
|
2835
|
+
if (hostRun === undefined) return { ...lineage };
|
|
2836
|
+
return {
|
|
2837
|
+
parentRunId: lineage.attempt === 0 ? hostRun.runId : lineage.parentRunId,
|
|
2838
|
+
rootRunId: hostRun.lineage.rootRunId,
|
|
2839
|
+
depth: hostRun.lineage.depth + 1,
|
|
2840
|
+
attempt: lineage.attempt,
|
|
2841
|
+
};
|
|
2820
2842
|
}
|
|
2821
2843
|
|
|
2822
2844
|
function accumulateFinalizedTotals(receipt: RunReceipt): void {
|
|
@@ -3135,7 +3157,7 @@ export function createDispatchBundle(
|
|
|
3135
3157
|
if (decision.excludedRouteParts.includes("model")) delete retryReq.model;
|
|
3136
3158
|
if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
|
|
3137
3159
|
}
|
|
3138
|
-
const handle = await dispatch(retryReq);
|
|
3160
|
+
const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
|
|
3139
3161
|
// The assignment folds every attempt into one stream with a reset marker.
|
|
3140
3162
|
const marker: AssignmentAttemptStartEvent = {
|
|
3141
3163
|
type: "attempt_start",
|
|
@@ -3321,6 +3343,27 @@ export function createDispatchBundle(
|
|
|
3321
3343
|
}
|
|
3322
3344
|
}
|
|
3323
3345
|
|
|
3346
|
+
/** Explicit deadlines outlive queue admission and use the ordinary truthful abort path. */
|
|
3347
|
+
function watchAssignmentDeadline(run: ActiveRun, callerDeadlineAt?: number): void {
|
|
3348
|
+
const deadlineAt = run.req.assignmentDeadlineAt;
|
|
3349
|
+
if (deadlineAt === undefined || (callerDeadlineAt !== undefined && deadlineAt >= callerDeadlineAt)) return;
|
|
3350
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
3351
|
+
let settled = false;
|
|
3352
|
+
const check = (): void => {
|
|
3353
|
+
if (settled || run.aborted || run.stallKilled) return;
|
|
3354
|
+
const remaining = deadlineAt - now();
|
|
3355
|
+
if (remaining <= 0) {
|
|
3356
|
+
contract.abort(run.runId, { cause: "timeout", detail: "timed out: explicit assignment deadline reached" });
|
|
3357
|
+
} else timer = setTimeout(check, Math.min(2_147_483_647, remaining));
|
|
3358
|
+
};
|
|
3359
|
+
const close = (): void => {
|
|
3360
|
+
settled = true;
|
|
3361
|
+
clearTimeout(timer);
|
|
3362
|
+
};
|
|
3363
|
+
void run.promise.then(close, close);
|
|
3364
|
+
check();
|
|
3365
|
+
}
|
|
3366
|
+
|
|
3324
3367
|
function startHeartbeatWatchdog(): void {
|
|
3325
3368
|
if (heartbeatTimer || heartbeatIntervalMs <= 0) return;
|
|
3326
3369
|
heartbeatTimer = setInterval(checkActiveHeartbeats, heartbeatIntervalMs);
|
|
@@ -3482,6 +3525,9 @@ export function createDispatchBundle(
|
|
|
3482
3525
|
if (!recipe) {
|
|
3483
3526
|
throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
|
|
3484
3527
|
}
|
|
3528
|
+
// Resolve the applied contract once here so a caller's summary allowance
|
|
3529
|
+
// on a recipe that carries no summary fails before any model boots.
|
|
3530
|
+
dispatchResultContract(req, recipe);
|
|
3485
3531
|
const spec = normalizeAgentSpec(recipe);
|
|
3486
3532
|
if (req.requestOrigin === "user" && !isUserVisibleAgent(spec)) {
|
|
3487
3533
|
throw new Error(
|
|
@@ -3553,8 +3599,8 @@ export function createDispatchBundle(
|
|
|
3553
3599
|
...admission,
|
|
3554
3600
|
allowedTools: effectiveTools,
|
|
3555
3601
|
};
|
|
3556
|
-
const
|
|
3557
|
-
const
|
|
3602
|
+
const hasCanonicalContext = canonicalContextAttached(target.runtime, effectiveTools);
|
|
3603
|
+
const personaBody = workerPersonaBody(req, recipe, hasCanonicalContext);
|
|
3558
3604
|
const hasBoundSkills =
|
|
3559
3605
|
hasCanonicalContext && recipe.skills !== undefined && recipe.skills.length > 0 && req.noSkills !== true;
|
|
3560
3606
|
const compiledWorkerPrompt = await prompts.compileWorkerPrompt({
|
|
@@ -3584,17 +3630,24 @@ export function createDispatchBundle(
|
|
|
3584
3630
|
settings,
|
|
3585
3631
|
runtime: target.runtime,
|
|
3586
3632
|
});
|
|
3587
|
-
// Fetch
|
|
3633
|
+
// Fetch captured project context only for tiers that receive it, so
|
|
3588
3634
|
// read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
|
|
3589
3635
|
// (capability-class default, recipe frontmatter override).
|
|
3590
3636
|
const tier = spec.projectContextTier;
|
|
3591
|
-
const
|
|
3637
|
+
const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
|
|
3592
3638
|
const dynamicPromptMessages = buildDynamicPromptMessages(req, {
|
|
3593
3639
|
capabilityClass: spec.capabilityClass,
|
|
3594
3640
|
projectContextTier: tier,
|
|
3595
3641
|
autonomy: effectiveAutonomy,
|
|
3596
3642
|
onPermission: settings?.fleet.permissions.mode ?? "deny",
|
|
3597
|
-
|
|
3643
|
+
projectPrompt,
|
|
3644
|
+
projectReadTools:
|
|
3645
|
+
target.runtime.kind === "subprocess"
|
|
3646
|
+
? null
|
|
3647
|
+
: effectiveTools.includes(ToolNames.Read)
|
|
3648
|
+
? targetToolCapability(target)
|
|
3649
|
+
: false,
|
|
3650
|
+
projectExternalReadTools: target.runtime.kind === "subprocess",
|
|
3598
3651
|
workspace: readWorkspaceRootFacts(cwd),
|
|
3599
3652
|
});
|
|
3600
3653
|
const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
|
|
@@ -3639,6 +3692,7 @@ export function createDispatchBundle(
|
|
|
3639
3692
|
pipeline: pipelineProvenanceFor(req),
|
|
3640
3693
|
briefing: briefingProvenanceFor(req),
|
|
3641
3694
|
personaOverride,
|
|
3695
|
+
decisionRefs: req.decisionRefs ?? null,
|
|
3642
3696
|
projectContext: projectContextProvenance,
|
|
3643
3697
|
rulesApplied: compiledWorkerPrompt.rulesApplied ?? [],
|
|
3644
3698
|
operatorProfileApplied: compiledWorkerPrompt.operatorProfileApplied ?? false,
|
|
@@ -3666,6 +3720,9 @@ export function createDispatchBundle(
|
|
|
3666
3720
|
`dispatch: shadow or internal agent '${req.agentId}' cannot run on external ACP agent '${agentId}'`,
|
|
3667
3721
|
);
|
|
3668
3722
|
}
|
|
3723
|
+
// A summary allowance on a recipe with no summary field fails here,
|
|
3724
|
+
// before the external agent is started.
|
|
3725
|
+
dispatchResultContract(req, spec);
|
|
3669
3726
|
}
|
|
3670
3727
|
if (!settings) throw new Error("dispatch: effective settings required for ACP delegation");
|
|
3671
3728
|
const configured = settings.integrations.externalAgents.entries.find((entry) => entry.id === agentId);
|
|
@@ -3686,21 +3743,24 @@ export function createDispatchBundle(
|
|
|
3686
3743
|
}
|
|
3687
3744
|
const cwd = req.cwd ?? process.cwd();
|
|
3688
3745
|
const pathScope = resolveDispatchPathScope(req);
|
|
3689
|
-
const personaBody = workerPersonaBody(req, null,
|
|
3746
|
+
const personaBody = workerPersonaBody(req, null, false);
|
|
3690
3747
|
// ACP owns an unknown external tool inventory, so it receives the raw
|
|
3691
3748
|
// bounded persona rather than a native Clio schema-harness claim.
|
|
3692
3749
|
const systemPrompt = personaBody;
|
|
3693
3750
|
// ACP delegation defaults to no project context: repo conventions and
|
|
3694
3751
|
// invariants never leave the machine unless this agent's config opts in
|
|
3695
3752
|
// with projectContext: "bounded". No recipe means no capability class,
|
|
3696
|
-
// so
|
|
3753
|
+
// so no derived verification supplement is added. Authored test guidance
|
|
3754
|
+
// stays intact within the opted-in source budget. The safety posture
|
|
3697
3755
|
// line still rides along for every worker run.
|
|
3698
3756
|
const tier: AgentProjectContextTier = configured.projectContext ?? "none";
|
|
3699
|
-
const
|
|
3757
|
+
const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
|
|
3700
3758
|
const dynamicPromptMessages = buildDynamicPromptMessages(req, {
|
|
3701
3759
|
projectContextTier: tier,
|
|
3702
3760
|
autonomy,
|
|
3703
|
-
|
|
3761
|
+
projectPrompt,
|
|
3762
|
+
projectReadTools: null,
|
|
3763
|
+
projectExternalReadTools: true,
|
|
3704
3764
|
workspace: readWorkspaceRootFacts(cwd),
|
|
3705
3765
|
});
|
|
3706
3766
|
const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
|
|
@@ -3728,6 +3788,7 @@ export function createDispatchBundle(
|
|
|
3728
3788
|
pipeline: pipelineProvenanceFor(req),
|
|
3729
3789
|
briefing: briefingProvenanceFor(req),
|
|
3730
3790
|
personaOverride,
|
|
3791
|
+
decisionRefs: req.decisionRefs ?? null,
|
|
3731
3792
|
projectContext: projectContextProvenance,
|
|
3732
3793
|
rulesApplied: [],
|
|
3733
3794
|
operatorProfileApplied: false,
|
|
@@ -3742,12 +3803,25 @@ export function createDispatchBundle(
|
|
|
3742
3803
|
timing: RunPhaseMarks,
|
|
3743
3804
|
routeDecision: RouteDecisionV1,
|
|
3744
3805
|
observer?: DispatchAdmissionObserver,
|
|
3806
|
+
callerDeadlineAt?: number,
|
|
3807
|
+
hostRun?: DispatchPreparationOptions["hostRun"],
|
|
3745
3808
|
): Promise<{
|
|
3746
3809
|
runId: string;
|
|
3747
3810
|
events: AsyncIterableIterator<unknown>;
|
|
3748
3811
|
finalPromise: Promise<RunReceipt>;
|
|
3749
3812
|
}> {
|
|
3750
3813
|
const lifecycle = resolveAcpDelegationLifecycle(req, settings);
|
|
3814
|
+
const estimate = workerToolCallHardCap(settings);
|
|
3815
|
+
const budgetEnvelope = resolveToolBudgetEnvelope({
|
|
3816
|
+
recipeId: req.agentId,
|
|
3817
|
+
policy: { toolCalls: estimate, readReserve: 0, synthesis: true },
|
|
3818
|
+
...(req.budget === undefined ? {} : { request: req.budget }),
|
|
3819
|
+
hardCap: estimate,
|
|
3820
|
+
hasReadTool: false,
|
|
3821
|
+
retry: (req.lineage?.attempt ?? 0) > 0,
|
|
3822
|
+
revision: false,
|
|
3823
|
+
enforcement: "external-one-shot",
|
|
3824
|
+
});
|
|
3751
3825
|
publishDispatchPathScope(req, lifecycle.pathScope);
|
|
3752
3826
|
timing.decisionCompletedAt = new Date(now()).toISOString();
|
|
3753
3827
|
const targetId = `delegation:${lifecycle.agentConfig.id}`;
|
|
@@ -3829,7 +3903,11 @@ export function createDispatchBundle(
|
|
|
3829
3903
|
let outcomeCode: RunOutcomeCode | null = null;
|
|
3830
3904
|
let reportedSpoofedOutcome = false;
|
|
3831
3905
|
let runIdForPermissionAudit: string | null = null;
|
|
3832
|
-
const outputCapture = createWorkerOutputCapture(
|
|
3906
|
+
const outputCapture = createWorkerOutputCapture({
|
|
3907
|
+
maxBytes: workerOutputCaptureBytes(
|
|
3908
|
+
dispatchResultContract(req, req.agentId && maybeAgents ? maybeAgents.getSpec(req.agentId) : null),
|
|
3909
|
+
),
|
|
3910
|
+
});
|
|
3833
3911
|
const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
|
|
3834
3912
|
if (timing[field] !== undefined) return;
|
|
3835
3913
|
timing[field] = new Date(now()).toISOString();
|
|
@@ -3997,10 +4075,11 @@ export function createDispatchBundle(
|
|
|
3997
4075
|
}
|
|
3998
4076
|
identity = detectRunIdentity();
|
|
3999
4077
|
ledgerRef.update(envelope.id, {
|
|
4078
|
+
budget: budgetEnvelope,
|
|
4000
4079
|
status: "running",
|
|
4001
4080
|
pid: acp.pid,
|
|
4002
4081
|
heartbeatAt: heartbeatIso(acp.heartbeatAt),
|
|
4003
|
-
lineage,
|
|
4082
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4004
4083
|
identity,
|
|
4005
4084
|
node: LOCAL_RUN_NODE,
|
|
4006
4085
|
...(lifecycle.pipeline ? { pipeline: lifecycle.pipeline } : {}),
|
|
@@ -4009,6 +4088,7 @@ export function createDispatchBundle(
|
|
|
4009
4088
|
...(req.council !== undefined ? { council: req.council } : {}),
|
|
4010
4089
|
...(req.plan !== undefined ? { plan: req.plan } : {}),
|
|
4011
4090
|
...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
|
|
4091
|
+
...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
|
|
4012
4092
|
});
|
|
4013
4093
|
observer?.onAdmitted({
|
|
4014
4094
|
runId: envelope.id,
|
|
@@ -4031,6 +4111,7 @@ export function createDispatchBundle(
|
|
|
4031
4111
|
});
|
|
4032
4112
|
}
|
|
4033
4113
|
context.bus.emit(BusChannels.DispatchStarted, {
|
|
4114
|
+
budget: budgetEnvelope,
|
|
4034
4115
|
runId: envelope.id,
|
|
4035
4116
|
agentId: req.agentId,
|
|
4036
4117
|
task: req.task,
|
|
@@ -4081,7 +4162,14 @@ export function createDispatchBundle(
|
|
|
4081
4162
|
});
|
|
4082
4163
|
|
|
4083
4164
|
const startedAt = envelope.startedAt;
|
|
4165
|
+
let resolveFinal!: (receipt: RunReceipt) => void;
|
|
4166
|
+
let rejectFinal!: (error: unknown) => void;
|
|
4167
|
+
const finalPromise = new Promise<RunReceipt>((res, rej) => {
|
|
4168
|
+
resolveFinal = res;
|
|
4169
|
+
rejectFinal = rej;
|
|
4170
|
+
});
|
|
4084
4171
|
const activeRun: ActiveRun = {
|
|
4172
|
+
budget: budgetEnvelope,
|
|
4085
4173
|
runId: envelope.id,
|
|
4086
4174
|
req,
|
|
4087
4175
|
abort: acp.abort,
|
|
@@ -4107,12 +4195,13 @@ export function createDispatchBundle(
|
|
|
4107
4195
|
stallKilled: false,
|
|
4108
4196
|
stallTimeoutMs: lifecycle.agentConfig.stallTimeoutMs ?? DEFAULT_ACP_STALL_TIMEOUT_MS,
|
|
4109
4197
|
lineage,
|
|
4198
|
+
...(hostRun === undefined ? {} : { hostRun }),
|
|
4110
4199
|
heartbeatAt: acp.heartbeatAt,
|
|
4111
4200
|
heartbeatStatus: "alive",
|
|
4112
4201
|
meter: tokenMeter,
|
|
4113
4202
|
pricing: null,
|
|
4114
4203
|
costProvenance: "unknown",
|
|
4115
|
-
finalPromise
|
|
4204
|
+
finalPromise,
|
|
4116
4205
|
};
|
|
4117
4206
|
|
|
4118
4207
|
const buildReceiptDraft = (
|
|
@@ -4127,8 +4216,7 @@ export function createDispatchBundle(
|
|
|
4127
4216
|
// the same messages, so adding both would double-count. Event-metered
|
|
4128
4217
|
// values survive only when the adapter reported nothing.
|
|
4129
4218
|
const usage = result.usage;
|
|
4130
|
-
const adapterReportedUsage =
|
|
4131
|
-
usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens + usage.reasoningTokens > 0;
|
|
4219
|
+
const adapterReportedUsage = usage.tokensReported;
|
|
4132
4220
|
if (adapterReportedUsage) {
|
|
4133
4221
|
tokenMeter.inputTokens = usage.inputTokens;
|
|
4134
4222
|
tokenMeter.outputTokens = usage.outputTokens;
|
|
@@ -4136,8 +4224,9 @@ export function createDispatchBundle(
|
|
|
4136
4224
|
tokenMeter.cacheWriteTokens = usage.cacheWriteTokens;
|
|
4137
4225
|
tokenMeter.reasoningTokens = usage.reasoningTokens;
|
|
4138
4226
|
}
|
|
4139
|
-
const tokenCount =
|
|
4140
|
-
|
|
4227
|
+
const tokenCount = adapterReportedUsage
|
|
4228
|
+
? usage.totalTokens
|
|
4229
|
+
: tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
|
|
4141
4230
|
const safetyMetadata = safety.policy?.metadata() ?? null;
|
|
4142
4231
|
const init = result.delegation.initialize;
|
|
4143
4232
|
const agentInfo = init?.agentInfo;
|
|
@@ -4160,7 +4249,7 @@ export function createDispatchBundle(
|
|
|
4160
4249
|
outcome,
|
|
4161
4250
|
outcomeCode,
|
|
4162
4251
|
outcomeDetail,
|
|
4163
|
-
lineage,
|
|
4252
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4164
4253
|
identity,
|
|
4165
4254
|
// An ACP peer is spawned by this process, so the run's node is this host.
|
|
4166
4255
|
node: LOCAL_RUN_NODE,
|
|
@@ -4170,6 +4259,8 @@ export function createDispatchBundle(
|
|
|
4170
4259
|
...(req.council !== undefined ? { council: req.council } : {}),
|
|
4171
4260
|
...(req.plan !== undefined ? { plan: req.plan } : {}),
|
|
4172
4261
|
...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
|
|
4262
|
+
...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
|
|
4263
|
+
budget: budgetEnvelope,
|
|
4173
4264
|
projectContext: lifecycle.projectContext,
|
|
4174
4265
|
rulesApplied: lifecycle.rulesApplied,
|
|
4175
4266
|
operatorProfileApplied: lifecycle.operatorProfileApplied,
|
|
@@ -4188,8 +4279,8 @@ export function createDispatchBundle(
|
|
|
4188
4279
|
reasoningTokenCount: tokenMeter.reasoningTokens,
|
|
4189
4280
|
...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
|
|
4190
4281
|
...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
|
|
4191
|
-
costUsd:
|
|
4192
|
-
costProvenance: "unknown",
|
|
4282
|
+
costUsd: usage.costUsd,
|
|
4283
|
+
costProvenance: usage.costProvenance ?? "unknown",
|
|
4193
4284
|
compiledPromptHash: lifecycle.compiledPromptHash,
|
|
4194
4285
|
staticCompositionHash: lifecycle.staticCompositionHash,
|
|
4195
4286
|
staticShellHash: lifecycle.staticCompositionHash,
|
|
@@ -4265,7 +4356,7 @@ export function createDispatchBundle(
|
|
|
4265
4356
|
outcome,
|
|
4266
4357
|
outcomeCode: receipt.outcomeCode ?? null,
|
|
4267
4358
|
outcomeDetail: receipt.outcomeDetail ?? null,
|
|
4268
|
-
lineage,
|
|
4359
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4269
4360
|
tokenCount: receipt.tokenCount,
|
|
4270
4361
|
inputTokenCount: receipt.inputTokenCount ?? 0,
|
|
4271
4362
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
@@ -4295,7 +4386,6 @@ export function createDispatchBundle(
|
|
|
4295
4386
|
const assessDispatchFinishContract = (): DispatchFinishContractSnapshot | null => {
|
|
4296
4387
|
if (finishContractAssistantText.trim().length === 0) return null;
|
|
4297
4388
|
const assessment = assessFinishContract({
|
|
4298
|
-
assistantText: finishContractAssistantText,
|
|
4299
4389
|
sessionEntries: finishContractEntries,
|
|
4300
4390
|
assistantTurnId: finishContractAssistantTurnId,
|
|
4301
4391
|
});
|
|
@@ -4316,7 +4406,7 @@ export function createDispatchBundle(
|
|
|
4316
4406
|
return { assessment, rigor };
|
|
4317
4407
|
};
|
|
4318
4408
|
|
|
4319
|
-
|
|
4409
|
+
(async (): Promise<RunReceipt> => {
|
|
4320
4410
|
try {
|
|
4321
4411
|
const result = await acp.promise;
|
|
4322
4412
|
// The receipt reads meters the domain pump fills. Finalization
|
|
@@ -4445,17 +4535,16 @@ export function createDispatchBundle(
|
|
|
4445
4535
|
outcome: "failed" satisfies RunOutcome,
|
|
4446
4536
|
outcomeDetail: detail,
|
|
4447
4537
|
reason: "failed",
|
|
4448
|
-
lineage,
|
|
4538
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4449
4539
|
exitCode: 1,
|
|
4450
4540
|
});
|
|
4451
4541
|
throw error;
|
|
4452
4542
|
} finally {
|
|
4453
4543
|
leaseSlot.release();
|
|
4454
4544
|
}
|
|
4455
|
-
})();
|
|
4456
|
-
|
|
4457
|
-
activeRun.finalPromise = finalPromise;
|
|
4545
|
+
})().then(resolveFinal, rejectFinal);
|
|
4458
4546
|
active.set(envelope.id, activeRun);
|
|
4547
|
+
watchAssignmentDeadline(activeRun, callerDeadlineAt);
|
|
4459
4548
|
|
|
4460
4549
|
return {
|
|
4461
4550
|
runId: envelope.id,
|
|
@@ -4475,6 +4564,7 @@ export function createDispatchBundle(
|
|
|
4475
4564
|
finalPromise: Promise<RunReceipt>;
|
|
4476
4565
|
effectiveRequest: DispatchRequest;
|
|
4477
4566
|
}> {
|
|
4567
|
+
const hostRun = preparation?.hostRun;
|
|
4478
4568
|
const requestedAt = new Date(now()).toISOString();
|
|
4479
4569
|
const timing: RunPhaseMarks = { requestedAt, decisionStartedAt: requestedAt };
|
|
4480
4570
|
const settings = getEffectiveSettings();
|
|
@@ -4520,11 +4610,13 @@ export function createDispatchBundle(
|
|
|
4520
4610
|
const phases = envelope ? deriveEnvelopePhaseDurations(envelope) : undefined;
|
|
4521
4611
|
if (envelope === null || envelope === undefined) return;
|
|
4522
4612
|
const outcome = receipt.outcome ?? (receipt.exitCode === 0 ? "succeeded" : "failed");
|
|
4613
|
+
const assignmentId = assignmentRootFor(receipt.runId);
|
|
4523
4614
|
const quality = reduceRouteQuality({
|
|
4524
|
-
subject: { receipt, envelope },
|
|
4615
|
+
subject: { receipt, envelope, assignmentId },
|
|
4525
4616
|
receipts: [{ receipt, envelope }],
|
|
4526
4617
|
});
|
|
4527
4618
|
routeObserver.recordOutcome(observation.id, {
|
|
4619
|
+
assignmentId,
|
|
4528
4620
|
route: observation.decision.executedRoute,
|
|
4529
4621
|
outcome,
|
|
4530
4622
|
qualityLabel: quality.label,
|
|
@@ -4542,11 +4634,6 @@ export function createDispatchBundle(
|
|
|
4542
4634
|
return handle;
|
|
4543
4635
|
};
|
|
4544
4636
|
if (req.delegationAgentId) {
|
|
4545
|
-
if (req.budget !== undefined) {
|
|
4546
|
-
throw new Error(
|
|
4547
|
-
"dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
|
|
4548
|
-
);
|
|
4549
|
-
}
|
|
4550
4637
|
assertPlannedNodeIdentity(req, { id: "local", kind: "local" });
|
|
4551
4638
|
assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
|
|
4552
4639
|
if (req.responseSchema !== undefined) {
|
|
@@ -4562,9 +4649,17 @@ export function createDispatchBundle(
|
|
|
4562
4649
|
"dispatch: writeRoots cannot be enforced on an ACP delegation target; the external agent runs its own tool surface. Dispatch to a native or claude-sdk worker.",
|
|
4563
4650
|
);
|
|
4564
4651
|
}
|
|
4565
|
-
rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
|
|
4652
|
+
await rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
|
|
4566
4653
|
routeObservation = observeShadowRoute(req, undefined, settings);
|
|
4567
|
-
const delegated = await dispatchAcpDelegation(
|
|
4654
|
+
const delegated = await dispatchAcpDelegation(
|
|
4655
|
+
req,
|
|
4656
|
+
settings,
|
|
4657
|
+
timing,
|
|
4658
|
+
routeObservation.decision,
|
|
4659
|
+
observer,
|
|
4660
|
+
preparation?.deadlineAt,
|
|
4661
|
+
hostRun,
|
|
4662
|
+
);
|
|
4568
4663
|
// An ACP member never runs host verification, so it can only ever leave
|
|
4569
4664
|
// the barrier. It still edits the checkout, so the barrier has to wait
|
|
4570
4665
|
// for it; dispatch() releases it when its finalPromise settles.
|
|
@@ -4603,7 +4698,7 @@ export function createDispatchBundle(
|
|
|
4603
4698
|
};
|
|
4604
4699
|
const endpoint = endpointCapacityForTarget(lifecycle.target.target.id);
|
|
4605
4700
|
assertRouteWithinApprovedEnvelope(req, effectiveRoute);
|
|
4606
|
-
rebindReservationSlot(
|
|
4701
|
+
await rebindReservationSlot(
|
|
4607
4702
|
req,
|
|
4608
4703
|
effectiveRoute.node,
|
|
4609
4704
|
endpoint,
|
|
@@ -4819,7 +4914,11 @@ export function createDispatchBundle(
|
|
|
4819
4914
|
lifecycle.runtimeKind === "http" ||
|
|
4820
4915
|
(lifecycle.runtimeKind === "sdk" && lifecycle.target.runtime.id === "claude-sdk");
|
|
4821
4916
|
let workerPolicyPermissionCounter = 0;
|
|
4822
|
-
|
|
4917
|
+
// The bound the receipt can seal follows the contract this run will be
|
|
4918
|
+
// validated against; a conforming result never arrives clipped.
|
|
4919
|
+
const outputCapture = createWorkerOutputCapture({
|
|
4920
|
+
maxBytes: workerOutputCaptureBytes(dispatchResultContract(req, lifecycle.recipe)),
|
|
4921
|
+
});
|
|
4823
4922
|
const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
|
|
4824
4923
|
if (timing[field] !== undefined) return;
|
|
4825
4924
|
timing[field] = new Date(now()).toISOString();
|
|
@@ -5098,7 +5197,7 @@ export function createDispatchBundle(
|
|
|
5098
5197
|
ledgerRef.update(envelope.id, {
|
|
5099
5198
|
status: "running",
|
|
5100
5199
|
pid,
|
|
5101
|
-
lineage,
|
|
5200
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5102
5201
|
identity,
|
|
5103
5202
|
node: placement?.node ?? LOCAL_RUN_NODE,
|
|
5104
5203
|
...(placement?.reroutes !== undefined && placement.reroutes.length > 0
|
|
@@ -5110,6 +5209,7 @@ export function createDispatchBundle(
|
|
|
5110
5209
|
...(req.council !== undefined ? { council: req.council } : {}),
|
|
5111
5210
|
...(req.plan !== undefined ? { plan: req.plan } : {}),
|
|
5112
5211
|
...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
|
|
5212
|
+
...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
|
|
5113
5213
|
...(heartbeatAt ? { heartbeatAt: heartbeatIso(heartbeatAt) } : {}),
|
|
5114
5214
|
});
|
|
5115
5215
|
observer?.onAdmitted({
|
|
@@ -5213,6 +5313,13 @@ export function createDispatchBundle(
|
|
|
5213
5313
|
|
|
5214
5314
|
const startedAt = envelope.startedAt;
|
|
5215
5315
|
|
|
5316
|
+
let resolveFinal!: (receipt: RunReceipt) => void;
|
|
5317
|
+
let rejectFinal!: (error: unknown) => void;
|
|
5318
|
+
const finalPromise = new Promise<RunReceipt>((res, rej) => {
|
|
5319
|
+
resolveFinal = res;
|
|
5320
|
+
rejectFinal = rej;
|
|
5321
|
+
});
|
|
5322
|
+
|
|
5216
5323
|
const activeRun: ActiveRun = {
|
|
5217
5324
|
runId: envelope.id,
|
|
5218
5325
|
req,
|
|
@@ -5243,12 +5350,13 @@ export function createDispatchBundle(
|
|
|
5243
5350
|
stallKilled: false,
|
|
5244
5351
|
stallTimeoutMs: null,
|
|
5245
5352
|
lineage,
|
|
5353
|
+
...(hostRun === undefined ? {} : { hostRun }),
|
|
5246
5354
|
heartbeatAt,
|
|
5247
5355
|
heartbeatStatus: "alive",
|
|
5248
5356
|
meter: tokenMeter,
|
|
5249
5357
|
pricing: lifecycle.target.effectivePricing.rates,
|
|
5250
5358
|
costProvenance: lifecycle.target.effectivePricing.provenance,
|
|
5251
|
-
finalPromise
|
|
5359
|
+
finalPromise,
|
|
5252
5360
|
};
|
|
5253
5361
|
|
|
5254
5362
|
const buildReceiptDraft = (
|
|
@@ -5326,7 +5434,7 @@ export function createDispatchBundle(
|
|
|
5326
5434
|
runtimeKind: lifecycle.runtimeKind,
|
|
5327
5435
|
outcome,
|
|
5328
5436
|
outcomeCode,
|
|
5329
|
-
lineage,
|
|
5437
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5330
5438
|
...(req.intent !== undefined ? { intent: structuredClone(req.intent) } : {}),
|
|
5331
5439
|
pathScope: structuredClone(lifecycle.pathScope.provenance),
|
|
5332
5440
|
identity,
|
|
@@ -5343,6 +5451,7 @@ export function createDispatchBundle(
|
|
|
5343
5451
|
...(req.plan !== undefined ? { plan: req.plan } : {}),
|
|
5344
5452
|
...(fleetGate !== null ? { fleetGate } : {}),
|
|
5345
5453
|
...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
|
|
5454
|
+
...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
|
|
5346
5455
|
projectContext: lifecycle.projectContext,
|
|
5347
5456
|
rulesApplied: lifecycle.rulesApplied,
|
|
5348
5457
|
operatorProfileApplied: lifecycle.operatorProfileApplied,
|
|
@@ -5456,7 +5565,7 @@ export function createDispatchBundle(
|
|
|
5456
5565
|
outcome,
|
|
5457
5566
|
outcomeCode: receipt.outcomeCode ?? null,
|
|
5458
5567
|
outcomeDetail: receipt.outcomeDetail ?? null,
|
|
5459
|
-
lineage,
|
|
5568
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5460
5569
|
tokenCount: receipt.tokenCount,
|
|
5461
5570
|
inputTokenCount: receipt.inputTokenCount ?? 0,
|
|
5462
5571
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
@@ -5486,7 +5595,6 @@ export function createDispatchBundle(
|
|
|
5486
5595
|
const assessDispatchFinishContract = (): DispatchFinishContractSnapshot | null => {
|
|
5487
5596
|
if (finishContractAssistantText.trim().length === 0) return null;
|
|
5488
5597
|
const assessment = assessFinishContract({
|
|
5489
|
-
assistantText: finishContractAssistantText,
|
|
5490
5598
|
sessionEntries: finishContractEntries,
|
|
5491
5599
|
assistantTurnId: finishContractAssistantTurnId,
|
|
5492
5600
|
});
|
|
@@ -5515,7 +5623,7 @@ export function createDispatchBundle(
|
|
|
5515
5623
|
// finalPromise settles.
|
|
5516
5624
|
settlement?.live(envelope.id);
|
|
5517
5625
|
|
|
5518
|
-
|
|
5626
|
+
(async (): Promise<RunReceipt> => {
|
|
5519
5627
|
try {
|
|
5520
5628
|
const result = await workerDone;
|
|
5521
5629
|
// The receipt reads meters the domain pump fills. Finalization
|
|
@@ -5577,13 +5685,12 @@ export function createDispatchBundle(
|
|
|
5577
5685
|
const steering = snapshotSteeringProvenance();
|
|
5578
5686
|
const capturedOutput = outputCapture.snapshot();
|
|
5579
5687
|
const observedRunEffects = runEffects.snapshot();
|
|
5580
|
-
const appliedResultContract =
|
|
5581
|
-
? (req.resultContractOverride ?? lifecycle.recipe?.resultContract ?? null)
|
|
5582
|
-
: null;
|
|
5688
|
+
const appliedResultContract = dispatchResultContract(req, lifecycle.recipe) ?? null;
|
|
5583
5689
|
const resultContract = validateRecipeResult({
|
|
5584
5690
|
contract: appliedResultContract,
|
|
5585
5691
|
reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
|
|
5586
5692
|
output: capturedOutput?.state === "final" ? capturedOutput.text : null,
|
|
5693
|
+
outputTruncated: capturedOutput?.truncated === true,
|
|
5587
5694
|
cwd: lifecycle.cwd,
|
|
5588
5695
|
networkAllowed:
|
|
5589
5696
|
lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
|
|
@@ -5633,8 +5740,7 @@ export function createDispatchBundle(
|
|
|
5633
5740
|
finalDetail = [finalDetail, describeUngroundedValidations(validationGrounding)].filter(Boolean).join("; ");
|
|
5634
5741
|
}
|
|
5635
5742
|
const hasTerminalArtifact =
|
|
5636
|
-
|
|
5637
|
-
resultValidation?.conformance === "pass";
|
|
5743
|
+
appliedResultContract?.kind === "architect-plan" && resultValidation?.conformance === "pass";
|
|
5638
5744
|
if (finalOutcome === "succeeded" && !hasDurableFinalOutput(capturedOutput) && !hasTerminalArtifact) {
|
|
5639
5745
|
finalOutcome = "failed";
|
|
5640
5746
|
outcomeCode = "worker_final_output_missing";
|
|
@@ -5824,7 +5930,7 @@ export function createDispatchBundle(
|
|
|
5824
5930
|
outcome: "failed" satisfies RunOutcome,
|
|
5825
5931
|
outcomeDetail: detail,
|
|
5826
5932
|
reason: "failed",
|
|
5827
|
-
lineage,
|
|
5933
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5828
5934
|
exitCode: 1,
|
|
5829
5935
|
});
|
|
5830
5936
|
throw error;
|
|
@@ -5832,10 +5938,10 @@ export function createDispatchBundle(
|
|
|
5832
5938
|
unsubscribeAgentLedger?.();
|
|
5833
5939
|
leaseSlot.release();
|
|
5834
5940
|
}
|
|
5835
|
-
})();
|
|
5941
|
+
})().then(resolveFinal, rejectFinal);
|
|
5836
5942
|
|
|
5837
|
-
activeRun.finalPromise = finalPromise;
|
|
5838
5943
|
active.set(envelope.id, activeRun);
|
|
5944
|
+
watchAssignmentDeadline(activeRun, preparation?.deadlineAt);
|
|
5839
5945
|
|
|
5840
5946
|
return attachRouteObservation({
|
|
5841
5947
|
runId: envelope.id,
|
|
@@ -5962,11 +6068,6 @@ export function createDispatchBundle(
|
|
|
5962
6068
|
req = validation.restore(validated.spec);
|
|
5963
6069
|
|
|
5964
6070
|
if (req.delegationAgentId) {
|
|
5965
|
-
if (req.budget !== undefined) {
|
|
5966
|
-
throw new Error(
|
|
5967
|
-
"dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
|
|
5968
|
-
);
|
|
5969
|
-
}
|
|
5970
6071
|
const protectedArtifactState = getProtectedArtifactState();
|
|
5971
6072
|
assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
|
|
5972
6073
|
if (req.responseSchema !== undefined) {
|
|
@@ -6382,6 +6483,7 @@ export function createDispatchBundle(
|
|
|
6382
6483
|
exitCode: 0,
|
|
6383
6484
|
gate,
|
|
6384
6485
|
council,
|
|
6486
|
+
...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
|
|
6385
6487
|
...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
|
|
6386
6488
|
});
|
|
6387
6489
|
const receipt = l.recordReceipt(runId, {
|
|
@@ -6423,6 +6525,7 @@ export function createDispatchBundle(
|
|
|
6423
6525
|
sessionId: input.template.sessionId,
|
|
6424
6526
|
gate,
|
|
6425
6527
|
council,
|
|
6528
|
+
...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
|
|
6426
6529
|
...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
|
|
6427
6530
|
});
|
|
6428
6531
|
await l.persist();
|
|
@@ -6628,7 +6731,7 @@ export function createDispatchBundle(
|
|
|
6628
6731
|
runtimeKind: run.runtimeKind,
|
|
6629
6732
|
outcomePhase: run.stallKilled ? "terminating" : run.aborted ? "aborting" : "running",
|
|
6630
6733
|
heartbeat,
|
|
6631
|
-
lineage:
|
|
6734
|
+
lineage: publishedLineage(run.lineage, run.hostRun),
|
|
6632
6735
|
startedAt: run.startedAt,
|
|
6633
6736
|
elapsedMs,
|
|
6634
6737
|
timing,
|
|
@@ -6716,7 +6819,12 @@ export function createDispatchBundle(
|
|
|
6716
6819
|
if (assignments.get(id) !== null) return id;
|
|
6717
6820
|
const live = active.get(id);
|
|
6718
6821
|
if (live) return live.lineage.rootRunId;
|
|
6719
|
-
|
|
6822
|
+
const local = assignmentRootsByAttempt.get(id);
|
|
6823
|
+
if (local !== undefined) return local;
|
|
6824
|
+
// After restart the immutable attempt history identifies the logical
|
|
6825
|
+
// assignment; a receipt's root may instead name its main host run.
|
|
6826
|
+
const stored = listStoredAssignments().find((record) => record.assignmentId === id || record.attempts.includes(id));
|
|
6827
|
+
return stored?.assignmentId ?? ledger?.get(id)?.lineage?.rootRunId ?? id;
|
|
6720
6828
|
}
|
|
6721
6829
|
|
|
6722
6830
|
function currentAssignmentRun(id: string): ActiveRun | null {
|
|
@@ -6771,8 +6879,8 @@ export function createDispatchBundle(
|
|
|
6771
6879
|
};
|
|
6772
6880
|
},
|
|
6773
6881
|
assignments: {
|
|
6774
|
-
get: (id) => assignments.get(id),
|
|
6775
|
-
getStored: (id) => getStoredAssignment(id),
|
|
6882
|
+
get: (id) => assignments.get(assignmentRootFor(id)),
|
|
6883
|
+
getStored: (id) => getStoredAssignment(assignmentRootFor(id)),
|
|
6776
6884
|
flushWrites: async () => {
|
|
6777
6885
|
await Promise.allSettled([...assignmentWrites]);
|
|
6778
6886
|
},
|