@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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "../domains/dispatch/gate-role-prompts.js";
|
|
13
13
|
import { narrowDispatchIntentToReadOnly, normalizeDispatchIntent } from "../domains/dispatch/intent.js";
|
|
14
14
|
import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
|
|
15
|
+
import { parallelWriterConflict } from "../domains/dispatch/parallel-writers.js";
|
|
15
16
|
import { approvedRouteCandidates } from "../domains/dispatch/route-approval.js";
|
|
16
17
|
import { defaultRoutingIntent } from "../domains/dispatch/routing-intent.js";
|
|
17
18
|
import type { DispatchFailoverMode } from "../domains/dispatch/validation.js";
|
|
@@ -26,6 +27,7 @@ import {
|
|
|
26
27
|
DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT,
|
|
27
28
|
type DispatchPlanView,
|
|
28
29
|
describeDispatchPlan,
|
|
30
|
+
dispatchPlanTopology,
|
|
29
31
|
RESOLVED_DISPATCH_PLAN_ARGUMENT,
|
|
30
32
|
type ResolvedDispatchPlanArtifact,
|
|
31
33
|
resolvedDispatchPlanFromArgs,
|
|
@@ -533,6 +535,10 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
533
535
|
if (args.writers === 1 && mode !== "parallel") {
|
|
534
536
|
return shapeRejection(args, "dispatch: writers is supported only for parallel dispatch");
|
|
535
537
|
}
|
|
538
|
+
if (mode === "parallel" && args.writers !== 1) {
|
|
539
|
+
const conflict = parallelWriterConflict(parsed.requests, deps.getAgentSpecs());
|
|
540
|
+
if (conflict !== null) return shapeRejection(args, conflict);
|
|
541
|
+
}
|
|
536
542
|
const parentCheckout = gitCheckoutRoot(process.cwd());
|
|
537
543
|
for (const request of parsed.requests) {
|
|
538
544
|
if (request.worktree !== true) continue;
|
|
@@ -605,6 +611,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
605
611
|
resolveTask(
|
|
606
612
|
{
|
|
607
613
|
agentId: gateDeciderAgentId(reviewResult.review.reviewer),
|
|
614
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
608
615
|
executionRole: "reviewer",
|
|
609
616
|
task: renderDispatchReviewerTask(base.task, subject.runId, cycle, base.intent),
|
|
610
617
|
systemPrompt: REVIEWER_GATE_PROMPT,
|
|
@@ -640,6 +647,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
640
647
|
resolveTask(
|
|
641
648
|
{
|
|
642
649
|
agentId: gateDeciderAgentId(compete.judge?.agent),
|
|
650
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
643
651
|
executionRole: "judge",
|
|
644
652
|
task: `Plan-time capability check for the ${compete.candidates}-candidate judge.`,
|
|
645
653
|
systemPrompt: JUDGE_GATE_PROMPT,
|
|
@@ -712,6 +720,7 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
712
720
|
if (council.synthesis === "judge") {
|
|
713
721
|
const judgeRequest: DispatchRequest = {
|
|
714
722
|
agentId: council.judge?.agent ?? base.agentId,
|
|
723
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
715
724
|
executionRole: "judge",
|
|
716
725
|
task: "Plan-time capability check for council synthesis.",
|
|
717
726
|
systemPrompt: COUNCIL_JUDGE_PROMPT,
|
|
@@ -738,7 +747,9 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
738
747
|
for (const [index, request] of parsed.requests.entries()) tasks.push(resolveTask(request, "task", index + 1));
|
|
739
748
|
}
|
|
740
749
|
|
|
741
|
-
|
|
750
|
+
// Scope has already been resolved on tasks. Rendering the raw call here
|
|
751
|
+
// would discard its typed intent and run legacy prose inference again.
|
|
752
|
+
const topology = dispatchPlanTopology(args);
|
|
742
753
|
const planScale =
|
|
743
754
|
tasks.length > 1 ||
|
|
744
755
|
topology === "compete" ||
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Pure model-argument parsing; every returned DispatchRequest has a concrete agent id. */
|
|
2
2
|
|
|
3
|
+
import { parseResultSummaryMaxBytes } from "../domains/agents/result-contract.js";
|
|
3
4
|
import type { AgentAutomationAuthority } from "../domains/agents/spec.js";
|
|
4
5
|
import { type AgentTaskType, classifyAgentTask } from "../domains/dispatch/agent-candidates.js";
|
|
5
6
|
import { cloneDispatchBudgetRequest } from "../domains/dispatch/budget-envelope.js";
|
|
@@ -108,6 +109,29 @@ export function maxOutputBytesArg(args: Record<string, unknown>): number {
|
|
|
108
109
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : DEFAULT_MAX_OUTPUT_BYTES;
|
|
109
110
|
}
|
|
110
111
|
|
|
112
|
+
/**
|
|
113
|
+
* The caller's inline-summary allowance, range-checked here so a bad value is
|
|
114
|
+
* a tool error rather than a sealed run failure. The scope records whether
|
|
115
|
+
* this assignment set it or inherited a batch default (see
|
|
116
|
+
* `dispatchResultContract`).
|
|
117
|
+
*/
|
|
118
|
+
function resultSummaryArg(
|
|
119
|
+
args: Record<string, unknown>,
|
|
120
|
+
scope: "task" | "batch",
|
|
121
|
+
): { ok: true; value: DispatchRequest["resultSummary"] } | { ok: false; message: string } {
|
|
122
|
+
if (!("result_summary_max_bytes" in args) || args.result_summary_max_bytes === undefined) {
|
|
123
|
+
return { ok: true, value: undefined };
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
value: { maxBytes: parseResultSummaryMaxBytes(args.result_summary_max_bytes, "result_summary_max_bytes"), scope },
|
|
129
|
+
};
|
|
130
|
+
} catch (error) {
|
|
131
|
+
return { ok: false, message: error instanceof Error ? error.message : String(error) };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
111
135
|
export function timeoutMsArg(args: Record<string, unknown>): number | undefined {
|
|
112
136
|
const value = args.timeout_ms;
|
|
113
137
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
|
|
@@ -116,6 +140,7 @@ export function timeoutMsArg(args: Record<string, unknown>): number | undefined
|
|
|
116
140
|
function dispatchRequestFromArgs(
|
|
117
141
|
args: Record<string, unknown>,
|
|
118
142
|
options: DispatchArgumentParserOptions,
|
|
143
|
+
resultSummaryScope: "task" | "batch" = "task",
|
|
119
144
|
): { ok: true; request: DispatchRequest } | { ok: false; message: string } {
|
|
120
145
|
const task = stringArg(args, "task");
|
|
121
146
|
if (!task) return { ok: false, message: "missing task (pass list:true to see available agents)" };
|
|
@@ -223,6 +248,9 @@ function dispatchRequestFromArgs(
|
|
|
223
248
|
}
|
|
224
249
|
}
|
|
225
250
|
}
|
|
251
|
+
const resultSummary = resultSummaryArg(args, resultSummaryScope);
|
|
252
|
+
if (!resultSummary.ok) return resultSummary;
|
|
253
|
+
if (resultSummary.value !== undefined) request.resultSummary = resultSummary.value;
|
|
226
254
|
if ("persona" in args && args.persona !== undefined) {
|
|
227
255
|
if (typeof args.persona !== "string") return { ok: false, message: "persona must be a string" };
|
|
228
256
|
const persona = args.persona.trim();
|
|
@@ -278,10 +306,19 @@ export function dispatchRequestsFromArgs(
|
|
|
278
306
|
for (let index = 0; index < tasks.length; index += 1) {
|
|
279
307
|
const item = tasks[index];
|
|
280
308
|
const itemArgs: Record<string, unknown> = isRecord(item) ? { ...shared, ...item } : { ...shared, task: item };
|
|
309
|
+
// A shared allowance over several members is inherited, not chosen for
|
|
310
|
+
// each of them; a one-task batch is the single-task form the tool
|
|
311
|
+
// normalizes every call into, so its shared value is that task's own.
|
|
312
|
+
const resultSummaryScope =
|
|
313
|
+
tasks.length > 1 &&
|
|
314
|
+
Object.hasOwn(shared, "result_summary_max_bytes") &&
|
|
315
|
+
!(isRecord(item) && Object.hasOwn(item, "result_summary_max_bytes"))
|
|
316
|
+
? "batch"
|
|
317
|
+
: "task";
|
|
281
318
|
const sharedIntent = isRecord(shared.intent) ? shared.intent : null;
|
|
282
319
|
const itemIntent = isRecord(item) && Object.hasOwn(item, "intent") && isRecord(item.intent) ? item.intent : null;
|
|
283
320
|
if (sharedIntent !== null && itemIntent !== null) itemArgs.intent = { ...sharedIntent, ...itemIntent };
|
|
284
|
-
const parsed = dispatchRequestFromArgs(itemArgs, options);
|
|
321
|
+
const parsed = dispatchRequestFromArgs(itemArgs, options, resultSummaryScope);
|
|
285
322
|
if (!parsed.ok) return { ok: false, message: `dispatch: task ${index + 1}: ${parsed.message}` };
|
|
286
323
|
if (sharedIntent !== null && itemIntent !== null) {
|
|
287
324
|
if (options.resolveIntent === undefined) {
|
|
@@ -376,7 +376,8 @@ function canonicalCandidates(value: unknown): DispatchFailoverCandidate[] | null
|
|
|
376
376
|
return out.length > 0 ? out : null;
|
|
377
377
|
}
|
|
378
378
|
|
|
379
|
-
|
|
379
|
+
/** Select topology without rendering unresolved task scope or consulting provider state. */
|
|
380
|
+
export function dispatchPlanTopology(args: Record<string, unknown>): DispatchPlanTopology {
|
|
380
381
|
if (isRecord(args.apply_winner)) return "compete";
|
|
381
382
|
if (args.mode === "compete") return "compete";
|
|
382
383
|
if (args.mode === "council") return "council";
|
|
@@ -400,8 +401,8 @@ function renderPlanText(
|
|
|
400
401
|
): string {
|
|
401
402
|
const lines = [
|
|
402
403
|
`dispatch plan: topology=${topology} tasks=${tasks.length}`,
|
|
403
|
-
`cost
|
|
404
|
-
`deadline: ${deadlineMs === null ? "
|
|
404
|
+
`advisory session cost baseline: ${costCeilingUsd === undefined ? "unavailable" : `$${costCeilingUsd.toFixed(4)}`}`,
|
|
405
|
+
`deadline: ${deadlineMs === null ? "none (advisory planning)" : `${deadlineMs}ms whole-plan`}`,
|
|
405
406
|
];
|
|
406
407
|
if (confirmation !== undefined) {
|
|
407
408
|
lines.push(
|
|
@@ -450,7 +451,7 @@ function renderPlanText(
|
|
|
450
451
|
const approval = task.routeApproval;
|
|
451
452
|
const selected = approval.decision.selected;
|
|
452
453
|
lines.push(
|
|
453
|
-
` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs} maxAttempts=${approval.maxAttempts}`,
|
|
454
|
+
` active policy=${safeField(approval.decision.policyVersion)} decision=${approval.decision.decisionHash} runtime=${safeField(selected.runtimeId)} thinking=${safeField(selected.thinkingLevel ?? "default")} totalCostUpperBoundUsd=${approval.totalCostUpperBoundUsd.toFixed(6)} deadlineMs=${approval.deadlineMs ?? "none"} maxAttempts=${approval.maxAttempts}`,
|
|
454
455
|
);
|
|
455
456
|
}
|
|
456
457
|
if (task.agentSelection !== null) {
|
|
@@ -778,8 +779,7 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
|
|
|
778
779
|
!Number.isInteger(value.maxWorkers) ||
|
|
779
780
|
Number(value.maxWorkers) < 1 ||
|
|
780
781
|
(value.onFailure !== "stop" && value.onFailure !== "continue") ||
|
|
781
|
-
!Number.isInteger(value.deadlineMs) ||
|
|
782
|
-
Number(value.deadlineMs) < 1
|
|
782
|
+
(value.deadlineMs !== null && (!Number.isInteger(value.deadlineMs) || Number(value.deadlineMs) < 1))
|
|
783
783
|
)
|
|
784
784
|
return null;
|
|
785
785
|
if (
|
|
@@ -902,7 +902,7 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
|
|
|
902
902
|
const args = prepareDispatchArguments(rawArgs ?? {});
|
|
903
903
|
const preparationFailed = typeof args[DISPATCH_PLAN_PREPARATION_ERROR_ARGUMENT] === "string";
|
|
904
904
|
const resolved = resolvedDispatchPlanFromArgs(args);
|
|
905
|
-
const topology = resolved?.topology ??
|
|
905
|
+
const topology = resolved?.topology ?? dispatchPlanTopology(args);
|
|
906
906
|
const tasks = resolved?.tasks ?? taskViews(args);
|
|
907
907
|
const costCeilingUsd = resolved?.costCeilingUsd;
|
|
908
908
|
const deadlineMs = resolved?.deadlineMs ?? null;
|
|
@@ -51,6 +51,7 @@ import { summarizeTrustStatus } from "../domains/evidence/trust-projection.js";
|
|
|
51
51
|
import { adaptRunReceiptTrustStatus } from "../domains/evidence/trust-status.js";
|
|
52
52
|
import type { AutonomyLevel } from "../domains/safety/autonomy.js";
|
|
53
53
|
import { activeDecisionRefs } from "../domains/session/decision-board.js";
|
|
54
|
+
import { renderCompeteJudgeTask } from "./compete-judge-task.js";
|
|
54
55
|
import {
|
|
55
56
|
type CandidateWorktree,
|
|
56
57
|
type CompeteGroupOwnership,
|
|
@@ -560,7 +561,12 @@ function dispatchDetails(
|
|
|
560
561
|
}
|
|
561
562
|
return {
|
|
562
563
|
mode,
|
|
563
|
-
assignmentIds: runs.map(
|
|
564
|
+
assignmentIds: runs.map(
|
|
565
|
+
(run) =>
|
|
566
|
+
deps.dispatch.assignments?.getStored(run.receipt.runId)?.assignmentId ??
|
|
567
|
+
run.receipt.lineage?.rootRunId ??
|
|
568
|
+
run.receipt.runId,
|
|
569
|
+
),
|
|
564
570
|
terminalRunIds: runs.map((run) => run.receipt.runId),
|
|
565
571
|
receiptCount: runs.length,
|
|
566
572
|
failedCount: failed.length,
|
|
@@ -787,6 +793,7 @@ async function runReviewGated(
|
|
|
787
793
|
}
|
|
788
794
|
const reviewerRequest: DispatchRequest = {
|
|
789
795
|
agentId: gateDeciderAgentId(review.reviewer),
|
|
796
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
790
797
|
executionRole: "reviewer",
|
|
791
798
|
task: renderDispatchReviewerTask(base.task, builder.receipt.runId, cycle, base.intent),
|
|
792
799
|
systemPrompt: REVIEWER_GATE_PROMPT,
|
|
@@ -865,20 +872,6 @@ async function runReviewGated(
|
|
|
865
872
|
}
|
|
866
873
|
}
|
|
867
874
|
|
|
868
|
-
function judgeTask(originalTask: string, candidates: ReadonlyArray<CandidateWorktree>, stats: string[]): string {
|
|
869
|
-
const lines = [
|
|
870
|
-
`Rank ${candidates.length} candidate implementations of this task and pick the best one.`,
|
|
871
|
-
"Original task:",
|
|
872
|
-
originalTask,
|
|
873
|
-
"Candidates:",
|
|
874
|
-
...candidates.map(
|
|
875
|
-
(candidate, index) =>
|
|
876
|
-
` ${candidate.index}. branch=${candidate.branch} worktree=${candidate.path} (${stats[index] ?? "?"})`,
|
|
877
|
-
),
|
|
878
|
-
];
|
|
879
|
-
return lines.join("\n\n");
|
|
880
|
-
}
|
|
881
|
-
|
|
882
875
|
function readVerifiedGateReceipt(deps: DispatchToolDeps, runId: string): RunReceipt | null {
|
|
883
876
|
const envelope = deps.dispatch.getRun(runId);
|
|
884
877
|
if (envelope === null) return null;
|
|
@@ -1173,6 +1166,11 @@ async function runCompete(
|
|
|
1173
1166
|
const throwIfStopped = (): void => {
|
|
1174
1167
|
if (stop !== null) throw new Error(stop.message);
|
|
1175
1168
|
};
|
|
1169
|
+
// A stopped phase still has terminal receipts worth reporting. Keep the
|
|
1170
|
+
// ordinary error result and no winner, without discarding those identities
|
|
1171
|
+
// through the generic exception path after the settlement barrier.
|
|
1172
|
+
const stoppedOutcome = (): CompeteOutcome | null =>
|
|
1173
|
+
stop === null ? null : { runs, decisions, group, winner: null, needsDecision: stop.message };
|
|
1176
1174
|
const settleRun = async (
|
|
1177
1175
|
handle: Awaited<ReturnType<DispatchContract["dispatch"]>>,
|
|
1178
1176
|
request: DispatchRequest,
|
|
@@ -1331,7 +1329,8 @@ async function runCompete(
|
|
|
1331
1329
|
});
|
|
1332
1330
|
const candidateRuns = await settledCompletedRuns(candidateOwned, "candidate settlement");
|
|
1333
1331
|
runs.push(...candidateRuns);
|
|
1334
|
-
|
|
1332
|
+
const stoppedCandidates = stoppedOutcome();
|
|
1333
|
+
if (stoppedCandidates !== null) return stoppedCandidates;
|
|
1335
1334
|
const stats = worktrees.map((worktree, index) => {
|
|
1336
1335
|
const receipt = candidateRuns[index]?.receipt;
|
|
1337
1336
|
const failed = receipt !== undefined && isPipelineStepFailure(receipt);
|
|
@@ -1356,8 +1355,22 @@ async function runCompete(
|
|
|
1356
1355
|
}
|
|
1357
1356
|
const judgeRequest: DispatchRequest = {
|
|
1358
1357
|
agentId: gateDeciderAgentId(compete.judge?.agent),
|
|
1358
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
1359
1359
|
executionRole: "judge",
|
|
1360
|
-
task:
|
|
1360
|
+
task: renderCompeteJudgeTask(base.task, worktrees, stats, candidateRuns),
|
|
1361
|
+
// Candidate prose and receipt locators are evidence, not inferred authority.
|
|
1362
|
+
// Read-only execution is enforced by the role/autonomy, not empty write roots.
|
|
1363
|
+
intent: narrowDispatchIntentToReadOnly(
|
|
1364
|
+
base.intent ?? {
|
|
1365
|
+
version: 2,
|
|
1366
|
+
readRoots: [],
|
|
1367
|
+
writeRoots: [],
|
|
1368
|
+
relevantPaths: [],
|
|
1369
|
+
pathProvenance: [],
|
|
1370
|
+
expectedOutputs: [],
|
|
1371
|
+
verification: [],
|
|
1372
|
+
},
|
|
1373
|
+
),
|
|
1361
1374
|
systemPrompt: JUDGE_GATE_PROMPT,
|
|
1362
1375
|
autonomy: "read-only",
|
|
1363
1376
|
cwd: root,
|
|
@@ -1390,7 +1403,8 @@ async function runCompete(
|
|
|
1390
1403
|
const judgeRun = (await settledCompletedRuns([judgeOwned], "judge settlement"))[0];
|
|
1391
1404
|
if (judgeRun === undefined) throw new Error("judge produced no completed run");
|
|
1392
1405
|
runs.push(judgeRun);
|
|
1393
|
-
|
|
1406
|
+
const stoppedJudge = stoppedOutcome();
|
|
1407
|
+
if (stoppedJudge !== null) return stoppedJudge;
|
|
1394
1408
|
const judgeReceipt = judgeRun.receipt;
|
|
1395
1409
|
const judgeSummary = judgeRun.summary;
|
|
1396
1410
|
// Every judged outcome names the same subjects, decider, and correlation;
|
|
@@ -1532,7 +1546,7 @@ async function runCompete(
|
|
|
1532
1546
|
|
|
1533
1547
|
// Losers are always cleaned; the winner's worktree and branch survive
|
|
1534
1548
|
// only while an operator decision is pending (supervised pick or a
|
|
1535
|
-
// failed merge). The durable state transition happens after the worker
|
|
1549
|
+
// failed merge). Every removed candidate is archived under a durable recovery ref. The durable state transition happens after the worker
|
|
1536
1550
|
// barrier and before deletion, defining the safe restart boundary.
|
|
1537
1551
|
const winnerAtFinalization = currentWinner();
|
|
1538
1552
|
if (ownership !== null) {
|
|
@@ -1588,8 +1602,7 @@ async function runCompete(
|
|
|
1588
1602
|
/**
|
|
1589
1603
|
* Apply a preserved compete winner. Plan-scale by definition, so supervised
|
|
1590
1604
|
* autonomy levels park this call for operator confirmation; the approval IS
|
|
1591
|
-
* the winner confirmation. After a successful merge
|
|
1592
|
-
* is cleaned up.
|
|
1605
|
+
* the winner confirmation. After a successful merge scratch worktrees are cleaned up; candidate recovery refs remain.
|
|
1593
1606
|
*/
|
|
1594
1607
|
function runApplyWinner(
|
|
1595
1608
|
input: { branch: string; cwd: string },
|
|
@@ -1736,7 +1749,7 @@ function runApplyWinner(
|
|
|
1736
1749
|
}
|
|
1737
1750
|
return {
|
|
1738
1751
|
kind: "ok",
|
|
1739
|
-
output: `winner ${branch} merged into the current branch; compete group ${group} cleaned up`,
|
|
1752
|
+
output: `winner ${branch} merged into the current branch; compete group ${group} scratch cleaned up; candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)`,
|
|
1740
1753
|
details: {
|
|
1741
1754
|
mode: "apply_winner",
|
|
1742
1755
|
branch,
|
|
@@ -1801,14 +1814,14 @@ function competeResult(
|
|
|
1801
1814
|
if (outcome.winner?.applied === true) {
|
|
1802
1815
|
return {
|
|
1803
1816
|
kind: "ok",
|
|
1804
|
-
output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged)\n\n${body}`,
|
|
1817
|
+
output: `compete winner candidate ${outcome.winner.index} applied (branch ${outcome.winner.branch} merged); candidate states remain under refs/clio-coder/compete/ (list with git for-each-ref)\n\n${body}`,
|
|
1805
1818
|
details,
|
|
1806
1819
|
};
|
|
1807
1820
|
}
|
|
1808
1821
|
if (outcome.winner !== null && outcome.needsDecision === undefined) {
|
|
1809
1822
|
const lines = [
|
|
1810
1823
|
`compete winner: candidate ${outcome.winner.index} (branch ${outcome.winner.branch}), preserved for confirmation at autonomy ${autonomy}`,
|
|
1811
|
-
`Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing
|
|
1824
|
+
`Apply it with dispatch apply_winner={branch: "${outcome.winner.branch}"}; the approval prompt is the winner confirmation. Losing candidate states remain under refs/clio-coder/compete/; list them with git for-each-ref.`,
|
|
1812
1825
|
];
|
|
1813
1826
|
return { kind: "ok", output: `${lines.join("\n")}\n\n${body}`, details };
|
|
1814
1827
|
}
|
|
@@ -1998,6 +2011,7 @@ async function runCouncil(
|
|
|
1998
2011
|
const finalRuns = [...prior.values()];
|
|
1999
2012
|
const judgeRequest: DispatchRequest = {
|
|
2000
2013
|
agentId: council.judge?.agent ?? base.agentId,
|
|
2014
|
+
...(base.budget === undefined ? {} : { budget: base.budget }),
|
|
2001
2015
|
executionRole: "judge",
|
|
2002
2016
|
task: `Synthesize the council answers for this task:\n\n${base.task}`,
|
|
2003
2017
|
briefing: boundedCouncilBriefing(
|
|
@@ -2165,6 +2179,7 @@ export async function runDispatchTool(
|
|
|
2165
2179
|
// admission bounds. Keep these off the serializable approved request.
|
|
2166
2180
|
const dispatch = deps.dispatch;
|
|
2167
2181
|
const preparation = {
|
|
2182
|
+
...(options?.hostRun === undefined ? {} : { hostRun: structuredClone(options.hostRun) }),
|
|
2168
2183
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
2169
2184
|
...(timeoutMs === undefined ? {} : { deadlineAt: Date.now() + timeoutMs }),
|
|
2170
2185
|
};
|
|
@@ -2305,12 +2320,7 @@ export async function runDispatchTool(
|
|
|
2305
2320
|
try {
|
|
2306
2321
|
if (resolvedPlan?.topology === "fleet") {
|
|
2307
2322
|
const executionPlan = admissionState.trustedExecutionPlans.get(args);
|
|
2308
|
-
if (
|
|
2309
|
-
executionPlan === undefined ||
|
|
2310
|
-
resolvedPlan.source === null ||
|
|
2311
|
-
resolvedPlan.deadlineMs === null ||
|
|
2312
|
-
reservationOwnerId === undefined
|
|
2313
|
-
) {
|
|
2323
|
+
if (executionPlan === undefined || resolvedPlan.source === null || reservationOwnerId === undefined) {
|
|
2314
2324
|
return { kind: "error", message: "dispatch: trusted Scout dependency plan is unavailable" };
|
|
2315
2325
|
}
|
|
2316
2326
|
if (executionPlan.hash !== resolvedPlan.source.executionPlanHash) {
|
|
@@ -2611,10 +2621,16 @@ async function runPipeline(
|
|
|
2611
2621
|
const { receipt, summary } = await registered.completion;
|
|
2612
2622
|
activeRunId = null;
|
|
2613
2623
|
runs.push(completeRun(deps, receipt, summary));
|
|
2614
|
-
|
|
2624
|
+
// Execution can succeed while a conforming report records a failed
|
|
2625
|
+
// check. Keep that receipt truthful, but do not feed failed quality
|
|
2626
|
+
// into a dependent step. Review/compete use failure to drive their
|
|
2627
|
+
// own repair loops, so this condition belongs only to the pipeline.
|
|
2628
|
+
const failedQuality = receipt.quality.resultContract?.quality === "fail";
|
|
2629
|
+
if (isPipelineStepFailure(receipt) || failedQuality) {
|
|
2615
2630
|
const skipped = requests.length - (index + 1);
|
|
2631
|
+
const reason = isPipelineStepFailure(receipt) ? pipelineFailureReason(receipt) : "result quality=fail";
|
|
2616
2632
|
throw new PipelineHaltError(
|
|
2617
|
-
`pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${
|
|
2633
|
+
`pipeline dispatch halted at step ${index + 1}/${requests.length} (run ${receipt.runId}, ${reason}); skipped ${skipped} later step(s)`,
|
|
2618
2634
|
[...runs],
|
|
2619
2635
|
);
|
|
2620
2636
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Static, Type } from "typebox";
|
|
2
2
|
import type { FleetSettings } from "../core/defaults.js";
|
|
3
|
+
import { RESULT_SUMMARY_MAX_BYTES_CEILING } from "../domains/agents/result-contract.js";
|
|
3
4
|
import { DISPATCH_BRIEFING_MAX_BYTES } from "../domains/dispatch/validation.js";
|
|
4
5
|
import { StringEnum } from "../engine/ai.js";
|
|
5
6
|
import { TOOL_PROFILE_NAMES } from "./profiles.js";
|
|
@@ -18,7 +19,7 @@ import { TOOL_PROFILE_NAMES } from "./profiles.js";
|
|
|
18
19
|
export interface DispatchSchemaComposition {
|
|
19
20
|
/** `roster`, `members`, `synthesis`, `rounds`: a council needs a configured roster to name. */
|
|
20
21
|
council: boolean;
|
|
21
|
-
/** `candidates`, `judge`, `apply_winner`:
|
|
22
|
+
/** `candidates`, `judge`, `apply_winner`: distinct executions may share one fleet route. */
|
|
22
23
|
compete: boolean;
|
|
23
24
|
/** `routing.posture`, `minimumQuality`, `locality`, `failover`: they act only once adaptive routing is activated. */
|
|
24
25
|
adaptiveRouting: boolean;
|
|
@@ -30,28 +31,15 @@ export const FULL_DISPATCH_SCHEMA_COMPOSITION: DispatchSchemaComposition = Objec
|
|
|
30
31
|
adaptiveRouting: true,
|
|
31
32
|
});
|
|
32
33
|
|
|
33
|
-
type FleetShape = Pick<FleetSettings, "
|
|
34
|
-
|
|
35
|
-
/** Distinct target/model routes the fleet can dispatch to: the default plus every profile and roster member. */
|
|
36
|
-
function distinctFleetRoutes(fleet: FleetShape): number {
|
|
37
|
-
const routes = new Set<string>();
|
|
38
|
-
const add = (target: string | null | undefined, model: string | null | undefined): void => {
|
|
39
|
-
if (!target) return;
|
|
40
|
-
routes.add(`${target}${model ?? ""}`);
|
|
41
|
-
};
|
|
42
|
-
add(fleet.default.target, fleet.default.model);
|
|
43
|
-
for (const profile of Object.values(fleet.profiles)) add(profile.target, profile.model);
|
|
44
|
-
for (const roster of Object.values(fleet.rosters)) {
|
|
45
|
-
for (const member of roster.members) add(member.target, member.model);
|
|
46
|
-
}
|
|
47
|
-
return routes.size;
|
|
48
|
-
}
|
|
34
|
+
type FleetShape = Pick<FleetSettings, "rosters" | "adaptiveRouting">;
|
|
49
35
|
|
|
50
36
|
export function dispatchSchemaCompositionFor(fleet: FleetShape): DispatchSchemaComposition {
|
|
51
37
|
const routing = fleet.adaptiveRouting;
|
|
52
38
|
return {
|
|
53
39
|
council: Object.keys(fleet.rosters).length > 0,
|
|
54
|
-
|
|
40
|
+
// The runner isolates candidate executions and dispatches a separate judge;
|
|
41
|
+
// route diversity is not required. Normal admission still validates routes.
|
|
42
|
+
compete: true,
|
|
55
43
|
adaptiveRouting: routing.roles.length > 0 || routing.postures.length > 0 || routing.agentRoles.length > 0,
|
|
56
44
|
};
|
|
57
45
|
}
|
|
@@ -85,7 +73,7 @@ const DispatchBudgetSchema = Type.Object(
|
|
|
85
73
|
{
|
|
86
74
|
additionalProperties: false,
|
|
87
75
|
description:
|
|
88
|
-
"
|
|
76
|
+
"Advisory tool-call estimate; choose appropriate counts even above recipe recommendations. retryRevision sets a retry/revision estimate. Crossing estimates does not stop work.",
|
|
89
77
|
},
|
|
90
78
|
);
|
|
91
79
|
|
|
@@ -124,7 +112,7 @@ const DispatchIntentSchema = Type.Object(
|
|
|
124
112
|
{
|
|
125
113
|
additionalProperties: false,
|
|
126
114
|
description:
|
|
127
|
-
"Repository-relative paths and outputs. Declare it on every dispatch: it selects the project rules that apply and pins worker context, where omitting it falls back to path tokens scraped from the task text. verification entries are declared check ids from package scripts or .clio-coder/verifiers.yaml. Per-task intent
|
|
115
|
+
"Repository-relative paths and outputs. Declare it on every dispatch: it selects the project rules that apply and pins worker context, where omitting it falls back to path tokens scraped from the task text. verification entries are declared check ids from package scripts or .clio-coder/verifiers.yaml. Per-task intent fields override inherited top-level fields within its scope. For disjoint parallel writes, set each task's write_roots to only its assigned outputs; expected_outputs alone does not narrow write access.",
|
|
128
116
|
},
|
|
129
117
|
);
|
|
130
118
|
|
|
@@ -193,7 +181,12 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
|
|
|
193
181
|
briefing: Type.Optional(
|
|
194
182
|
Type.String({ description: `Per-task parent context, max ${DISPATCH_BRIEFING_MAX_BYTES} UTF-8 bytes.` }),
|
|
195
183
|
),
|
|
196
|
-
agent: Type.Optional(
|
|
184
|
+
agent: Type.Optional(
|
|
185
|
+
Type.String({
|
|
186
|
+
description:
|
|
187
|
+
"Recipe id for this task: set scout/documenter explicitly in a mixed pipeline; names in task text do not select recipes, and omission inherits the batch/default recipe.",
|
|
188
|
+
}),
|
|
189
|
+
),
|
|
197
190
|
budget: Type.Optional(BudgetRef),
|
|
198
191
|
target: Type.Optional(Type.String()),
|
|
199
192
|
model: Type.Optional(Type.String()),
|
|
@@ -201,6 +194,13 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
|
|
|
201
194
|
worktree: Type.Optional(Type.Literal(true, { description: "Run this writer in an isolated git worktree." })),
|
|
202
195
|
intent: Type.Optional(IntentRef),
|
|
203
196
|
gate: Type.Optional(Type.String({ description: "One declared check id, shorthand for intent.verification." })),
|
|
197
|
+
result_summary_max_bytes: Type.Optional(
|
|
198
|
+
Type.Integer({
|
|
199
|
+
minimum: 1,
|
|
200
|
+
maximum: RESULT_SUMMARY_MAX_BYTES_CEILING,
|
|
201
|
+
description: "This task's inline summary allowance; mutation-report workers (coder, documenter) only.",
|
|
202
|
+
}),
|
|
203
|
+
),
|
|
204
204
|
}),
|
|
205
205
|
]),
|
|
206
206
|
{ description: "Batch of assignments; one string or object is wrapped." },
|
|
@@ -284,8 +284,8 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
|
|
|
284
284
|
agent: Type.Optional(
|
|
285
285
|
Type.String({
|
|
286
286
|
description: composition.council
|
|
287
|
-
? "Default recipe id for
|
|
288
|
-
: "Default recipe id for
|
|
287
|
+
? "Default recipe id for tasks without their own agent, or auto (default coder; researcher for council)."
|
|
288
|
+
: "Default recipe id for tasks without their own agent, or auto (default coder).",
|
|
289
289
|
}),
|
|
290
290
|
),
|
|
291
291
|
briefing: Type.Optional(
|
|
@@ -332,6 +332,13 @@ export function buildDispatchParameters(composition: DispatchSchemaComposition =
|
|
|
332
332
|
cwd: Type.Optional(Type.String({ description: "Default worker working directory." })),
|
|
333
333
|
timeout_ms: Type.Optional(Type.Number({ description: "Abort the dispatch after this many ms." })),
|
|
334
334
|
max_output_bytes: Type.Optional(Type.Number({ description: "Max summary bytes returned." })),
|
|
335
|
+
result_summary_max_bytes: Type.Optional(
|
|
336
|
+
Type.Integer({
|
|
337
|
+
minimum: 1,
|
|
338
|
+
maximum: RESULT_SUMMARY_MAX_BYTES_CEILING,
|
|
339
|
+
description: `UTF-8 byte allowance for a mutation-report worker's inline summary (coder, documenter), default 16384. A batch default applies to mutation-report steps only; other steps ignore it. Storage bound, not the returned preview (max_output_bytes).`,
|
|
340
|
+
}),
|
|
341
|
+
),
|
|
335
342
|
},
|
|
336
343
|
{ $defs: DISPATCH_DEFS },
|
|
337
344
|
);
|
|
@@ -11,14 +11,11 @@ import type {
|
|
|
11
11
|
} from "../domains/dispatch/contract.js";
|
|
12
12
|
import { type ExecutionPlan, requireAgentSteps } from "../domains/dispatch/execution-plan.js";
|
|
13
13
|
import { verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
|
|
14
|
-
import { sameRouteIdentity } from "../domains/dispatch/route-decision.js";
|
|
15
14
|
import type { RoutingIntent } from "../domains/dispatch/routing-intent.js";
|
|
16
15
|
import { compileScoutTransition, type ScoutAgentBinding } from "../domains/dispatch/scout-transition.js";
|
|
17
16
|
import type { RunEnvelope, RunReceipt } from "../domains/dispatch/types.js";
|
|
18
17
|
import type { ResolvedDispatchPlanArtifact } from "./dispatch-plan.js";
|
|
19
18
|
|
|
20
|
-
const MAX_SCOUT_PLAN_DEADLINE_MS = 3_600_000;
|
|
21
|
-
|
|
22
19
|
export interface ScoutContinuationRef {
|
|
23
20
|
runId: string;
|
|
24
21
|
receiptDigest: string;
|
|
@@ -132,8 +129,8 @@ export function prepareScoutContinuation(input: {
|
|
|
132
129
|
: {
|
|
133
130
|
...sourceIntent,
|
|
134
131
|
posture: sourceIntent.posture === "manual" ? "balanced" : sourceIntent.posture,
|
|
135
|
-
maxCostUsd:
|
|
136
|
-
deadlineMs:
|
|
132
|
+
maxCostUsd: sourceIntent.maxCostUsd,
|
|
133
|
+
deadlineMs: sourceIntent.deadlineMs,
|
|
137
134
|
requiredCapabilities: [...sourceIntent.requiredCapabilities],
|
|
138
135
|
failover: "approved",
|
|
139
136
|
};
|
|
@@ -164,11 +161,7 @@ export function prepareScoutContinuation(input: {
|
|
|
164
161
|
routingIntent,
|
|
165
162
|
});
|
|
166
163
|
}
|
|
167
|
-
const
|
|
168
|
-
const effectiveCostCeiling =
|
|
169
|
-
input.authorization === "full-auto-policy" && priorCostCeiling !== null
|
|
170
|
-
? Math.min(input.costCeilingUsd, priorCostCeiling)
|
|
171
|
-
: input.costCeilingUsd;
|
|
164
|
+
const explicitCostCeiling = input.source.receipt.routingIntent.maxCostUsd;
|
|
172
165
|
const bindings: ScoutAgentBinding[] = proposals.map(({ subtask, agentSpec }) => ({
|
|
173
166
|
subtaskId: subtask.id,
|
|
174
167
|
spec: agentSpec,
|
|
@@ -192,35 +185,8 @@ export function prepareScoutContinuation(input: {
|
|
|
192
185
|
throw new Error("dispatch: full-auto policy does not grant every requested Scout authority");
|
|
193
186
|
}
|
|
194
187
|
const plan = transition.plan;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const selected = proposal.decision.candidateEvaluations.find((entry) =>
|
|
198
|
-
sameRouteIdentity(entry.candidate, proposal.decision.selected),
|
|
199
|
-
);
|
|
200
|
-
if (selected === undefined || selected.rejection !== null) {
|
|
201
|
-
throw new Error(`dispatch: Scout step '${proposal.subtask.id}' has no admissible latency estimate`);
|
|
202
|
-
}
|
|
203
|
-
return [proposal.subtask.id, selected.estimate.p95EndToEndMs] as const;
|
|
204
|
-
}),
|
|
205
|
-
);
|
|
206
|
-
const predictedDeadlineMs = Math.ceil(
|
|
207
|
-
plan.waves.reduce(
|
|
208
|
-
(total, wave) => total + Math.max(...wave.map((stepId) => p95ByStep.get(stepId) ?? Number.POSITIVE_INFINITY)),
|
|
209
|
-
0,
|
|
210
|
-
),
|
|
211
|
-
);
|
|
212
|
-
if (
|
|
213
|
-
!Number.isFinite(predictedDeadlineMs) ||
|
|
214
|
-
predictedDeadlineMs < 1 ||
|
|
215
|
-
predictedDeadlineMs > MAX_SCOUT_PLAN_DEADLINE_MS
|
|
216
|
-
) {
|
|
217
|
-
throw new Error("dispatch: Scout continuation exceeds the finite whole-plan deadline ceiling");
|
|
218
|
-
}
|
|
219
|
-
const priorDeadlineMs = input.source.receipt.routingIntent.deadlineMs;
|
|
220
|
-
if (input.authorization === "full-auto-policy" && priorDeadlineMs !== null && predictedDeadlineMs > priorDeadlineMs) {
|
|
221
|
-
throw new Error("dispatch: full-auto Scout continuation exceeds the previously granted deadline");
|
|
222
|
-
}
|
|
223
|
-
const deadlineMs = Math.max(priorDeadlineMs ?? 0, predictedDeadlineMs);
|
|
188
|
+
// Route estimates are advisory. Only a caller-supplied deadline grants stop authority.
|
|
189
|
+
const deadlineMs = input.source.receipt.routingIntent.deadlineMs;
|
|
224
190
|
const requests: DispatchRequest[] = [];
|
|
225
191
|
const resolutions: DispatchPlanTaskResolution[] = [];
|
|
226
192
|
const tasks = requireAgentSteps(plan.steps).map((step, index): ResolvedDispatchPlanArtifact["tasks"][number] => {
|
|
@@ -241,7 +207,7 @@ export function prepareScoutContinuation(input: {
|
|
|
241
207
|
cwd: input.source.envelope.cwd,
|
|
242
208
|
requestOrigin: "user",
|
|
243
209
|
agentSelection: selection,
|
|
244
|
-
routingIntent: { ...proposal.routingIntent, maxCostUsd:
|
|
210
|
+
routingIntent: { ...proposal.routingIntent, maxCostUsd: explicitCostCeiling, deadlineMs, failover: "none" },
|
|
245
211
|
failover: "none",
|
|
246
212
|
});
|
|
247
213
|
resolutions.push(proposal.resolution);
|
|
@@ -253,7 +219,7 @@ export function prepareScoutContinuation(input: {
|
|
|
253
219
|
node: proposal.resolution.node.id,
|
|
254
220
|
nodeKind: proposal.resolution.node.kind,
|
|
255
221
|
...(proposal.resolution.node.host === undefined ? {} : { nodeHost: proposal.resolution.node.host }),
|
|
256
|
-
routingIntent: { ...proposal.routingIntent, maxCostUsd:
|
|
222
|
+
routingIntent: { ...proposal.routingIntent, maxCostUsd: explicitCostCeiling, deadlineMs, failover: "none" },
|
|
257
223
|
failover: "none",
|
|
258
224
|
routeApproval: null,
|
|
259
225
|
agentSelection: selection,
|
|
@@ -269,8 +235,8 @@ export function prepareScoutContinuation(input: {
|
|
|
269
235
|
};
|
|
270
236
|
});
|
|
271
237
|
const aggregateCost = resolutions.reduce((sum, resolution) => sum + resolution.costUpperBoundUsd, 0);
|
|
272
|
-
if (!Number.isFinite(aggregateCost) || aggregateCost >
|
|
273
|
-
throw new Error("dispatch: Scout continuation exceeds the
|
|
238
|
+
if (!Number.isFinite(aggregateCost) || (explicitCostCeiling !== null && aggregateCost > explicitCostCeiling)) {
|
|
239
|
+
throw new Error("dispatch: Scout continuation exceeds the explicit routing cost ceiling");
|
|
274
240
|
}
|
|
275
241
|
return {
|
|
276
242
|
artifact: {
|
|
@@ -285,7 +251,7 @@ export function prepareScoutContinuation(input: {
|
|
|
285
251
|
maxWorkers: plan.maxWorkers,
|
|
286
252
|
onFailure: plan.onFailure,
|
|
287
253
|
tasks,
|
|
288
|
-
costCeilingUsd:
|
|
254
|
+
costCeilingUsd: input.costCeilingUsd,
|
|
289
255
|
deadlineMs,
|
|
290
256
|
},
|
|
291
257
|
requests,
|
|
@@ -186,8 +186,7 @@ export async function runScoutContinuationPlan<T, S>(input: {
|
|
|
186
186
|
): Promise<{ receipt: RunReceipt; summary: S }>;
|
|
187
187
|
complete(receipt: RunReceipt, summary: S): { value: T; integrityValid: boolean };
|
|
188
188
|
}): Promise<{ runs: T[]; skipped: ReadonlyArray<string> }> {
|
|
189
|
-
|
|
190
|
-
const assignmentDeadlineAt = Date.now() + input.artifact.deadlineMs;
|
|
189
|
+
const assignmentDeadlineAt = input.artifact.deadlineMs === null ? undefined : Date.now() + input.artifact.deadlineMs;
|
|
191
190
|
const completedByStep = new Map<string, T>();
|
|
192
191
|
const byStep = new Map(
|
|
193
192
|
input.artifact.tasks.map((task, index) => [task.stepId, { task, request: input.requests[index] }]),
|
|
@@ -234,7 +233,7 @@ export async function runScoutContinuationPlan<T, S>(input: {
|
|
|
234
233
|
...bound.request,
|
|
235
234
|
predecessorHandoffs: handoffs,
|
|
236
235
|
reservation,
|
|
237
|
-
assignmentDeadlineAt,
|
|
236
|
+
...(assignmentDeadlineAt === undefined ? {} : { assignmentDeadlineAt }),
|
|
238
237
|
...(ledger !== undefined ? { ledger } : {}),
|
|
239
238
|
};
|
|
240
239
|
const handle = await input.dispatch.dispatch(request);
|