@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
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* all flow through it.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
9
10
|
import {
|
|
10
11
|
BusChannels,
|
|
11
12
|
type ContextActivityStatus,
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
import type { ClioSettings } from "../core/config.js";
|
|
24
25
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
25
26
|
import { residencyTargetKey } from "../core/residency-target-key.js";
|
|
27
|
+
import type { PendingSkillToolPolicy } from "../core/skill-activation.js";
|
|
26
28
|
import type { ToolName } from "../core/tool-names.js";
|
|
27
29
|
import { buildEvictionFields, planEviction } from "../domains/context/working-set/engine.js";
|
|
28
30
|
import { foldWorkingSet } from "../domains/context/working-set/fold.js";
|
|
@@ -45,7 +47,8 @@ import {
|
|
|
45
47
|
DEFAULT_COMPACTION_THRESHOLD,
|
|
46
48
|
shouldCompact,
|
|
47
49
|
} from "../domains/session/compaction/auto.js";
|
|
48
|
-
import type { CompactResult } from "../domains/session/compaction/compact.js";
|
|
50
|
+
import type { CompactInput, CompactResult } from "../domains/session/compaction/compact.js";
|
|
51
|
+
import { DEFAULT_KEEP_RECENT_TOKENS } from "../domains/session/compaction/defaults.js";
|
|
49
52
|
import { maskStaleObservations } from "../domains/session/compaction/mask-observations.js";
|
|
50
53
|
import { estimateTokens } from "../domains/session/compaction/tokens.js";
|
|
51
54
|
import {
|
|
@@ -73,13 +76,15 @@ import {
|
|
|
73
76
|
type PromptCacheStats,
|
|
74
77
|
} from "../domains/session/context-ledger.js";
|
|
75
78
|
import type { SessionContract } from "../domains/session/contract.js";
|
|
76
|
-
import type
|
|
79
|
+
import { type CompactionTrigger, mainSkillContextState, type SessionEntry } from "../domains/session/entries.js";
|
|
77
80
|
import {
|
|
78
81
|
appendPromptCompileRecord,
|
|
79
82
|
PROMPT_MANIFEST_VERSION,
|
|
80
83
|
readPromptCompileRecords,
|
|
81
84
|
type SessionPromptCompileRecord,
|
|
82
85
|
} from "../domains/session/prompt-manifest.js";
|
|
86
|
+
import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
|
|
87
|
+
import { resolveReservedOutputTokens } from "../engine/apis/output-budget.js";
|
|
83
88
|
import type { AgentMessage, Usage } from "../engine/types.js";
|
|
84
89
|
import { resolveToolPromptHint, type ToolRegistry } from "../tools/registry.js";
|
|
85
90
|
import {
|
|
@@ -105,7 +110,13 @@ export interface TurnContextDeps {
|
|
|
105
110
|
observability?: ObservabilityContract | undefined;
|
|
106
111
|
bus?: SafeEventBus | undefined;
|
|
107
112
|
readSessionEntries?: (() => ReadonlyArray<SessionEntry>) | undefined;
|
|
108
|
-
autoCompact?:
|
|
113
|
+
autoCompact?:
|
|
114
|
+
| ((
|
|
115
|
+
instructions?: string,
|
|
116
|
+
trigger?: CompactionTrigger,
|
|
117
|
+
budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
|
|
118
|
+
) => Promise<CompactResult | null>)
|
|
119
|
+
| undefined;
|
|
109
120
|
/** Test seam for the eviction planner; production uses `planEviction` from the working-set engine. */
|
|
110
121
|
planEviction?: typeof planEviction;
|
|
111
122
|
getMemorySection?: (() => string) | undefined;
|
|
@@ -121,7 +132,7 @@ export interface LiveContextEstimate {
|
|
|
121
132
|
* did not see.
|
|
122
133
|
*/
|
|
123
134
|
tokens: number;
|
|
124
|
-
/**
|
|
135
|
+
/** Structural projection; includes the legacy usage floor when no live anchor is trusted. */
|
|
125
136
|
estimatedTokens: number;
|
|
126
137
|
/**
|
|
127
138
|
* Provider-attested prompt tokens for the messages up to the last reconciled
|
|
@@ -187,7 +198,10 @@ export interface TurnContext {
|
|
|
187
198
|
instructions?: string,
|
|
188
199
|
triggerOverride?: CompactionTrigger,
|
|
189
200
|
pendingUserText?: string,
|
|
201
|
+
pendingSkillPolicy?: PendingSkillToolPolicy,
|
|
202
|
+
signal?: AbortSignal,
|
|
190
203
|
): Promise<boolean>;
|
|
204
|
+
cancelCompaction(): void;
|
|
191
205
|
postToolContinuationGuard(
|
|
192
206
|
agentRuntime: AgentRuntime,
|
|
193
207
|
signal?: AbortSignal,
|
|
@@ -244,6 +258,7 @@ function evictionSkipMessage(
|
|
|
244
258
|
export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
245
259
|
const { state, middleware } = deps;
|
|
246
260
|
const compactionTrigger = new AutoCompactionTrigger<CompactResult | null>();
|
|
261
|
+
let compactionController: AbortController | null = null;
|
|
247
262
|
|
|
248
263
|
let currentContextSnapshot: ContextSnapshot | null = null;
|
|
249
264
|
/**
|
|
@@ -252,14 +267,25 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
252
267
|
*
|
|
253
268
|
* `tokens` is the provider's own prompt count for that call plus the output
|
|
254
269
|
* it produced, which together are what the next call's prompt carries for
|
|
255
|
-
* the same messages.
|
|
256
|
-
*
|
|
257
|
-
*
|
|
270
|
+
* the same messages. The anchored message prefix identifies that history,
|
|
271
|
+
* so anything appended since is priced by estimate and added on top.
|
|
272
|
+
* Unlike the per-message usage anchor inside
|
|
258
273
|
* `estimateAgentContextTokens`, this survives `contextUsageInvalidated`:
|
|
259
274
|
* a working-set projection subtracts the tokens it removed rather than
|
|
260
275
|
* throwing the attestation away.
|
|
261
276
|
*/
|
|
262
|
-
let reconciledAnchor: {
|
|
277
|
+
let reconciledAnchor: {
|
|
278
|
+
tokens: number;
|
|
279
|
+
anchoredMessages: ReadonlyArray<AgentMessage>;
|
|
280
|
+
runtime: AgentRuntime;
|
|
281
|
+
model: AgentRuntime["agent"]["state"]["model"];
|
|
282
|
+
modelKey: string;
|
|
283
|
+
targetId: string;
|
|
284
|
+
runtimeId: string;
|
|
285
|
+
wireModelId: string;
|
|
286
|
+
systemPromptTokens: number;
|
|
287
|
+
toolSchemaTokens: number;
|
|
288
|
+
} | null = null;
|
|
263
289
|
let lastCompactionEvent: { stage: string; tokensBefore: number; tokensAfter: number; trigger: string } | null = null;
|
|
264
290
|
// Last settled run's provider cache usage plus whether the compiled system
|
|
265
291
|
// prompt was reused. Shown together in /context so "prompt reused" can
|
|
@@ -292,11 +318,10 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
292
318
|
let resumedPromptHash: string | null = null;
|
|
293
319
|
const sessionWorkingContextPaths = new Set<string>();
|
|
294
320
|
let pendingPromptLogEntry: SessionPromptCompileRecord | null = null;
|
|
295
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
298
|
-
|
|
299
|
-
let emptyAutoCompactTurnId: string | null = null;
|
|
321
|
+
// Reuse an empty automatic attempt only for identical ledger and provider
|
|
322
|
+
// context. Same-turn tool growth or same-length content replacement must
|
|
323
|
+
// get a fresh cut; ordinary below-threshold checks never fingerprint it.
|
|
324
|
+
let emptyAutoCompactContextKey: string | null = null;
|
|
300
325
|
|
|
301
326
|
// Cache-disturbance honesty (T3.3). Accumulate every known local-runtime
|
|
302
327
|
// disturbance and prefix-byte change since the last settled run. The next
|
|
@@ -549,27 +574,36 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
549
574
|
return { contextWindow: 0, contextWindowSource: null, contextWindowSlots: null };
|
|
550
575
|
};
|
|
551
576
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
* described was rewritten beneath it.
|
|
560
|
-
*/
|
|
561
|
-
const reconciledAnchoredTokens = (agentRuntime: AgentRuntime, pendingUserTokens: number): number | null => {
|
|
577
|
+
const anchorModelKey = (agentRuntime: AgentRuntime): string => {
|
|
578
|
+
const model = agentRuntime.agent.state.model;
|
|
579
|
+
return JSON.stringify([model?.id, model?.provider, model?.api, model?.baseUrl]);
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
/** Price appended history separately so eviction can retain it without folding in static growth twice. */
|
|
583
|
+
const reconciledHistoryTokens = (agentRuntime: AgentRuntime): number | null => {
|
|
562
584
|
const anchor = reconciledAnchor;
|
|
563
585
|
if (!anchor) return null;
|
|
564
586
|
const messages = agentRuntime.agent.state.messages;
|
|
565
|
-
if (
|
|
587
|
+
if (
|
|
588
|
+
anchor.runtime !== agentRuntime ||
|
|
589
|
+
anchor.model !== agentRuntime.agent.state.model ||
|
|
590
|
+
anchor.modelKey !== anchorModelKey(agentRuntime) ||
|
|
591
|
+
anchor.targetId !== agentRuntime.targetId ||
|
|
592
|
+
anchor.runtimeId !== agentRuntime.runtimeId ||
|
|
593
|
+
anchor.wireModelId !== agentRuntime.wireModelId ||
|
|
594
|
+
anchor.anchoredMessages.length > messages.length ||
|
|
595
|
+
anchor.anchoredMessages.some((message, index) => message !== messages[index])
|
|
596
|
+
) {
|
|
597
|
+
reconciledAnchor = null;
|
|
598
|
+
return null;
|
|
599
|
+
}
|
|
566
600
|
let tail = 0;
|
|
567
|
-
for (let i = anchor.
|
|
601
|
+
for (let i = anchor.anchoredMessages.length; i < messages.length; i += 1) {
|
|
568
602
|
const message = messages[i];
|
|
569
603
|
if (message === undefined) continue;
|
|
570
604
|
tail += estimateAgentMessageTokens(message);
|
|
571
605
|
}
|
|
572
|
-
return anchor.tokens + tail
|
|
606
|
+
return anchor.tokens + tail;
|
|
573
607
|
};
|
|
574
608
|
|
|
575
609
|
const liveContextEstimate = (agentRuntime: AgentRuntime, pendingUserText?: string): LiveContextEstimate => {
|
|
@@ -581,8 +615,22 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
581
615
|
...(pendingUserText !== undefined ? { pendingUserText } : {}),
|
|
582
616
|
};
|
|
583
617
|
const breakdown = estimateAgentContextBreakdown(estimateInput);
|
|
584
|
-
const
|
|
585
|
-
const
|
|
618
|
+
const historyTokens = reconciledHistoryTokens(agentRuntime);
|
|
619
|
+
const anchor = reconciledAnchor;
|
|
620
|
+
// Provider usage already includes the old system prompt and schemas.
|
|
621
|
+
// Price only positive growth, separately: shrinking one must not hide
|
|
622
|
+
// growth in the other when the measured prompt exceeds chars/4.
|
|
623
|
+
const reconciledTokens =
|
|
624
|
+
historyTokens !== null && anchor
|
|
625
|
+
? historyTokens +
|
|
626
|
+
breakdown.pendingUserTokens +
|
|
627
|
+
Math.max(0, breakdown.systemPromptTokens - anchor.systemPromptTokens) +
|
|
628
|
+
Math.max(0, breakdown.toolSchemaTokens - anchor.toolSchemaTokens)
|
|
629
|
+
: null;
|
|
630
|
+
const estimatedTokens =
|
|
631
|
+
reconciledTokens === null
|
|
632
|
+
? estimateAgentContextTokens(estimateInput)
|
|
633
|
+
: breakdown.systemPromptTokens + breakdown.messageTokens + breakdown.pendingUserTokens + breakdown.toolSchemaTokens;
|
|
586
634
|
return {
|
|
587
635
|
// The estimate is a floor, not a competing verdict: it prices material
|
|
588
636
|
// the attested call never saw, so a provider count below it would be
|
|
@@ -601,13 +649,20 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
601
649
|
* what the planner priced out against the same projection and re-anchor on
|
|
602
650
|
* the refreshed list, instead of discarding the figure and falling back to
|
|
603
651
|
* pure chars/4 exactly when the accounting matters most (issue #227).
|
|
604
|
-
*
|
|
652
|
+
* Materialize history before rebuilding the list; otherwise advancing the
|
|
653
|
+
* anchor would lose tool results appended since the last measured call.
|
|
654
|
+
* Static baselines stay tied to that call until the next reconciliation.
|
|
605
655
|
*/
|
|
606
|
-
const carryReconciledAnchorThroughProjection = (
|
|
607
|
-
|
|
656
|
+
const carryReconciledAnchorThroughProjection = (
|
|
657
|
+
agentRuntime: AgentRuntime,
|
|
658
|
+
historyTokens: number | null,
|
|
659
|
+
tokensRemoved: number,
|
|
660
|
+
): void => {
|
|
661
|
+
if (!reconciledAnchor || historyTokens === null) return;
|
|
608
662
|
reconciledAnchor = {
|
|
609
|
-
|
|
610
|
-
|
|
663
|
+
...reconciledAnchor,
|
|
664
|
+
tokens: Math.max(0, historyTokens - Math.max(0, tokensRemoved)),
|
|
665
|
+
anchoredMessages: [...agentRuntime.agent.state.messages],
|
|
611
666
|
};
|
|
612
667
|
};
|
|
613
668
|
|
|
@@ -679,14 +734,57 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
679
734
|
instructions?: string,
|
|
680
735
|
triggerOverride?: CompactionTrigger,
|
|
681
736
|
pendingUserText?: string,
|
|
737
|
+
pendingSkillPolicy?: PendingSkillToolPolicy,
|
|
738
|
+
signal?: AbortSignal,
|
|
682
739
|
): Promise<boolean> => {
|
|
683
740
|
if (!deps.readSessionEntries) return false;
|
|
684
|
-
|
|
685
|
-
|
|
741
|
+
// Overflow forces a fit attempt even below the automatic threshold, but
|
|
742
|
+
// still needs the request budget and active task. Manual force keeps its defaults.
|
|
743
|
+
const useRequestBudget = !force || triggerOverride === "overflow";
|
|
744
|
+
const activeAutoTurnId = useRequestBudget ? state.activeUserTurnId : null;
|
|
745
|
+
const skillContextState = mainSkillContextState(
|
|
746
|
+
filterEntriesToActivePath(deps.readSessionEntries(), state.lastTurnId ?? undefined),
|
|
747
|
+
pendingSkillPolicy ?? state.currentPendingSkillPolicy ?? state.activeSkillSurface,
|
|
748
|
+
);
|
|
686
749
|
const settings = deps.getSettings();
|
|
687
750
|
const cfg = settings.context.compaction;
|
|
688
751
|
const autoEnabled = cfg?.auto !== false;
|
|
689
752
|
if (!force && !autoEnabled) return false;
|
|
753
|
+
const compactionThreshold = cfg?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
|
|
754
|
+
const pressureEstimate = force ? null : liveContextEstimate(agentRuntime, pendingUserText);
|
|
755
|
+
if (
|
|
756
|
+
pressureEstimate &&
|
|
757
|
+
!shouldCompact(pressureEstimate.tokens, compactionThreshold, pressureEstimate.contextWindow).shouldCompact
|
|
758
|
+
)
|
|
759
|
+
return false;
|
|
760
|
+
// Empty cuts are reusable only while their source and provider context
|
|
761
|
+
// remain unchanged. Tools can grow the same user turn into a useful cut.
|
|
762
|
+
const attemptKey =
|
|
763
|
+
!force && activeAutoTurnId
|
|
764
|
+
? createHash("sha256")
|
|
765
|
+
.update(
|
|
766
|
+
JSON.stringify({
|
|
767
|
+
turn: activeAutoTurnId,
|
|
768
|
+
leaf: state.lastTurnId,
|
|
769
|
+
entries: deps.readSessionEntries(),
|
|
770
|
+
context: {
|
|
771
|
+
systemPrompt: agentRuntime.agent.state.systemPrompt,
|
|
772
|
+
messages: agentRuntime.agent.state.messages,
|
|
773
|
+
tools: agentRuntime.agent.state.tools,
|
|
774
|
+
model: agentRuntime.agent.state.model,
|
|
775
|
+
thinkingLevel: agentRuntime.agent.state.thinkingLevel,
|
|
776
|
+
},
|
|
777
|
+
pendingUserText,
|
|
778
|
+
skillContextState,
|
|
779
|
+
estimate: pressureEstimate,
|
|
780
|
+
compaction: cfg,
|
|
781
|
+
workingSet: settings.context.workingSet,
|
|
782
|
+
output: settings.chat.maxOutputTokens,
|
|
783
|
+
}),
|
|
784
|
+
)
|
|
785
|
+
.digest("hex")
|
|
786
|
+
: null;
|
|
787
|
+
if (attemptKey && emptyAutoCompactContextKey === attemptKey) return false;
|
|
690
788
|
let preSummaryStageActed = false;
|
|
691
789
|
// G1 from smoke pass 2: a short session generates all its pressure inside
|
|
692
790
|
// the protection window, the non-destructive layer finds nothing, and the
|
|
@@ -695,16 +793,14 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
695
793
|
// actually follows.
|
|
696
794
|
let evictionSkipNotice: string | null = null;
|
|
697
795
|
const rememberEmptyAutomaticAttempt = (): void => {
|
|
698
|
-
if (!force && !preSummaryStageActed &&
|
|
796
|
+
if (!force && !preSummaryStageActed && attemptKey) emptyAutoCompactContextKey = attemptKey;
|
|
699
797
|
};
|
|
700
798
|
|
|
701
|
-
const compactionThreshold = cfg?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
|
|
702
799
|
const trigger: CompactionTrigger = triggerOverride ?? (force ? "force" : "auto");
|
|
703
800
|
|
|
704
|
-
if (
|
|
705
|
-
const estimate =
|
|
801
|
+
if (pressureEstimate) {
|
|
802
|
+
const estimate = pressureEstimate;
|
|
706
803
|
const verdict = shouldCompact(estimate.tokens, compactionThreshold, estimate.contextWindow);
|
|
707
|
-
if (!verdict.shouldCompact) return false;
|
|
708
804
|
|
|
709
805
|
// One-release compatibility escape hatch. This is the destructive
|
|
710
806
|
// pre-stage that working-set eviction replaces; keep it byte-for-byte
|
|
@@ -808,6 +904,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
808
904
|
middleware.fireCompactionHook("working_set_evict", "pressure", estimate.tokens);
|
|
809
905
|
emitCompactionActivity("started", "compacting context (working-set eviction)");
|
|
810
906
|
try {
|
|
907
|
+
const historyTokens = reconciledHistoryTokens(agentRuntime);
|
|
811
908
|
deps.session.appendEntry({
|
|
812
909
|
...buildEvictionFields(planned, {
|
|
813
910
|
trigger: "pressure",
|
|
@@ -820,7 +917,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
820
917
|
});
|
|
821
918
|
noteColdReason("working_set_evict");
|
|
822
919
|
refreshAgentMessagesFromSession(agentRuntime);
|
|
823
|
-
carryReconciledAnchorThroughProjection(agentRuntime, planned.tokensBefore - planned.tokensAfter);
|
|
920
|
+
carryReconciledAnchorThroughProjection(agentRuntime, historyTokens, planned.tokensBefore - planned.tokensAfter);
|
|
824
921
|
|
|
825
922
|
const postEvictionSnapshot = captureRuntimeContextSnapshot(
|
|
826
923
|
agentRuntime,
|
|
@@ -898,13 +995,69 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
898
995
|
// useful ahead of it.
|
|
899
996
|
if (evictionSkipNotice) deps.emitNotice(evictionSkipNotice);
|
|
900
997
|
let result: CompactResult | null = null;
|
|
901
|
-
|
|
998
|
+
// Compare full runtime estimates on both sides. The current snapshot and
|
|
999
|
+
// result.tokensBefore may instead carry provider-calibrated history usage.
|
|
1000
|
+
const snapshotMetadata =
|
|
1001
|
+
currentContextSnapshot && currentContextSnapshot.systemPrompt === agentRuntime.agent.state.systemPrompt
|
|
1002
|
+
? { promptSegments: currentContextSnapshot.promptSegments, promptHash: currentContextSnapshot.promptHash }
|
|
1003
|
+
: {};
|
|
1004
|
+
const preCompactSnapshot = captureRuntimeContextSnapshot(
|
|
1005
|
+
agentRuntime,
|
|
1006
|
+
state.activeUserTurnId || "compaction",
|
|
1007
|
+
compactionThreshold,
|
|
1008
|
+
snapshotMetadata,
|
|
1009
|
+
);
|
|
1010
|
+
let budget:
|
|
1011
|
+
| Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">
|
|
1012
|
+
| undefined = skillContextState !== undefined ? { skillContextState } : undefined;
|
|
1013
|
+
if (useRequestBudget) {
|
|
1014
|
+
const estimate = liveContextEstimate(agentRuntime, pendingUserText);
|
|
1015
|
+
const output = Math.min(
|
|
1016
|
+
resolveReservedOutputTokens(agentRuntime.agent.state.model?.maxTokens, {
|
|
1017
|
+
api: agentRuntime.agent.state.model?.api ?? "",
|
|
1018
|
+
contextWindow: estimate.contextWindow,
|
|
1019
|
+
inputTokens: estimate.tokens,
|
|
1020
|
+
}),
|
|
1021
|
+
settings.chat.maxOutputTokens > 0 ? settings.chat.maxOutputTokens : Number.POSITIVE_INFINITY,
|
|
1022
|
+
);
|
|
1023
|
+
const inputTarget = Math.min(estimate.contextWindow * compactionThreshold, estimate.contextWindow - output);
|
|
1024
|
+
const staticTokens = estimate.breakdown.systemPromptTokens + estimate.breakdown.toolSchemaTokens;
|
|
1025
|
+
const calibration = Math.max(
|
|
1026
|
+
0,
|
|
1027
|
+
estimate.tokens - staticTokens - estimate.breakdown.messageTokens - estimate.breakdown.pendingUserTokens,
|
|
1028
|
+
);
|
|
1029
|
+
// Split available history space between the recent suffix and the
|
|
1030
|
+
// checkpoint (including verbatim active instructions). The cut remains
|
|
1031
|
+
// structural, so the unchanged continuation guard verifies the result.
|
|
1032
|
+
const historyBudget = inputTarget - staticTokens - estimate.breakdown.pendingUserTokens - calibration;
|
|
1033
|
+
budget = {
|
|
1034
|
+
...budget,
|
|
1035
|
+
keepRecentTokens: Math.min(DEFAULT_KEEP_RECENT_TOKENS, Math.max(1, Math.floor(historyBudget / 2))),
|
|
1036
|
+
...(activeAutoTurnId ? { preserveUserTurnId: activeAutoTurnId } : {}),
|
|
1037
|
+
};
|
|
1038
|
+
}
|
|
1039
|
+
let summarySignal = compactionController?.signal;
|
|
902
1040
|
try {
|
|
903
|
-
result = await compactionTrigger.fire(
|
|
1041
|
+
result = await compactionTrigger.fire(async () => {
|
|
1042
|
+
const controller = new AbortController();
|
|
1043
|
+
compactionController = controller;
|
|
1044
|
+
summarySignal = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
|
|
1045
|
+
try {
|
|
1046
|
+
return (
|
|
1047
|
+
(await deps.autoCompact?.(instructions, trigger, {
|
|
1048
|
+
...budget,
|
|
1049
|
+
signal: summarySignal,
|
|
1050
|
+
})) ?? null
|
|
1051
|
+
);
|
|
1052
|
+
} finally {
|
|
1053
|
+
if (compactionController === controller) compactionController = null;
|
|
1054
|
+
}
|
|
1055
|
+
});
|
|
904
1056
|
} catch (error) {
|
|
905
1057
|
if (!summaryLifecycleStarted) startSummaryLifecycle();
|
|
906
1058
|
emitCompactionActivity("failed", compactionFailureMessage(error));
|
|
907
1059
|
deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
|
|
1060
|
+
summarySignal?.throwIfAborted();
|
|
908
1061
|
throw error;
|
|
909
1062
|
}
|
|
910
1063
|
if (!result || result.summary.length === 0) {
|
|
@@ -934,33 +1087,36 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
934
1087
|
agentRuntime,
|
|
935
1088
|
state.activeUserTurnId || "compaction",
|
|
936
1089
|
compactionThreshold,
|
|
1090
|
+
snapshotMetadata,
|
|
937
1091
|
);
|
|
938
1092
|
currentContextSnapshot = postCompactSnapshot;
|
|
1093
|
+
persistContextSnapshot(preCompactSnapshot);
|
|
939
1094
|
persistContextSnapshot(postCompactSnapshot);
|
|
940
1095
|
|
|
1096
|
+
const tokensBefore = snapshotInputTokens(preCompactSnapshot);
|
|
941
1097
|
const tokensAfter = snapshotInputTokens(postCompactSnapshot);
|
|
942
1098
|
lastCompactionEvent = {
|
|
943
1099
|
stage: "llm_summary",
|
|
944
|
-
tokensBefore
|
|
1100
|
+
tokensBefore,
|
|
945
1101
|
tokensAfter,
|
|
946
1102
|
trigger,
|
|
947
1103
|
};
|
|
948
1104
|
deps.bus?.emit(BusChannels.ContextPruned, {
|
|
949
1105
|
stage: "llm_summary",
|
|
950
|
-
tokensBefore
|
|
1106
|
+
tokensBefore,
|
|
951
1107
|
tokensAfter,
|
|
952
1108
|
trigger,
|
|
953
|
-
snapshotIdBefore:
|
|
1109
|
+
snapshotIdBefore: preCompactSnapshot.snapshotId,
|
|
954
1110
|
snapshotIdAfter: postCompactSnapshot.snapshotId,
|
|
955
1111
|
at: Date.now(),
|
|
956
1112
|
} satisfies ContextPrunedPayload);
|
|
957
|
-
emitCompactionActivity("completed", `compacted ~${
|
|
1113
|
+
emitCompactionActivity("completed", `compacted ~${tokensBefore} -> ~${tokensAfter} tokens`);
|
|
958
1114
|
|
|
959
1115
|
deps.emitNotice(
|
|
960
1116
|
renderCompactionSummaryLine({
|
|
961
1117
|
messagesSummarized: result.messagesSummarized,
|
|
962
1118
|
summaryChars: result.summary.length,
|
|
963
|
-
tokensBefore
|
|
1119
|
+
tokensBefore,
|
|
964
1120
|
isSplitTurn: result.isSplitTurn,
|
|
965
1121
|
}),
|
|
966
1122
|
);
|
|
@@ -990,6 +1146,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
990
1146
|
rememberedLoadedContextWindow,
|
|
991
1147
|
refreshAgentMessagesFromSession,
|
|
992
1148
|
runAutoCompact,
|
|
1149
|
+
cancelCompaction: () => compactionController?.abort(),
|
|
993
1150
|
|
|
994
1151
|
setCurrentSnapshot(snapshot: ContextSnapshot): void {
|
|
995
1152
|
currentContextSnapshot = snapshot;
|
|
@@ -1004,13 +1161,22 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1004
1161
|
// Cached prompt tokens still occupy the window; providers report them
|
|
1005
1162
|
// outside `input`, so the attested prompt is the three summed.
|
|
1006
1163
|
const promptTokens = (usage.input || 0) + (usage.cacheRead || 0) + (usage.cacheWrite || 0);
|
|
1007
|
-
const
|
|
1008
|
-
if (promptTokens > 0 &&
|
|
1164
|
+
const runtime = state.runtime;
|
|
1165
|
+
if (promptTokens > 0 && runtime) {
|
|
1166
|
+
const breakdown = estimateAgentContextBreakdown({ ...runtime.agent.state, messages: [] });
|
|
1009
1167
|
// The output of this call is part of the next call's prompt for the
|
|
1010
1168
|
// same messages, which is why it is folded in here.
|
|
1011
1169
|
reconciledAnchor = {
|
|
1012
1170
|
tokens: promptTokens + (usage.output || 0),
|
|
1013
|
-
|
|
1171
|
+
anchoredMessages: [...runtime.agent.state.messages],
|
|
1172
|
+
runtime,
|
|
1173
|
+
model: runtime.agent.state.model,
|
|
1174
|
+
modelKey: anchorModelKey(runtime),
|
|
1175
|
+
targetId: runtime.targetId,
|
|
1176
|
+
runtimeId: runtime.runtimeId,
|
|
1177
|
+
wireModelId: runtime.wireModelId,
|
|
1178
|
+
systemPromptTokens: breakdown.systemPromptTokens,
|
|
1179
|
+
toolSchemaTokens: breakdown.toolSchemaTokens,
|
|
1014
1180
|
};
|
|
1015
1181
|
}
|
|
1016
1182
|
if (!currentContextSnapshot) return;
|
|
@@ -1199,7 +1365,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1199
1365
|
let compacted = false;
|
|
1200
1366
|
if (verdict.shouldCompact) {
|
|
1201
1367
|
try {
|
|
1202
|
-
compacted = await runAutoCompact(agentRuntime, false, undefined, "auto");
|
|
1368
|
+
compacted = await runAutoCompact(agentRuntime, false, undefined, "auto", undefined, undefined, signal);
|
|
1203
1369
|
} catch (err) {
|
|
1204
1370
|
throw new Error(
|
|
1205
1371
|
`[Clio Coder] post-tool context guard could not compact before continuation: ${err instanceof Error ? err.message : String(err)}`,
|
|
@@ -1379,6 +1545,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1379
1545
|
},
|
|
1380
1546
|
|
|
1381
1547
|
resetForSession(): void {
|
|
1548
|
+
compactionController?.abort();
|
|
1382
1549
|
// An in-process switch replaces the whole prefix: the backend's slot
|
|
1383
1550
|
// still holds the outgoing session's prompt and history, so the first
|
|
1384
1551
|
// turn on the incoming one is expected-cold on every tier, exactly as
|
|
@@ -1397,13 +1564,14 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
1397
1564
|
resumedPromptHash = null;
|
|
1398
1565
|
sessionWorkingContextPaths.clear();
|
|
1399
1566
|
pendingPromptLogEntry = null;
|
|
1400
|
-
|
|
1567
|
+
emptyAutoCompactContextKey = null;
|
|
1401
1568
|
reconciledAnchor = null;
|
|
1402
1569
|
const session = deps.session?.current();
|
|
1403
1570
|
currentContextSnapshot = session ? getLatestContextSnapshot(session) : null;
|
|
1404
1571
|
},
|
|
1405
1572
|
|
|
1406
1573
|
dispose(): void {
|
|
1574
|
+
compactionController?.abort();
|
|
1407
1575
|
for (const unsubscribe of unsubscribeColdReasonSources) unsubscribe?.();
|
|
1408
1576
|
},
|
|
1409
1577
|
};
|
|
@@ -268,7 +268,9 @@ export function createTurnMiddleware(deps: TurnMiddlewareDeps): TurnMiddleware {
|
|
|
268
268
|
|
|
269
269
|
flushPendingReminders(): string {
|
|
270
270
|
if (pendingReminders.length === 0) return "";
|
|
271
|
-
|
|
271
|
+
// Severity affects host actions, not the text delivered to the model.
|
|
272
|
+
// A paired continuation/info and reminder/warn still needs one copy.
|
|
273
|
+
const messages = [...new Set(pendingReminders.map((entry) => entry.message))];
|
|
272
274
|
pendingReminders.length = 0;
|
|
273
275
|
return `<system-reminder>\n${messages.join("\n\n")}\n</system-reminder>`;
|
|
274
276
|
},
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
type AssistantCallTiming,
|
|
18
18
|
assistantSessionPayload,
|
|
19
19
|
estimatedUsageForInterruptedTurn,
|
|
20
|
+
explainInterruptedAssistant,
|
|
20
21
|
extractUserText,
|
|
21
22
|
hasPersistableAssistantContent,
|
|
22
23
|
hasStructuredToolCall,
|
|
@@ -220,10 +221,12 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
220
221
|
|
|
221
222
|
const appendAssistantTurn = (message: AgentMessage, timing?: AssistantCallTiming | null): void => {
|
|
222
223
|
if (message?.role !== "assistant") return;
|
|
224
|
+
if (persistedAssistantMessages.has(message)) return;
|
|
223
225
|
// A loop-guard interrupt already persisted a durable closing turn with the
|
|
224
226
|
// stop reason; drop the empty aborted message the abort leaves behind so
|
|
225
227
|
// the operator does not see a hollow "request aborted" turn after it.
|
|
226
228
|
if (state.activeInterruptReason !== null && isEmptyAbortedAssistantMessage(message)) return;
|
|
229
|
+
if (explainInterruptedAssistant(message, state.activeInterruptReason)) state.interruptedAssistantMessage = message;
|
|
227
230
|
const failure = terminalFailureFromAssistantMessage(message);
|
|
228
231
|
const payload = assistantSessionPayload(message, failure);
|
|
229
232
|
if (timing) payload.timing = timing;
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
patchToolChoiceNonePayload,
|
|
33
33
|
} from "../engine/provider-payload.js";
|
|
34
34
|
import type { AgentEvent, AgentMessage, EngineModel, Usage } from "../engine/types.js";
|
|
35
|
-
import type { resolveAgentTools,
|
|
35
|
+
import type { resolveAgentTools, ToolFinishEvent, ToolTelemetry } from "../tools/agent-tools.js";
|
|
36
36
|
import {
|
|
37
37
|
type AssistantCallTiming,
|
|
38
38
|
type BackendCacheVerdict,
|
|
@@ -162,7 +162,10 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
162
162
|
* a call whose end event never arrives leaves at most one stale entry, which
|
|
163
163
|
* the next run with the same id would overwrite.
|
|
164
164
|
*/
|
|
165
|
-
const toolOutcomes = new Map<
|
|
165
|
+
const toolOutcomes = new Map<
|
|
166
|
+
string,
|
|
167
|
+
Pick<ToolFinishEvent, "outcome" | "reason" | "durationMs" | "ruleId" | "reasonCode" | "policySource">
|
|
168
|
+
>();
|
|
166
169
|
const toolTelemetry: ToolTelemetry = {
|
|
167
170
|
onFinish(event) {
|
|
168
171
|
if (event.toolCallId === undefined) return;
|
|
@@ -170,6 +173,9 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
170
173
|
outcome: event.outcome,
|
|
171
174
|
...(event.reason === undefined ? {} : { reason: event.reason }),
|
|
172
175
|
durationMs: event.durationMs,
|
|
176
|
+
...(event.ruleId === undefined ? {} : { ruleId: event.ruleId }),
|
|
177
|
+
...(event.reasonCode === undefined ? {} : { reasonCode: event.reasonCode }),
|
|
178
|
+
...(event.policySource === undefined ? {} : { policySource: event.policySource }),
|
|
173
179
|
});
|
|
174
180
|
},
|
|
175
181
|
};
|
|
@@ -651,6 +657,9 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
651
657
|
? {}
|
|
652
658
|
: {
|
|
653
659
|
outcome: admission.outcome,
|
|
660
|
+
...(admission.ruleId === undefined ? {} : { ruleId: admission.ruleId }),
|
|
661
|
+
...(admission.reasonCode === undefined ? {} : { reasonCode: admission.reasonCode }),
|
|
662
|
+
...(admission.policySource === undefined ? {} : { policySource: admission.policySource }),
|
|
654
663
|
...(admission.reason === undefined ? {} : { blockReason: admission.reason }),
|
|
655
664
|
}),
|
|
656
665
|
} as typeof event;
|
|
@@ -88,19 +88,19 @@ export interface ChatTurnState {
|
|
|
88
88
|
/** The user turn id of the in-flight submit; null between turns. */
|
|
89
89
|
activeUserTurnId: string | null;
|
|
90
90
|
/**
|
|
91
|
-
* Set by
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* in-flight tool results have landed. Cleared there, and defensively at the
|
|
96
|
-
* start of each submit.
|
|
91
|
+
* Set by an operator or explained interrupt. A nonempty aborted assistant
|
|
92
|
+
* carries this reason; hollow abort messages are suppressed and replaced
|
|
93
|
+
* by one durable closing turn after in-flight tool results have landed.
|
|
94
|
+
* Cleared at settlement and defensively at the start of each submit.
|
|
97
95
|
*/
|
|
98
96
|
activeInterruptReason: string | null;
|
|
97
|
+
/** The provider's nonempty aborted message closes this interrupt without a synthetic second assistant. */
|
|
98
|
+
interruptedAssistantMessage: AgentMessage | null;
|
|
99
99
|
/**
|
|
100
100
|
* Estimated spend of the cancelled call whose hollow aborted message the
|
|
101
|
-
* interrupt suppressed
|
|
102
|
-
*
|
|
103
|
-
*
|
|
101
|
+
* interrupt suppressed. The message never reaches the ledger, so the closing
|
|
102
|
+
* turn persisted in submit's finally carries this instead of an estimate
|
|
103
|
+
* derived from its own notice text. Cleared with
|
|
104
104
|
* `activeInterruptReason`.
|
|
105
105
|
*/
|
|
106
106
|
interruptedUsage: Record<string, unknown> | null;
|
|
@@ -148,6 +148,7 @@ export function createTurnState(initialThinkingLevel: ThinkingLevel): ChatTurnSt
|
|
|
148
148
|
replayedContextMessages: [],
|
|
149
149
|
activeUserTurnId: null,
|
|
150
150
|
activeInterruptReason: null,
|
|
151
|
+
interruptedAssistantMessage: null,
|
|
151
152
|
interruptedUsage: null,
|
|
152
153
|
synthesisToolLock: false,
|
|
153
154
|
toolProseAbortReason: null,
|
|
@@ -44,6 +44,7 @@ import { clockLocal } from "../format-time.js";
|
|
|
44
44
|
import { abbreviateModelId } from "../theme/index.js";
|
|
45
45
|
|
|
46
46
|
export type ViewArtifactCategory =
|
|
47
|
+
| "transcript"
|
|
47
48
|
| "accountability"
|
|
48
49
|
| "evidence"
|
|
49
50
|
| "receipt"
|
|
@@ -86,6 +87,7 @@ export interface ArtifactProvider {
|
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
export interface ArtifactProviderDeps {
|
|
90
|
+
readTranscript?: (() => ViewArtifact[]) | undefined;
|
|
89
91
|
stateDir: string;
|
|
90
92
|
dataDir?: string | undefined;
|
|
91
93
|
dispatch?: Pick<DispatchContract, "listRuns" | "getRun"> | undefined;
|
|
@@ -94,6 +96,7 @@ export interface ArtifactProviderDeps {
|
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
export const VIEW_ARTIFACT_CATEGORIES: readonly ViewArtifactCategory[] = [
|
|
99
|
+
"transcript",
|
|
97
100
|
"accountability",
|
|
98
101
|
"evidence",
|
|
99
102
|
"receipt",
|
|
@@ -1560,6 +1563,7 @@ export class SafetyAuditArtifactProvider implements ArtifactProvider {
|
|
|
1560
1563
|
|
|
1561
1564
|
export function createDefaultArtifactProviders(deps: ArtifactProviderDeps): ArtifactProvider[] {
|
|
1562
1565
|
return [
|
|
1566
|
+
{ category: "transcript", list: async () => deps.readTranscript?.() ?? [] },
|
|
1563
1567
|
new AccountabilityArtifactProvider(deps),
|
|
1564
1568
|
new EvidenceArtifactProvider(deps),
|
|
1565
1569
|
new ReceiptArtifactProvider(deps),
|