@iowarp/clio-coder 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -2
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
- 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-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
- package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
- package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-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-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
- 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-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
- package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
- package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
- 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-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- 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-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
- 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-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
- package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
- package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
- package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
- package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
- 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-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
- 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-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
- 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-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
- 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-5I2IBFYL.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
- package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
- package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
- package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -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-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
- package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
- package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
- 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-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
- package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
- package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -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-N5REUETU.js} +145 -94
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
- package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
- package/dist/verify-3AS3ULCY.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-7BV7XWIY.js +614 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -88
- 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 +44 -59
- 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/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +49 -36
- package/docs/guide/configuration-and-targets.md +7 -2
- package/docs/guide/configuration-reference.md +13 -3
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +9 -2
- package/docs/process/development-pipeline.md +10 -10
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/release-cut-checklist.md +6 -6
- 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/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/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/run.ts +16 -14
- 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 +9 -6
- 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 +33 -14
- package/src/core/defaults.ts +5 -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/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/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- 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/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +17 -2
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/interactive-application.ts +8 -2
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +15 -7
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-commands.ts +9 -7
- 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/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/read.ts +112 -15
- package/src/tools/registry.ts +54 -17
- 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 +6 -1
- 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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
|
+
|
|
5
|
+
export class EvalGraderIntegrityError extends Error {}
|
|
6
|
+
|
|
7
|
+
/** Explicit dependencies avoid guessing executable paths from arbitrary shell commands. */
|
|
8
|
+
export async function protectGraderFiles(cwd: string, files: readonly string[]): Promise<() => Promise<void>> {
|
|
9
|
+
const paths = files.map((file) => {
|
|
10
|
+
const path = resolve(cwd, file);
|
|
11
|
+
const rel = relative(cwd, path);
|
|
12
|
+
if (isAbsolute(file) || rel === ".." || rel.startsWith(`..${sep}`))
|
|
13
|
+
throw new EvalGraderIntegrityError(`grader dependency escapes workspace: ${file}`);
|
|
14
|
+
return path;
|
|
15
|
+
});
|
|
16
|
+
const fingerprint = async (path: string) => {
|
|
17
|
+
// Do not follow a replacement symlink to content chosen outside the fixture.
|
|
18
|
+
let current = path;
|
|
19
|
+
while (current !== resolve(cwd)) {
|
|
20
|
+
if ((await lstat(current)).isSymbolicLink())
|
|
21
|
+
throw new EvalGraderIntegrityError(`grader dependency is a symlink: ${path}`);
|
|
22
|
+
current = resolve(current, "..");
|
|
23
|
+
}
|
|
24
|
+
return createHash("sha256")
|
|
25
|
+
.update(await readFile(path))
|
|
26
|
+
.digest("hex");
|
|
27
|
+
};
|
|
28
|
+
const hashes = await Promise.all(paths.map(fingerprint));
|
|
29
|
+
return async () => {
|
|
30
|
+
for (const [index, path] of paths.entries()) {
|
|
31
|
+
try {
|
|
32
|
+
if ((await fingerprint(path)) === hashes[index]) continue;
|
|
33
|
+
} catch {
|
|
34
|
+
/* Missing, unreadable, and replaced dependencies all invalidate grading. */
|
|
35
|
+
}
|
|
36
|
+
throw new EvalGraderIntegrityError(`grader dependency changed during trial: ${relative(cwd, path)}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -1,4 +1,43 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { readdirSync, readFileSync, readlinkSync } from "node:fs";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
|
|
6
|
+
type FileBaseline = Map<string, { hash: string; bytes: number }>;
|
|
7
|
+
const baselines = new Map<string, FileBaseline>();
|
|
8
|
+
|
|
9
|
+
/** Held by the harness process so a runner cannot rewrite its own baseline. */
|
|
10
|
+
export function recordPatchBaseline(cwd: string): void {
|
|
11
|
+
baselines.set(resolve(cwd), snapshotFiles(cwd));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function forgetPatchBaseline(cwd: string): void {
|
|
15
|
+
baselines.delete(resolve(cwd));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function snapshotFiles(cwd: string): FileBaseline {
|
|
19
|
+
const files: FileBaseline = new Map();
|
|
20
|
+
function walk(dir: string, prefix: string): void {
|
|
21
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
22
|
+
if (entry.name === ".git") continue;
|
|
23
|
+
const path = join(dir, entry.name);
|
|
24
|
+
const relative = prefix + entry.name;
|
|
25
|
+
if (entry.isDirectory()) walk(path, `${relative}/`);
|
|
26
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
27
|
+
const bytes = entry.isSymbolicLink() ? Buffer.from(readlinkSync(path)) : readFileSync(path);
|
|
28
|
+
files.set(relative, {
|
|
29
|
+
hash: createHash("sha256")
|
|
30
|
+
.update(entry.isSymbolicLink() ? "link:" : "file:")
|
|
31
|
+
.update(bytes)
|
|
32
|
+
.digest("hex"),
|
|
33
|
+
bytes: bytes.length,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
walk(cwd, "");
|
|
39
|
+
return files;
|
|
40
|
+
}
|
|
2
41
|
|
|
3
42
|
export interface PatchMetrics {
|
|
4
43
|
bytes: number;
|
|
@@ -6,9 +45,26 @@ export interface PatchMetrics {
|
|
|
6
45
|
testFilesModified: number;
|
|
7
46
|
}
|
|
8
47
|
|
|
9
|
-
export function collectPatchMetrics(cwd: string): PatchMetrics {
|
|
48
|
+
export function collectPatchMetrics(cwd: string): PatchMetrics | null {
|
|
49
|
+
const baseline = baselines.get(resolve(cwd));
|
|
50
|
+
if (baseline !== undefined) {
|
|
51
|
+
const current = snapshotFiles(cwd);
|
|
52
|
+
const changed = [...new Set([...baseline.keys(), ...current.keys()])].filter(
|
|
53
|
+
(path) => baseline.get(path)?.hash !== current.get(path)?.hash,
|
|
54
|
+
);
|
|
55
|
+
return {
|
|
56
|
+
// For hash baselines this is changed file content bytes, including deleted
|
|
57
|
+
// content, rather than a textual Git diff (which cannot represent all files).
|
|
58
|
+
bytes: changed.reduce((sum, path) => sum + (current.get(path)?.bytes ?? baseline.get(path)?.bytes ?? 0), 0),
|
|
59
|
+
filesChanged: changed.length,
|
|
60
|
+
testFilesModified: changed.filter((file) => /(^|\/)(test|tests|spec|__tests__)(\/|$)|\.(test|spec)\./.test(file))
|
|
61
|
+
.length,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
10
65
|
const diff = spawnSync("git", ["diff", "--", "."], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
11
|
-
|
|
66
|
+
if (diff.status !== 0 || typeof diff.stdout !== "string") return null;
|
|
67
|
+
const text = diff.stdout;
|
|
12
68
|
const files = text
|
|
13
69
|
.split(/\r?\n/)
|
|
14
70
|
.filter((line) => line.startsWith("diff --git "))
|
|
@@ -4,6 +4,7 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import { relative, resolve } from "node:path";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
6
|
import type { EvalWorkspaceV2 } from "../schema/suite.js";
|
|
7
|
+
import { forgetPatchBaseline, recordPatchBaseline } from "../verifiers/patch.js";
|
|
7
8
|
import type { PreparedEvalWorkspace } from "./local.js";
|
|
8
9
|
|
|
9
10
|
const execFileAsync = promisify(execFile);
|
|
@@ -42,9 +43,11 @@ export async function prepareTempCopyWorkspace(
|
|
|
42
43
|
recursive: true,
|
|
43
44
|
filter: (path) => shouldCopy(relative(source, path), excludes, selection),
|
|
44
45
|
});
|
|
46
|
+
recordPatchBaseline(dest);
|
|
45
47
|
return {
|
|
46
48
|
dir: dest,
|
|
47
49
|
cleanup: async () => {
|
|
50
|
+
forgetPatchBaseline(dest);
|
|
48
51
|
await rm(dest, { recursive: true, force: true });
|
|
49
52
|
},
|
|
50
53
|
};
|
|
@@ -1473,11 +1473,13 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
|
|
|
1473
1473
|
const label = decision.label === undefined ? "" : ` label=${previewUnknown(decision.label)}`;
|
|
1474
1474
|
const sourceQuestion =
|
|
1475
1475
|
decision.source_question === undefined ? "" : ` sourceQuestion=${previewUnknown(decision.source_question)}`;
|
|
1476
|
-
const
|
|
1476
|
+
const revisionSource = decision.revisionSource ?? "unknown";
|
|
1477
|
+
const revision =
|
|
1478
|
+
decision.revisedAt === undefined ? "" : ` revisedAt=${decision.revisedAt} revisionSource=${revisionSource}`;
|
|
1477
1479
|
const correction =
|
|
1478
1480
|
decision.correction === undefined
|
|
1479
1481
|
? ""
|
|
1480
|
-
: ` correctionSource
|
|
1482
|
+
: ` correctionSource=${revisionSource} correction=${previewUnknown(decision.correction)}`;
|
|
1481
1483
|
return ` decision key=${decision.key} status=${decision.status} decidedAt=${decision.decidedAt}${revision}${label}${sourceQuestion} value=${previewUnknown(decision.value)}${correction}`;
|
|
1482
1484
|
}),
|
|
1483
1485
|
];
|
|
@@ -19,7 +19,7 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
|
|
|
19
19
|
instructionFiles: ["CLAUDE.md", ".claude/CLAUDE.md"],
|
|
20
20
|
acp: {
|
|
21
21
|
command: "npx",
|
|
22
|
-
args: ["-y", "@zed-industries/claude-code-acp"],
|
|
22
|
+
args: ["-y", "@zed-industries/claude-code-acp@0.16.2"],
|
|
23
23
|
npmPackage: "@zed-industries/claude-code-acp",
|
|
24
24
|
npmPackageBin: "claude-code-acp",
|
|
25
25
|
},
|
|
@@ -39,7 +39,7 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
|
|
|
39
39
|
instructionFiles: ["AGENTS.md", "CODEX.md", ".codex/AGENTS.md"],
|
|
40
40
|
acp: {
|
|
41
41
|
command: "npx",
|
|
42
|
-
args: ["-y", "@agentclientprotocol/codex-acp"],
|
|
42
|
+
args: ["-y", "@agentclientprotocol/codex-acp@1.10.0"],
|
|
43
43
|
npmPackage: "@agentclientprotocol/codex-acp",
|
|
44
44
|
npmPackageBin: "codex-acp",
|
|
45
45
|
},
|
|
@@ -19,13 +19,18 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { spawnSync } from "node:child_process";
|
|
22
|
-
import { readFileSync } from "node:fs";
|
|
23
|
-
import { join } from "node:path";
|
|
24
22
|
import { parse as parseYaml } from "yaml";
|
|
25
23
|
import {
|
|
24
|
+
gitCommitAttributionEnabled,
|
|
26
25
|
reportCommitAttributionDiagnostic,
|
|
27
26
|
withManagedGitCommitAttributionEnvironment,
|
|
28
27
|
} from "../../core/git-commit-attribution.js";
|
|
28
|
+
import { buildSafeToolEnv } from "../../core/safe-exec.js";
|
|
29
|
+
import {
|
|
30
|
+
captureProjectSurface,
|
|
31
|
+
type ProjectSurfaceSnapshot,
|
|
32
|
+
projectSurfaceTrustNotice,
|
|
33
|
+
} from "../../core/workspace-trust.js";
|
|
29
34
|
import {
|
|
30
35
|
type HookReceiptSink,
|
|
31
36
|
loadUserHooks,
|
|
@@ -49,6 +54,7 @@ export interface HookFileIssue {
|
|
|
49
54
|
export interface ReadHookSourcesResult {
|
|
50
55
|
batches: UserHookDeclarationBatch[];
|
|
51
56
|
fileIssues: HookFileIssue[];
|
|
57
|
+
projectSurface: ProjectSurfaceSnapshot;
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
/** One package's hook declarations, captured by the supplier from verified bytes. */
|
|
@@ -77,15 +83,9 @@ export interface ReadHookSourcesOptions {
|
|
|
77
83
|
function readBatch(
|
|
78
84
|
source: UserHookSource,
|
|
79
85
|
filePath: string,
|
|
86
|
+
text: string,
|
|
80
87
|
fileIssues: HookFileIssue[],
|
|
81
88
|
): UserHookDeclarationBatch | null {
|
|
82
|
-
let text: string;
|
|
83
|
-
try {
|
|
84
|
-
text = readFileSync(filePath, "utf8");
|
|
85
|
-
} catch {
|
|
86
|
-
// Missing file: not an error, the source is simply absent.
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
89
|
try {
|
|
90
90
|
const parsed = parseYaml(text) as unknown;
|
|
91
91
|
return { source, declarations: parsed ?? [] };
|
|
@@ -125,21 +125,22 @@ export function readHookSources(options: ReadHookSourcesOptions): ReadHookSource
|
|
|
125
125
|
batches.push({ source, declarations: entry.declarations });
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
128
|
+
const projectSurface = captureProjectSurface(options.cwd, "hooks");
|
|
129
|
+
for (const [index, file] of projectSurface.files.entries()) {
|
|
130
|
+
const source: UserHookSource = {
|
|
131
|
+
origin: index === 0 ? "project" : "project.local",
|
|
132
|
+
sourcePath: index === 0 ? ".clio-coder/hooks.yaml" : ".clio-coder/hooks.local.yaml",
|
|
133
|
+
};
|
|
134
|
+
if (file.error !== undefined) fileIssues.push({ source, message: file.error });
|
|
135
|
+
if (file.text === null) continue;
|
|
136
|
+
if (projectSurface.verdict !== "trusted") {
|
|
137
|
+
fileIssues.push({ source, message: projectSurfaceTrustNotice(projectSurface, file.path) });
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const batch = readBatch(source, file.path, file.text, fileIssues);
|
|
141
|
+
if (batch) batches.push(batch);
|
|
142
|
+
}
|
|
143
|
+
return { batches, fileIssues, projectSurface };
|
|
143
144
|
}
|
|
144
145
|
|
|
145
146
|
export interface BuildUserHookRegistrationsOptions {
|
|
@@ -151,6 +152,8 @@ export interface BuildUserHookRegistrationsOptions {
|
|
|
151
152
|
/** Injected for tests; defaults to the spawnSync runner. */
|
|
152
153
|
runCommand?: UserHookCommandRunner;
|
|
153
154
|
now?: () => number;
|
|
155
|
+
/** Operator notice when an already published project's trust changes. */
|
|
156
|
+
report?: (line: string) => void;
|
|
154
157
|
}
|
|
155
158
|
|
|
156
159
|
export interface BuildUserHookRegistrationsResult extends UserHookLoadResult {
|
|
@@ -173,13 +176,28 @@ export function buildUserHookRegistrations(
|
|
|
173
176
|
const workspaceRoot = options.workspaceRoot ?? options.cwd;
|
|
174
177
|
const readOptions: ReadHookSourcesOptions = { cwd: options.cwd };
|
|
175
178
|
if (options.capturedSources !== undefined) readOptions.capturedSources = options.capturedSources;
|
|
176
|
-
const { batches, fileIssues } = readHookSources(readOptions);
|
|
179
|
+
const { batches, fileIssues, projectSurface } = readHookSources(readOptions);
|
|
177
180
|
const loaded = loadUserHooks(batches, { workspaceRoot });
|
|
178
181
|
const runCommand = options.runCommand ?? spawnSyncCommandRunner();
|
|
182
|
+
let reportedUntrusted = false;
|
|
183
|
+
const projectStillTrusted = (): boolean => {
|
|
184
|
+
const current = captureProjectSurface(options.cwd, "hooks");
|
|
185
|
+
if (current.verdict === "trusted" && current.contentHash === projectSurface.contentHash) return true;
|
|
186
|
+
if (!reportedUntrusted) {
|
|
187
|
+
reportedUntrusted = true;
|
|
188
|
+
options.report?.(
|
|
189
|
+
`[clio-coder:hooks] project hooks changed or trust was revoked; hooks skipped. Review with clio-coder config trust hooks, then reload extensions.`,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
};
|
|
179
194
|
const registrations = loaded.hooks.map((hook) =>
|
|
180
195
|
userHookToRegistration(hook, {
|
|
181
196
|
recordReceipt: options.recordReceipt,
|
|
182
197
|
runCommand,
|
|
198
|
+
...(hook.source.origin === "project" || hook.source.origin === "project.local"
|
|
199
|
+
? { isTrusted: projectStillTrusted }
|
|
200
|
+
: {}),
|
|
183
201
|
...(options.now !== undefined ? { now: options.now } : {}),
|
|
184
202
|
}),
|
|
185
203
|
);
|
|
@@ -195,8 +213,9 @@ export function spawnSyncCommandRunner(): UserHookCommandRunner {
|
|
|
195
213
|
const [command, ...args] = argv;
|
|
196
214
|
// A user hook is operator automation, not Clio work: the environment is
|
|
197
215
|
// normalized so a nested seam sees consistent state, but no role is claimed.
|
|
198
|
-
const attribution = withManagedGitCommitAttributionEnvironment(
|
|
216
|
+
const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(), {
|
|
199
217
|
cwd: options.cwd ?? process.cwd(),
|
|
218
|
+
enabled: gitCommitAttributionEnabled(process.env),
|
|
200
219
|
evidence: {},
|
|
201
220
|
});
|
|
202
221
|
reportCommitAttributionDiagnostic(attribution.diagnostic);
|
|
@@ -397,6 +397,8 @@ export interface UserHookRegistrationDeps {
|
|
|
397
397
|
/** Synchronous command runner. Injected so tests need no real subprocess. */
|
|
398
398
|
runCommand: UserHookCommandRunner;
|
|
399
399
|
now?: () => number;
|
|
400
|
+
/** Published project hooks stop executing after their approved surface changes or is revoked. */
|
|
401
|
+
isTrusted?: () => boolean;
|
|
400
402
|
}
|
|
401
403
|
|
|
402
404
|
function reminderEffect(message: string, severity: MiddlewareReminderSeverity): MiddlewareEffect {
|
|
@@ -441,6 +443,10 @@ export function userHookToRegistration(
|
|
|
441
443
|
evaluate: (input) => {
|
|
442
444
|
if (!hook.enabled) return [];
|
|
443
445
|
try {
|
|
446
|
+
if (deps.isTrusted?.() === false) {
|
|
447
|
+
deps.recordReceipt({ ...baseReceipt(input), outcome: "skipped" });
|
|
448
|
+
return [];
|
|
449
|
+
}
|
|
444
450
|
return evaluateHook(hook, deps, baseReceipt(input));
|
|
445
451
|
} catch {
|
|
446
452
|
// A hook must never throw into a turn; report a skipped receipt.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { INSTRUCTION_SHAPED_WARNING } from "../../core/untrusted-content.js";
|
|
2
|
+
import type { MiddlewareRuleDefinition } from "./runtime.js";
|
|
3
|
+
|
|
4
|
+
/** Raw-body marker detection is supplied by the registry before result shaping. */
|
|
5
|
+
export const INJECTION_SCREEN_RULE: MiddlewareRuleDefinition = {
|
|
6
|
+
rule: {
|
|
7
|
+
id: "safety.untrusted-instructions",
|
|
8
|
+
source: "builtin",
|
|
9
|
+
description: "Warn when external tool data contains instruction-shaped markers",
|
|
10
|
+
enabled: true,
|
|
11
|
+
hooks: ["after_tool"],
|
|
12
|
+
effectKinds: ["annotate_tool_result"],
|
|
13
|
+
},
|
|
14
|
+
toolNames: ["web_fetch", "read", "bash", "dispatch", "monitor"],
|
|
15
|
+
predicate: (input) => input.metadata?.untrustedInstructionMarkers === true,
|
|
16
|
+
effects: [
|
|
17
|
+
{
|
|
18
|
+
kind: "annotate_tool_result",
|
|
19
|
+
severity: "warn",
|
|
20
|
+
message: INSTRUCTION_SHAPED_WARNING,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { INJECTION_SCREEN_RULE } from "./injection-screen.js";
|
|
1
2
|
import type { MiddlewareRuleDefinition } from "./runtime.js";
|
|
2
3
|
import { STALLED_TURN_RULE_DEFINITION } from "./stalled-turn.js";
|
|
3
4
|
import type { MiddlewareRule } from "./types.js";
|
|
@@ -8,7 +9,10 @@ import type { MiddlewareRule } from "./types.js";
|
|
|
8
9
|
* channel delivers the declarative half to workers, which resolve payloads
|
|
9
10
|
* from this table by rule id.
|
|
10
11
|
*/
|
|
11
|
-
const BUILTIN_MIDDLEWARE_RULE_DEFINITIONS: ReadonlyArray<MiddlewareRuleDefinition> = [
|
|
12
|
+
const BUILTIN_MIDDLEWARE_RULE_DEFINITIONS: ReadonlyArray<MiddlewareRuleDefinition> = [
|
|
13
|
+
STALLED_TURN_RULE_DEFINITION,
|
|
14
|
+
INJECTION_SCREEN_RULE,
|
|
15
|
+
];
|
|
12
16
|
|
|
13
17
|
export const BUILTIN_MIDDLEWARE_RULE_IDS = BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => definition.rule.id);
|
|
14
18
|
|
|
@@ -9,7 +9,7 @@ export const STALLED_TURN_REQUEST_CONTINUATION_MESSAGE =
|
|
|
9
9
|
"You ended your turn after announcing an action without executing it: no tools were called. Continue now and perform the announced action, or state plainly that you are finished and waiting for the user.";
|
|
10
10
|
|
|
11
11
|
export const SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE =
|
|
12
|
-
"You ended your turn on a skill suggestion without doing the task. The suggestion line has already made the offer and only the operator loads a skill, so
|
|
12
|
+
"You ended your turn on a skill suggestion without doing the task. The suggestion line has already made the offer and only the operator loads a skill, so the skill choice needs nothing from them before you proceed. Continue the already-authorized task now without the skill. This continuation is not an operator answer to any other question: if the remaining work is a proposal awaiting an explicit operator go-ahead, park it on the task board and say so instead of implementing.";
|
|
13
13
|
|
|
14
14
|
const INTENT_PATTERN = /\b(let me|i['’]ll|i will|i am going to|i['’]m going to|now i|next i|let's|let us)\b/i;
|
|
15
15
|
|
|
@@ -110,12 +110,25 @@ const ACTION_OBJECT_CONNECTOR_PATTERN = /^(?:at|for|in|into|on|through|to)\s+/i;
|
|
|
110
110
|
const ACTION_OBJECT_DETERMINER_PATTERN = /^(?:a|an|my|our|that|the|their|these|this|those|your)\s+/i;
|
|
111
111
|
const ACTION_OBJECT_PATTERN = /^(?!(?:again|everyone|later|next|now|soon|then|you)\b)[`"'./~]*[\p{L}\p{N}_-]/iu;
|
|
112
112
|
const CONDITIONAL_LEAD_IN_PATTERN = /\b(?:if|once|unless|until|when|whenever)\b/i;
|
|
113
|
-
|
|
113
|
+
// "say go and", "confirm and", "reply yes and": the sentence hands the operator
|
|
114
|
+
// the decision and promises work only after it.
|
|
115
|
+
const CONDITIONAL_INVITATION_PATTERN =
|
|
116
|
+
/\b(?:answer|approve|ask|confirm|give|point|reply|respond|say|send|share|tell|type)\b[\s\S]*\b(?:and|then)\s*$/i;
|
|
114
117
|
// "if needed", and any conditional whose condition is about the user: "if you
|
|
115
118
|
// want", "if that is what you need". Conditions about the work ("if the config
|
|
116
119
|
// is valid") stay announcements.
|
|
120
|
+
// Any condition that waits on the operator ("after you approve", "once you
|
|
121
|
+
// confirm", "until you say", "upon your go-ahead") is a proposal awaiting a
|
|
122
|
+
// decision, not an announcement: the operator's answer is the missing input,
|
|
123
|
+
// and an automatic continuation would stand in for it (issue #365).
|
|
117
124
|
const CONDITIONAL_OFFER_SUFFIX_PATTERN =
|
|
118
|
-
/\b(?:if\s+(?:needed|necessary|requested)\b|if\b[^.!?]*\byou\b|
|
|
125
|
+
/\b(?:if\s+(?:needed|necessary|requested|approved|confirmed)\b|(?:if|after|once|until|unless|when(?:ever)?|as\s+soon\s+as|provided|assuming)\b[^.!?]*\byou\b|(?:upon|on|after|with|pending|awaiting|following)\s+(?:your\s+|the\s+operator(?:'s)?\s+)?(?:approval|go-?ahead|confirmation|sign-?off|decision|word|green\s+light|okay|ok)\b)/i;
|
|
126
|
+
// A lead-in that is itself a wait ("Awaiting your go-ahead; I'll then write
|
|
127
|
+
// the test") defers whatever the intent clause goes on to name.
|
|
128
|
+
const OPERATOR_WAIT_LEAD_PATTERN = /\b(?:await(?:ing)?|pending|waiting\s+(?:for|on))\b/i;
|
|
129
|
+
// "I will not edit files" announces a refusal, and "next I would create
|
|
130
|
+
// clamp.py" describes a hypothetical; neither promises an action now.
|
|
131
|
+
const NEGATED_OR_HYPOTHETICAL_CLAUSE_PATTERN = /^\s*(?:not|never|would|could|might|may)\b/i;
|
|
119
132
|
const LET_ME_KNOW_PATTERN = /\blet me know\b/i;
|
|
120
133
|
// "I'll wait for your go-ahead before I touch src/cli/index.ts" names a path
|
|
121
134
|
// and promises nothing now. A clause that opens by deferring is a wait
|
|
@@ -199,12 +212,14 @@ function announcesConcreteAction(sentence: string): boolean {
|
|
|
199
212
|
if (
|
|
200
213
|
CONDITIONAL_LEAD_IN_PATTERN.test(leadIn) ||
|
|
201
214
|
CONDITIONAL_INVITATION_PATTERN.test(leadIn) ||
|
|
215
|
+
OPERATOR_WAIT_LEAD_PATTERN.test(leadIn) ||
|
|
202
216
|
CONDITIONAL_OFFER_SUFFIX_PATTERN.test(sentence)
|
|
203
217
|
) {
|
|
204
218
|
return false;
|
|
205
219
|
}
|
|
206
220
|
const clause = sentence.slice(intent.index + intent[0].length);
|
|
207
221
|
if (DEFERRAL_LEAD_PATTERN.test(clause)) return false;
|
|
222
|
+
if (NEGATED_OR_HYPOTHETICAL_CLAUSE_PATTERN.test(clause)) return false;
|
|
208
223
|
if (hasActionWithObject(clause)) return true;
|
|
209
224
|
// A path or command is evidence of an immediate action only when the
|
|
210
225
|
// announcement itself is unconditional; "once package.json is updated"
|
|
@@ -17,8 +17,10 @@ export const TASK_BOARD_REMINDER_REGISTRATION_ID = "observer.task-board-reminder
|
|
|
17
17
|
export function taskBoardReminderMessage(steps: number): string {
|
|
18
18
|
return (
|
|
19
19
|
`[Tasks] This request enumerates ${steps} steps. Before the first edit, declare the task board: ` +
|
|
20
|
-
'tasks action="plan" with a title and one task per step, then work them one at a time ' +
|
|
21
|
-
'("start", then "done" with an evidence note).'
|
|
20
|
+
'tasks action="plan" with a title and one task per authorized step, then work them one at a time ' +
|
|
21
|
+
'("start", then "done" with an evidence note). A plan does not authorize implementation: ' +
|
|
22
|
+
'for proposed work awaiting an operator go-ahead, use action="block" with a note naming the pending operator decision, ' +
|
|
23
|
+
'or action="drop", and wait.'
|
|
22
24
|
);
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -36,7 +36,10 @@ export function buildOpenTasksMessage(board: TaskBoardSnapshot): string {
|
|
|
36
36
|
return (
|
|
37
37
|
`[Clio Coder] task board "${board.title}" still has ${open.length} of ${counts.total} task(s) open:\n` +
|
|
38
38
|
`${rows.join("\n")}\n` +
|
|
39
|
-
`Continue
|
|
39
|
+
`Continue only work already authorized by the operator. This reminder and a self-created plan are not authorization ` +
|
|
40
|
+
`to implement a proposal. If implementation awaits an operator decision, use tasks action="block" with a note ` +
|
|
41
|
+
`naming that pending operator decision, or action="drop"; then wait for an explicit operator go-ahead. ` +
|
|
42
|
+
`A skill-install choice does not authorize implementation. Otherwise record the honest state on the board: ` +
|
|
40
43
|
`tasks action="done" with an evidence note, action="block" with a reason, or action="drop". ` +
|
|
41
44
|
`Do not end the turn with a stale board.`
|
|
42
45
|
);
|
|
@@ -61,7 +61,13 @@ const TOKEN_VALUE_MAX = 80;
|
|
|
61
61
|
/** How long `available()` stays false after a transport failure before probing again. */
|
|
62
62
|
const DEGRADE_COOLDOWN_MS = 5_000;
|
|
63
63
|
|
|
64
|
+
export type MuxPaneOpenFailure =
|
|
65
|
+
| { source: "mux"; kind: MuxError["kind"]; wireCode: string | null; method: string | null; message: string }
|
|
66
|
+
| { source: "local"; message: string };
|
|
67
|
+
|
|
64
68
|
export interface MuxOpenUtilityPaneRequest {
|
|
69
|
+
/** Request-scoped diagnostics; the pane-or-null best-effort result is unchanged. */
|
|
70
|
+
onFailure?: (failure: MuxPaneOpenFailure) => void;
|
|
65
71
|
argv: ReadonlyArray<string>;
|
|
66
72
|
cwd: string;
|
|
67
73
|
label: string;
|
|
@@ -230,7 +236,12 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
230
236
|
* is what the caller sees when the pane layer is not there, which is the same
|
|
231
237
|
* value it sees in `none` mode.
|
|
232
238
|
*/
|
|
233
|
-
const attempt = async <T>(
|
|
239
|
+
const attempt = async <T>(
|
|
240
|
+
what: string,
|
|
241
|
+
run: (live: MuxClient) => Promise<T>,
|
|
242
|
+
fallback: T,
|
|
243
|
+
onError?: (error: unknown) => void,
|
|
244
|
+
): Promise<T> => {
|
|
234
245
|
if (!usable() || client === null) return fallback;
|
|
235
246
|
try {
|
|
236
247
|
const value = await run(client);
|
|
@@ -238,6 +249,7 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
238
249
|
return value;
|
|
239
250
|
} catch (error) {
|
|
240
251
|
degrade(what, error);
|
|
252
|
+
onError?.(error);
|
|
241
253
|
return fallback;
|
|
242
254
|
}
|
|
243
255
|
};
|
|
@@ -301,6 +313,13 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
301
313
|
},
|
|
302
314
|
|
|
303
315
|
async openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null> {
|
|
316
|
+
const report = (failure: MuxPaneOpenFailure): void => {
|
|
317
|
+
try {
|
|
318
|
+
request.onFailure?.(failure);
|
|
319
|
+
} catch {
|
|
320
|
+
// Diagnostics must not break the best-effort contract.
|
|
321
|
+
}
|
|
322
|
+
};
|
|
304
323
|
// Idempotence for docks: a slot that already has a pane answers with it.
|
|
305
324
|
const dockSlot = request.dock?.slot;
|
|
306
325
|
if (dockSlot && docks) {
|
|
@@ -314,6 +333,7 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
314
333
|
let ref: MuxPaneRef;
|
|
315
334
|
if (request.dock && docks) {
|
|
316
335
|
const placed = await docks.open(request.dock.slot, {
|
|
336
|
+
onRefused: (message) => report({ source: "local", message }),
|
|
317
337
|
...(request.dock.share === undefined ? {} : { share: request.dock.share }),
|
|
318
338
|
cwd: request.cwd,
|
|
319
339
|
...(request.env ? { env: request.env } : {}),
|
|
@@ -356,6 +376,19 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
356
376
|
return ref;
|
|
357
377
|
},
|
|
358
378
|
null,
|
|
379
|
+
(error) => {
|
|
380
|
+
if (error instanceof MuxError) {
|
|
381
|
+
report({
|
|
382
|
+
source: "mux",
|
|
383
|
+
kind: error.kind,
|
|
384
|
+
wireCode: error.wireCode,
|
|
385
|
+
method: error.method,
|
|
386
|
+
message: error.message,
|
|
387
|
+
});
|
|
388
|
+
} else {
|
|
389
|
+
report({ source: "local", message: error instanceof Error ? error.message : String(error) });
|
|
390
|
+
}
|
|
391
|
+
},
|
|
359
392
|
);
|
|
360
393
|
},
|
|
361
394
|
|
|
@@ -198,7 +198,12 @@ export interface DockController {
|
|
|
198
198
|
*/
|
|
199
199
|
open(
|
|
200
200
|
slot: DockSlot,
|
|
201
|
-
options?: {
|
|
201
|
+
options?: {
|
|
202
|
+
share?: number;
|
|
203
|
+
cwd?: string;
|
|
204
|
+
env?: Readonly<Record<string, string>>;
|
|
205
|
+
onRefused?: (reason: string) => void;
|
|
206
|
+
},
|
|
202
207
|
): Promise<MuxPaneRef | null>;
|
|
203
208
|
/** Record an adopted pane (crash recovery) as this slot's dock. */
|
|
204
209
|
adopt(slot: DockSlot, ref: MuxPaneRef): void;
|
|
@@ -265,11 +270,13 @@ export function createDockController(options: DockControllerOptions): DockContro
|
|
|
265
270
|
const geometry = await client.paneLayout(anchorPaneId);
|
|
266
271
|
const anchorRect = geometry.panes.find((pane) => pane.paneId === anchorPaneId)?.rect;
|
|
267
272
|
if (!anchorRect) {
|
|
273
|
+
openOptions.onRefused?.(`no anchor geometry for ${anchorPaneId}; check the pane host layout before trying again`);
|
|
268
274
|
log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
|
|
269
275
|
return null;
|
|
270
276
|
}
|
|
271
277
|
const plan = planDockOpen(anchorRect, spec, openOptions.share);
|
|
272
278
|
if ("refused" in plan) {
|
|
279
|
+
openOptions.onRefused?.(`${plan.refused}; enlarge the anchor pane before trying again`);
|
|
273
280
|
log("info", `mux ${slot} dock refused: ${plan.refused}`);
|
|
274
281
|
return null;
|
|
275
282
|
}
|
package/src/domains/mux/index.ts
CHANGED
|
@@ -645,9 +645,19 @@ export function createMuxClient(options: MuxClientOptions): MuxClient {
|
|
|
645
645
|
// so an empty-id error line on this connection is still ours.
|
|
646
646
|
if (responseId !== id && !(responseId === "" && error)) return;
|
|
647
647
|
if (error) {
|
|
648
|
-
const code = typeof error.code === "string" ? error.code :
|
|
649
|
-
|
|
650
|
-
|
|
648
|
+
const code = typeof error.code === "string" ? error.code : undefined;
|
|
649
|
+
// Absence is different from a host literally saying "unknown".
|
|
650
|
+
// Keep supplied text verbatim and make missing text explicit here.
|
|
651
|
+
const message =
|
|
652
|
+
typeof error.message === "string" ? error.message : "no failure message was supplied by the pane host";
|
|
653
|
+
finish(() =>
|
|
654
|
+
reject(
|
|
655
|
+
new MuxError(muxErrorKind(code ?? "unknown"), message, {
|
|
656
|
+
...(code === undefined ? {} : { wireCode: code }),
|
|
657
|
+
method,
|
|
658
|
+
}),
|
|
659
|
+
),
|
|
660
|
+
);
|
|
651
661
|
return;
|
|
652
662
|
}
|
|
653
663
|
finish(() => resolve(line.result));
|
|
@@ -47,7 +47,7 @@ export interface ObservabilityNotice {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
|
-
* Compact lifecycle summary for
|
|
50
|
+
* Compact lifecycle summary for an active or recently settled dispatch run. Projected from the
|
|
51
51
|
* dispatch bus channels; raw tool arguments and reasoning are absent. Worker
|
|
52
52
|
* progress is a bounded, redacted presentation of the live stream. `evidence`
|
|
53
53
|
* is populated asynchronously once the forensic bundle for the run finalizes.
|
|
@@ -205,7 +205,7 @@ export interface ObservabilityContract extends ObservabilityRunProjection {
|
|
|
205
205
|
recordSessionTurn(trace: SessionTurnTrace): void;
|
|
206
206
|
/**
|
|
207
207
|
* Current product-facing projection. Cheap to call: it folds in-memory state
|
|
208
|
-
* (bounded
|
|
208
|
+
* (active runs, bounded terminal history/notices, session cost/tokens, aggregated metrics, and the
|
|
209
209
|
* cached accountability summary) into a fresh immutable snapshot.
|
|
210
210
|
*/
|
|
211
211
|
snapshot(): ObservabilitySnapshot;
|