@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
package/src/tools/monitor.ts
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
type RunReceipt,
|
|
18
18
|
type RunReceiptVerification,
|
|
19
19
|
} from "../domains/dispatch/types.js";
|
|
20
|
-
import { summarizeTrustStatus } from "../domains/evidence/trust-projection.js";
|
|
20
|
+
import { summarizeTrustStatus, trustStateWord } from "../domains/evidence/trust-projection.js";
|
|
21
21
|
import {
|
|
22
22
|
adaptRunReceiptTrustStatus,
|
|
23
23
|
type CanonicalTrustStatus,
|
|
@@ -100,13 +100,19 @@ function listRuns(deps: MonitorToolDeps, options: ToolInvokeOptions | undefined)
|
|
|
100
100
|
|
|
101
101
|
function runStatus(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
102
102
|
const requestedRun = deps.dispatch.getRun(runId);
|
|
103
|
-
const
|
|
104
|
-
const
|
|
103
|
+
const assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
|
|
104
|
+
const rootRunId = assignment?.assignmentId ?? requestedRun?.lineage?.rootRunId ?? runId;
|
|
105
105
|
const resolvedRunId = assignment?.terminalRunId ?? runId;
|
|
106
106
|
const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun;
|
|
107
107
|
if (!run && !assignment) return { kind: "error", message: `monitor: unknown run or assignment '${runId}'` };
|
|
108
108
|
if (!run) return { kind: "error", message: `monitor: assignment '${runId}' has no available attempt` };
|
|
109
|
-
const live =
|
|
109
|
+
const live =
|
|
110
|
+
deps.dispatch
|
|
111
|
+
.snapshot()
|
|
112
|
+
.running.find(
|
|
113
|
+
(entry) =>
|
|
114
|
+
(deps.dispatch.assignments?.getStored(entry.runId)?.assignmentId ?? entry.lineage.rootRunId) === rootRunId,
|
|
115
|
+
) ?? null;
|
|
110
116
|
const reroutes =
|
|
111
117
|
run.reroutes !== undefined && run.reroutes.length > 0
|
|
112
118
|
? ` reroutes=${run.reroutes.map((hop) => `${hop.fromNode}>${hop.toNode}`).join(",")}`
|
|
@@ -142,11 +148,18 @@ function runStatus(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
|
142
148
|
`live: phase=${live.outcomePhase} heartbeat=${live.heartbeat} elapsed=${Math.round(live.elapsedMs / 1000)}s tokens=${live.tokens.total}`,
|
|
143
149
|
);
|
|
144
150
|
}
|
|
151
|
+
const trust = isTerminalRunEnvelope(run) ? summarizeTrustStatus(durableRunEvidence(run).trustStatus) : null;
|
|
152
|
+
if (trust)
|
|
153
|
+
lines.push(
|
|
154
|
+
`quality: ${trustStateWord("validationGrounding", trust.axes.validationGrounding)}`,
|
|
155
|
+
`trust: ${trust.text}`,
|
|
156
|
+
);
|
|
145
157
|
return {
|
|
146
158
|
kind: "ok",
|
|
147
159
|
output: lines.join("\n"),
|
|
148
160
|
details: {
|
|
149
161
|
mode: "status",
|
|
162
|
+
...(trust ? { trust } : {}),
|
|
150
163
|
...(assignment
|
|
151
164
|
? {
|
|
152
165
|
assignmentId: assignment.assignmentId,
|
|
@@ -289,8 +302,7 @@ function receiptToolLines(receipt: RunReceipt): string[] {
|
|
|
289
302
|
*/
|
|
290
303
|
function runTools(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
291
304
|
const requestedRun = deps.dispatch.getRun(runId);
|
|
292
|
-
const
|
|
293
|
-
const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
305
|
+
const assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
|
|
294
306
|
const resolvedRunId = assignment?.terminalRunId ?? runId;
|
|
295
307
|
const run = deps.dispatch.getRun(resolvedRunId) ?? requestedRun ?? null;
|
|
296
308
|
if (run === null && assignment === null) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
@@ -504,8 +516,8 @@ async function runWait(
|
|
|
504
516
|
const startedAt = performance.now();
|
|
505
517
|
let run = deps.dispatch.getRun(runId);
|
|
506
518
|
if (!run) return { kind: "error", message: `monitor: unknown run '${runId}'` };
|
|
507
|
-
|
|
508
|
-
|
|
519
|
+
let assignment = deps.dispatch.assignments?.getStored(runId) ?? null;
|
|
520
|
+
const rootRunId = assignment?.assignmentId ?? runId;
|
|
509
521
|
while (assignment?.status === "running" || (assignment === null && !isTerminalRunEnvelope(run))) {
|
|
510
522
|
if (signal?.aborted) return { kind: "error", message: "monitor: wait aborted" };
|
|
511
523
|
const elapsed = Math.round(performance.now() - startedAt);
|
|
@@ -587,7 +599,11 @@ function collectRunLine(row: CollectedRunRow): string[] {
|
|
|
587
599
|
lines.push(` ${workerTextLabel(row.evidence.trustStatus)}`);
|
|
588
600
|
const output = row.evidence.output;
|
|
589
601
|
if (output) {
|
|
590
|
-
const capped = truncateUtf8(
|
|
602
|
+
const capped = truncateUtf8(
|
|
603
|
+
output.text,
|
|
604
|
+
COLLECT_TEXT_BYTES,
|
|
605
|
+
`\n[preview clipped at ${COLLECT_TEXT_BYTES} bytes; the complete sealed text is output.text in ${row.run?.receiptPath ?? "the receipt"}]`,
|
|
606
|
+
);
|
|
591
607
|
const qualifier = output.state === "partial" ? " (partial; the run did not complete this message)" : "";
|
|
592
608
|
const truncatedNote = output.truncated ? ` (stored output truncated; full text was ${output.bytes} bytes)` : "";
|
|
593
609
|
lines.push(` agent output${qualifier}${truncatedNote}:`, ...capped.split("\n").map((line) => ` ${line}`));
|
|
@@ -606,11 +622,10 @@ function collectRunLine(row: CollectedRunRow): string[] {
|
|
|
606
622
|
|
|
607
623
|
function resolveCollectRow(deps: MonitorToolDeps, originalRunId: string, agentId: string): CollectRow {
|
|
608
624
|
const original = deps.dispatch.getRun(originalRunId);
|
|
609
|
-
const rootRunId = original?.lineage?.rootRunId ?? originalRunId;
|
|
610
625
|
// The durable assignment record is written asynchronously at admission, so a
|
|
611
626
|
// collect issued in that window sees none yet and reads the attempt directly.
|
|
612
627
|
// terminalRunId is null while the assignment is still running.
|
|
613
|
-
const assignment = deps.dispatch.assignments?.getStored(
|
|
628
|
+
const assignment = deps.dispatch.assignments?.getStored(originalRunId) ?? null;
|
|
614
629
|
const runId = assignment?.terminalRunId ?? originalRunId;
|
|
615
630
|
const run = deps.dispatch.getRun(runId) ?? original;
|
|
616
631
|
return {
|
|
@@ -1,29 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* answers an unregistered name with a `not_visible` verdict. So the existing
|
|
8
|
-
* lever for "this run has no network" is registration itself, the same lever
|
|
9
|
-
* that already keeps `ask_user` out of headless and worker registries. This
|
|
10
|
-
* module carries the switch that lever reads.
|
|
11
|
-
*
|
|
12
|
-
* The channel is an environment variable because the process that needs the
|
|
13
|
-
* policy is a child: the skill-eval harness spawns `clio-coder run` for each arm,
|
|
14
|
-
* and any worker those runs dispatch is a grandchild. Env inherits down the
|
|
15
|
-
* whole tree, so one setting at spawn time covers every registry built below
|
|
16
|
-
* it (`src/tools/bootstrap.ts`, `src/engine/worker-tools.ts`) without a flag
|
|
17
|
-
* threaded through four call layers.
|
|
18
|
-
*
|
|
19
|
-
* What this does not cover: a runtime that executes its own tool surface
|
|
20
|
-
* outside Clio's mediation (an external CLI subprocess) never consults this
|
|
21
|
-
* registry, so its network access is its own to answer for.
|
|
2
|
+
* Process-wide registration switch for the RETRIEVE tool plane (web_fetch).
|
|
3
|
+
* This removes retrieval tools from main and worker registries. It does not
|
|
4
|
+
* restrict bash, hooks, external CLIs, or provider traffic. Hermetic execution
|
|
5
|
+
* requires an OS network sandbox supplied by the operator or eval harness.
|
|
6
|
+
* The environment setting propagates to child registries without per-run wiring.
|
|
22
7
|
*/
|
|
8
|
+
export const NO_NETWORK_TOOLS_ENV = "CLIO_CODER_DISABLE_RETRIEVE_TOOLS";
|
|
23
9
|
|
|
24
|
-
/**
|
|
25
|
-
export const NO_NETWORK_TOOLS_ENV = "CLIO_CODER_NO_NETWORK_TOOLS";
|
|
26
|
-
|
|
10
|
+
/** Legacy spelling remains accepted for existing harnesses; neither is a sandbox. */
|
|
27
11
|
export function networkToolsDisabled(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
28
|
-
return env[NO_NETWORK_TOOLS_ENV] === "1";
|
|
12
|
+
return env[NO_NETWORK_TOOLS_ENV] === "1" || env.CLIO_CODER_NO_NETWORK_TOOLS === "1";
|
|
29
13
|
}
|
|
14
|
+
|
|
15
|
+
/** Operator process opt-in; never accepted from model arguments or project settings. */
|
|
16
|
+
export const WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV = "CLIO_CODER_WEB_FETCH_ALLOW_PRIVATE_NETWORK";
|
package/src/tools/observation.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
|
|
2
|
+
import { createSafetyPolicyEngine } from "../domains/safety/policy-engine.js";
|
|
3
|
+
import type { ImageContent } from "../engine/types.js";
|
|
2
4
|
import type { ToolInvokeOptions, ToolResult } from "./registry.js";
|
|
3
5
|
import { offloadPointer, writeToolOffload } from "./result-shaping.js";
|
|
4
6
|
import { formatSize } from "./truncate.js";
|
|
@@ -337,6 +339,8 @@ export function observationBudgetExhausted(input: {
|
|
|
337
339
|
}
|
|
338
340
|
|
|
339
341
|
export interface ObservationInput {
|
|
342
|
+
images?: ImageContent[];
|
|
343
|
+
withheldPaths?: number;
|
|
340
344
|
tool: string;
|
|
341
345
|
unit: ObservationUnit;
|
|
342
346
|
format?: ObservationFormat;
|
|
@@ -446,7 +450,10 @@ export function finalizeObservation(input: ObservationInput): ToolResult {
|
|
|
446
450
|
}
|
|
447
451
|
}
|
|
448
452
|
|
|
449
|
-
|
|
453
|
+
if ((input.withheldPaths ?? 0) > 0 && format === "text")
|
|
454
|
+
output += `\n\n[${input.withheldPaths} protected paths withheld by zero-access policy]`;
|
|
455
|
+
const shownBytes =
|
|
456
|
+
byteLength(output) + (input.images ?? []).reduce((bytes, image) => bytes + byteLength(image.data), 0);
|
|
450
457
|
recordSpentBytes(input.reservation, shownBytes);
|
|
451
458
|
const budget = budgetDetails(input.reservation);
|
|
452
459
|
const observation: Observation = {
|
|
@@ -466,5 +473,35 @@ export function finalizeObservation(input: ObservationInput): ToolResult {
|
|
|
466
473
|
...(offloadPath !== null ? { offloadPath } : {}),
|
|
467
474
|
...(budget !== null ? { budget } : {}),
|
|
468
475
|
};
|
|
469
|
-
return {
|
|
476
|
+
return {
|
|
477
|
+
kind: "ok",
|
|
478
|
+
output,
|
|
479
|
+
...(input.images?.length ? { images: input.images } : {}),
|
|
480
|
+
details: { ...(input.details ?? {}), observation },
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/** Producers pass structured paths before rendering or offloading any content. */
|
|
485
|
+
export function createObservationPathFilter(
|
|
486
|
+
cwd = process.cwd(),
|
|
487
|
+
allowsPath?: (path: string) => boolean,
|
|
488
|
+
): {
|
|
489
|
+
allows(path: string): boolean;
|
|
490
|
+
readonly withheldPaths: number;
|
|
491
|
+
} {
|
|
492
|
+
const policy = allowsPath ? undefined : createSafetyPolicyEngine({ cwd });
|
|
493
|
+
const allows =
|
|
494
|
+
allowsPath ??
|
|
495
|
+
((path: string) => policy?.evaluate({ tool: "read", args: { path } }).reasonCode !== "path-policy:zeroAccessPaths");
|
|
496
|
+
const withheld = new Set<string>();
|
|
497
|
+
return {
|
|
498
|
+
allows(path) {
|
|
499
|
+
if (allows(path)) return true;
|
|
500
|
+
withheld.add(path);
|
|
501
|
+
return false;
|
|
502
|
+
},
|
|
503
|
+
get withheldPaths() {
|
|
504
|
+
return withheld.size;
|
|
505
|
+
},
|
|
506
|
+
};
|
|
470
507
|
}
|
package/src/tools/policy.ts
CHANGED
|
@@ -21,6 +21,7 @@ interface PlaneExpectation {
|
|
|
21
21
|
|
|
22
22
|
/** One row per registered tool: plane, action class, and concurrency rule. */
|
|
23
23
|
export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> = {
|
|
24
|
+
[ToolNames.Evidence]: { plane: "observe", actionClass: "read", executionMode: "sequential" },
|
|
24
25
|
[ToolNames.Read]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
25
26
|
[ToolNames.Grep]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
26
27
|
[ToolNames.Find]: { plane: "observe", actionClass: "read", executionMode: "parallel" },
|
|
@@ -53,6 +54,14 @@ export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> =
|
|
|
53
54
|
// panes. It mutates no workspace, so it stays read class; sequential because
|
|
54
55
|
// two pane operations in one batch would race the same pane registry.
|
|
55
56
|
[ToolNames.Panes]: { plane: "orchestrate", actionClass: "read", executionMode: "sequential" },
|
|
57
|
+
// limitation records a typed receipt in the session ledger and nothing
|
|
58
|
+
// else: no filesystem, no shell. Read class so it never trips a safety
|
|
59
|
+
// gate; parallel because the call is pure and idempotent.
|
|
60
|
+
[ToolNames.Limitation]: { plane: "orchestrate", actionClass: "read", executionMode: "parallel" },
|
|
61
|
+
// decide appends one decision-board entry to the session ledger and
|
|
62
|
+
// nothing else. Read class so it never trips a safety gate; sequential so
|
|
63
|
+
// two decisions in one batch never race the supersede lookup.
|
|
64
|
+
[ToolNames.Decide]: { plane: "orchestrate", actionClass: "read", executionMode: "sequential" },
|
|
56
65
|
[ToolNames.WebFetch]: { plane: "retrieve", actionClass: "read", executionMode: "parallel" },
|
|
57
66
|
[ToolNames.AskUser]: { plane: "interact", actionClass: "read", executionMode: "sequential" },
|
|
58
67
|
[ToolNames.Artifact]: { plane: "artifact", actionClass: "write", executionMode: "sequential" },
|
|
@@ -50,6 +50,7 @@ const FOLDED_WITH_DIFF: ToolPresentationPolicy = {
|
|
|
50
50
|
* tools, folds the same way.
|
|
51
51
|
*/
|
|
52
52
|
export const TOOL_PRESENTATION: Readonly<Record<string, ToolPresentationPolicy>> = {
|
|
53
|
+
[ToolNames.Evidence]: FOLDED,
|
|
53
54
|
[ToolNames.Read]: FOLDED,
|
|
54
55
|
[ToolNames.Grep]: FOLDED,
|
|
55
56
|
[ToolNames.Find]: FOLDED,
|
|
@@ -68,6 +69,8 @@ export const TOOL_PRESENTATION: Readonly<Record<string, ToolPresentationPolicy>>
|
|
|
68
69
|
[ToolNames.Tasks]: FOLDED,
|
|
69
70
|
[ToolNames.Ledger]: FOLDED,
|
|
70
71
|
[ToolNames.Panes]: FOLDED,
|
|
72
|
+
[ToolNames.Limitation]: FOLDED,
|
|
73
|
+
[ToolNames.Decide]: FOLDED,
|
|
71
74
|
[ToolNames.WebFetch]: FOLDED,
|
|
72
75
|
[ToolNames.AskUser]: FOLDED,
|
|
73
76
|
[ToolNames.Artifact]: FOLDED,
|
package/src/tools/read.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { readFileSync, statSync } from "node:fs";
|
|
2
2
|
import { Type } from "typebox";
|
|
3
|
+
import { detectSupportedImageMimeType, prepareBoundedImage } from "../core/file-references.js";
|
|
3
4
|
import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
|
|
4
5
|
import { ToolNames } from "../core/tool-names.js";
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
commitObservationReservation,
|
|
8
|
+
finalizeObservation,
|
|
9
|
+
observationBudgetExhausted,
|
|
10
|
+
releaseObservation,
|
|
11
|
+
reserveObservation,
|
|
12
|
+
} from "./observation.js";
|
|
6
13
|
import { resolveReadPath } from "./path-utils.js";
|
|
7
14
|
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
8
15
|
import { isSessionOffloadPath } from "./result-shaping.js";
|
|
@@ -28,13 +35,35 @@ export function readMaxBytes(): number {
|
|
|
28
35
|
return Math.max(MIN_READ_CAP_BYTES, resolveGuardrail("readMaxBytes"));
|
|
29
36
|
}
|
|
30
37
|
|
|
38
|
+
// Number only an already bounded slice, retaining its explicit physical line
|
|
39
|
+
// count: a truncated slice ending in a blank line can look like a terminator.
|
|
40
|
+
function numberSourceLines(content: string, firstLine: number, lineCount: number): string {
|
|
41
|
+
return content
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map((line, index) => (index < lineCount ? `${firstLine + index} | ${line}` : line))
|
|
44
|
+
.join("\n");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function numberedPrefixBytes(totalLines: number): number {
|
|
48
|
+
let bytes = totalLines * 3; // " | " after each decimal source line number.
|
|
49
|
+
for (let first = 1, digits = 1; first <= totalLines; first *= 10, digits++) {
|
|
50
|
+
bytes += (Math.min(totalLines + 1, first * 10) - first) * digits;
|
|
51
|
+
}
|
|
52
|
+
return bytes;
|
|
53
|
+
}
|
|
54
|
+
|
|
31
55
|
export const readTool: ToolSpec = {
|
|
32
56
|
name: ToolNames.Read,
|
|
33
|
-
description: `Read a UTF-8 text file. Output is capped at ${DEFAULT_MAX_LINES} lines or ${
|
|
57
|
+
description: `Read a UTF-8 text file or a PNG, JPEG, GIF, or WebP image when the routed model supports vision. Output is capped at ${DEFAULT_MAX_LINES} lines or ${
|
|
34
58
|
DEFAULT_READ_MAX_BYTES / 1024
|
|
35
|
-
}KB per call; truncated results say how to continue with offset/limit. Pass tail=N to read the last N lines (jump to EOF) instead of paging from the top.`,
|
|
59
|
+
}KB per call; truncated results say how to continue with offset/limit. Pass tail=N to read the last N lines (jump to EOF) instead of paging from the top. Set line_numbers=true for citations: each source line is prefixed with its physical 1-based line number and " | "; these labels are not file content.`,
|
|
36
60
|
parameters: Type.Object({
|
|
37
61
|
path: Type.String({ description: "File path (relative or absolute)." }),
|
|
62
|
+
line_numbers: Type.Optional(
|
|
63
|
+
Type.Boolean({
|
|
64
|
+
description: "Display physical source line numbers for citations. Default false preserves plain text.",
|
|
65
|
+
}),
|
|
66
|
+
),
|
|
38
67
|
offset: Type.Optional(Type.Number({ description: "1-indexed start line." })),
|
|
39
68
|
limit: Type.Optional(Type.Number({ description: "Max lines to read." })),
|
|
40
69
|
tail: Type.Optional(
|
|
@@ -47,6 +76,7 @@ export const readTool: ToolSpec = {
|
|
|
47
76
|
const pathArg = typeof args.path === "string" ? args.path : null;
|
|
48
77
|
if (!pathArg) return { kind: "error", message: "read: missing path argument" };
|
|
49
78
|
const filePath = resolveReadPath(pathArg);
|
|
79
|
+
const numbered = args.line_numbers === true;
|
|
50
80
|
const offset = typeof args.offset === "number" && args.offset > 0 ? Math.floor(args.offset) : 1;
|
|
51
81
|
const limit = typeof args.limit === "number" && args.limit > 0 ? Math.floor(args.limit) : null;
|
|
52
82
|
const tail = typeof args.tail === "number" && args.tail > 0 ? Math.floor(args.tail) : null;
|
|
@@ -76,13 +106,44 @@ export const readTool: ToolSpec = {
|
|
|
76
106
|
hint: "Use offset/limit in a follow-up turn or grep/find for a narrower section.",
|
|
77
107
|
});
|
|
78
108
|
}
|
|
79
|
-
const
|
|
109
|
+
const bytes = readFileSync(filePath);
|
|
110
|
+
if (detectSupportedImageMimeType(bytes) !== null) {
|
|
111
|
+
if (options?.supportsImages !== true)
|
|
112
|
+
return {
|
|
113
|
+
kind: "error",
|
|
114
|
+
message:
|
|
115
|
+
"IMAGE_INPUT_UNSUPPORTED: the routed model does not support image input. Choose a vision-capable model to inspect this file.",
|
|
116
|
+
};
|
|
117
|
+
const output = `Image: ${pathArg}`;
|
|
118
|
+
commitObservationReservation(reservation);
|
|
119
|
+
const image = await prepareBoundedImage(
|
|
120
|
+
bytes,
|
|
121
|
+
Math.min(reservation.callCapBytes, options.toolResultMaxBytes ?? readMaxBytes()) - Buffer.byteLength(output) - 512,
|
|
122
|
+
);
|
|
123
|
+
if (image === null)
|
|
124
|
+
return {
|
|
125
|
+
kind: "error",
|
|
126
|
+
message: "IMAGE_RESULT_TOO_LARGE: image could not be encoded within the tool result byte cap.",
|
|
127
|
+
};
|
|
128
|
+
return finalizeObservation({
|
|
129
|
+
tool: ToolNames.Read,
|
|
130
|
+
unit: "results",
|
|
131
|
+
output,
|
|
132
|
+
images: [image],
|
|
133
|
+
shownCount: 1,
|
|
134
|
+
totalCount: 1,
|
|
135
|
+
truncated: false,
|
|
136
|
+
reservation,
|
|
137
|
+
...(options ? { options } : {}),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const content = bytes.toString("utf8");
|
|
80
141
|
// Slice from the raw split (keeps the trailing newline on selections that
|
|
81
142
|
// reach EOF); count lines honestly (a trailing "\n" is a terminator, not
|
|
82
143
|
// a phantom extra line) so continuation notices never over-report by one.
|
|
83
144
|
const allLines = content.split("\n");
|
|
84
145
|
const totalLines = splitLinesForCounting(content).length;
|
|
85
|
-
const totalBytes = Buffer.byteLength(content, "utf8");
|
|
146
|
+
const totalBytes = Buffer.byteLength(content, "utf8") + (numbered ? numberedPrefixBytes(totalLines) : 0);
|
|
86
147
|
const startIndex = Math.min(offset - 1, totalLines);
|
|
87
148
|
if (tail === null && offset > 1 && startIndex >= totalLines) {
|
|
88
149
|
// The anchor matters for weak models: a bare "beyond end of file"
|
|
@@ -104,10 +165,26 @@ export const readTool: ToolSpec = {
|
|
|
104
165
|
// the end (reusing truncateTail) so the very tail always survives.
|
|
105
166
|
const startLine = Math.max(0, totalLines - tail);
|
|
106
167
|
const tailContent = allLines.slice(startLine).join("\n");
|
|
107
|
-
const
|
|
168
|
+
const sourceTruncation = truncateTail(tailContent, { maxBytes: cap, maxLines: tail });
|
|
169
|
+
let truncation = sourceTruncation;
|
|
170
|
+
if (numbered) {
|
|
171
|
+
const numberedContent = numberSourceLines(
|
|
172
|
+
sourceTruncation.content,
|
|
173
|
+
totalLines - sourceTruncation.outputLines + 1,
|
|
174
|
+
sourceTruncation.outputLines,
|
|
175
|
+
);
|
|
176
|
+
truncation = truncateTail(numberedContent, { maxBytes: cap, maxLines: tail });
|
|
177
|
+
if (sourceTruncation.lastLinePartial || truncation.lastLinePartial) {
|
|
178
|
+
// Never return a tail fragment with a lost or fabricated complete
|
|
179
|
+
// line label. Keep the suffix within the cap and mark it partial.
|
|
180
|
+
const label = `${totalLines} | [partial line suffix] `;
|
|
181
|
+
const suffix = truncateTail(allLines[totalLines - 1] ?? "", { maxBytes: cap - Buffer.byteLength(label) });
|
|
182
|
+
truncation = { ...truncation, content: label + suffix.content, outputLines: 0, truncated: true };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
108
185
|
const shownLines = truncation.outputLines;
|
|
109
186
|
const firstShown = Math.max(1, totalLines - shownLines + 1);
|
|
110
|
-
const truncated = startLine > 0 || truncation.truncated;
|
|
187
|
+
const truncated = startLine > 0 || sourceTruncation.truncated || truncation.truncated;
|
|
111
188
|
return finalizeObservation({
|
|
112
189
|
tool: ToolNames.Read,
|
|
113
190
|
unit: "lines",
|
|
@@ -116,19 +193,37 @@ export const readTool: ToolSpec = {
|
|
|
116
193
|
totalCount: totalLines,
|
|
117
194
|
totalBytes,
|
|
118
195
|
truncated,
|
|
119
|
-
...(truncated
|
|
196
|
+
...(truncated && shownLines > 0
|
|
197
|
+
? {
|
|
198
|
+
next: `offset=${Math.max(1, firstShown - shownLines)} limit=${shownLines}${numbered ? " line_numbers=true" : ""}`,
|
|
199
|
+
}
|
|
200
|
+
: {}),
|
|
120
201
|
reservation,
|
|
121
202
|
...(options ? { options } : {}),
|
|
122
203
|
});
|
|
123
204
|
}
|
|
124
205
|
|
|
206
|
+
const endIndex = limit !== null ? Math.min(startIndex + limit, totalLines) : totalLines;
|
|
207
|
+
// Preserve the last selected source line's terminator when it exists.
|
|
208
|
+
// Joining a limited slice alone turns ["x", ""] into "x\n", which
|
|
209
|
+
// truncateHead counts as one line; [""] even becomes an empty file.
|
|
210
|
+
// The raw split's final entry tells us whether that newline is real,
|
|
211
|
+
// without inventing a line at EOF or changing shared text counting.
|
|
125
212
|
const selected =
|
|
126
|
-
|
|
127
|
-
const
|
|
213
|
+
allLines.slice(startIndex, endIndex).join("\n") + (endIndex > startIndex && endIndex < allLines.length ? "\n" : "");
|
|
214
|
+
const sourceTruncation = truncateHead(selected, { maxBytes: cap });
|
|
215
|
+
const truncation: TruncationResult =
|
|
216
|
+
numbered && !sourceTruncation.firstLineExceedsLimit
|
|
217
|
+
? truncateHead(numberSourceLines(sourceTruncation.content, startIndex + 1, sourceTruncation.outputLines), {
|
|
218
|
+
maxBytes: cap,
|
|
219
|
+
})
|
|
220
|
+
: sourceTruncation;
|
|
128
221
|
if (truncation.firstLineExceedsLimit) {
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
const
|
|
222
|
+
const label = numbered ? `${startIndex + 1} | ` : "";
|
|
223
|
+
const firstLineSize = formatSize(Buffer.byteLength(label + (allLines[startIndex] ?? ""), "utf8"));
|
|
224
|
+
const linePrefix =
|
|
225
|
+
label + truncateUtf8(allLines[startIndex] ?? "", cap - Buffer.byteLength(label), "\n[line truncated]");
|
|
226
|
+
const output = `${linePrefix}\n\n[${numbered ? "Numbered line" : "Line"} ${startIndex + 1} is ${firstLineSize}, exceeding the ${formatSize(cap)} read limit. Showing the UTF-8 prefix only. Use grep with a narrower literal/regex or edit with exact surrounding text; use shell access only when byte-level inspection is required.]`;
|
|
132
227
|
return finalizeObservation({
|
|
133
228
|
tool: ToolNames.Read,
|
|
134
229
|
unit: "lines",
|
|
@@ -144,7 +239,7 @@ export const readTool: ToolSpec = {
|
|
|
144
239
|
}
|
|
145
240
|
const endDisplay = startIndex + truncation.outputLines;
|
|
146
241
|
const moreAfter = endDisplay < totalLines;
|
|
147
|
-
const truncated = truncation.truncated || (limit !== null && moreAfter);
|
|
242
|
+
const truncated = sourceTruncation.truncated || truncation.truncated || (limit !== null && moreAfter);
|
|
148
243
|
return finalizeObservation({
|
|
149
244
|
tool: ToolNames.Read,
|
|
150
245
|
unit: "lines",
|
|
@@ -153,7 +248,7 @@ export const readTool: ToolSpec = {
|
|
|
153
248
|
totalCount: totalLines,
|
|
154
249
|
totalBytes,
|
|
155
250
|
truncated,
|
|
156
|
-
...(truncated && moreAfter ? { next: `offset=${endDisplay + 1}` } : {}),
|
|
251
|
+
...(truncated && moreAfter ? { next: `offset=${endDisplay + 1}${numbered ? " line_numbers=true" : ""}` } : {}),
|
|
157
252
|
reservation,
|
|
158
253
|
...(options ? { options } : {}),
|
|
159
254
|
});
|
|
@@ -167,6 +262,8 @@ export const readTool: ToolSpec = {
|
|
|
167
262
|
};
|
|
168
263
|
}
|
|
169
264
|
return { kind: "error", message: `read: ${msg}` };
|
|
265
|
+
} finally {
|
|
266
|
+
releaseObservation(reservation);
|
|
170
267
|
}
|
|
171
268
|
},
|
|
172
269
|
};
|
package/src/tools/registry.ts
CHANGED
|
@@ -9,9 +9,10 @@ import {
|
|
|
9
9
|
type SkillToolSurfaceViolation,
|
|
10
10
|
} from "../core/skill-activation.js";
|
|
11
11
|
import { type ToolName, ToolNames } from "../core/tool-names.js";
|
|
12
|
+
import { containsInstructionMarkers, INSTRUCTION_SHAPED_WARNING } from "../core/untrusted-content.js";
|
|
12
13
|
import type { MiddlewareContract } from "../domains/middleware/contract.js";
|
|
13
14
|
import type { MiddlewareEffect, MiddlewareHookInput, MiddlewareMetadataValue } from "../domains/middleware/types.js";
|
|
14
|
-
import type
|
|
15
|
+
import { type ActionClass, type ClassifierCall, webFetchIsOutward } from "../domains/safety/action-classifier.js";
|
|
15
16
|
import { approvalAxisId } from "../domains/safety/approval-axis.js";
|
|
16
17
|
import {
|
|
17
18
|
type AutonomyExposure,
|
|
@@ -26,6 +27,7 @@ import type { SafetyContract, SafetyDecision } from "../domains/safety/contract.
|
|
|
26
27
|
import type { DecisionPresentation } from "../domains/safety/decision-presentation.js";
|
|
27
28
|
import { hashToolCall } from "../domains/safety/loop-detector.js";
|
|
28
29
|
import { detectValidationCommand } from "../domains/safety/protected-artifacts.js";
|
|
30
|
+
import type { ImageContent } from "../engine/types.js";
|
|
29
31
|
import { askUserExposure } from "./ask-user.js";
|
|
30
32
|
import { type DispatchPlanView, describeDispatchPlan } from "./dispatch-plan.js";
|
|
31
33
|
import type { ToolPresentationPolicy } from "./presentation.js";
|
|
@@ -171,6 +173,8 @@ export type ToolResult =
|
|
|
171
173
|
| {
|
|
172
174
|
kind: "ok";
|
|
173
175
|
output: string;
|
|
176
|
+
/** Bounded visual evidence accompanying the mandatory text result. */
|
|
177
|
+
images?: ImageContent[];
|
|
174
178
|
details?: ToolResultDetails;
|
|
175
179
|
/** Internal registry projection consumed only by the agent-tool adapter. */
|
|
176
180
|
modelContext?: string;
|
|
@@ -214,6 +218,12 @@ export interface RegistryDeps {
|
|
|
214
218
|
}
|
|
215
219
|
|
|
216
220
|
export interface ToolInvokeOptions {
|
|
221
|
+
/** Registry-owned filter bound to the active compiled safety policy. */
|
|
222
|
+
allowsObservationPath?: (path: string) => boolean;
|
|
223
|
+
/** Trusted submitting host identity for nested dispatch; never model arguments. */
|
|
224
|
+
hostRun?: import("../domains/dispatch/contract.js").DispatchPreparationOptions["hostRun"];
|
|
225
|
+
/** Trusted resolved model capability; never read from tool arguments. */
|
|
226
|
+
supportsImages?: boolean;
|
|
217
227
|
signal?: AbortSignal;
|
|
218
228
|
runId?: string;
|
|
219
229
|
sessionId?: string;
|
|
@@ -464,7 +474,12 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
|
|
|
464
474
|
try {
|
|
465
475
|
const preparedArgs = prepareToolArgs(spec, call.args ?? {});
|
|
466
476
|
resultDisposition = resolveToolResultDisposition(spec, preparedArgs);
|
|
467
|
-
const
|
|
477
|
+
const { allowsObservationPath: _callerPathFilter, ...callerOptions } = options ?? {};
|
|
478
|
+
const allowsObservationPath = deps.safety.policy?.allowsObservationPath;
|
|
479
|
+
const result = await spec.run(preparedArgs, {
|
|
480
|
+
...callerOptions,
|
|
481
|
+
...(allowsObservationPath ? { allowsObservationPath } : {}),
|
|
482
|
+
});
|
|
468
483
|
const digest = toolResultDigestFor(spec, result, resultDisposition, options);
|
|
469
484
|
const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
|
|
470
485
|
const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
|
|
@@ -583,10 +598,13 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
|
|
|
583
598
|
? (spec.describeDispatchPlan?.(call.args ?? {}) ?? describeDispatchPlan(call.args))
|
|
584
599
|
: null;
|
|
585
600
|
const planScale = dispatchPlan?.planScale === true;
|
|
586
|
-
//
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
601
|
+
// Gates declare their tier; write-shaped HTTP requests send data outward.
|
|
602
|
+
const exposure =
|
|
603
|
+
call.tool === ToolNames.AskUser
|
|
604
|
+
? askUserExposure(call.args)
|
|
605
|
+
: call.tool === ToolNames.WebFetch && webFetchIsOutward(call.args)
|
|
606
|
+
? "outward"
|
|
607
|
+
: DEFAULT_AUTONOMY_EXPOSURE;
|
|
590
608
|
const disposition = mapAutonomy(level, actionClass, {
|
|
591
609
|
executeRecognized: decision.policy?.execRecognition !== "unrecognized",
|
|
592
610
|
...(planScale ? { dispatchPlanScale: true } : {}),
|
|
@@ -1030,10 +1048,8 @@ const HEADLESS_GUIDANCE_MAX_CHARS = 240;
|
|
|
1030
1048
|
* model that hits an unrecognized-bash rail retries the same shape until the run
|
|
1031
1049
|
* ends. An unrecognized execution decision carries the working form in its
|
|
1032
1050
|
* reasons, and those reasons reach the audit record and the interactive approval
|
|
1033
|
-
* overlay but not the model.
|
|
1034
|
-
*
|
|
1035
|
-
* those, bounded: this is a nudge toward the recognized spelling, not a dump of
|
|
1036
|
-
* the policy's reason list.
|
|
1051
|
+
* overlay but not the model. Preserve one bounded recovery hint separately
|
|
1052
|
+
* from the actual policy cause carried by the terminal denial below.
|
|
1037
1053
|
*/
|
|
1038
1054
|
function headlessDenialGuidance(decision: SafetyDecision, reason: string): string | null {
|
|
1039
1055
|
// Interactive denials are left exactly as they were: the operator saw the
|
|
@@ -1059,9 +1075,9 @@ function headlessDenialGuidance(decision: SafetyDecision, reason: string): strin
|
|
|
1059
1075
|
* it with the standing pivot instruction.
|
|
1060
1076
|
*
|
|
1061
1077
|
* A headless answer is the exception: nobody will ever approve it, so the detail
|
|
1062
|
-
* carries
|
|
1063
|
-
* stays the detail's prefix, which the
|
|
1064
|
-
* depends on.
|
|
1078
|
+
* carries the policy cause and rule, a terminal settlement statement, and any
|
|
1079
|
+
* recovery guidance. The denial sentence stays the detail's prefix, which the
|
|
1080
|
+
* skill-eval permission-wall recognizer depends on.
|
|
1065
1081
|
*/
|
|
1066
1082
|
function parkAnsweredBlockedVerdict(
|
|
1067
1083
|
decision: SafetyDecision,
|
|
@@ -1069,12 +1085,25 @@ function parkAnsweredBlockedVerdict(
|
|
|
1069
1085
|
reason: string,
|
|
1070
1086
|
): Extract<RegistryVerdict, { kind: "blocked" }> {
|
|
1071
1087
|
const guidance = headlessDenialGuidance(decision, reason);
|
|
1088
|
+
const detail = [reason];
|
|
1089
|
+
if (reason.startsWith(HEADLESS_PERMISSION_DENIED_MARKER)) {
|
|
1090
|
+
if (decision.policy?.ruleId) detail.push(`rule: ${decision.policy.ruleId}`);
|
|
1091
|
+
const cause =
|
|
1092
|
+
decision.policy?.kind === "ask"
|
|
1093
|
+
? decision.policy.reasons[0]
|
|
1094
|
+
: decision.kind === "allow"
|
|
1095
|
+
? undefined
|
|
1096
|
+
: decision.rejection.short;
|
|
1097
|
+
if (cause) detail.push(cause);
|
|
1098
|
+
detail.push("This call was denied; no approval is pending.");
|
|
1099
|
+
if (guidance !== null) detail.push(guidance);
|
|
1100
|
+
}
|
|
1072
1101
|
const blocked: SafetyDecision = {
|
|
1073
1102
|
kind: "block",
|
|
1074
1103
|
classification: decision.classification,
|
|
1075
1104
|
rejection: {
|
|
1076
1105
|
short: `${tool} blocked: ${decision.classification.actionClass} was not approved`,
|
|
1077
|
-
detail:
|
|
1106
|
+
detail: detail.join("\n"),
|
|
1078
1107
|
hints: [],
|
|
1079
1108
|
},
|
|
1080
1109
|
...(decision.policy !== undefined ? { policy: decision.policy } : {}),
|
|
@@ -1099,7 +1128,7 @@ function skillSurfaceBlockedVerdict(
|
|
|
1099
1128
|
const reason =
|
|
1100
1129
|
violation.disallowedBy.length > 0
|
|
1101
1130
|
? `${tool} is disallowed by the active skill(s) ${violation.disallowedBy.join(", ")} (disallowed-tools). ${lifetime} Work within the skill workflow; if it genuinely needs this step, use ask_user when available or state the blocker in your reply.`
|
|
1102
|
-
: `${tool} is outside the tool surface declared by the active skill(s) ${violation.skills.join(", ")}. Tools are narrowed to: ${(violation.mergedAllowedTools ?? []).join(", ")} (plus context and ask_user). ${lifetime} Work within the skill workflow; if it genuinely needs this step, use ask_user when available or state the blocker in your reply.`;
|
|
1131
|
+
: `${tool} is outside the tool surface declared by the active skill(s) ${violation.skills.join(", ")}. Tools are narrowed to: ${(violation.mergedAllowedTools ?? []).join(", ")} (plus context and ask_user). The limitation receipt is also available unless explicitly disallowed. ${lifetime} Work within the skill workflow; if it genuinely needs this step, use ask_user when available or state the blocker in your reply.`;
|
|
1103
1132
|
const blocked: SafetyDecision = {
|
|
1104
1133
|
kind: "block",
|
|
1105
1134
|
classification: decision.classification,
|
|
@@ -1206,6 +1235,10 @@ function buildToolHookInput(
|
|
|
1206
1235
|
}
|
|
1207
1236
|
if (call.tool !== spec.name) metadata.requestedToolName = call.tool;
|
|
1208
1237
|
if (result !== undefined) {
|
|
1238
|
+
if (hook === "after_tool" && ["web_fetch", "read", "bash", "dispatch", "monitor"].includes(spec.name))
|
|
1239
|
+
metadata.untrustedInstructionMarkers = containsInstructionMarkers(
|
|
1240
|
+
result.kind === "ok" ? result.output : result.kind === "error" ? result.message : "",
|
|
1241
|
+
);
|
|
1209
1242
|
metadata.resultKind = result.kind;
|
|
1210
1243
|
if (result.kind === "error") metadata.errorMessage = result.message;
|
|
1211
1244
|
if (result.kind === "ok" && result.terminate === true) metadata.terminate = true;
|
|
@@ -1259,14 +1292,18 @@ function firstBlockToolEffect(
|
|
|
1259
1292
|
function applyToolResultEffects(result: ToolResult, effects: ReadonlyArray<MiddlewareEffect>): ToolResult {
|
|
1260
1293
|
const annotations = annotationMessages(effects);
|
|
1261
1294
|
if (annotations.length === 0) return result;
|
|
1262
|
-
const
|
|
1295
|
+
const warning = `[middleware:warn] ${INSTRUCTION_SHAPED_WARNING}`;
|
|
1296
|
+
const prefix = annotations.includes(warning) ? `${warning}\n\n` : "";
|
|
1297
|
+
const remaining = annotations.filter((annotation) => annotation !== warning);
|
|
1298
|
+
const suffix = remaining.length > 0 ? `\n\n${remaining.join("\n")}` : "";
|
|
1263
1299
|
if (result.kind === "ok") {
|
|
1264
|
-
const annotated: ToolResult = { kind: "ok", output: `${result.output}${suffix}` };
|
|
1300
|
+
const annotated: ToolResult = { kind: "ok", output: `${prefix}${result.output}${suffix}` };
|
|
1265
1301
|
if (result.details !== undefined) annotated.details = result.details;
|
|
1266
1302
|
if (result.terminate === true) annotated.terminate = true;
|
|
1303
|
+
if (result.images !== undefined) annotated.images = result.images;
|
|
1267
1304
|
return annotated;
|
|
1268
1305
|
}
|
|
1269
|
-
const annotated: ToolResult = { kind: "error", message: `${result.message}${suffix}` };
|
|
1306
|
+
const annotated: ToolResult = { kind: "error", message: `${prefix}${result.message}${suffix}` };
|
|
1270
1307
|
if (result.details !== undefined) annotated.details = result.details;
|
|
1271
1308
|
return annotated;
|
|
1272
1309
|
}
|