@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
|
@@ -37,6 +37,7 @@ import { getSharedBus } from "../core/shared-bus.js";
|
|
|
37
37
|
import { isSkillActivation } from "../core/skill-activation.js";
|
|
38
38
|
import { StartupTimer } from "../core/startup-timer.js";
|
|
39
39
|
import { getTerminationCoordinator } from "../core/termination.js";
|
|
40
|
+
import { captureProjectSurface, projectSurfaceTrustNotice } from "../core/workspace-trust.js";
|
|
40
41
|
import { clioDataDir, clioStateDir } from "../core/xdg.js";
|
|
41
42
|
import { renderAgentCatalogSectionsFromSpecs } from "../domains/agents/catalog.js";
|
|
42
43
|
import type { AgentsContract } from "../domains/agents/contract.js";
|
|
@@ -157,10 +158,9 @@ import {
|
|
|
157
158
|
import type { SchedulingContract } from "../domains/scheduling/contract.js";
|
|
158
159
|
import { SchedulingDomainModule } from "../domains/scheduling/index.js";
|
|
159
160
|
import type { CompactionCallObservation } from "../domains/session/compaction/compact.js";
|
|
160
|
-
import { type CompactResult, compact } from "../domains/session/compaction/compact.js";
|
|
161
|
+
import { type CompactInput, type CompactResult, compact } from "../domains/session/compaction/compact.js";
|
|
161
162
|
import { collectSessionEntries } from "../domains/session/compaction/session-entries.js";
|
|
162
163
|
import { estimateTokens } from "../domains/session/compaction/tokens.js";
|
|
163
|
-
import { ceilChars } from "../domains/session/context-accounting.js";
|
|
164
164
|
import type { SessionContract, SessionMeta } from "../domains/session/contract.js";
|
|
165
165
|
import { activeDecisionRefs, createDecisionBoardStore } from "../domains/session/decision-board.js";
|
|
166
166
|
import type { CompactionSummaryEntry, CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
|
|
@@ -615,6 +615,7 @@ function agentRoleToolWarnings(providers: ProvidersContract, settings: Readonly<
|
|
|
615
615
|
async function resolveCompactionModel(
|
|
616
616
|
settings: ClioSettings,
|
|
617
617
|
providers: ProvidersContract,
|
|
618
|
+
signal?: AbortSignal,
|
|
618
619
|
): Promise<CompactionResolution | null> {
|
|
619
620
|
const override = settings.context.compaction.model;
|
|
620
621
|
let targetId = settings.chat.target;
|
|
@@ -635,7 +636,7 @@ async function resolveCompactionModel(
|
|
|
635
636
|
wireModelId = selected.ref.model;
|
|
636
637
|
}
|
|
637
638
|
if (!targetId || !wireModelId) return null;
|
|
638
|
-
await prepareBackgroundModelMetadata(providers, targetId);
|
|
639
|
+
await prepareBackgroundModelMetadata(providers, targetId, signal);
|
|
639
640
|
const status = providers.list().find((entry) => entry.target.id === targetId);
|
|
640
641
|
if (!status?.available) {
|
|
641
642
|
throw new Error("context.compaction.model target is unavailable; check the selected target with clio-coder targets");
|
|
@@ -674,7 +675,7 @@ async function resolveCompactionModel(
|
|
|
674
675
|
applyModelCapabilityPatch(model, refined.capabilities);
|
|
675
676
|
let apiKey: string | undefined = LOCAL_API_KEY_FALLBACK;
|
|
676
677
|
if (targetRequiresAuth(route.target, route.runtime)) {
|
|
677
|
-
const auth = await providers.auth.resolveForTarget(route.target, route.runtime);
|
|
678
|
+
const auth = await providers.auth.resolveForTarget(route.target, route.runtime, signal ? { signal } : undefined);
|
|
678
679
|
if (!auth.available || !auth.apiKey) {
|
|
679
680
|
throw new Error(
|
|
680
681
|
"context.compaction.model authentication is unavailable; authenticate the selected target with clio-coder auth",
|
|
@@ -795,6 +796,8 @@ async function runCompactionFlow(
|
|
|
795
796
|
instructions?: string,
|
|
796
797
|
trigger?: CompactionTrigger,
|
|
797
798
|
observability?: BackgroundMemoryUsageSink,
|
|
799
|
+
budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
|
|
800
|
+
summarize?: CompactInput["summarize"],
|
|
798
801
|
): Promise<CompactResult | null> {
|
|
799
802
|
const meta = session.current();
|
|
800
803
|
if (!meta) {
|
|
@@ -806,8 +809,11 @@ async function runCompactionFlow(
|
|
|
806
809
|
session.current()?.id === meta.id && (session.tree(meta.id).leafId ?? undefined) === activeLeafTurnId;
|
|
807
810
|
const entries = filterEntriesToActivePath(readSessionEntriesForCompact(meta.id), activeLeafTurnId);
|
|
808
811
|
if (entries.length === 0) return null;
|
|
812
|
+
budget?.signal?.throwIfAborted();
|
|
809
813
|
const systemPrompt = await readCompactionSystemPrompt(settings.context.compaction.systemPrompt, meta.cwd);
|
|
810
|
-
|
|
814
|
+
budget?.signal?.throwIfAborted();
|
|
815
|
+
const resolved = await resolveCompactionModel(settings, providers, budget?.signal);
|
|
816
|
+
budget?.signal?.throwIfAborted();
|
|
811
817
|
if (!resolved) {
|
|
812
818
|
throw new Error("no model configured; set chat.target + chat.model");
|
|
813
819
|
}
|
|
@@ -842,6 +848,8 @@ async function runCompactionFlow(
|
|
|
842
848
|
try {
|
|
843
849
|
result = await compact({
|
|
844
850
|
entries,
|
|
851
|
+
...budget,
|
|
852
|
+
...(summarize ? { summarize } : {}),
|
|
845
853
|
onCall: (call) => calls.push(call),
|
|
846
854
|
model: resolved.model,
|
|
847
855
|
...(systemPrompt !== undefined ? { systemPrompt } : {}),
|
|
@@ -859,6 +867,10 @@ async function runCompactionFlow(
|
|
|
859
867
|
} finally {
|
|
860
868
|
releaseEndpointSlot();
|
|
861
869
|
}
|
|
870
|
+
if (budget?.signal?.aborted) {
|
|
871
|
+
preserveCalls();
|
|
872
|
+
budget.signal.throwIfAborted();
|
|
873
|
+
}
|
|
862
874
|
if (!isOriginCurrent()) {
|
|
863
875
|
preserveCalls();
|
|
864
876
|
throw new Error("compaction session or branch changed; summary discarded and originating usage retained");
|
|
@@ -877,6 +889,8 @@ async function runCompactionFlow(
|
|
|
877
889
|
turnId: randomUUID(),
|
|
878
890
|
parentTurnId: result.firstKeptTurnId ?? null,
|
|
879
891
|
summary: result.summary,
|
|
892
|
+
...(result.skillContext ? { skillContext: result.skillContext } : {}),
|
|
893
|
+
...(result.userContext ? { userContext: result.userContext } : {}),
|
|
880
894
|
tokensBefore: result.tokensBefore,
|
|
881
895
|
firstKeptTurnId: result.firstKeptTurnId ?? "",
|
|
882
896
|
messagesSummarized: result.messagesSummarized,
|
|
@@ -940,17 +954,28 @@ export function createProductionAutoCompact(
|
|
|
940
954
|
getSettings: () => ClioSettings,
|
|
941
955
|
providers: ProvidersContract,
|
|
942
956
|
observability?: BackgroundMemoryUsageSink,
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
957
|
+
summarize?: CompactInput["summarize"],
|
|
958
|
+
): (
|
|
959
|
+
instructions?: string,
|
|
960
|
+
trigger?: CompactionTrigger,
|
|
961
|
+
budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
|
|
962
|
+
) => Promise<CompactResult | null> {
|
|
963
|
+
return (instructions, trigger, budget) =>
|
|
964
|
+
runCompactionFlow(session, getSettings(), providers, instructions, trigger, observability, budget, summarize);
|
|
946
965
|
}
|
|
947
966
|
|
|
948
|
-
function estimateTokensFromSummary(
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
967
|
+
function estimateTokensFromSummary(result: CompactResult): number {
|
|
968
|
+
return estimateTokens({
|
|
969
|
+
kind: "compactionSummary",
|
|
970
|
+
turnId: "estimate",
|
|
971
|
+
parentTurnId: null,
|
|
972
|
+
timestamp: "",
|
|
973
|
+
summary: result.summary,
|
|
974
|
+
firstKeptTurnId: result.firstKeptTurnId ?? "",
|
|
975
|
+
tokensBefore: result.tokensBefore,
|
|
976
|
+
...(result.skillContext ? { skillContext: result.skillContext } : {}),
|
|
977
|
+
...(result.userContext ? { userContext: result.userContext } : {}),
|
|
978
|
+
});
|
|
954
979
|
}
|
|
955
980
|
|
|
956
981
|
/**
|
|
@@ -973,7 +998,7 @@ function estimateTokensFromSummary(summary: string): number {
|
|
|
973
998
|
function estimateTokensAfterCompaction(entries: ReadonlyArray<SessionEntry>, result: CompactResult): number {
|
|
974
999
|
let droppedTokens = 0;
|
|
975
1000
|
for (const entry of entries.slice(0, result.firstKeptEntryIndex)) droppedTokens += estimateTokens(entry);
|
|
976
|
-
const summaryTokens = estimateTokensFromSummary(result
|
|
1001
|
+
const summaryTokens = estimateTokensFromSummary(result);
|
|
977
1002
|
// The summary alone is the floor: a session whose dropped estimate exceeds
|
|
978
1003
|
// the measured anchor must not report a negative or sub-summary context.
|
|
979
1004
|
return Math.max(summaryTokens, result.tokensBefore - droppedTokens + summaryTokens);
|
|
@@ -1042,6 +1067,15 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1042
1067
|
termination.installSignalHandlers();
|
|
1043
1068
|
|
|
1044
1069
|
ensureClioState();
|
|
1070
|
+
for (const surface of ["safety", "settings"] as const) {
|
|
1071
|
+
const snapshot = captureProjectSurface(process.cwd(), surface);
|
|
1072
|
+
if (snapshot.verdict === "trusted") continue;
|
|
1073
|
+
for (const file of snapshot.files) {
|
|
1074
|
+
if (file.text !== null || file.error !== undefined) {
|
|
1075
|
+
bootStderr(`[clio-coder:trust] ${projectSurfaceTrustNotice(snapshot, file.path)}\n`);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1045
1079
|
sweepExpiredToolOffloads();
|
|
1046
1080
|
timer.mark("install check");
|
|
1047
1081
|
|
|
@@ -1500,6 +1534,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1500
1534
|
// different generation. The owner slot is anchored here, so user hooks
|
|
1501
1535
|
// keep evaluating after the guards and before the assessors below.
|
|
1502
1536
|
const hookReceiptLog = createHookReceiptLog({ persistPath: join(clioStateDir(), "hook-receipts.json") });
|
|
1537
|
+
let bootHookNotices = true;
|
|
1503
1538
|
const extensionReload = createExtensionReloadCoordinator({
|
|
1504
1539
|
extensions,
|
|
1505
1540
|
middleware,
|
|
@@ -1507,10 +1542,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
|
|
|
1507
1542
|
recordReceipt: (receipt) => hookReceiptLog.record(receipt),
|
|
1508
1543
|
report: (line) => {
|
|
1509
1544
|
if (!interactive) process.stderr.write(`${line}\n`);
|
|
1545
|
+
else if (bootHookNotices) initialNotices.push(line);
|
|
1546
|
+
else bus.emit(BusChannels.ExtensionsLoadIssue, { message: line });
|
|
1510
1547
|
},
|
|
1511
1548
|
onCommitted: (event) => bus.emit(BusChannels.ExtensionsReloaded, event),
|
|
1512
1549
|
});
|
|
1513
1550
|
extensionReload.applyBoot();
|
|
1551
|
+
bootHookNotices = false;
|
|
1514
1552
|
termination.onDrain(() => hookReceiptLog.flush());
|
|
1515
1553
|
// Autonomy is hot-reloaded for interactive and headless admissions. ACP
|
|
1516
1554
|
// server prompts use the snapshot captured at session/new.
|
|
@@ -6,16 +6,12 @@ import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-life
|
|
|
6
6
|
export const APPLICATION_DOUBLE_TAP_MS = 500;
|
|
7
7
|
|
|
8
8
|
const CLOSED_ACTION_ORDER = [
|
|
9
|
+
"clio-coder.output.cycle",
|
|
9
10
|
"clio-coder.notifications.dismiss",
|
|
10
|
-
"clio-coder.tool.expand",
|
|
11
|
-
"clio-coder.tool.expandAll",
|
|
12
|
-
"clio-coder.tool.liveOutput",
|
|
13
11
|
"clio-coder.editor.external",
|
|
14
12
|
"clio-coder.message.followUp",
|
|
15
13
|
"clio-coder.message.interrupt",
|
|
16
14
|
"clio-coder.message.dequeue",
|
|
17
|
-
"clio-coder.thinking.expand",
|
|
18
|
-
"clio-coder.thinking.expandAll",
|
|
19
15
|
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
20
16
|
|
|
21
17
|
export const GLOBAL_ACTION_ORDER = [
|
|
@@ -108,10 +104,6 @@ export interface ApplicationControllerDeps {
|
|
|
108
104
|
listNotifications: () => ReadonlyArray<{ id: string }>;
|
|
109
105
|
dismissNotification: (id: string) => void;
|
|
110
106
|
dismissAllNotifications: () => void;
|
|
111
|
-
toggleLastToolExpanded: () => boolean;
|
|
112
|
-
toggleAllToolsExpanded: () => boolean;
|
|
113
|
-
toggleLastThinking: () => boolean;
|
|
114
|
-
toggleAllThinking: () => boolean;
|
|
115
107
|
shutdownDisposers: ReadonlyArray<() => void>;
|
|
116
108
|
/** Settle the last presentation mutation into an accepted/drained frame. */
|
|
117
109
|
beforeStopUi?: () => Promise<void>;
|
|
@@ -145,8 +137,6 @@ export interface ApplicationController {
|
|
|
145
137
|
handleInput(data: string): ApplicationInputResult;
|
|
146
138
|
handleCtrlC(): void;
|
|
147
139
|
dismissNotifications(): void;
|
|
148
|
-
toggleToolExpansion(): void;
|
|
149
|
-
toggleThinkingExpansion(): void;
|
|
150
140
|
shutdown(): Promise<void>;
|
|
151
141
|
}
|
|
152
142
|
|
|
@@ -163,8 +153,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
|
|
|
163
153
|
let shuttingDown = false;
|
|
164
154
|
let lastCtrlCAt = 0;
|
|
165
155
|
let lastNotificationDismissAt = 0;
|
|
166
|
-
let lastToolExpandAt = 0;
|
|
167
|
-
let lastThinkingExpandAt = 0;
|
|
168
156
|
|
|
169
157
|
const isDoubleTap = (lastAt: number, now: number): boolean => lastAt > 0 && now - lastAt <= APPLICATION_DOUBLE_TAP_MS;
|
|
170
158
|
|
|
@@ -346,22 +334,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
|
|
|
346
334
|
if (first) deps.dismissNotification(first.id);
|
|
347
335
|
};
|
|
348
336
|
|
|
349
|
-
const toggleToolExpansion = (): void => {
|
|
350
|
-
const now = deps.clock.now();
|
|
351
|
-
const doubleTap = isDoubleTap(lastToolExpandAt, now);
|
|
352
|
-
lastToolExpandAt = now;
|
|
353
|
-
const changed = doubleTap ? deps.toggleAllToolsExpanded() : deps.toggleLastToolExpanded();
|
|
354
|
-
if (changed) deps.requestRender();
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
const toggleThinkingExpansion = (): void => {
|
|
358
|
-
const now = deps.clock.now();
|
|
359
|
-
const doubleTap = isDoubleTap(lastThinkingExpandAt, now);
|
|
360
|
-
lastThinkingExpandAt = now;
|
|
361
|
-
const changed = doubleTap ? deps.toggleAllThinking() : deps.toggleLastThinking();
|
|
362
|
-
if (changed) deps.requestRender();
|
|
363
|
-
};
|
|
364
|
-
|
|
365
337
|
const handleInput = (data: string): ApplicationInputResult => {
|
|
366
338
|
const initialOverlayState = deps.getOverlayState();
|
|
367
339
|
if (overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending()) deps.leaderKeys.reset();
|
|
@@ -427,8 +399,6 @@ export function createApplicationController(deps: ApplicationControllerDeps): Ap
|
|
|
427
399
|
handleInput,
|
|
428
400
|
handleCtrlC,
|
|
429
401
|
dismissNotifications,
|
|
430
|
-
toggleToolExpansion,
|
|
431
|
-
toggleThinkingExpansion,
|
|
432
402
|
shutdown,
|
|
433
403
|
};
|
|
434
404
|
}
|
|
@@ -162,10 +162,9 @@ export function isLengthStopAssistantMessage(message: AgentMessage | undefined):
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
/**
|
|
165
|
-
* An aborted assistant message with no
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
* loop-guard interrupt has already written a durable closing turn.
|
|
165
|
+
* An aborted assistant message with no text, thinking, or structured tool
|
|
166
|
+
* call. Only a hollow abort needs a synthetic closing record; streamed
|
|
167
|
+
* thinking belongs to the same durable assistant as any partial answer.
|
|
169
168
|
*/
|
|
170
169
|
export function isEmptyAbortedAssistantMessage(message: AgentMessage | undefined): boolean {
|
|
171
170
|
if (
|
|
@@ -179,9 +178,17 @@ export function isEmptyAbortedAssistantMessage(message: AgentMessage | undefined
|
|
|
179
178
|
}
|
|
180
179
|
if ((message as { stopReason?: unknown }).stopReason !== "aborted") return false;
|
|
181
180
|
if (extractText(message).trim().length > 0) return false;
|
|
181
|
+
if (extractThinking(message).trim().length > 0) return false;
|
|
182
182
|
return !hasStructuredToolCall(message);
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
+
/** Apply host cancellation provenance only to a structurally aborted message. */
|
|
186
|
+
export function explainInterruptedAssistant(message: AgentMessage, reason: string | null): boolean {
|
|
187
|
+
if (reason === null || message.role !== "assistant" || message.stopReason !== "aborted") return false;
|
|
188
|
+
message.errorMessage = reason;
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
185
192
|
function lengthStopMetadata(message: AgentMessage): Record<string, unknown> {
|
|
186
193
|
const usage = (message as { usage?: unknown }).usage;
|
|
187
194
|
const metadata: Record<string, unknown> = {
|
|
@@ -497,6 +504,7 @@ export function assistantSessionPayload(
|
|
|
497
504
|
"model",
|
|
498
505
|
"responseModel",
|
|
499
506
|
"responseId",
|
|
507
|
+
"providerThinkingLevel",
|
|
500
508
|
"gatewayRouting",
|
|
501
509
|
"diagnostics",
|
|
502
510
|
]) {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* machine, and the shared ChatTurnState the modules coordinate through.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
16
17
|
import { BusChannels, type RunAbortSource } from "../core/bus-events.js";
|
|
17
18
|
import type { ClioSettings } from "../core/config.js";
|
|
18
19
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
@@ -45,14 +46,21 @@ import {
|
|
|
45
46
|
} from "../domains/providers/index.js";
|
|
46
47
|
import { type AutonomyLevel, modelMayActivateSkills } from "../domains/safety/autonomy.js";
|
|
47
48
|
import type { ProtectedArtifactState } from "../domains/safety/protected-artifacts.js";
|
|
48
|
-
import type { CompactResult } from "../domains/session/compaction/compact.js";
|
|
49
|
+
import type { CompactInput, CompactResult } from "../domains/session/compaction/compact.js";
|
|
49
50
|
import type { ContextSnapshot, ContextUsageSnapshot } from "../domains/session/context-accounting.js";
|
|
50
51
|
import { ceilChars, snapshotInputTokens } from "../domains/session/context-accounting.js";
|
|
51
52
|
import type { ContextLedger } from "../domains/session/context-ledger.js";
|
|
52
53
|
import type { SessionContract } from "../domains/session/contract.js";
|
|
53
|
-
import
|
|
54
|
+
import {
|
|
55
|
+
type CompactionTrigger,
|
|
56
|
+
latestSkillContextState,
|
|
57
|
+
mainSkillContextState,
|
|
58
|
+
type SessionEntry,
|
|
59
|
+
SKILL_CONTEXT_STATE,
|
|
60
|
+
} from "../domains/session/entries.js";
|
|
54
61
|
import { protectedArtifactStateFromSessionEntries } from "../domains/session/protected-artifacts.js";
|
|
55
62
|
import { isRetryableErrorMessage, type RetrySettings } from "../domains/session/retry.js";
|
|
63
|
+
import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
|
|
56
64
|
import { createEngineAgent } from "../engine/agent.js";
|
|
57
65
|
import { resolveReservedOutputTokens } from "../engine/apis/output-budget.js";
|
|
58
66
|
import { cwdHash } from "../engine/session.js";
|
|
@@ -65,6 +73,7 @@ import {
|
|
|
65
73
|
createPendingSkillToolPolicy,
|
|
66
74
|
detectOverflowFromState,
|
|
67
75
|
detectTerminalFailureFromState,
|
|
76
|
+
explainInterruptedAssistant,
|
|
68
77
|
notConfiguredNotice,
|
|
69
78
|
noticeMessage,
|
|
70
79
|
pendingSkillRequestPreamble,
|
|
@@ -189,6 +198,8 @@ export type ChatLoopEvent =
|
|
|
189
198
|
| ToolApprovalStateEvent;
|
|
190
199
|
|
|
191
200
|
export interface ChatSubmitOptions {
|
|
201
|
+
/** Host-owned run identity, scoped to this submit and its internal continuations. */
|
|
202
|
+
hostRun?: ToolInvokeOptions["hostRun"];
|
|
192
203
|
images?: ReadonlyArray<ImageContent>;
|
|
193
204
|
/** Files already expanded into this session's working context. */
|
|
194
205
|
workingContextPaths?: ReadonlyArray<string>;
|
|
@@ -443,7 +454,11 @@ export interface CreateChatLoopDeps {
|
|
|
443
454
|
* Both sites share an AutoCompactionTrigger so two fires in the same tick
|
|
444
455
|
* coalesce onto one summarization call.
|
|
445
456
|
*/
|
|
446
|
-
autoCompact?: (
|
|
457
|
+
autoCompact?: (
|
|
458
|
+
instructions?: string,
|
|
459
|
+
trigger?: CompactionTrigger,
|
|
460
|
+
budget?: Pick<CompactInput, "keepRecentTokens" | "preserveUserTurnId" | "skillContextState" | "signal">,
|
|
461
|
+
) => Promise<CompactResult | null>;
|
|
447
462
|
/** Optional observability sink for orchestrator chat token usage. */
|
|
448
463
|
observability?: ObservabilityContract;
|
|
449
464
|
/**
|
|
@@ -649,10 +664,33 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
649
664
|
* line back when it lifts; the skill-activation ledger entry already
|
|
650
665
|
* records provenance, so this is the notice, not a second UI.
|
|
651
666
|
*/
|
|
652
|
-
const armSkillSurface = (
|
|
667
|
+
const armSkillSurface = (
|
|
668
|
+
policy: PendingSkillToolPolicy | undefined,
|
|
669
|
+
loadedBefore?: ReadonlySet<string>,
|
|
670
|
+
explicitOff = false,
|
|
671
|
+
): void => {
|
|
653
672
|
const previous = skillSurfaceNames(state.activeSkillSurface).join(", ");
|
|
654
673
|
const next = armedSkillSurface(policy);
|
|
655
674
|
const current = skillSurfaceNames(next).join(", ");
|
|
675
|
+
if (
|
|
676
|
+
deps.session?.current() &&
|
|
677
|
+
(explicitOff ||
|
|
678
|
+
previous.length > 0 ||
|
|
679
|
+
(policy?.loadedSkillNames.size ?? 0) > 0 ||
|
|
680
|
+
(policy?.requests.length ?? 0) > 0)
|
|
681
|
+
) {
|
|
682
|
+
const entries = filterEntriesToActivePath(deps.readSessionEntries?.() ?? [], state.lastTurnId ?? undefined);
|
|
683
|
+
const selection = next
|
|
684
|
+
? mainSkillContextState(entries, next)
|
|
685
|
+
: (policy?.loadedSkillNames.size ?? 0) > 0
|
|
686
|
+
? null
|
|
687
|
+
: { version: 1 as const, activationRefs: [] };
|
|
688
|
+
const data = selection ?? { version: 1 as const, activationRefs: [], unknown: true as const };
|
|
689
|
+
if (JSON.stringify(data) !== JSON.stringify(latestSkillContextState(entries))) {
|
|
690
|
+
// Persist before changing live state: restart must not resurrect a cleared/replaced skill.
|
|
691
|
+
deps.session.appendEntry({ kind: "custom", customType: SKILL_CONTEXT_STATE, parentTurnId: state.lastTurnId, data });
|
|
692
|
+
}
|
|
693
|
+
}
|
|
656
694
|
state.activeSkillSurface = next;
|
|
657
695
|
const activated = skillSurfaceLabels(policy).filter((label) => !loadedBefore?.has(label.split(" ")[0] ?? label));
|
|
658
696
|
if (activated.length > 0) {
|
|
@@ -692,10 +730,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
692
730
|
|
|
693
731
|
const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().chat.retry);
|
|
694
732
|
|
|
733
|
+
const hostRunContext = new AsyncLocalStorage<ToolInvokeOptions["hostRun"]>();
|
|
695
734
|
const currentToolInvokeOptions = (): Partial<ToolInvokeOptions> => {
|
|
696
735
|
const options: Partial<ToolInvokeOptions> = {
|
|
697
736
|
toolResultMaxBytes: deps.getSettings().context.toolResultMaxBytes,
|
|
698
737
|
};
|
|
738
|
+
const hostRun = hostRunContext.getStore();
|
|
739
|
+
if (hostRun !== undefined) options.hostRun = hostRun;
|
|
699
740
|
const sessionId = deps.session?.current()?.id ?? null;
|
|
700
741
|
if (sessionId) options.sessionId = sessionId;
|
|
701
742
|
const turnId = state.activeUserTurnId ?? state.lastTurnId;
|
|
@@ -774,7 +815,10 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
774
815
|
emitNotice,
|
|
775
816
|
});
|
|
776
817
|
const emitRuntimeEvent = (event: AgentEvent | AssistantDeltaEvent): void => {
|
|
777
|
-
if (event.type === "message_end")
|
|
818
|
+
if (event.type === "message_end") {
|
|
819
|
+
rewriteStallAbortMessage(state, event.message);
|
|
820
|
+
explainInterruptedAssistant(event.message, state.activeInterruptReason);
|
|
821
|
+
}
|
|
778
822
|
emit(event as ChatLoopEvent);
|
|
779
823
|
};
|
|
780
824
|
|
|
@@ -1007,7 +1051,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1007
1051
|
interruptRefusal: () => (state.streaming ? interruptRefusalReason() : null),
|
|
1008
1052
|
clearSkillSurface: () => {
|
|
1009
1053
|
const cleared = skillSurfaceNames(state.activeSkillSurface);
|
|
1010
|
-
armSkillSurface(undefined);
|
|
1054
|
+
armSkillSurface(undefined, undefined, true);
|
|
1011
1055
|
return cleared;
|
|
1012
1056
|
},
|
|
1013
1057
|
clearQueuedFollowUps: () => queues.clearQueuedMirror().map((entry) => entry.text),
|
|
@@ -1145,9 +1189,10 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1145
1189
|
const forceNow = process.env.CLIO_CODER_FORCE_COMPACT === "1";
|
|
1146
1190
|
try {
|
|
1147
1191
|
setTurnPreparation("compacting");
|
|
1148
|
-
await context.runAutoCompact(agentRuntime, forceNow, undefined, undefined, submittedText);
|
|
1192
|
+
await context.runAutoCompact(agentRuntime, forceNow, undefined, undefined, submittedText, pendingSkillPolicy);
|
|
1149
1193
|
} catch (err) {
|
|
1150
1194
|
emitNotice(`[Clio Coder] auto-compaction failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1195
|
+
if (err instanceof Error && err.name === "AbortError") return;
|
|
1151
1196
|
} finally {
|
|
1152
1197
|
endPreparationCompaction();
|
|
1153
1198
|
}
|
|
@@ -1170,8 +1215,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1170
1215
|
toolSignature,
|
|
1171
1216
|
});
|
|
1172
1217
|
|
|
1173
|
-
const reservedOutput = resolveReservedOutputTokens(agentRuntime.runtimeResolution.capabilityDecisions.maxTokens);
|
|
1174
1218
|
const effectiveWindow = agentRuntime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
|
|
1219
|
+
const outputForInput = (inputTokens: number): number =>
|
|
1220
|
+
resolveReservedOutputTokens(agentRuntime.runtimeResolution.capabilityDecisions.maxTokens, {
|
|
1221
|
+
api: agentRuntime.agent.state.model?.api ?? "",
|
|
1222
|
+
contextWindow: effectiveWindow,
|
|
1223
|
+
inputTokens,
|
|
1224
|
+
});
|
|
1175
1225
|
const pendingInputTokens = ceilChars(submittedText.length);
|
|
1176
1226
|
let turnSnapshot = captureTurnSnapshot("pending");
|
|
1177
1227
|
// The snapshot prices the prompt at chars/4. When the provider has
|
|
@@ -1184,28 +1234,38 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1184
1234
|
snapshotInputTokens(snapshot) + pendingInputTokens,
|
|
1185
1235
|
context.liveContextEstimate(agentRuntime, submittedText).tokens,
|
|
1186
1236
|
);
|
|
1187
|
-
const
|
|
1237
|
+
const inputEstimate = budgetedPromptTokens(turnSnapshot);
|
|
1238
|
+
const reservedOutput = outputForInput(inputEstimate);
|
|
1239
|
+
const totalEstimate = inputEstimate + reservedOutput;
|
|
1188
1240
|
|
|
1189
1241
|
if (effectiveWindow > 0 && totalEstimate > effectiveWindow) {
|
|
1190
1242
|
emitNotice(
|
|
1191
1243
|
`[Clio Coder] Estimated request size ${totalEstimate} tokens (input ${totalEstimate - reservedOutput} + output budget ${reservedOutput}) exceeds the effective context window of ${effectiveWindow} tokens. Running compaction before sending...`,
|
|
1192
1244
|
);
|
|
1193
1245
|
setTurnPreparation("compacting");
|
|
1246
|
+
let compactionFailure: string | undefined;
|
|
1194
1247
|
const compacted = await context
|
|
1195
|
-
.runAutoCompact(agentRuntime, true, undefined,
|
|
1248
|
+
.runAutoCompact(agentRuntime, true, undefined, "overflow", submittedText, pendingSkillPolicy)
|
|
1249
|
+
.catch((error: unknown) => {
|
|
1250
|
+
compactionFailure = error instanceof Error ? error.message : String(error);
|
|
1251
|
+
return false;
|
|
1252
|
+
})
|
|
1196
1253
|
.finally(endPreparationCompaction);
|
|
1197
1254
|
if (!compacted) {
|
|
1198
|
-
|
|
1199
|
-
|
|
1255
|
+
emitAdmissionNotice(
|
|
1256
|
+
`[Clio Coder] Request exceeds the context window and compaction could not reclaim enough space.${compactionFailure ? ` ${compactionFailure}.` : ""} Trim the prompt or reduce active tools.`,
|
|
1257
|
+
"context-window-exceeded",
|
|
1200
1258
|
);
|
|
1201
1259
|
return;
|
|
1202
1260
|
}
|
|
1203
1261
|
context.refreshAgentMessagesFromSession(agentRuntime);
|
|
1204
1262
|
turnSnapshot = captureTurnSnapshot("pending");
|
|
1205
|
-
const
|
|
1263
|
+
const postInputEstimate = budgetedPromptTokens(turnSnapshot);
|
|
1264
|
+
const postTotalEstimate = postInputEstimate + outputForInput(postInputEstimate);
|
|
1206
1265
|
if (postTotalEstimate > effectiveWindow) {
|
|
1207
|
-
|
|
1266
|
+
emitAdmissionNotice(
|
|
1208
1267
|
`[Clio Coder] Request still exceeds the effective window after compaction (${postTotalEstimate} > ${effectiveWindow}). Request blocked.`,
|
|
1268
|
+
"context-window-exceeded",
|
|
1209
1269
|
);
|
|
1210
1270
|
return;
|
|
1211
1271
|
}
|
|
@@ -1264,6 +1324,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1264
1324
|
state.toolProseAbortReason = null;
|
|
1265
1325
|
state.toolProseAssessedChars = 0;
|
|
1266
1326
|
state.activeInterruptReason = null;
|
|
1327
|
+
state.interruptedAssistantMessage = null;
|
|
1267
1328
|
state.interruptedUsage = null;
|
|
1268
1329
|
|
|
1269
1330
|
// 6. Cache-disturbance honesty (T3.3)
|
|
@@ -1355,19 +1416,21 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1355
1416
|
}
|
|
1356
1417
|
state.streaming = false;
|
|
1357
1418
|
if (state.activeInterruptReason !== null) {
|
|
1358
|
-
|
|
1359
|
-
// the durable closing turn only now, after the aborted run's
|
|
1360
|
-
// in-flight tool results have all landed, so the ledger replays
|
|
1361
|
-
// as tool_calls → tool_results → closing text.
|
|
1362
|
-
// A thinking-only abort never reaches the ledger, so its estimated
|
|
1363
|
-
// spend rides on the closing turn; persistence computes nothing
|
|
1364
|
-
// further for a message that already reports positive usage.
|
|
1365
|
-
const closing = noticeMessage(state.activeInterruptReason);
|
|
1366
|
-
if (state.interruptedUsage !== null) {
|
|
1367
|
-
(closing as { usage?: unknown }).usage = state.interruptedUsage;
|
|
1368
|
-
}
|
|
1369
|
-
persistence.appendAssistantTurn(closing);
|
|
1419
|
+
const reason = state.activeInterruptReason;
|
|
1370
1420
|
state.activeInterruptReason = null;
|
|
1421
|
+
// A partial response already closed with the cancellation reason.
|
|
1422
|
+
// Only a hollow abort needs a synthetic assistant, after all tool
|
|
1423
|
+
// results have landed. Publish its notice after settlement too, so
|
|
1424
|
+
// it cannot split the entry the provider's message_end finalizes.
|
|
1425
|
+
if (state.interruptedAssistantMessage === null) {
|
|
1426
|
+
const closing = noticeMessage(reason);
|
|
1427
|
+
if (state.interruptedUsage !== null) {
|
|
1428
|
+
(closing as { usage?: unknown }).usage = state.interruptedUsage;
|
|
1429
|
+
}
|
|
1430
|
+
persistence.appendAssistantTurn(closing);
|
|
1431
|
+
emitNotice(reason, "warning", "turn.interrupted");
|
|
1432
|
+
}
|
|
1433
|
+
state.interruptedAssistantMessage = null;
|
|
1371
1434
|
state.interruptedUsage = null;
|
|
1372
1435
|
}
|
|
1373
1436
|
state.currentPendingSkillPolicy = priorPendingSkillPolicy;
|
|
@@ -1385,6 +1448,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1385
1448
|
|
|
1386
1449
|
cancel(options?: ChatCancelOptions): void {
|
|
1387
1450
|
const wasStreaming = state.streaming;
|
|
1451
|
+
context.cancelCompaction();
|
|
1388
1452
|
recovery.cancelRetryCountdown();
|
|
1389
1453
|
// Clear both queues before the abort settles the in-flight prompt:
|
|
1390
1454
|
// a cancelled run must not deliver queued steers or follow-ups, and
|
|
@@ -1392,19 +1456,13 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1392
1456
|
queues.clearQueuedMirror();
|
|
1393
1457
|
const requestedReason = options?.reason?.trim();
|
|
1394
1458
|
if (wasStreaming) {
|
|
1395
|
-
//
|
|
1396
|
-
//
|
|
1397
|
-
//
|
|
1398
|
-
//
|
|
1399
|
-
// results, which strict chat templates reject on replay.
|
|
1400
|
-
// `activeInterruptReason` meanwhile suppresses the empty aborted
|
|
1401
|
-
// messages the abort leaves behind, in both the ledger and the live
|
|
1402
|
-
// transcript. Operator cancels take the same path with the default
|
|
1403
|
-
// text, so they no longer render a redundant "[aborted] Request was
|
|
1404
|
-
// aborted" turn on top of the cancellation notice.
|
|
1459
|
+
// Keep immediate feedback in the footer. A transcript notice here
|
|
1460
|
+
// would split the streamed entry before message_end can finalize it.
|
|
1461
|
+
// The reason is carried by the provider's aborted assistant, or by
|
|
1462
|
+
// one synthetic closing record after an empty abort settles.
|
|
1405
1463
|
state.activeInterruptReason =
|
|
1406
1464
|
requestedReason && requestedReason.length > 0 ? requestedReason : "[Clio Coder] active response cancelled.";
|
|
1407
|
-
|
|
1465
|
+
emitFooterNotice("warning", state.activeInterruptReason, "turn.interrupted");
|
|
1408
1466
|
}
|
|
1409
1467
|
state.runtime?.agent.abort();
|
|
1410
1468
|
if (wasStreaming && deps.bus) {
|
|
@@ -1595,11 +1653,16 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1595
1653
|
return;
|
|
1596
1654
|
}
|
|
1597
1655
|
let compacted = false;
|
|
1656
|
+
enterPreparation();
|
|
1657
|
+
setTurnPreparation("compacting");
|
|
1598
1658
|
try {
|
|
1599
1659
|
compacted = await context.runAutoCompact(agentRuntime, true, instructions, "force");
|
|
1600
1660
|
} catch (err) {
|
|
1601
1661
|
emitNotice(`[/context compact] ${err instanceof Error ? err.message : String(err)}`);
|
|
1602
1662
|
return;
|
|
1663
|
+
} finally {
|
|
1664
|
+
leavePreparation();
|
|
1665
|
+
endPreparationCompaction();
|
|
1603
1666
|
}
|
|
1604
1667
|
if (!compacted) {
|
|
1605
1668
|
emitNotice("[/context compact] nothing to compact; session is empty or no cut crossed");
|
|
@@ -1633,6 +1696,9 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1633
1696
|
// released at admission, not settlement, so steering stays immediate.
|
|
1634
1697
|
let admissionTail: Promise<void> | null = null;
|
|
1635
1698
|
api.submit = (text, options = {}) => {
|
|
1699
|
+
// Capture before admission can await. Internal resubmits inherit the
|
|
1700
|
+
// async scope; every independent public submit explicitly starts its own.
|
|
1701
|
+
const hostRun = options.hostRun === undefined ? undefined : structuredClone(options.hostRun);
|
|
1636
1702
|
// The operator owns the slot from the keystroke, not from admission. The
|
|
1637
1703
|
// prefix the pre-warm already pushed through stays in it either way, so
|
|
1638
1704
|
// aborting here costs nothing and stops the real turn from queueing behind
|
|
@@ -1669,14 +1735,18 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1669
1735
|
// A presentation observer cannot refuse a turn after the editor has
|
|
1670
1736
|
// consumed it. The ordinary render path can recover on its next tick.
|
|
1671
1737
|
}
|
|
1672
|
-
return
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1738
|
+
return hostRunContext
|
|
1739
|
+
.run(hostRun, () =>
|
|
1740
|
+
submitTracked(text, {
|
|
1741
|
+
...submitOptions,
|
|
1742
|
+
onAdmitted: () => {
|
|
1743
|
+
releaseTicket();
|
|
1744
|
+
leaveOnce();
|
|
1745
|
+
options.onAdmitted?.();
|
|
1746
|
+
},
|
|
1747
|
+
}),
|
|
1748
|
+
)
|
|
1749
|
+
.finally(releaseTicket);
|
|
1680
1750
|
};
|
|
1681
1751
|
const run = previous ? previous.then(start) : start();
|
|
1682
1752
|
return run.finally(leaveOnce);
|