@iowarp/clio-coder 0.4.3 → 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 +153 -0
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
- package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-7DRAWPTZ.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-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
- package/dist/{chunk-NMJXSHBJ.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-5DDOTTG4.js +402 -0
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
- package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/chunk-633EXGZA.js +44 -0
- package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
- package/dist/{chunk-DWUOQKRU.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-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
- 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-B6UM3OZC.js +15 -0
- package/dist/{chunk-MCEPRMZW.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-42FMPA75.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-WCXUNS7U.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-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
- 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-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
- package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
- 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-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/chunk-GXCCHKN6.js +59 -0
- package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
- package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-WBKFA554.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-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
- package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
- 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-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
- package/dist/chunk-L4N3DWNW.js +539 -0
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/chunk-LVFANMOH.js +466 -0
- 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-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/chunk-MDU3C27C.js +674 -0
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-JEQ3XTHC.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-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/chunk-O2RQ7LCK.js +283 -0
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
- 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-64I3JVYM.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-R6MAYTMS.js +108 -0
- package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
- package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
- package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
- package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
- 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-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/chunk-T52TPHYC.js +318 -0
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
- package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/chunk-VLPTKCKT.js +396 -0
- 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-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
- package/dist/{chunk-YQWYVTMC.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-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-2VIKGWFZ.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-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
- 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 +45 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-MDZNQS33.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-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
- package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
- package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-E3VC7RX5.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-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
- package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
- package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
- package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
- package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
- package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
- package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
- package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
- package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
- package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
- package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
- package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
- package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
- package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
- package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.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-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
- package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
- package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
- package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -85
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +10 -8
- package/docs/architecture/acp.md +27 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/artifact-versions.md +1 -1
- 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/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +11 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +22 -12
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +1 -1
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +66 -38
- package/docs/guide/configuration-and-targets.md +10 -3
- package/docs/guide/configuration-reference.md +23 -8
- package/docs/guide/environment-variables.md +8 -4
- 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 +87 -5
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +15 -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/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- 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/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +33 -33
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +17 -17
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- 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.ts +2 -1
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/eval.ts +17 -3
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -16
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +84 -32
- package/src/cli/tasks.ts +93 -0
- package/src/cli/upgrade.ts +19 -11
- package/src/cli/usage.ts +30 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +240 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/commit-attribution.ts +41 -1
- 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/git-commit-attribution.ts +46 -3
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/run-overrides.ts +0 -5
- package/src/core/settings-layers.ts +21 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/termination.ts +26 -9
- package/src/core/tool-names.ts +5 -2
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +5 -3
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +8 -5
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- 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 +97 -11
- 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 +12 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +207 -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 +85 -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 +10 -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/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +41 -9
- 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 +4 -0
- package/src/domains/dispatch/extension.ts +240 -132
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +21 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +13 -37
- 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/state.ts +15 -2
- package/src/domains/dispatch/types.ts +21 -5
- 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 +17 -10
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- 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 +106 -17
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- 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/marketplace-offer.ts +20 -1
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/runtime.ts +7 -3
- 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/detect.ts +3 -6
- 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/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +54 -9
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +423 -53
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- 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 +12 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +36 -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/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +16 -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 +13 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +211 -34
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/archive-readers.ts +10 -1
- 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 +137 -28
- package/src/domains/session/entries.ts +213 -11
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +32 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +60 -10
- package/src/engine/acp/server.ts +22 -4
- package/src/engine/acp/transport.ts +55 -9
- package/src/engine/acp/types.ts +9 -0
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/ollama-native.ts +15 -0
- 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/claude/subprocess-runtime.ts +107 -60
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +26 -7
- 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 +64 -17
- 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 +58 -714
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +11 -4
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +63 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/oracle.ts +5 -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/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +3 -3
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.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-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +31 -43
- package/src/interactive/slash-spec.ts +28 -0
- 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 +2 -0
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +14 -10
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +40 -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 +41 -1
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +33 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +12 -9
- package/src/tools/dispatch-runner.ts +63 -33
- 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/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/limitation.ts +76 -0
- 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/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +127 -7
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +40 -5
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +303 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- 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-IA7V7FUC.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-BEPZRGGU.js +0 -1560
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-KK4JZPBQ.js +0 -3982
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-NDINPTJ4.js +0 -641
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/chunk-Y3CBHOR6.js +0 -228
- package/dist/clio-CMMK4KRR.js +0 -25
- package/dist/configure-LE3IK2TJ.js +0 -56
- package/dist/context-clear-BW4O37TG.js +0 -176
- package/dist/fleet-view-SWBR3VGQ.js +0 -97
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-S7MBJDQK.js +0 -83
- package/dist/tools-TFGJICCU.js +0 -29
- package/dist/verify-RWE4PPEK.js +0 -27
- package/dist/wiki-generate-C7IQOXSP.js +0 -469
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import type { RunReceipt } from "../../dispatch/types.js";
|
|
4
|
+
import type { ProjectPreloadClass } from "../../prompts/preload.js";
|
|
4
5
|
import { listSessionLedgerRefs, parseSessionEntries } from "../../session/archive-readers.js";
|
|
5
6
|
import { extractReasoningTokens } from "../../session/context-accounting.js";
|
|
6
7
|
import type { SessionEntry } from "../../session/entries.js";
|
|
8
|
+
import { isProjectPreloadClass } from "../../session/prompt-manifest.js";
|
|
7
9
|
import { evalHarnessMetricsFromReceipt } from "../harness-metrics.js";
|
|
8
10
|
import type {
|
|
9
11
|
EvalMetricSource,
|
|
@@ -22,14 +24,7 @@ export interface EvalLedgerSnapshot {
|
|
|
22
24
|
export interface EvalPromptManifestObservation {
|
|
23
25
|
systemPromptHash: string;
|
|
24
26
|
thinkingLevel: string | null;
|
|
25
|
-
projectPreload:
|
|
26
|
-
mode: "full" | "synopsis" | "none";
|
|
27
|
-
chars: number;
|
|
28
|
-
lines: number;
|
|
29
|
-
reason: string | null;
|
|
30
|
-
nearLimit: boolean;
|
|
31
|
-
label: string;
|
|
32
|
-
} | null;
|
|
27
|
+
projectPreload: ProjectPreloadClass | null;
|
|
33
28
|
fragments: Array<{ id: string; contentHash: string }>;
|
|
34
29
|
}
|
|
35
30
|
|
|
@@ -408,26 +403,7 @@ function promptManifestObservation(record: Record<string, unknown>): EvalPromptM
|
|
|
408
403
|
return contentHash === null ? [] : [{ id: entry.id, contentHash }];
|
|
409
404
|
});
|
|
410
405
|
const preload = record.projectPreload;
|
|
411
|
-
const projectPreload:
|
|
412
|
-
preload === null
|
|
413
|
-
? null
|
|
414
|
-
: isRecord(preload) &&
|
|
415
|
-
(preload.mode === "full" || preload.mode === "synopsis" || preload.mode === "none") &&
|
|
416
|
-
typeof preload.chars === "number" &&
|
|
417
|
-
Number.isInteger(preload.chars) &&
|
|
418
|
-
typeof preload.lines === "number" &&
|
|
419
|
-
Number.isInteger(preload.lines) &&
|
|
420
|
-
typeof preload.nearLimit === "boolean" &&
|
|
421
|
-
typeof preload.label === "string"
|
|
422
|
-
? {
|
|
423
|
-
mode: preload.mode as "full" | "synopsis" | "none",
|
|
424
|
-
chars: preload.chars,
|
|
425
|
-
lines: preload.lines,
|
|
426
|
-
reason: nullableString(preload.reason),
|
|
427
|
-
nearLimit: preload.nearLimit,
|
|
428
|
-
label: preload.label,
|
|
429
|
-
}
|
|
430
|
-
: null;
|
|
406
|
+
const projectPreload = isProjectPreloadClass(preload) ? preload : null;
|
|
431
407
|
return {
|
|
432
408
|
systemPromptHash,
|
|
433
409
|
thinkingLevel: nullableString(record.thinkingLevel),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EvalCompareV4Summary } from "../compare/compare.js";
|
|
2
|
-
import { renderEvalComparisonV4 } from "../compare/compare.js";
|
|
2
|
+
import { renderEvalComparisonRoutesV1, renderEvalComparisonV4 } from "../compare/compare.js";
|
|
3
3
|
|
|
4
4
|
export type EvalComparisonReportFormat = "text" | "json" | "md" | "junit";
|
|
5
5
|
|
|
@@ -16,7 +16,7 @@ export function renderEvalComparisonReportV1(
|
|
|
16
16
|
function renderMarkdown(summary: EvalCompareV4Summary): string {
|
|
17
17
|
const rows = summary.behavioralMetrics.map(
|
|
18
18
|
(row) =>
|
|
19
|
-
`| ${cell(row.scenarioId)} | ${cell(row.role)} | ${cell(
|
|
19
|
+
`| ${cell(row.scenarioId)} | ${cell(row.role)} | ${cell(renderEvalComparisonRoutesV1(row))} | ${row.family} | ${row.metric} | ${format(row.baseline.mean)} | ${format(row.baseline.variance)} | ${row.baseline.measured}/${row.baseline.observations} | ${format(row.candidate.mean)} | ${format(row.candidate.variance)} | ${row.candidate.measured}/${row.candidate.observations} | ${format(row.noiseBand)} | ${row.change} | ${row.varianceChange} | ${row.comparability.comparable ? "comparable" : cell(row.comparability.mismatchedFields.join(", "))} | ${row.hardGate ? "hard" : "informational"} |`,
|
|
20
20
|
);
|
|
21
21
|
const scenarioRows = summary.scenarioReports.map(
|
|
22
22
|
(report) => `| ${cell(report.id)} | ${changeCounts(report.metrics)} | ${changeCounts(report.variance)} |`,
|
|
@@ -30,11 +30,11 @@ function renderMarkdown(summary: EvalCompareV4Summary): string {
|
|
|
30
30
|
`Behavioral hard gate: **${summary.hardGate.pass ? "pass" : "fail"}**`,
|
|
31
31
|
...summary.hardGate.failures.map(
|
|
32
32
|
(failure) =>
|
|
33
|
-
`- Hard failure: ${failure.scenarioId} / ${failure.role} / ${failure
|
|
33
|
+
`- Hard failure: ${failure.scenarioId} / ${failure.role} / ${renderEvalComparisonRoutesV1(failure)} / ${failure.metric}: ${failure.change}`,
|
|
34
34
|
),
|
|
35
35
|
...summary.envelopeMismatches.map(
|
|
36
36
|
(mismatch) =>
|
|
37
|
-
`- Incomparable envelope: ${mismatch.scenarioId} / ${mismatch.role} / ${mismatch
|
|
37
|
+
`- Incomparable envelope: ${mismatch.scenarioId} / ${mismatch.role} / ${renderEvalComparisonRoutesV1(mismatch)}: ${mismatch.fields.join(", ")}`,
|
|
38
38
|
),
|
|
39
39
|
...summary.affectedCorpusResults.map(
|
|
40
40
|
(result) => `- Affected corpus result: ${result.scenarioId} / ${result.role}: ${result.changedFields.join(", ")}`,
|
|
@@ -43,8 +43,8 @@ function renderMarkdown(summary: EvalCompareV4Summary): string {
|
|
|
43
43
|
`Token delta: ${summary.tokenDelta === null ? "unmeasured" : summary.tokenDelta}`,
|
|
44
44
|
`Wall-time delta ms: ${summary.wallTimeDelta}`,
|
|
45
45
|
"",
|
|
46
|
-
"| Scenario | Role |
|
|
47
|
-
"
|
|
46
|
+
"| Scenario | Role | Baseline -> candidate target/model | Family | Metric | Baseline mean | Baseline variance | Baseline measured | Candidate mean | Candidate variance | Candidate measured | Noise band | Change | Variance | Comparability | Gate |",
|
|
47
|
+
"|---|---|---|---|---|---:|---:|---:|---:|---:|---:|---:|---|---|---|---|",
|
|
48
48
|
...rows,
|
|
49
49
|
"",
|
|
50
50
|
"## Per-scenario baseline/candidate report",
|
|
@@ -70,7 +70,7 @@ function renderJunit(summary: EvalCompareV4Summary): string {
|
|
|
70
70
|
);
|
|
71
71
|
const represented = new Set<string>();
|
|
72
72
|
const cases = summary.behavioralMetrics.map((row) => {
|
|
73
|
-
const name = `${row.scenarioId}[${row.role}:${row
|
|
73
|
+
const name = `${row.scenarioId}[${row.role}:${renderEvalComparisonRoutesV1(row)}].${row.metric}`;
|
|
74
74
|
const key = JSON.stringify([row.scenarioId, row.role, row.target.id, row.target.model, row.metric]);
|
|
75
75
|
represented.add(key);
|
|
76
76
|
const detail = `change=${row.change} variance=${row.varianceChange} baseline=${format(row.baseline.mean)} candidate=${format(row.candidate.mean)}`;
|
|
@@ -87,13 +87,13 @@ function renderJunit(summary: EvalCompareV4Summary): string {
|
|
|
87
87
|
failure.metric,
|
|
88
88
|
]);
|
|
89
89
|
if (represented.has(key)) continue;
|
|
90
|
-
const name = `${failure.scenarioId}[${failure.role}:${failure
|
|
90
|
+
const name = `${failure.scenarioId}[${failure.role}:${renderEvalComparisonRoutesV1(failure)}].${failure.metric}`;
|
|
91
91
|
cases.push(
|
|
92
92
|
` <testcase classname="eval.behavior.hard" name="${escapeXml(name)}"><failure message="${escapeXml(failure.change)}">hard behavioral gate</failure></testcase>`,
|
|
93
93
|
);
|
|
94
94
|
}
|
|
95
95
|
for (const failure of summary.hardGate.envelopeFailures) {
|
|
96
|
-
const name = `${failure.scenarioId}[${failure.role}:${failure
|
|
96
|
+
const name = `${failure.scenarioId}[${failure.role}:${renderEvalComparisonRoutesV1(failure)}].execution-envelope`;
|
|
97
97
|
cases.push(
|
|
98
98
|
` <testcase classname="eval.behavior.envelope" name="${escapeXml(name)}"><failure message="incomparable">${escapeXml(failure.fields.join(", "))}</failure></testcase>`,
|
|
99
99
|
);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
2
2
|
import { normalizeClioCoderEventRecord } from "../../../core/naming-events.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ALL_TOOL_NAMES } from "../../../core/tool-names.js";
|
|
4
4
|
import { clioStateDir } from "../../../core/xdg.js";
|
|
5
5
|
import {
|
|
6
6
|
evidenceMetricsFromReceipt,
|
|
@@ -22,19 +22,23 @@ export async function runClioRunRunner(
|
|
|
22
22
|
readObservation?: { allowedPaths: string[]; decoyPaths: string[] },
|
|
23
23
|
): Promise<EvalRunnerOutput> {
|
|
24
24
|
const prompt = runner.prompt ?? "";
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
// Spawned as an argv, not a shell line: the task timeout has to reach the
|
|
26
|
+
// Clio process itself so the receipt it seals and the exit code this
|
|
27
|
+
// runner reports describe the same ending. See runShellCommand.
|
|
28
|
+
const args: [string, ...string[]] = [
|
|
29
|
+
process.execPath,
|
|
30
|
+
clioEntry,
|
|
27
31
|
"run",
|
|
28
32
|
"--json",
|
|
29
|
-
...(runner.agent === undefined ? [] : ["--agent",
|
|
33
|
+
...(runner.agent === undefined ? [] : ["--agent", runner.agent]),
|
|
30
34
|
"--target",
|
|
31
|
-
|
|
32
|
-
...(target.model === undefined ? [] : ["--model",
|
|
33
|
-
...(target.thinking === undefined ? [] : ["--thinking",
|
|
35
|
+
target.id,
|
|
36
|
+
...(target.model === undefined ? [] : ["--model", target.model]),
|
|
37
|
+
...(target.thinking === undefined ? [] : ["--thinking", target.thinking]),
|
|
34
38
|
...(runner.autonomy === undefined ? [] : ["--autonomy", runner.autonomy]),
|
|
35
|
-
|
|
39
|
+
prompt,
|
|
36
40
|
];
|
|
37
|
-
const result = await runShellCommand(
|
|
41
|
+
const result = await runShellCommand(args, cwd, runner.timeoutMs ?? timeoutMs, env);
|
|
38
42
|
// Usage is folded from the live stream, not from the bounded stdout
|
|
39
43
|
// artifact: a verbose run's `message_end` events do not survive truncation.
|
|
40
44
|
const tokens = result.usage;
|
|
@@ -202,19 +206,22 @@ export function toolBehaviorMetricEntriesFromJsonl(
|
|
|
202
206
|
const terminals = canonicalFinishes.length > 0 ? canonicalFinishes : executionEnds;
|
|
203
207
|
const calls = new Map<string, number>();
|
|
204
208
|
const succeeded = new Map<string, number>();
|
|
209
|
+
const failed = new Map<string, number>();
|
|
205
210
|
const blocked = new Map<string, number>();
|
|
206
211
|
for (const terminal of terminals) {
|
|
207
212
|
const tool = metricToolName(terminal.tool);
|
|
208
213
|
calls.set(tool, (calls.get(tool) ?? 0) + 1);
|
|
209
214
|
if (terminal.outcome === "ok") succeeded.set(tool, (succeeded.get(tool) ?? 0) + 1);
|
|
210
215
|
if (terminal.outcome === "blocked") blocked.set(tool, (blocked.get(tool) ?? 0) + 1);
|
|
216
|
+
if (terminal.outcome === "error") failed.set(tool, (failed.get(tool) ?? 0) + 1);
|
|
211
217
|
}
|
|
212
|
-
const namedTools = new Set([
|
|
218
|
+
const namedTools = new Set([...ALL_TOOL_NAMES, ...calls.keys()]);
|
|
213
219
|
const entries: Record<string, number> = { "tools.read.distinctPaths": readPaths.size };
|
|
214
220
|
for (const tool of [...namedTools].sort()) {
|
|
215
221
|
entries[`tools.calls.${tool}`] = calls.get(tool) ?? 0;
|
|
216
222
|
entries[`tools.succeeded.${tool}`] = succeeded.get(tool) ?? 0;
|
|
217
223
|
entries[`tools.blocked.${tool}`] = blocked.get(tool) ?? 0;
|
|
224
|
+
entries[`tools.failed.${tool}`] = failed.get(tool) ?? 0;
|
|
218
225
|
}
|
|
219
226
|
if (readObservation !== undefined) {
|
|
220
227
|
const allowed = readObservation.allowedPaths.map((path) => normalizeObservedPath(cwd, path));
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { shellQuote } from "../../../core/shell-quote.js";
|
|
2
1
|
import type { EvalSuiteTargetV2 } from "../schema/suite.js";
|
|
3
2
|
import { type EvalRunnerOutput, runShellCommand } from "./external-command.js";
|
|
4
3
|
|
|
@@ -9,12 +8,8 @@ export async function runContextIndexRunner(
|
|
|
9
8
|
target: EvalSuiteTargetV2,
|
|
10
9
|
env?: NodeJS.ProcessEnv,
|
|
11
10
|
): Promise<EvalRunnerOutput> {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
cwd,
|
|
15
|
-
timeoutMs,
|
|
16
|
-
env,
|
|
17
|
-
);
|
|
11
|
+
const args: [string, ...string[]] = [process.execPath, clioEntry, "context", "index", "--json"];
|
|
12
|
+
const result = await runShellCommand(args, cwd, timeoutMs, env);
|
|
18
13
|
const parsed = parseContextIndexOutput(result.stdout);
|
|
19
14
|
return {
|
|
20
15
|
assignmentId: null,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { existsSync, statSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { shellQuote } from "../../../core/shell-quote.js";
|
|
4
3
|
import type { EvalRunnerV2, EvalSuiteTargetV2 } from "../schema/suite.js";
|
|
5
4
|
import { type EvalRunnerOutput, runShellCommand } from "./external-command.js";
|
|
6
5
|
|
|
@@ -13,7 +12,7 @@ export async function runContextInitRunner(
|
|
|
13
12
|
env?: NodeJS.ProcessEnv,
|
|
14
13
|
): Promise<EvalRunnerOutput> {
|
|
15
14
|
const extraArgs = runner.args ?? [];
|
|
16
|
-
const
|
|
15
|
+
const args: [string, ...string[]] = [
|
|
17
16
|
process.execPath,
|
|
18
17
|
clioEntry,
|
|
19
18
|
"context",
|
|
@@ -25,10 +24,8 @@ export async function runContextInitRunner(
|
|
|
25
24
|
...(target.model === undefined ? [] : ["--model", target.model]),
|
|
26
25
|
...(target.thinking === undefined ? [] : ["--thinking", target.thinking]),
|
|
27
26
|
...extraArgs,
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
.join(" ");
|
|
31
|
-
const result = await runShellCommand(command, cwd, runner.timeoutMs ?? timeoutMs, env);
|
|
27
|
+
];
|
|
28
|
+
const result = await runShellCommand(args, cwd, runner.timeoutMs ?? timeoutMs, env);
|
|
32
29
|
const payload = parseInitPayload(result.stdout);
|
|
33
30
|
const candidateGeneration = recordField(payload, "generation");
|
|
34
31
|
const generation = isValidGenerationPayload(payload, candidateGeneration) ? candidateGeneration : null;
|
|
@@ -65,6 +65,11 @@ const OUTPUT_HEAD_LIMIT = 20_000;
|
|
|
65
65
|
const OUTPUT_TRUNCATION_MARKER = "\n[output middle truncated; tail preserved]\n";
|
|
66
66
|
const METRIC_JSONL_LIMIT = 256_000;
|
|
67
67
|
const METRIC_JSONL_LINE_LIMIT = 64_000;
|
|
68
|
+
// After the deadline's SIGTERM, how long a run gets to end on its own terms
|
|
69
|
+
// before SIGKILL. Clio seals the interrupted run's receipt inside its
|
|
70
|
+
// coordinated shutdown, which budgets 500ms per hook across several hooks; a
|
|
71
|
+
// one-second grace killed it mid-seal and the timed-out run left no receipt.
|
|
72
|
+
const TIMEOUT_KILL_GRACE_MS = 5_000;
|
|
68
73
|
|
|
69
74
|
export async function runExternalCommandRunner(
|
|
70
75
|
runner: EvalRunnerV2,
|
|
@@ -133,8 +138,23 @@ export async function runExternalCommandRunner(
|
|
|
133
138
|
};
|
|
134
139
|
}
|
|
135
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Run one eval subprocess to completion or to the timeout.
|
|
143
|
+
*
|
|
144
|
+
* A string runs through the shell, which is what an operator's
|
|
145
|
+
* `external-command` line and the verifier commands are. An argv array spawns
|
|
146
|
+
* the program directly, with no shell between the runner and the process
|
|
147
|
+
* whose exit code it reports. That distinction matters on the timeout path:
|
|
148
|
+
* `/bin/sh -c` on dash keeps the shell as the parent, so SIGTERM to the shell
|
|
149
|
+
* stops the shell alone while the program runs on to completion. A
|
|
150
|
+
* `clio-coder run` spawned that way finished its turn after the deadline,
|
|
151
|
+
* sealed a succeeded receipt with exit 0, and exited 0, and this runner
|
|
152
|
+
* reported the shell's signal death as exit 124 (issue #275). With an argv the
|
|
153
|
+
* signal reaches Clio itself, which seals the run as canceled with the exit
|
|
154
|
+
* status it then reports, so the receipt and the exit code agree either way.
|
|
155
|
+
*/
|
|
136
156
|
export function runShellCommand(
|
|
137
|
-
command: string,
|
|
157
|
+
command: string | readonly [string, ...string[]],
|
|
138
158
|
cwd: string,
|
|
139
159
|
timeoutMs: number,
|
|
140
160
|
env?: NodeJS.ProcessEnv,
|
|
@@ -153,14 +173,12 @@ export function runShellCommand(
|
|
|
153
173
|
const callLedgerFold = createEvalCallLedgerFold();
|
|
154
174
|
let timedOut = false;
|
|
155
175
|
let settled = false;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
env: env === undefined ? process.env : { ...process.env, ...env },
|
|
163
|
-
});
|
|
176
|
+
// The overlay is additive: an eval item pins where Clio writes its
|
|
177
|
+
// journal, and inherits everything else the operator's shell provides.
|
|
178
|
+
const spawnEnv = env === undefined ? process.env : { ...process.env, ...env };
|
|
179
|
+
const [file, args, shell] = typeof command === "string" ? [command, [], true] : [command[0], command.slice(1), false];
|
|
180
|
+
const child = spawn(file, args, { cwd, shell, stdio: ["ignore", "pipe", "pipe"], env: spawnEnv });
|
|
181
|
+
const commandLine = typeof command === "string" ? command : command.join(" ");
|
|
164
182
|
child.stdout.setEncoding("utf8");
|
|
165
183
|
child.stderr.setEncoding("utf8");
|
|
166
184
|
child.stdout.on("data", (chunk: string) => {
|
|
@@ -177,14 +195,14 @@ export function runShellCommand(
|
|
|
177
195
|
const timer = setTimeout(() => {
|
|
178
196
|
timedOut = true;
|
|
179
197
|
child.kill("SIGTERM");
|
|
180
|
-
setTimeout(() => child.kill("SIGKILL"),
|
|
198
|
+
setTimeout(() => child.kill("SIGKILL"), TIMEOUT_KILL_GRACE_MS);
|
|
181
199
|
}, timeoutMs);
|
|
182
200
|
const finish = (exitCode: number): void => {
|
|
183
201
|
if (settled) return;
|
|
184
202
|
settled = true;
|
|
185
203
|
clearTimeout(timer);
|
|
186
204
|
resolve({
|
|
187
|
-
command,
|
|
205
|
+
command: commandLine,
|
|
188
206
|
exitCode,
|
|
189
207
|
stdout,
|
|
190
208
|
metricJsonl: metricCapture.finish(),
|
|
@@ -230,6 +230,8 @@ export interface EvalRunnerV2 {
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
export interface EvalVerifyV2 {
|
|
233
|
+
/** Workspace-relative grader code and dependencies that the runner must not change. */
|
|
234
|
+
protectedFiles?: string[];
|
|
233
235
|
commands?: string[];
|
|
234
236
|
/**
|
|
235
237
|
* Commands that grade the task outcome. They run in the workspace before the
|
|
@@ -247,6 +247,7 @@ function readVerify(
|
|
|
247
247
|
return {
|
|
248
248
|
commands: readOptionalStringArray(value, "commands", `${path}.commands`, issues),
|
|
249
249
|
measure: readOptionalStringArray(value, "measure", `${path}.measure`, issues),
|
|
250
|
+
protectedFiles: readOptionalStringArray(value, "protectedFiles", `${path}.protectedFiles`, issues),
|
|
250
251
|
assertions: readAssertions(value.assertions, `${path}.assertions`, issues),
|
|
251
252
|
forbidPaths: readOptionalStringArray(value, "forbidPaths", `${path}.forbidPaths`, issues),
|
|
252
253
|
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { lstat, mkdir, mkdtemp, open, readdir, realpath, rm, writeFile } from "node:fs/promises";
|
|
2
3
|
import { tmpdir } from "node:os";
|
|
3
|
-
import { resolve } from "node:path";
|
|
4
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
5
|
import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
|
|
6
|
+
import { clioDataDir } from "../../../core/xdg.js";
|
|
5
7
|
import { resolveMetricAssertion } from "../compare/thresholds.js";
|
|
6
8
|
import { buildEvalExecutionEnvelopeV1, type EvalExecutionObservationV1 } from "../execution-provenance.js";
|
|
7
9
|
import { aggregateEvalVerdicts } from "../metrics/aggregate.js";
|
|
@@ -44,7 +46,8 @@ import type { EvalMetricAssertion, EvalSuiteTargetV2, LoadedEvalSuiteV2 } from "
|
|
|
44
46
|
import { createEvalId } from "../store.js";
|
|
45
47
|
import { runCommandVerifiers } from "../verifiers/command.js";
|
|
46
48
|
import { forbiddenPathHits } from "../verifiers/file-exists.js";
|
|
47
|
-
import {
|
|
49
|
+
import { EvalGraderIntegrityError, protectGraderFiles } from "../verifiers/integrity.js";
|
|
50
|
+
import { collectPatchMetrics, forgetPatchBaseline, recordPatchBaseline } from "../verifiers/patch.js";
|
|
48
51
|
import { prepareGitWorkspace } from "../workspaces/git.js";
|
|
49
52
|
import { type PreparedEvalWorkspace, prepareLocalWorkspace } from "../workspaces/local.js";
|
|
50
53
|
import { type PrepareTempCopyWorkspaceOptions, prepareTempCopyWorkspace } from "../workspaces/temp-copy.js";
|
|
@@ -99,6 +102,7 @@ export async function runEvalSuiteV2(
|
|
|
99
102
|
options.clioEntry,
|
|
100
103
|
options.freshWorkspaces === true,
|
|
101
104
|
options.tempCopy,
|
|
105
|
+
resolve(clioDataDir(), "evals", evalId, "transcripts", String(results.length)),
|
|
102
106
|
);
|
|
103
107
|
spentUsd += resultCostUsd(completed.result);
|
|
104
108
|
results.push(completed.result);
|
|
@@ -154,10 +158,13 @@ async function runMatrixItem(
|
|
|
154
158
|
clioEntry: string,
|
|
155
159
|
freshWorkspace: boolean,
|
|
156
160
|
tempCopy: PrepareTempCopyWorkspaceOptions | undefined,
|
|
161
|
+
transcriptDir: string,
|
|
157
162
|
): Promise<CompletedMatrixItem> {
|
|
158
163
|
let workspace: PreparedEvalWorkspace | null = null;
|
|
159
164
|
let receipt: EvalRunnerOutput["receipt"] = null;
|
|
160
165
|
let runnerWallTimeMs = 0;
|
|
166
|
+
let runnerEvidence: EvalRunnerOutput | null = null;
|
|
167
|
+
let retention: Promise<RetainedSessionLedgers> | undefined;
|
|
161
168
|
let executionObservation: EvalExecutionObservationV1 | undefined;
|
|
162
169
|
// One matrix item, one Clio journal. An item measures Clio, and a shared
|
|
163
170
|
// state directory would mix sibling processes' runs and yesterday's sessions
|
|
@@ -170,20 +177,24 @@ async function runMatrixItem(
|
|
|
170
177
|
// A fixture that never came up measured nothing, so the item fails as a
|
|
171
178
|
// harness failure rather than reporting an invariant it never observed.
|
|
172
179
|
if (!setup.pass) throw new EvalWorkspaceSetupError(setup.exitCode, setup.stderr);
|
|
180
|
+
if (task.workspace.kind !== "local" || freshWorkspace) recordPatchBaseline(workspace.dir);
|
|
181
|
+
const checkGraderIntegrity = await protectGraderFiles(workspace.dir, task.verify.protectedFiles ?? []);
|
|
173
182
|
const runner = await runTaskRunner(task, target, workspace.dir, clioEntry, {
|
|
174
183
|
CLIO_CODER_STATE_DIR: stateDir,
|
|
175
184
|
CLIO_CODER_ENTRY: clioEntry,
|
|
176
185
|
});
|
|
177
|
-
|
|
178
|
-
await writeFile(runnerStdoutFile, runner.stdout, "utf8");
|
|
186
|
+
runnerEvidence = runner;
|
|
179
187
|
receipt = runner.receipt ?? null;
|
|
180
188
|
runnerWallTimeMs = runner.wallTimeMs;
|
|
189
|
+
const runnerStdoutFile = resolve(stateDir, "eval-runner-output.jsonl");
|
|
190
|
+
await writeFile(runnerStdoutFile, runner.stdout, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
181
191
|
const patch = collectPatchMetrics(workspace.dir);
|
|
182
192
|
const receiptExitCode = runner.exitCode;
|
|
183
193
|
// Read after the runner returned and before the journal is removed: what
|
|
184
194
|
// Clio sealed for this item, judged against its own ledger, and whether
|
|
185
195
|
// the workers it attested are still running.
|
|
186
196
|
const journalMetrics = invariantMetrics(stateDir, receiptExitCode);
|
|
197
|
+
await checkGraderIntegrity();
|
|
187
198
|
const measurement = await measureTaskOutcome(task, workspace.dir, {
|
|
188
199
|
...namingCompatibilityEnvironment(
|
|
189
200
|
"CLIO_CODER_EVAL_RUNNER_STDOUT_FILE",
|
|
@@ -202,14 +213,20 @@ async function runMatrixItem(
|
|
|
202
213
|
// The one reading that needs both sides: what the loop reported it
|
|
203
214
|
// spent, and what the journal shows it sealed.
|
|
204
215
|
...fleetLoopReceiptAgreement(runner.metrics as Record<string, number | boolean>, journalMetrics),
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
216
|
+
...(patch === null
|
|
217
|
+
? {}
|
|
218
|
+
: {
|
|
219
|
+
"patch.bytes": patch.bytes,
|
|
220
|
+
"patch.filesChanged": patch.filesChanged,
|
|
221
|
+
"patch.testFilesModified": patch.testFilesModified,
|
|
222
|
+
}),
|
|
208
223
|
"result.pass": runner.exitCode === 0,
|
|
209
224
|
"result.failureClass": runner.exitCode === 0 ? null : "runner_failed",
|
|
210
225
|
...measurement.metrics,
|
|
211
226
|
};
|
|
227
|
+
await checkGraderIntegrity();
|
|
212
228
|
const verifier = await runVerifiers(task, workspace.dir, metrics);
|
|
229
|
+
await checkGraderIntegrity();
|
|
213
230
|
const graderFailed = metrics["task.solved"] === false;
|
|
214
231
|
const pass = runner.exitCode === 0 && verifier.pass && !graderFailed;
|
|
215
232
|
const failureClass = pass
|
|
@@ -238,7 +255,10 @@ async function runMatrixItem(
|
|
|
238
255
|
...(verifier.stderr.length > 0 ? { verifierStderr: verifier.stderr } : {}),
|
|
239
256
|
},
|
|
240
257
|
};
|
|
241
|
-
|
|
258
|
+
retention ??= retainSessionLedgers(stateDir, transcriptDir, runnerEvidence?.stdout);
|
|
259
|
+
const retained = await retention;
|
|
260
|
+
applyRetainedSessionLedgers(result, retained);
|
|
261
|
+
const snapshot = retained.errors.length > 0 ? emptyLedgerSnapshot() : await readEvalLedgerSnapshot(stateDir);
|
|
242
262
|
const selected = selectEvalLedgerEntries(snapshot.entries, runner.ledgerEntries ?? []);
|
|
243
263
|
result.artifacts.trackedMetricSources = JSON.stringify({
|
|
244
264
|
assistantCalls: selected.source,
|
|
@@ -271,10 +291,15 @@ async function runMatrixItem(
|
|
|
271
291
|
serving: evalServingObservationFrom(target, receipt ?? null, snapshot.compiledPromptHashes),
|
|
272
292
|
};
|
|
273
293
|
} catch (error) {
|
|
274
|
-
const failureClass =
|
|
294
|
+
const failureClass =
|
|
295
|
+
error instanceof EvalGraderIntegrityError
|
|
296
|
+
? "grader_integrity"
|
|
297
|
+
: error instanceof EvalWorkspaceSetupError
|
|
298
|
+
? "setup_failed"
|
|
299
|
+
: "command_error";
|
|
275
300
|
const result: EvalArtifactResultV4 = {
|
|
276
|
-
assignmentId: null,
|
|
277
|
-
terminalReceiptDigest: null,
|
|
301
|
+
assignmentId: runnerEvidence?.assignmentId ?? null,
|
|
302
|
+
terminalReceiptDigest: runnerEvidence?.terminalReceiptDigest ?? null,
|
|
278
303
|
taskId: task.id,
|
|
279
304
|
repeatIndex,
|
|
280
305
|
target: { id: target.id, model: target.model ?? null, thinking: target.thinking ?? null },
|
|
@@ -287,11 +312,15 @@ async function runMatrixItem(
|
|
|
287
312
|
"latency.wallMs": 0,
|
|
288
313
|
},
|
|
289
314
|
artifacts: {
|
|
315
|
+
...runnerEvidence?.artifacts,
|
|
290
316
|
error: error instanceof Error ? error.message : String(error),
|
|
291
317
|
...(workspace === null ? {} : { workspace: workspace.dir }),
|
|
292
318
|
},
|
|
293
319
|
};
|
|
294
|
-
|
|
320
|
+
retention ??= retainSessionLedgers(stateDir, transcriptDir, runnerEvidence?.stdout);
|
|
321
|
+
const retained = await retention;
|
|
322
|
+
applyRetainedSessionLedgers(result, retained);
|
|
323
|
+
const snapshot = retained.errors.length > 0 ? emptyLedgerSnapshot() : await readEvalLedgerSnapshot(stateDir);
|
|
295
324
|
result.verdict = adaptSuiteV2ResultToVerdictV1(
|
|
296
325
|
result,
|
|
297
326
|
buildEvalTrackedMetrics({
|
|
@@ -316,6 +345,7 @@ async function runMatrixItem(
|
|
|
316
345
|
};
|
|
317
346
|
} finally {
|
|
318
347
|
try {
|
|
348
|
+
if (workspace !== null) forgetPatchBaseline(workspace.dir);
|
|
319
349
|
await workspace?.cleanup();
|
|
320
350
|
} finally {
|
|
321
351
|
// A workspace cleanup error must not strand the suite-owned journal.
|
|
@@ -575,3 +605,149 @@ function nullableNonNegativeInteger(value: unknown): number | null {
|
|
|
575
605
|
function stringArray(value: unknown): string[] {
|
|
576
606
|
return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === "string") : [];
|
|
577
607
|
}
|
|
608
|
+
|
|
609
|
+
interface RetainedSessionLedgers {
|
|
610
|
+
runnerStdoutPath?: string;
|
|
611
|
+
paths: string[];
|
|
612
|
+
errors: string[];
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
function applyRetainedSessionLedgers(result: EvalArtifactResultV4, retained: RetainedSessionLedgers): void {
|
|
616
|
+
if (retained.runnerStdoutPath !== undefined) result.artifacts.runnerStdoutFile = retained.runnerStdoutPath;
|
|
617
|
+
if (retained.paths.length > 0 || retained.errors.length > 0) result.artifacts.sessionLedgers = retained.paths;
|
|
618
|
+
if (retained.errors.length === 0) return;
|
|
619
|
+
result.artifacts.sessionLedgerErrors = retained.errors;
|
|
620
|
+
result.metrics["evidence.retentionComplete"] = false;
|
|
621
|
+
// Keep a runner/integrity failure as the primary cause; an otherwise healthy
|
|
622
|
+
// task outcome cannot claim successful grading with unsafe or missing evidence.
|
|
623
|
+
if (result.pass || result.failureClass === "grader_failed") {
|
|
624
|
+
result.artifacts.outcomeBeforeEvidenceFailure = result.failureClass ?? "pass";
|
|
625
|
+
result.pass = false;
|
|
626
|
+
result.failureClass = "evidence_integrity";
|
|
627
|
+
result.metrics["result.pass"] = false;
|
|
628
|
+
result.metrics["result.failureClass"] = "evidence_integrity";
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/** Reject symlinks at every component inside the owned source directory. */
|
|
633
|
+
async function plainLedgerPath(root: string, path: string): Promise<void> {
|
|
634
|
+
const rel = relative(root, path);
|
|
635
|
+
if (isAbsolute(rel) || rel === ".." || rel.startsWith(`..${sep}`)) throw new Error("unsafe ledger path");
|
|
636
|
+
let current = root;
|
|
637
|
+
for (const part of ["", ...rel.split(sep)]) {
|
|
638
|
+
current = resolve(current, part);
|
|
639
|
+
if ((await lstat(current)).isSymbolicLink()) throw new Error("unsafe ledger symlink");
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
async function readOwnedLedger(root: string, path: string): Promise<Buffer> {
|
|
644
|
+
await plainLedgerPath(root, path);
|
|
645
|
+
const before = await lstat(path);
|
|
646
|
+
if (!before.isFile()) throw new Error("ledger is not a regular file");
|
|
647
|
+
const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
648
|
+
try {
|
|
649
|
+
const opened = await file.stat();
|
|
650
|
+
await plainLedgerPath(root, path);
|
|
651
|
+
if (opened.dev !== before.dev || opened.ino !== before.ino) throw new Error("ledger changed while opening");
|
|
652
|
+
return await file.readFile();
|
|
653
|
+
} finally {
|
|
654
|
+
await file.close();
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/** Create a private, unique capture below the operator's artifact root. */
|
|
659
|
+
async function transcriptCaptureDirectory(destination: string): Promise<string> {
|
|
660
|
+
const base = clioDataDir();
|
|
661
|
+
await mkdir(base, { recursive: true, mode: 0o700 });
|
|
662
|
+
let current = await realpath(base);
|
|
663
|
+
const rel = relative(base, destination);
|
|
664
|
+
if (isAbsolute(rel) || rel === ".." || rel.startsWith(`..${sep}`)) throw new Error("unsafe transcript destination");
|
|
665
|
+
for (const part of rel.split(sep)) {
|
|
666
|
+
current = resolve(current, part);
|
|
667
|
+
try {
|
|
668
|
+
await mkdir(current, { mode: 0o700 });
|
|
669
|
+
} catch (error) {
|
|
670
|
+
if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
|
|
671
|
+
}
|
|
672
|
+
const info = await lstat(current);
|
|
673
|
+
if (info.isSymbolicLink() || !info.isDirectory()) throw new Error("unsafe transcript destination");
|
|
674
|
+
}
|
|
675
|
+
return mkdtemp(resolve(current, "capture-"));
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/** Enumerate only ordinary directories; never traverse a runner-created alias. */
|
|
679
|
+
async function discoverOwnedLedgers(stateDir: string, errors: string[]): Promise<string[]> {
|
|
680
|
+
const root = resolve(stateDir, "sessions");
|
|
681
|
+
try {
|
|
682
|
+
await plainLedgerPath(stateDir, root);
|
|
683
|
+
} catch (error) {
|
|
684
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
685
|
+
throw error;
|
|
686
|
+
}
|
|
687
|
+
const paths: string[] = [];
|
|
688
|
+
for (const cwd of await readdir(root, { withFileTypes: true })) {
|
|
689
|
+
if (cwd.isSymbolicLink()) {
|
|
690
|
+
errors.push("session directory rejected: symlink");
|
|
691
|
+
continue;
|
|
692
|
+
}
|
|
693
|
+
if (!cwd.isDirectory()) continue;
|
|
694
|
+
const cwdPath = resolve(root, cwd.name);
|
|
695
|
+
try {
|
|
696
|
+
await plainLedgerPath(stateDir, cwdPath);
|
|
697
|
+
for (const session of await readdir(cwdPath, { withFileTypes: true })) {
|
|
698
|
+
if (session.isSymbolicLink()) {
|
|
699
|
+
errors.push("session directory rejected: symlink");
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
if (session.isDirectory()) paths.push(resolve(cwdPath, session.name, "current.jsonl"));
|
|
703
|
+
}
|
|
704
|
+
} catch {
|
|
705
|
+
errors.push("session directory unreadable or unsafe");
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
return paths.sort();
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/** Best-effort evidence collection never throws into (or retries) the failure path. */
|
|
712
|
+
async function retainSessionLedgers(
|
|
713
|
+
stateDir: string,
|
|
714
|
+
destination: string,
|
|
715
|
+
runnerStdout?: string,
|
|
716
|
+
): Promise<RetainedSessionLedgers> {
|
|
717
|
+
const retained: RetainedSessionLedgers = { paths: [], errors: [] };
|
|
718
|
+
try {
|
|
719
|
+
const refs = await discoverOwnedLedgers(stateDir, retained.errors);
|
|
720
|
+
if (refs.length === 0 && !runnerStdout) return retained;
|
|
721
|
+
const directory = await transcriptCaptureDirectory(destination);
|
|
722
|
+
if (runnerStdout) {
|
|
723
|
+
const path = resolve(directory, "runner-stdout.jsonl");
|
|
724
|
+
await writeFile(path, runnerStdout, { mode: 0o600, flag: "wx" });
|
|
725
|
+
retained.runnerStdoutPath = path;
|
|
726
|
+
}
|
|
727
|
+
for (const [index, pathToLedger] of refs.entries()) {
|
|
728
|
+
try {
|
|
729
|
+
let content: Buffer;
|
|
730
|
+
try {
|
|
731
|
+
content = await readOwnedLedger(stateDir, pathToLedger);
|
|
732
|
+
} catch (error) {
|
|
733
|
+
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
|
|
734
|
+
content = await readOwnedLedger(stateDir, `${pathToLedger}.tmp`);
|
|
735
|
+
retained.errors.push(`ledger ${index}: incomplete current ledger; temporary evidence retained`);
|
|
736
|
+
}
|
|
737
|
+
const path = resolve(directory, `${index}.jsonl`);
|
|
738
|
+
await writeFile(path, content, { mode: 0o600, flag: "wx" });
|
|
739
|
+
retained.paths.push(path);
|
|
740
|
+
} catch (error) {
|
|
741
|
+
// Error codes describe missing/unreadable/unsafe evidence without echoing
|
|
742
|
+
// runner-controlled paths or external file contents into the artifact.
|
|
743
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
744
|
+
retained.errors.push(
|
|
745
|
+
`ledger ${index}: retention failed (${code === "ENOENT" ? "missing" : "unsafe or unreadable"})`,
|
|
746
|
+
);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
} catch {
|
|
750
|
+
retained.errors.push("session ledger retention failed: artifact storage unavailable or unsafe");
|
|
751
|
+
}
|
|
752
|
+
return retained;
|
|
753
|
+
}
|