@iowarp/clio-coder 0.4.4 → 0.4.6
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 +116 -2
- package/CONTRIBUTING.md +39 -24
- package/NOTICE +16 -0
- package/README.md +343 -403
- package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
- package/dist/builtins-PD652MTK.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
- package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
- 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-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
- package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
- package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
- package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
- package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
- package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
- package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
- package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
- package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
- package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
- package/dist/{chunk-W54I7H25.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-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
- package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
- package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-QZWQA4DE.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-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
- 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-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/chunk-EM2WNQS2.js +93 -0
- package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- 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-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
- package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
- package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
- package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- 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-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
- package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- 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-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.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-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
- package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
- package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
- package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
- package/dist/chunk-R2CT5YDO.js +66 -0
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
- package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
- 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-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
- 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 +44 -44
- package/dist/clio-QQCMTUZE.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.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-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
- package/dist/configure-4ZM5HWJX.js +73 -0
- package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
- package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
- package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
- package/dist/context-clear-OQV76MYP.js +184 -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-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
- package/dist/detail-UXPWRANG.js +115 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
- package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-35PYWGSO.js +225 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
- package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
- package/dist/fleet-view-IWHYGQKK.js +118 -0
- package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
- package/dist/inventory-74UL7UHU.js +118 -0
- package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
- package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
- package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-EJAWJEIO.js +116 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
- package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
- package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
- package/dist/slash-commands-MDSDSWYF.js +92 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
- package/dist/tasks-R6P6OV22.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.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-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
- package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
- package/dist/verify-HYF7KBVE.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-RK7JQ5NP.js +615 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +108 -95
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/context-engine.md +45 -60
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +45 -30
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +75 -61
- package/docs/guide/configuration-and-targets.md +126 -26
- package/docs/guide/configuration-reference.md +22 -7
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +13 -6
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +79 -20
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +9 -2
- package/docs/process/development-pipeline.md +11 -11
- package/docs/process/documentation-coverage.md +1 -1
- 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/release-cut-checklist.md +24 -12
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- 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/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/ask.ts +10 -10
- 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-editor.ts +51 -0
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure-oauth.ts +1 -1
- package/src/cli/configure-onboarding.ts +232 -96
- package/src/cli/configure-prompts.ts +76 -0
- package/src/cli/configure-quick.ts +274 -0
- package/src/cli/configure-target.ts +14 -2
- package/src/cli/configure.ts +413 -174
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/oauth-manual-input.ts +1 -1
- package/src/cli/reset.ts +2 -0
- package/src/cli/run.ts +16 -14
- package/src/cli/select.ts +35 -4
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +11 -8
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/config.ts +39 -15
- package/src/core/defaults.ts +38 -15
- package/src/{interactive → core}/external-editor.ts +4 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/config/classify.ts +1 -1
- package/src/domains/config/keybindings.ts +3 -31
- 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 +72 -10
- 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 +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -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 +42 -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 +6 -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/contract.ts +10 -2
- 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 +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- 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/types.ts +4 -3
- 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 +5 -1
- 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 +4 -2
- 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/rules.ts +5 -1
- 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/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/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- 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 +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -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/probe/fingerprint.ts +13 -6
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -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 +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- 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 +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- 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/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- 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 +53 -15
- package/src/interactive/application-controller.ts +1 -31
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-panel.ts +163 -637
- package/src/interactive/chat-renderer.ts +73 -30
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +18 -5
- package/src/interactive/editor-submit.ts +21 -31
- package/src/interactive/footer/dashboard.ts +8 -3
- package/src/interactive/footer/widgets.ts +50 -91
- package/src/interactive/interactive-application.ts +24 -44
- package/src/interactive/interactive-event-projection.ts +9 -45
- package/src/interactive/interactive-input-runtime.ts +3 -28
- package/src/interactive/interactive-presentation.ts +45 -16
- package/src/interactive/interactive-slash-runtime.ts +5 -40
- package/src/interactive/layout.ts +31 -5
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +5 -1
- package/src/interactive/overlay-lifecycle.ts +1 -0
- package/src/interactive/overlay-session-lifecycle.ts +7 -1
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/settings.ts +9 -8
- package/src/interactive/renderers/preview.ts +16 -0
- package/src/interactive/renderers/tool-execution.ts +84 -161
- package/src/interactive/renderers/worker-entry.ts +74 -43
- package/src/interactive/slash-autocomplete.ts +1 -6
- package/src/interactive/slash-commands.ts +16 -46
- package/src/interactive/status/controller.ts +0 -5
- package/src/interactive/status/state-machine.ts +44 -26
- package/src/interactive/status/types.ts +3 -0
- package/src/interactive/status/verbs.ts +13 -12
- package/src/interactive/transcript-detail.ts +50 -112
- 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 +4 -0
- package/src/interactive/view/view-overlay.ts +44 -34
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -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 +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- 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/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- 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/presentation.ts +1 -1
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +10 -5
- 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-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
|
@@ -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
|
}
|
|
@@ -1107,6 +1114,12 @@ export interface WorkerDynamicContext {
|
|
|
1107
1114
|
autonomy?: AutonomyLevel | null;
|
|
1108
1115
|
/** Effective approval routing; defaults to deny for legacy direct callers. */
|
|
1109
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;
|
|
1110
1123
|
/** Structured CLIO-CODER.md fields; null when CLIO-CODER.md is absent or malformed. */
|
|
1111
1124
|
project?: ProjectStructuredContext | null;
|
|
1112
1125
|
/** The run's own working directory and top-level layout; sent at every tier. */
|
|
@@ -1160,10 +1173,10 @@ function renderWorkerProjectContext(
|
|
|
1160
1173
|
|
|
1161
1174
|
/** True when the rendered project message body includes the verification block. */
|
|
1162
1175
|
function workerProjectContextIncludesVerification(body: string): boolean {
|
|
1163
|
-
return body.includes("\nVerification expectations:\n");
|
|
1176
|
+
return body.startsWith("# Project Context\n") && body.includes("\nVerification expectations:\n");
|
|
1164
1177
|
}
|
|
1165
1178
|
|
|
1166
|
-
function buildDynamicPromptMessages(
|
|
1179
|
+
export function buildDynamicPromptMessages(
|
|
1167
1180
|
req: DispatchRequest,
|
|
1168
1181
|
dynamicContext: WorkerDynamicContext = {},
|
|
1169
1182
|
): WorkerPromptMessage[] {
|
|
@@ -1172,10 +1185,22 @@ function buildDynamicPromptMessages(
|
|
|
1172
1185
|
const body = renderWorkerWorkspaceContext(dynamicContext.workspace);
|
|
1173
1186
|
messages.push({ id: "dispatch-workspace", body, contentHash: sha256(body) });
|
|
1174
1187
|
}
|
|
1175
|
-
if (dynamicContext.
|
|
1176
|
-
const
|
|
1177
|
-
|
|
1178
|
-
|
|
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
|
+
: "";
|
|
1179
1204
|
if (body.length > 0) {
|
|
1180
1205
|
messages.push({ id: "dispatch-project-context", body, contentHash: sha256(body) });
|
|
1181
1206
|
}
|
|
@@ -1454,7 +1479,7 @@ function runtimeLimitations(runtimeKind: RunKind, runtimeId: string): string[] {
|
|
|
1454
1479
|
if (runtimeKind === "subprocess" && runtimeId === "antigravity-code") {
|
|
1455
1480
|
return [
|
|
1456
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",
|
|
1457
|
-
"Antigravity
|
|
1482
|
+
"Antigravity resumes a conversation only when the caller supplies its id explicitly",
|
|
1458
1483
|
"Antigravity runs are one-shot and never retried automatically",
|
|
1459
1484
|
];
|
|
1460
1485
|
}
|
|
@@ -1626,22 +1651,6 @@ function workerToolCallHardCap(settings: EffectiveSettings): number {
|
|
|
1626
1651
|
return settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap;
|
|
1627
1652
|
}
|
|
1628
1653
|
|
|
1629
|
-
/**
|
|
1630
|
-
* Only a runtime that declares its external agent loop may accept a declared
|
|
1631
|
-
* per-tool budget: Clio records that budget as unobserved rather than enforced.
|
|
1632
|
-
* Any other subprocess runtime cannot mediate tool calls, so a declared budget
|
|
1633
|
-
* would be a claim nobody enforces.
|
|
1634
|
-
*/
|
|
1635
|
-
export function assertWorkerBudgetEnforceable(
|
|
1636
|
-
runtime: Pick<RuntimeDescriptor, "id" | "kind" | "externalAgentLoop">,
|
|
1637
|
-
hasDeclaredBudget: boolean,
|
|
1638
|
-
): void {
|
|
1639
|
-
if (!hasDeclaredBudget || runtime.kind !== "subprocess" || runtime.externalAgentLoop !== undefined) return;
|
|
1640
|
-
throw new Error(
|
|
1641
|
-
`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`,
|
|
1642
|
-
);
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
1654
|
/** Per-tool budget enforcement is real only where Clio observes each tool call. */
|
|
1646
1655
|
export function budgetEnforcementForRuntime(
|
|
1647
1656
|
runtime: Pick<RuntimeDescriptor, "kind">,
|
|
@@ -1657,7 +1666,6 @@ function resolveEffectiveWorkerBudget(input: {
|
|
|
1657
1666
|
settings: EffectiveSettings;
|
|
1658
1667
|
runtime: RuntimeDescriptor;
|
|
1659
1668
|
}): RunToolBudgetEnvelope {
|
|
1660
|
-
assertWorkerBudgetEnforceable(input.runtime, input.declared !== null || input.req.budget !== undefined);
|
|
1661
1669
|
const hardCap = workerToolCallHardCap(input.settings);
|
|
1662
1670
|
const declared = input.declared ?? {
|
|
1663
1671
|
toolCalls: hardCap,
|
|
@@ -1737,15 +1745,6 @@ function assertPlannedNodeIdentity(req: DispatchRequest, actual: RunNodeIdentity
|
|
|
1737
1745
|
);
|
|
1738
1746
|
}
|
|
1739
1747
|
|
|
1740
|
-
function assertApprovedCostCeiling(req: DispatchRequest, liveCeilingUsd: number): void {
|
|
1741
|
-
const approved = req.plan?.costCeilingUsd;
|
|
1742
|
-
if (approved === undefined) return;
|
|
1743
|
-
if (Object.is(approved, liveCeilingUsd)) return;
|
|
1744
|
-
throw new Error(
|
|
1745
|
-
`dispatch: scheduling cost ceiling drifted after plan approval (approved $${approved.toFixed(4)}, current $${liveCeilingUsd.toFixed(4)}); re-plan before launch`,
|
|
1746
|
-
);
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
1748
|
/** Fail closed until another runtime has an explicitly tested JSON-schema wire contract. */
|
|
1750
1749
|
function assertResponseSchemaEnforceable(
|
|
1751
1750
|
runtime: RuntimeDescriptor,
|
|
@@ -1929,10 +1928,9 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
|
|
|
1929
1928
|
// Requiring a recipe contract here meant a caller-supplied override against a
|
|
1930
1929
|
// recipe with none was sealed but never sent, so the worker spent no repair
|
|
1931
1930
|
// round on a contract it was never told about and the run failed on a shape
|
|
1932
|
-
// nothing had asked it for.
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
: 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);
|
|
1936
1934
|
if (workerResultContract) spec.resultContract = workerResultContract;
|
|
1937
1935
|
const product = input.req.product ?? input.recipe?.product;
|
|
1938
1936
|
if (product) spec.product = product;
|
|
@@ -2586,10 +2584,17 @@ export function createDispatchBundle(
|
|
|
2586
2584
|
return configuredEndpointCapacities()[endpoint.key] ?? endpoint;
|
|
2587
2585
|
}
|
|
2588
2586
|
|
|
2589
|
-
|
|
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.
|
|
2590
2597
|
const preflight = scheduling.preflight();
|
|
2591
|
-
// Reservation planning compares against a fresh read, never the display cache.
|
|
2592
|
-
const usage = capacityLeaseUsage();
|
|
2593
2598
|
const nodes: Record<string, { active: number; limit: number }> = {
|
|
2594
2599
|
local: { active: usage.nodes.local ?? 0, limit: configuredGlobalCapacity(settings) },
|
|
2595
2600
|
};
|
|
@@ -2624,7 +2629,7 @@ export function createDispatchBundle(
|
|
|
2624
2629
|
...(task.resolution.endpoint !== undefined ? { endpointKey: task.resolution.endpoint.key } : {}),
|
|
2625
2630
|
costUpperBoundUsd: task.resolution.routeApproval?.totalCostUpperBoundUsd ?? task.resolution.costUpperBoundUsd,
|
|
2626
2631
|
})),
|
|
2627
|
-
capacity:
|
|
2632
|
+
capacity: reservationCapacitySnapshotSync(getEffectiveSettings()),
|
|
2628
2633
|
nowMs: now(),
|
|
2629
2634
|
});
|
|
2630
2635
|
ownedReservations.add(record.ownerId);
|
|
@@ -2655,20 +2660,10 @@ export function createDispatchBundle(
|
|
|
2655
2660
|
}
|
|
2656
2661
|
|
|
2657
2662
|
function assertBudgetAdmitsRoute(req: DispatchRequest, pricing: EffectivePricing, settings: EffectiveSettings): void {
|
|
2658
|
-
const preflight = scheduling.preflight();
|
|
2659
|
-
assertApprovedCostCeiling(req, preflight.ceilingUsd);
|
|
2660
|
-
if (preflight.verdict === "over" || preflight.verdict === "at") {
|
|
2661
|
-
denyDispatchForBudget(preflight, req.agentId);
|
|
2662
|
-
}
|
|
2663
2663
|
const estimateUsd = conservativeRouteAdmissionEstimateUsd(pricing, admissionMaxOutputTokens(settings));
|
|
2664
2664
|
const intentCeiling = req.routingIntent?.maxCostUsd;
|
|
2665
2665
|
if (intentCeiling !== null && intentCeiling !== undefined && estimateUsd > intentCeiling)
|
|
2666
2666
|
denyDispatchForBudget({ currentUsd: estimateUsd, ceilingUsd: intentCeiling }, req.agentId, estimateUsd);
|
|
2667
|
-
const heldUsd = reservedBudgetUsd();
|
|
2668
|
-
const projectedUsd = preflight.currentUsd + heldUsd + (req.reservation === undefined ? estimateUsd : 0);
|
|
2669
|
-
if (scheduling.checkCeiling(projectedUsd) !== "under") {
|
|
2670
|
-
denyDispatchForBudget({ currentUsd: projectedUsd, ceilingUsd: preflight.ceilingUsd }, req.agentId, estimateUsd);
|
|
2671
|
-
}
|
|
2672
2667
|
}
|
|
2673
2668
|
|
|
2674
2669
|
function configuredGlobalCapacity(settings: EffectiveSettings): number {
|
|
@@ -2716,7 +2711,12 @@ export function createDispatchBundle(
|
|
|
2716
2711
|
const assignmentId =
|
|
2717
2712
|
req.lineage?.rootRunId ?? req.runIdHint ?? `pending-${queuedAt.toString(36)}-${randomBytes(6).toString("hex")}`;
|
|
2718
2713
|
const requestedAt = Date.parse(timing.requestedAt ?? timing.queuedAt);
|
|
2719
|
-
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;
|
|
2720
2720
|
if (req.lineage === undefined) await registerAssignment(assignmentId);
|
|
2721
2721
|
// A plan's queued members keep their wave order and their reserved peak.
|
|
2722
2722
|
const plan =
|
|
@@ -2735,7 +2735,7 @@ export function createDispatchBundle(
|
|
|
2735
2735
|
assignmentId,
|
|
2736
2736
|
nodeId,
|
|
2737
2737
|
...(endpoint !== null && endpoint !== undefined ? { endpointKey: endpoint.key } : {}),
|
|
2738
|
-
deadlineAt,
|
|
2738
|
+
...(deadlineAt === undefined ? {} : { deadlineAt }),
|
|
2739
2739
|
...plan,
|
|
2740
2740
|
// A fleet's first attempt carries lineage and still owns the held
|
|
2741
2741
|
// reservation member that admission must transfer into its lease.
|
|
@@ -2767,7 +2767,8 @@ export function createDispatchBundle(
|
|
|
2767
2767
|
settings: EffectiveSettings,
|
|
2768
2768
|
): Promise<void> {
|
|
2769
2769
|
if (req.reservation === undefined || req.lineage === undefined) return;
|
|
2770
|
-
|
|
2770
|
+
// Retries can await fresh capacity; the advisory display cache is never admission data.
|
|
2771
|
+
const capacity = reservationCapacitySnapshot(settings, await capacityLeaseUsageAsync());
|
|
2771
2772
|
const rebind = {
|
|
2772
2773
|
...req.reservation,
|
|
2773
2774
|
nodeId,
|
|
@@ -2795,6 +2796,7 @@ export function createDispatchBundle(
|
|
|
2795
2796
|
const retryQueue = new Map<string, RetryQueueEntry>();
|
|
2796
2797
|
const retryBackoff = new Map<string, BackoffState>();
|
|
2797
2798
|
const retryReasons = new Map<string, string>();
|
|
2799
|
+
const assignmentRootsByAttempt = new Map<string, string>();
|
|
2798
2800
|
const assignments = new AssignmentRegistry({
|
|
2799
2801
|
onStreamError: (error) => reportDispatchDiagnostic("assignment event stream", error),
|
|
2800
2802
|
});
|
|
@@ -2824,8 +2826,19 @@ export function createDispatchBundle(
|
|
|
2824
2826
|
}
|
|
2825
2827
|
|
|
2826
2828
|
function lineageFor(req: DispatchRequest, runId: string): RunLineage {
|
|
2827
|
-
|
|
2828
|
-
|
|
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
|
+
};
|
|
2829
2842
|
}
|
|
2830
2843
|
|
|
2831
2844
|
function accumulateFinalizedTotals(receipt: RunReceipt): void {
|
|
@@ -3144,7 +3157,7 @@ export function createDispatchBundle(
|
|
|
3144
3157
|
if (decision.excludedRouteParts.includes("model")) delete retryReq.model;
|
|
3145
3158
|
if (decision.excludedRouteParts.includes("runtime")) delete retryReq.workerRuntime;
|
|
3146
3159
|
}
|
|
3147
|
-
const handle = await dispatch(retryReq);
|
|
3160
|
+
const handle = await dispatch(retryReq, undefined, run.hostRun === undefined ? undefined : { hostRun: run.hostRun });
|
|
3148
3161
|
// The assignment folds every attempt into one stream with a reset marker.
|
|
3149
3162
|
const marker: AssignmentAttemptStartEvent = {
|
|
3150
3163
|
type: "attempt_start",
|
|
@@ -3330,6 +3343,27 @@ export function createDispatchBundle(
|
|
|
3330
3343
|
}
|
|
3331
3344
|
}
|
|
3332
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
|
+
|
|
3333
3367
|
function startHeartbeatWatchdog(): void {
|
|
3334
3368
|
if (heartbeatTimer || heartbeatIntervalMs <= 0) return;
|
|
3335
3369
|
heartbeatTimer = setInterval(checkActiveHeartbeats, heartbeatIntervalMs);
|
|
@@ -3491,6 +3525,9 @@ export function createDispatchBundle(
|
|
|
3491
3525
|
if (!recipe) {
|
|
3492
3526
|
throw new Error(`dispatch: unknown agent recipe: ${req.agentId}`);
|
|
3493
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);
|
|
3494
3531
|
const spec = normalizeAgentSpec(recipe);
|
|
3495
3532
|
if (req.requestOrigin === "user" && !isUserVisibleAgent(spec)) {
|
|
3496
3533
|
throw new Error(
|
|
@@ -3593,17 +3630,24 @@ export function createDispatchBundle(
|
|
|
3593
3630
|
settings,
|
|
3594
3631
|
runtime: target.runtime,
|
|
3595
3632
|
});
|
|
3596
|
-
// Fetch
|
|
3633
|
+
// Fetch captured project context only for tiers that receive it, so
|
|
3597
3634
|
// read-only scouts never pay the CLIO-CODER.md read. The tier is spec policy
|
|
3598
3635
|
// (capability-class default, recipe frontmatter override).
|
|
3599
3636
|
const tier = spec.projectContextTier;
|
|
3600
|
-
const
|
|
3637
|
+
const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
|
|
3601
3638
|
const dynamicPromptMessages = buildDynamicPromptMessages(req, {
|
|
3602
3639
|
capabilityClass: spec.capabilityClass,
|
|
3603
3640
|
projectContextTier: tier,
|
|
3604
3641
|
autonomy: effectiveAutonomy,
|
|
3605
3642
|
onPermission: settings?.fleet.permissions.mode ?? "deny",
|
|
3606
|
-
|
|
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",
|
|
3607
3651
|
workspace: readWorkspaceRootFacts(cwd),
|
|
3608
3652
|
});
|
|
3609
3653
|
const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
|
|
@@ -3676,6 +3720,9 @@ export function createDispatchBundle(
|
|
|
3676
3720
|
`dispatch: shadow or internal agent '${req.agentId}' cannot run on external ACP agent '${agentId}'`,
|
|
3677
3721
|
);
|
|
3678
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);
|
|
3679
3726
|
}
|
|
3680
3727
|
if (!settings) throw new Error("dispatch: effective settings required for ACP delegation");
|
|
3681
3728
|
const configured = settings.integrations.externalAgents.entries.find((entry) => entry.id === agentId);
|
|
@@ -3703,14 +3750,17 @@ export function createDispatchBundle(
|
|
|
3703
3750
|
// ACP delegation defaults to no project context: repo conventions and
|
|
3704
3751
|
// invariants never leave the machine unless this agent's config opts in
|
|
3705
3752
|
// with projectContext: "bounded". No recipe means no capability class,
|
|
3706
|
-
// so
|
|
3753
|
+
// so no derived verification supplement is added. Authored test guidance
|
|
3754
|
+
// stays intact within the opted-in source budget. The safety posture
|
|
3707
3755
|
// line still rides along for every worker run.
|
|
3708
3756
|
const tier: AgentProjectContextTier = configured.projectContext ?? "none";
|
|
3709
|
-
const
|
|
3757
|
+
const projectPrompt = projectContext && tier === "bounded" ? projectContext.renderPromptContext(cwd) : null;
|
|
3710
3758
|
const dynamicPromptMessages = buildDynamicPromptMessages(req, {
|
|
3711
3759
|
projectContextTier: tier,
|
|
3712
3760
|
autonomy,
|
|
3713
|
-
|
|
3761
|
+
projectPrompt,
|
|
3762
|
+
projectReadTools: null,
|
|
3763
|
+
projectExternalReadTools: true,
|
|
3714
3764
|
workspace: readWorkspaceRootFacts(cwd),
|
|
3715
3765
|
});
|
|
3716
3766
|
const projectContextProvenance = projectContextProvenanceFor(tier, dynamicPromptMessages);
|
|
@@ -3753,12 +3803,25 @@ export function createDispatchBundle(
|
|
|
3753
3803
|
timing: RunPhaseMarks,
|
|
3754
3804
|
routeDecision: RouteDecisionV1,
|
|
3755
3805
|
observer?: DispatchAdmissionObserver,
|
|
3806
|
+
callerDeadlineAt?: number,
|
|
3807
|
+
hostRun?: DispatchPreparationOptions["hostRun"],
|
|
3756
3808
|
): Promise<{
|
|
3757
3809
|
runId: string;
|
|
3758
3810
|
events: AsyncIterableIterator<unknown>;
|
|
3759
3811
|
finalPromise: Promise<RunReceipt>;
|
|
3760
3812
|
}> {
|
|
3761
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
|
+
});
|
|
3762
3825
|
publishDispatchPathScope(req, lifecycle.pathScope);
|
|
3763
3826
|
timing.decisionCompletedAt = new Date(now()).toISOString();
|
|
3764
3827
|
const targetId = `delegation:${lifecycle.agentConfig.id}`;
|
|
@@ -3840,7 +3903,11 @@ export function createDispatchBundle(
|
|
|
3840
3903
|
let outcomeCode: RunOutcomeCode | null = null;
|
|
3841
3904
|
let reportedSpoofedOutcome = false;
|
|
3842
3905
|
let runIdForPermissionAudit: string | null = null;
|
|
3843
|
-
const outputCapture = createWorkerOutputCapture(
|
|
3906
|
+
const outputCapture = createWorkerOutputCapture({
|
|
3907
|
+
maxBytes: workerOutputCaptureBytes(
|
|
3908
|
+
dispatchResultContract(req, req.agentId && maybeAgents ? maybeAgents.getSpec(req.agentId) : null),
|
|
3909
|
+
),
|
|
3910
|
+
});
|
|
3844
3911
|
const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
|
|
3845
3912
|
if (timing[field] !== undefined) return;
|
|
3846
3913
|
timing[field] = new Date(now()).toISOString();
|
|
@@ -4008,10 +4075,11 @@ export function createDispatchBundle(
|
|
|
4008
4075
|
}
|
|
4009
4076
|
identity = detectRunIdentity();
|
|
4010
4077
|
ledgerRef.update(envelope.id, {
|
|
4078
|
+
budget: budgetEnvelope,
|
|
4011
4079
|
status: "running",
|
|
4012
4080
|
pid: acp.pid,
|
|
4013
4081
|
heartbeatAt: heartbeatIso(acp.heartbeatAt),
|
|
4014
|
-
lineage,
|
|
4082
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4015
4083
|
identity,
|
|
4016
4084
|
node: LOCAL_RUN_NODE,
|
|
4017
4085
|
...(lifecycle.pipeline ? { pipeline: lifecycle.pipeline } : {}),
|
|
@@ -4043,6 +4111,7 @@ export function createDispatchBundle(
|
|
|
4043
4111
|
});
|
|
4044
4112
|
}
|
|
4045
4113
|
context.bus.emit(BusChannels.DispatchStarted, {
|
|
4114
|
+
budget: budgetEnvelope,
|
|
4046
4115
|
runId: envelope.id,
|
|
4047
4116
|
agentId: req.agentId,
|
|
4048
4117
|
task: req.task,
|
|
@@ -4100,6 +4169,7 @@ export function createDispatchBundle(
|
|
|
4100
4169
|
rejectFinal = rej;
|
|
4101
4170
|
});
|
|
4102
4171
|
const activeRun: ActiveRun = {
|
|
4172
|
+
budget: budgetEnvelope,
|
|
4103
4173
|
runId: envelope.id,
|
|
4104
4174
|
req,
|
|
4105
4175
|
abort: acp.abort,
|
|
@@ -4125,6 +4195,7 @@ export function createDispatchBundle(
|
|
|
4125
4195
|
stallKilled: false,
|
|
4126
4196
|
stallTimeoutMs: lifecycle.agentConfig.stallTimeoutMs ?? DEFAULT_ACP_STALL_TIMEOUT_MS,
|
|
4127
4197
|
lineage,
|
|
4198
|
+
...(hostRun === undefined ? {} : { hostRun }),
|
|
4128
4199
|
heartbeatAt: acp.heartbeatAt,
|
|
4129
4200
|
heartbeatStatus: "alive",
|
|
4130
4201
|
meter: tokenMeter,
|
|
@@ -4145,8 +4216,7 @@ export function createDispatchBundle(
|
|
|
4145
4216
|
// the same messages, so adding both would double-count. Event-metered
|
|
4146
4217
|
// values survive only when the adapter reported nothing.
|
|
4147
4218
|
const usage = result.usage;
|
|
4148
|
-
const adapterReportedUsage =
|
|
4149
|
-
usage.inputTokens + usage.outputTokens + usage.cacheReadTokens + usage.cacheWriteTokens + usage.reasoningTokens > 0;
|
|
4219
|
+
const adapterReportedUsage = usage.tokensReported;
|
|
4150
4220
|
if (adapterReportedUsage) {
|
|
4151
4221
|
tokenMeter.inputTokens = usage.inputTokens;
|
|
4152
4222
|
tokenMeter.outputTokens = usage.outputTokens;
|
|
@@ -4154,8 +4224,9 @@ export function createDispatchBundle(
|
|
|
4154
4224
|
tokenMeter.cacheWriteTokens = usage.cacheWriteTokens;
|
|
4155
4225
|
tokenMeter.reasoningTokens = usage.reasoningTokens;
|
|
4156
4226
|
}
|
|
4157
|
-
const tokenCount =
|
|
4158
|
-
|
|
4227
|
+
const tokenCount = adapterReportedUsage
|
|
4228
|
+
? usage.totalTokens
|
|
4229
|
+
: tokenMeter.inputTokens + tokenMeter.outputTokens + tokenMeter.cacheReadTokens + tokenMeter.cacheWriteTokens;
|
|
4159
4230
|
const safetyMetadata = safety.policy?.metadata() ?? null;
|
|
4160
4231
|
const init = result.delegation.initialize;
|
|
4161
4232
|
const agentInfo = init?.agentInfo;
|
|
@@ -4178,7 +4249,7 @@ export function createDispatchBundle(
|
|
|
4178
4249
|
outcome,
|
|
4179
4250
|
outcomeCode,
|
|
4180
4251
|
outcomeDetail,
|
|
4181
|
-
lineage,
|
|
4252
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4182
4253
|
identity,
|
|
4183
4254
|
// An ACP peer is spawned by this process, so the run's node is this host.
|
|
4184
4255
|
node: LOCAL_RUN_NODE,
|
|
@@ -4189,6 +4260,7 @@ export function createDispatchBundle(
|
|
|
4189
4260
|
...(req.plan !== undefined ? { plan: req.plan } : {}),
|
|
4190
4261
|
...(lifecycle.personaOverride ? { personaOverride: lifecycle.personaOverride } : {}),
|
|
4191
4262
|
...(lifecycle.decisionRefs ? { decisionRefs: lifecycle.decisionRefs } : {}),
|
|
4263
|
+
budget: budgetEnvelope,
|
|
4192
4264
|
projectContext: lifecycle.projectContext,
|
|
4193
4265
|
rulesApplied: lifecycle.rulesApplied,
|
|
4194
4266
|
operatorProfileApplied: lifecycle.operatorProfileApplied,
|
|
@@ -4207,8 +4279,8 @@ export function createDispatchBundle(
|
|
|
4207
4279
|
reasoningTokenCount: tokenMeter.reasoningTokens,
|
|
4208
4280
|
...(upstreamResponses.length > 0 ? { upstreamResponses: [...upstreamResponses] } : {}),
|
|
4209
4281
|
...(capturedOutput !== undefined ? { output: capturedOutput } : {}),
|
|
4210
|
-
costUsd:
|
|
4211
|
-
costProvenance: "unknown",
|
|
4282
|
+
costUsd: usage.costUsd,
|
|
4283
|
+
costProvenance: usage.costProvenance ?? "unknown",
|
|
4212
4284
|
compiledPromptHash: lifecycle.compiledPromptHash,
|
|
4213
4285
|
staticCompositionHash: lifecycle.staticCompositionHash,
|
|
4214
4286
|
staticShellHash: lifecycle.staticCompositionHash,
|
|
@@ -4284,7 +4356,7 @@ export function createDispatchBundle(
|
|
|
4284
4356
|
outcome,
|
|
4285
4357
|
outcomeCode: receipt.outcomeCode ?? null,
|
|
4286
4358
|
outcomeDetail: receipt.outcomeDetail ?? null,
|
|
4287
|
-
lineage,
|
|
4359
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4288
4360
|
tokenCount: receipt.tokenCount,
|
|
4289
4361
|
inputTokenCount: receipt.inputTokenCount ?? 0,
|
|
4290
4362
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
@@ -4463,7 +4535,7 @@ export function createDispatchBundle(
|
|
|
4463
4535
|
outcome: "failed" satisfies RunOutcome,
|
|
4464
4536
|
outcomeDetail: detail,
|
|
4465
4537
|
reason: "failed",
|
|
4466
|
-
lineage,
|
|
4538
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
4467
4539
|
exitCode: 1,
|
|
4468
4540
|
});
|
|
4469
4541
|
throw error;
|
|
@@ -4472,6 +4544,7 @@ export function createDispatchBundle(
|
|
|
4472
4544
|
}
|
|
4473
4545
|
})().then(resolveFinal, rejectFinal);
|
|
4474
4546
|
active.set(envelope.id, activeRun);
|
|
4547
|
+
watchAssignmentDeadline(activeRun, callerDeadlineAt);
|
|
4475
4548
|
|
|
4476
4549
|
return {
|
|
4477
4550
|
runId: envelope.id,
|
|
@@ -4491,6 +4564,7 @@ export function createDispatchBundle(
|
|
|
4491
4564
|
finalPromise: Promise<RunReceipt>;
|
|
4492
4565
|
effectiveRequest: DispatchRequest;
|
|
4493
4566
|
}> {
|
|
4567
|
+
const hostRun = preparation?.hostRun;
|
|
4494
4568
|
const requestedAt = new Date(now()).toISOString();
|
|
4495
4569
|
const timing: RunPhaseMarks = { requestedAt, decisionStartedAt: requestedAt };
|
|
4496
4570
|
const settings = getEffectiveSettings();
|
|
@@ -4536,11 +4610,13 @@ export function createDispatchBundle(
|
|
|
4536
4610
|
const phases = envelope ? deriveEnvelopePhaseDurations(envelope) : undefined;
|
|
4537
4611
|
if (envelope === null || envelope === undefined) return;
|
|
4538
4612
|
const outcome = receipt.outcome ?? (receipt.exitCode === 0 ? "succeeded" : "failed");
|
|
4613
|
+
const assignmentId = assignmentRootFor(receipt.runId);
|
|
4539
4614
|
const quality = reduceRouteQuality({
|
|
4540
|
-
subject: { receipt, envelope },
|
|
4615
|
+
subject: { receipt, envelope, assignmentId },
|
|
4541
4616
|
receipts: [{ receipt, envelope }],
|
|
4542
4617
|
});
|
|
4543
4618
|
routeObserver.recordOutcome(observation.id, {
|
|
4619
|
+
assignmentId,
|
|
4544
4620
|
route: observation.decision.executedRoute,
|
|
4545
4621
|
outcome,
|
|
4546
4622
|
qualityLabel: quality.label,
|
|
@@ -4558,11 +4634,6 @@ export function createDispatchBundle(
|
|
|
4558
4634
|
return handle;
|
|
4559
4635
|
};
|
|
4560
4636
|
if (req.delegationAgentId) {
|
|
4561
|
-
if (req.budget !== undefined) {
|
|
4562
|
-
throw new Error(
|
|
4563
|
-
"dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
|
|
4564
|
-
);
|
|
4565
|
-
}
|
|
4566
4637
|
assertPlannedNodeIdentity(req, { id: "local", kind: "local" });
|
|
4567
4638
|
assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
|
|
4568
4639
|
if (req.responseSchema !== undefined) {
|
|
@@ -4580,7 +4651,15 @@ export function createDispatchBundle(
|
|
|
4580
4651
|
}
|
|
4581
4652
|
await rebindReservationSlot(req, "local", null, UNKNOWN_PRICING_ADMISSION_ESTIMATE_USD, settings);
|
|
4582
4653
|
routeObservation = observeShadowRoute(req, undefined, settings);
|
|
4583
|
-
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
|
+
);
|
|
4584
4663
|
// An ACP member never runs host verification, so it can only ever leave
|
|
4585
4664
|
// the barrier. It still edits the checkout, so the barrier has to wait
|
|
4586
4665
|
// for it; dispatch() releases it when its finalPromise settles.
|
|
@@ -4835,7 +4914,11 @@ export function createDispatchBundle(
|
|
|
4835
4914
|
lifecycle.runtimeKind === "http" ||
|
|
4836
4915
|
(lifecycle.runtimeKind === "sdk" && lifecycle.target.runtime.id === "claude-sdk");
|
|
4837
4916
|
let workerPolicyPermissionCounter = 0;
|
|
4838
|
-
|
|
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
|
+
});
|
|
4839
4922
|
const markObservedPhase = (field: "firstModelTokenAt" | "firstToolAt"): void => {
|
|
4840
4923
|
if (timing[field] !== undefined) return;
|
|
4841
4924
|
timing[field] = new Date(now()).toISOString();
|
|
@@ -5114,7 +5197,7 @@ export function createDispatchBundle(
|
|
|
5114
5197
|
ledgerRef.update(envelope.id, {
|
|
5115
5198
|
status: "running",
|
|
5116
5199
|
pid,
|
|
5117
|
-
lineage,
|
|
5200
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5118
5201
|
identity,
|
|
5119
5202
|
node: placement?.node ?? LOCAL_RUN_NODE,
|
|
5120
5203
|
...(placement?.reroutes !== undefined && placement.reroutes.length > 0
|
|
@@ -5267,6 +5350,7 @@ export function createDispatchBundle(
|
|
|
5267
5350
|
stallKilled: false,
|
|
5268
5351
|
stallTimeoutMs: null,
|
|
5269
5352
|
lineage,
|
|
5353
|
+
...(hostRun === undefined ? {} : { hostRun }),
|
|
5270
5354
|
heartbeatAt,
|
|
5271
5355
|
heartbeatStatus: "alive",
|
|
5272
5356
|
meter: tokenMeter,
|
|
@@ -5350,7 +5434,7 @@ export function createDispatchBundle(
|
|
|
5350
5434
|
runtimeKind: lifecycle.runtimeKind,
|
|
5351
5435
|
outcome,
|
|
5352
5436
|
outcomeCode,
|
|
5353
|
-
lineage,
|
|
5437
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5354
5438
|
...(req.intent !== undefined ? { intent: structuredClone(req.intent) } : {}),
|
|
5355
5439
|
pathScope: structuredClone(lifecycle.pathScope.provenance),
|
|
5356
5440
|
identity,
|
|
@@ -5481,7 +5565,7 @@ export function createDispatchBundle(
|
|
|
5481
5565
|
outcome,
|
|
5482
5566
|
outcomeCode: receipt.outcomeCode ?? null,
|
|
5483
5567
|
outcomeDetail: receipt.outcomeDetail ?? null,
|
|
5484
|
-
lineage,
|
|
5568
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5485
5569
|
tokenCount: receipt.tokenCount,
|
|
5486
5570
|
inputTokenCount: receipt.inputTokenCount ?? 0,
|
|
5487
5571
|
outputTokenCount: receipt.outputTokenCount ?? 0,
|
|
@@ -5601,13 +5685,12 @@ export function createDispatchBundle(
|
|
|
5601
5685
|
const steering = snapshotSteeringProvenance();
|
|
5602
5686
|
const capturedOutput = outputCapture.snapshot();
|
|
5603
5687
|
const observedRunEffects = runEffects.snapshot();
|
|
5604
|
-
const appliedResultContract =
|
|
5605
|
-
? (req.resultContractOverride ?? lifecycle.recipe?.resultContract ?? null)
|
|
5606
|
-
: null;
|
|
5688
|
+
const appliedResultContract = dispatchResultContract(req, lifecycle.recipe) ?? null;
|
|
5607
5689
|
const resultContract = validateRecipeResult({
|
|
5608
5690
|
contract: appliedResultContract,
|
|
5609
5691
|
reachedTerminalResult: resultContractWasDue(finalOutcome, outcomeCode),
|
|
5610
5692
|
output: capturedOutput?.state === "final" ? capturedOutput.text : null,
|
|
5693
|
+
outputTruncated: capturedOutput?.truncated === true,
|
|
5611
5694
|
cwd: lifecycle.cwd,
|
|
5612
5695
|
networkAllowed:
|
|
5613
5696
|
lifecycle.admission.allowedTools.includes(ToolNames.WebFetch) ||
|
|
@@ -5657,8 +5740,7 @@ export function createDispatchBundle(
|
|
|
5657
5740
|
finalDetail = [finalDetail, describeUngroundedValidations(validationGrounding)].filter(Boolean).join("; ");
|
|
5658
5741
|
}
|
|
5659
5742
|
const hasTerminalArtifact =
|
|
5660
|
-
|
|
5661
|
-
resultValidation?.conformance === "pass";
|
|
5743
|
+
appliedResultContract?.kind === "architect-plan" && resultValidation?.conformance === "pass";
|
|
5662
5744
|
if (finalOutcome === "succeeded" && !hasDurableFinalOutput(capturedOutput) && !hasTerminalArtifact) {
|
|
5663
5745
|
finalOutcome = "failed";
|
|
5664
5746
|
outcomeCode = "worker_final_output_missing";
|
|
@@ -5848,7 +5930,7 @@ export function createDispatchBundle(
|
|
|
5848
5930
|
outcome: "failed" satisfies RunOutcome,
|
|
5849
5931
|
outcomeDetail: detail,
|
|
5850
5932
|
reason: "failed",
|
|
5851
|
-
lineage,
|
|
5933
|
+
lineage: publishedLineage(lineage, hostRun),
|
|
5852
5934
|
exitCode: 1,
|
|
5853
5935
|
});
|
|
5854
5936
|
throw error;
|
|
@@ -5859,6 +5941,7 @@ export function createDispatchBundle(
|
|
|
5859
5941
|
})().then(resolveFinal, rejectFinal);
|
|
5860
5942
|
|
|
5861
5943
|
active.set(envelope.id, activeRun);
|
|
5944
|
+
watchAssignmentDeadline(activeRun, preparation?.deadlineAt);
|
|
5862
5945
|
|
|
5863
5946
|
return attachRouteObservation({
|
|
5864
5947
|
runId: envelope.id,
|
|
@@ -5985,11 +6068,6 @@ export function createDispatchBundle(
|
|
|
5985
6068
|
req = validation.restore(validated.spec);
|
|
5986
6069
|
|
|
5987
6070
|
if (req.delegationAgentId) {
|
|
5988
|
-
if (req.budget !== undefined) {
|
|
5989
|
-
throw new Error(
|
|
5990
|
-
"dispatch: budget envelopes cannot be enforced on an ACP delegation target; dispatch to a native or claude-sdk worker",
|
|
5991
|
-
);
|
|
5992
|
-
}
|
|
5993
6071
|
const protectedArtifactState = getProtectedArtifactState();
|
|
5994
6072
|
assertProtectedArtifactsEnforceable("acp-delegation", false, protectedArtifactState);
|
|
5995
6073
|
if (req.responseSchema !== undefined) {
|
|
@@ -6405,6 +6483,7 @@ export function createDispatchBundle(
|
|
|
6405
6483
|
exitCode: 0,
|
|
6406
6484
|
gate,
|
|
6407
6485
|
council,
|
|
6486
|
+
...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
|
|
6408
6487
|
...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
|
|
6409
6488
|
});
|
|
6410
6489
|
const receipt = l.recordReceipt(runId, {
|
|
@@ -6446,6 +6525,7 @@ export function createDispatchBundle(
|
|
|
6446
6525
|
sessionId: input.template.sessionId,
|
|
6447
6526
|
gate,
|
|
6448
6527
|
council,
|
|
6528
|
+
...(input.template.lineage !== undefined ? { lineage: { ...input.template.lineage } } : {}),
|
|
6449
6529
|
...(input.template.plan !== undefined ? { plan: input.template.plan } : {}),
|
|
6450
6530
|
});
|
|
6451
6531
|
await l.persist();
|
|
@@ -6651,7 +6731,7 @@ export function createDispatchBundle(
|
|
|
6651
6731
|
runtimeKind: run.runtimeKind,
|
|
6652
6732
|
outcomePhase: run.stallKilled ? "terminating" : run.aborted ? "aborting" : "running",
|
|
6653
6733
|
heartbeat,
|
|
6654
|
-
lineage:
|
|
6734
|
+
lineage: publishedLineage(run.lineage, run.hostRun),
|
|
6655
6735
|
startedAt: run.startedAt,
|
|
6656
6736
|
elapsedMs,
|
|
6657
6737
|
timing,
|
|
@@ -6739,7 +6819,12 @@ export function createDispatchBundle(
|
|
|
6739
6819
|
if (assignments.get(id) !== null) return id;
|
|
6740
6820
|
const live = active.get(id);
|
|
6741
6821
|
if (live) return live.lineage.rootRunId;
|
|
6742
|
-
|
|
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;
|
|
6743
6828
|
}
|
|
6744
6829
|
|
|
6745
6830
|
function currentAssignmentRun(id: string): ActiveRun | null {
|
|
@@ -6794,8 +6879,8 @@ export function createDispatchBundle(
|
|
|
6794
6879
|
};
|
|
6795
6880
|
},
|
|
6796
6881
|
assignments: {
|
|
6797
|
-
get: (id) => assignments.get(id),
|
|
6798
|
-
getStored: (id) => getStoredAssignment(id),
|
|
6882
|
+
get: (id) => assignments.get(assignmentRootFor(id)),
|
|
6883
|
+
getStored: (id) => getStoredAssignment(assignmentRootFor(id)),
|
|
6799
6884
|
flushWrites: async () => {
|
|
6800
6885
|
await Promise.allSettled([...assignmentWrites]);
|
|
6801
6886
|
},
|