@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,17 +1,30 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { resolveSafeCwd } from "../../core/safe-exec.js";
|
|
3
|
+
import { resolveSafeCwd, runCommandVector, type SafeCommandResult } from "../../core/safe-exec.js";
|
|
4
4
|
import { declaredVerificationScripts, VERIFICATION_SCRIPT_FAMILY_HINT } from "../../core/verification-scripts.js";
|
|
5
5
|
import type { ToolResult } from "../registry.js";
|
|
6
6
|
import { runVectorTool } from "../safe-exec.js";
|
|
7
7
|
import {
|
|
8
8
|
type DeclaredCheck,
|
|
9
9
|
type DeclaredCheckSource,
|
|
10
|
+
type DeclaredNumericCompare,
|
|
11
|
+
type DeclaredPerfBudget,
|
|
10
12
|
loadProjectVerifierCatalog,
|
|
11
13
|
PROJECT_VERIFIER_CATALOG_RELATIVE_PATH,
|
|
12
14
|
packageDeclaredCheck,
|
|
13
15
|
resolveProjectVerifierExecutionCwd,
|
|
14
16
|
} from "./catalog.js";
|
|
17
|
+
import { compareNumeric, type NumericCompareReport, parseNumericPayload, renderNumericReport } from "./numeric.js";
|
|
18
|
+
import {
|
|
19
|
+
evaluatePerfBudget,
|
|
20
|
+
type PerfBaseline,
|
|
21
|
+
type PerfBudgetReport,
|
|
22
|
+
parsePerfBaseline,
|
|
23
|
+
renderPerfBaseline,
|
|
24
|
+
} from "./perf.js";
|
|
25
|
+
|
|
26
|
+
/** The structured verdict a numeric-compare or perf-budget check records beside the command facts. */
|
|
27
|
+
export type DeclaredCheckReport = NumericCompareReport | PerfBudgetReport;
|
|
15
28
|
|
|
16
29
|
/**
|
|
17
30
|
* Package scripts and the project catalog meet here as one canonical check
|
|
@@ -197,6 +210,7 @@ function withDeclaredEvidence(result: ToolResult, check: DeclaredCheck): ToolRes
|
|
|
197
210
|
...result.details,
|
|
198
211
|
action: "verify",
|
|
199
212
|
check: check.id,
|
|
213
|
+
kind: check.kind,
|
|
200
214
|
source: { ...check.source },
|
|
201
215
|
description: check.description,
|
|
202
216
|
declaredCommand: [...check.command],
|
|
@@ -207,15 +221,228 @@ function withDeclaredEvidence(result: ToolResult, check: DeclaredCheck): ToolRes
|
|
|
207
221
|
};
|
|
208
222
|
}
|
|
209
223
|
|
|
224
|
+
/**
|
|
225
|
+
* The JSON object a numeric-compare command printed. The whole text is tried
|
|
226
|
+
* first; when the command also wrote diagnostics around it, the span from the
|
|
227
|
+
* first `{` to the last `}` is tried once more, so a preamble line does not
|
|
228
|
+
* turn a correct payload into a parse failure.
|
|
229
|
+
*/
|
|
230
|
+
export function extractNumericPayloadText(output: string): string {
|
|
231
|
+
const trimmed = output.trim();
|
|
232
|
+
try {
|
|
233
|
+
JSON.parse(trimmed);
|
|
234
|
+
return trimmed;
|
|
235
|
+
} catch {
|
|
236
|
+
const start = trimmed.indexOf("{");
|
|
237
|
+
const end = trimmed.lastIndexOf("}");
|
|
238
|
+
return start >= 0 && end > start ? trimmed.slice(start, end + 1) : trimmed;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Read a repository-relative check file inside the workspace root, as text. */
|
|
243
|
+
function readCheckFile(workspaceRoot: string, relative: string, label: string): string | Error {
|
|
244
|
+
let resolved: string;
|
|
245
|
+
try {
|
|
246
|
+
resolved = resolveSafeCwd(relative, workspaceRoot);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
return new Error(`${label} ${error instanceof Error ? error.message : String(error)}`);
|
|
249
|
+
}
|
|
250
|
+
if (!existsSync(resolved)) return new Error(`${label} '${relative}' does not exist`);
|
|
251
|
+
try {
|
|
252
|
+
return readFileSync(resolved, "utf8");
|
|
253
|
+
} catch (error) {
|
|
254
|
+
return new Error(`${label} '${relative}' cannot be read (${error instanceof Error ? error.message : String(error)})`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** Judge a numeric-compare command's stdout against reference text already read from disk. Pure. */
|
|
259
|
+
export function judgeNumericTexts(
|
|
260
|
+
stdout: string,
|
|
261
|
+
referenceText: string,
|
|
262
|
+
tolerance: DeclaredNumericCompare["tolerance"],
|
|
263
|
+
referenceLabel: string,
|
|
264
|
+
): NumericCompareReport | Error {
|
|
265
|
+
const reference = parseNumericPayload(referenceText, referenceLabel);
|
|
266
|
+
if (reference instanceof Error) return reference;
|
|
267
|
+
const actual = parseNumericPayload(extractNumericPayloadText(stdout), "command output");
|
|
268
|
+
if (actual instanceof Error) return actual;
|
|
269
|
+
return compareNumeric(actual, reference, tolerance);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Judge a numeric-compare command's stdout against the declared reference under the workspace root. */
|
|
273
|
+
function judgeNumericCompare(
|
|
274
|
+
stdout: string,
|
|
275
|
+
numeric: DeclaredNumericCompare,
|
|
276
|
+
workspaceRoot: string,
|
|
277
|
+
): NumericCompareReport | Error {
|
|
278
|
+
const referenceText = readCheckFile(workspaceRoot, numeric.reference, "reference");
|
|
279
|
+
if (referenceText instanceof Error) return referenceText;
|
|
280
|
+
return judgeNumericTexts(stdout, referenceText, numeric.tolerance, `reference '${numeric.reference}'`);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/** Judge a measured wall time against a budget, or against baseline text already read from disk. Pure. */
|
|
284
|
+
export function judgePerfTexts(
|
|
285
|
+
measuredMs: number,
|
|
286
|
+
perf: DeclaredPerfBudget,
|
|
287
|
+
baselineText: string | undefined,
|
|
288
|
+
baselineLabel: string,
|
|
289
|
+
): PerfBudgetReport | Error {
|
|
290
|
+
let baseline: PerfBaseline | undefined;
|
|
291
|
+
if (perf.baseline !== undefined) {
|
|
292
|
+
if (baselineText === undefined) {
|
|
293
|
+
return new Error(`${baselineLabel} is missing; record it with \`clio-coder verifiers baseline <id>\``);
|
|
294
|
+
}
|
|
295
|
+
const parsed = parsePerfBaseline(baselineText, baselineLabel);
|
|
296
|
+
if (parsed instanceof Error) return parsed;
|
|
297
|
+
baseline = parsed;
|
|
298
|
+
}
|
|
299
|
+
return evaluatePerfBudget(measuredMs, {
|
|
300
|
+
...(perf.budget !== undefined ? { budget: perf.budget } : {}),
|
|
301
|
+
...(baseline !== undefined ? { baseline } : {}),
|
|
302
|
+
...(perf.tolerance?.relative !== undefined ? { relative: perf.tolerance.relative } : {}),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** Judge a measured wall time against the declared budget or the recorded baseline under the workspace root. */
|
|
307
|
+
function judgePerfBudget(
|
|
308
|
+
measuredMs: number,
|
|
309
|
+
perf: DeclaredPerfBudget,
|
|
310
|
+
workspaceRoot: string,
|
|
311
|
+
): PerfBudgetReport | Error {
|
|
312
|
+
let baselineText: string | undefined;
|
|
313
|
+
if (perf.baseline !== undefined) {
|
|
314
|
+
const text = readCheckFile(workspaceRoot, perf.baseline, "baseline");
|
|
315
|
+
if (text instanceof Error) {
|
|
316
|
+
return new Error(`${text.message}; record it with \`clio-coder verifiers baseline <id>\``);
|
|
317
|
+
}
|
|
318
|
+
baselineText = text;
|
|
319
|
+
}
|
|
320
|
+
return judgePerfTexts(measuredMs, perf, baselineText, `baseline '${perf.baseline ?? ""}'`);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function commandFacts(result: SafeCommandResult): Record<string, unknown> {
|
|
324
|
+
return {
|
|
325
|
+
command: [result.file, ...result.args].join(" "),
|
|
326
|
+
argv: [result.file, ...result.args],
|
|
327
|
+
cwd: result.cwd,
|
|
328
|
+
exitCode: result.exitCode,
|
|
329
|
+
durationMs: result.durationMs,
|
|
330
|
+
aborted: result.aborted,
|
|
331
|
+
timedOut: result.timedOut,
|
|
332
|
+
outputCapped: result.outputCapped,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Run a numeric-compare or perf-budget check: the command through the same
|
|
338
|
+
* safe-exec spine as a command check, then the pure judgement. A command that
|
|
339
|
+
* exits non-zero, times out, or is aborted fails before any comparison, so a
|
|
340
|
+
* crashed validator never reads as a tolerance verdict.
|
|
341
|
+
*/
|
|
342
|
+
async function runJudgedCheck(
|
|
343
|
+
check: DeclaredCheck,
|
|
344
|
+
file: string,
|
|
345
|
+
vector: ReadonlyArray<string>,
|
|
346
|
+
cwd: string,
|
|
347
|
+
options?: { signal?: AbortSignal },
|
|
348
|
+
): Promise<ToolResult> {
|
|
349
|
+
let result: SafeCommandResult;
|
|
350
|
+
try {
|
|
351
|
+
result = await runCommandVector(file, vector, {
|
|
352
|
+
cwd,
|
|
353
|
+
timeoutMs: check.timeoutMs,
|
|
354
|
+
...(options?.signal !== undefined ? { signal: options.signal } : {}),
|
|
355
|
+
});
|
|
356
|
+
} catch (error) {
|
|
357
|
+
return { kind: "error", message: `verify: ${error instanceof Error ? error.message : String(error)}` };
|
|
358
|
+
}
|
|
359
|
+
const facts = commandFacts(result);
|
|
360
|
+
const tail = `${result.stdout}${result.stderr}`.trim().slice(-2_000);
|
|
361
|
+
if (result.aborted) return { kind: "error", message: "verify: aborted", details: facts };
|
|
362
|
+
if (result.timedOut) return { kind: "error", message: `verify: timed out after ${check.timeoutMs}ms`, details: facts };
|
|
363
|
+
if (result.exitCode !== 0) {
|
|
364
|
+
return {
|
|
365
|
+
kind: "error",
|
|
366
|
+
message: `verify: ${check.kind} command exited with code ${result.exitCode ?? "?"} before judgement: ${tail}`,
|
|
367
|
+
details: facts,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const report =
|
|
371
|
+
check.kind === "numeric-compare" && check.numeric !== undefined
|
|
372
|
+
? judgeNumericCompare(result.stdout, check.numeric, process.cwd())
|
|
373
|
+
: check.kind === "perf-budget" && check.perf !== undefined
|
|
374
|
+
? judgePerfBudget(result.durationMs, check.perf, process.cwd())
|
|
375
|
+
: new Error(`declared check '${check.id}' has kind ${check.kind} without its parameters`);
|
|
376
|
+
if (report instanceof Error) return { kind: "error", message: `verify: ${report.message}`, details: facts };
|
|
377
|
+
const rendered = report.kind === "numeric-compare" ? renderNumericReport(report) : report.summary;
|
|
378
|
+
const details = { ...facts, report };
|
|
379
|
+
if (!report.passed) return { kind: "error", message: `verify: ${rendered}`, details };
|
|
380
|
+
return { kind: "ok", output: `${rendered}\n`, details };
|
|
381
|
+
}
|
|
382
|
+
|
|
210
383
|
export async function runProjectCheck(check: DeclaredCheck, options?: { signal?: AbortSignal }): Promise<ToolResult> {
|
|
211
384
|
const [file, ...vector] = check.command;
|
|
212
385
|
if (file === undefined) return { kind: "error", message: `verify: declared check '${check.id}' has empty argv` };
|
|
213
386
|
const cwd = resolveProjectVerifierExecutionCwd(check.cwd, process.cwd());
|
|
214
387
|
if (cwd instanceof Error) return { kind: "error", message: `verify: ${cwd.message}` };
|
|
388
|
+
if (check.kind !== "command") {
|
|
389
|
+
return withDeclaredEvidence(await runJudgedCheck(check, file, vector, cwd, options), check);
|
|
390
|
+
}
|
|
215
391
|
const result = await runVectorTool("verify", file, vector, { cwd, timeout_ms: check.timeoutMs }, options);
|
|
216
392
|
return withDeclaredEvidence(result, check);
|
|
217
393
|
}
|
|
218
394
|
|
|
395
|
+
/**
|
|
396
|
+
* Run a perf-budget check once and write its wall time as the baseline the
|
|
397
|
+
* check's `baseline` path names. The command must exit cleanly; a failed run
|
|
398
|
+
* records nothing, so a baseline never encodes a broken command's timing.
|
|
399
|
+
*/
|
|
400
|
+
export async function recordPerfBaseline(
|
|
401
|
+
check: DeclaredCheck,
|
|
402
|
+
options?: { signal?: AbortSignal; now?: () => Date },
|
|
403
|
+
): Promise<{ ok: true; path: string; wallTimeMs: number } | { ok: false; message: string }> {
|
|
404
|
+
if (check.kind !== "perf-budget" || check.perf?.baseline === undefined) {
|
|
405
|
+
return { ok: false, message: `check '${check.id}' is not a perf-budget check with a baseline path` };
|
|
406
|
+
}
|
|
407
|
+
const [file, ...vector] = check.command;
|
|
408
|
+
if (file === undefined) return { ok: false, message: `declared check '${check.id}' has empty argv` };
|
|
409
|
+
const cwd = resolveProjectVerifierExecutionCwd(check.cwd, process.cwd());
|
|
410
|
+
if (cwd instanceof Error) return { ok: false, message: cwd.message };
|
|
411
|
+
let result: SafeCommandResult;
|
|
412
|
+
try {
|
|
413
|
+
result = await runCommandVector(file, vector, {
|
|
414
|
+
cwd,
|
|
415
|
+
timeoutMs: check.timeoutMs,
|
|
416
|
+
...(options?.signal !== undefined ? { signal: options.signal } : {}),
|
|
417
|
+
});
|
|
418
|
+
} catch (error) {
|
|
419
|
+
return { ok: false, message: error instanceof Error ? error.message : String(error) };
|
|
420
|
+
}
|
|
421
|
+
if (result.aborted || result.timedOut || result.exitCode !== 0) {
|
|
422
|
+
return {
|
|
423
|
+
ok: false,
|
|
424
|
+
message: `command ${result.timedOut ? "timed out" : result.aborted ? "was aborted" : `exited with code ${result.exitCode ?? "?"}`}; no baseline recorded`,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
let target: string;
|
|
428
|
+
try {
|
|
429
|
+
target = resolveSafeCwd(check.perf.baseline, process.cwd());
|
|
430
|
+
} catch (error) {
|
|
431
|
+
return { ok: false, message: `baseline ${error instanceof Error ? error.message : String(error)}` };
|
|
432
|
+
}
|
|
433
|
+
const recordedAt = (options?.now?.() ?? new Date()).toISOString();
|
|
434
|
+
try {
|
|
435
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
436
|
+
writeFileSync(target, renderPerfBaseline({ wallTimeMs: result.durationMs, check: check.id, recordedAt }), "utf8");
|
|
437
|
+
} catch (error) {
|
|
438
|
+
return {
|
|
439
|
+
ok: false,
|
|
440
|
+
message: `cannot write baseline '${check.perf.baseline}' (${error instanceof Error ? error.message : String(error)})`,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
return { ok: true, path: check.perf.baseline, wallTimeMs: result.durationMs };
|
|
444
|
+
}
|
|
445
|
+
|
|
219
446
|
export async function runScriptCheck(
|
|
220
447
|
check: string,
|
|
221
448
|
args: Record<string, unknown>,
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { lookup } from "node:dns/promises";
|
|
2
|
+
import { request as httpRequest } from "node:http";
|
|
3
|
+
import { request as httpsRequest } from "node:https";
|
|
4
|
+
import { BlockList, isIP } from "node:net";
|
|
5
|
+
import { Readable } from "node:stream";
|
|
6
|
+
import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
|
|
7
|
+
import { WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV } from "./network-policy.js";
|
|
8
|
+
|
|
9
|
+
const blocked = new BlockList();
|
|
10
|
+
for (const [address, prefix] of [
|
|
11
|
+
["0.0.0.0", 8],
|
|
12
|
+
["10.0.0.0", 8],
|
|
13
|
+
["100.64.0.0", 10],
|
|
14
|
+
["127.0.0.0", 8],
|
|
15
|
+
["169.254.0.0", 16],
|
|
16
|
+
["172.16.0.0", 12],
|
|
17
|
+
["192.168.0.0", 16],
|
|
18
|
+
["192.0.0.0", 24],
|
|
19
|
+
["192.0.2.0", 24],
|
|
20
|
+
["198.18.0.0", 15],
|
|
21
|
+
["198.51.100.0", 24],
|
|
22
|
+
["203.0.113.0", 24],
|
|
23
|
+
["224.0.0.0", 4],
|
|
24
|
+
["240.0.0.0", 4],
|
|
25
|
+
] as const)
|
|
26
|
+
blocked.addSubnet(address, prefix, "ipv4");
|
|
27
|
+
// Permit only global unicast IPv6. Block transition mechanisms that can embed
|
|
28
|
+
// an IPv4 destination and local/documentation allocations within that range.
|
|
29
|
+
for (const [address, prefix] of [
|
|
30
|
+
["2001::", 32],
|
|
31
|
+
["2001:db8::", 32],
|
|
32
|
+
["2002::", 16],
|
|
33
|
+
] as const)
|
|
34
|
+
blocked.addSubnet(address, prefix, "ipv6");
|
|
35
|
+
const globalV6 = new BlockList();
|
|
36
|
+
globalV6.addSubnet("2000::", 3, "ipv6");
|
|
37
|
+
export function isPublicWebAddress(address: string): boolean {
|
|
38
|
+
const family = isIP(address);
|
|
39
|
+
if (family === 4) return !blocked.check(address, "ipv4");
|
|
40
|
+
return family === 6 && globalV6.check(address, "ipv6") && !blocked.check(address, "ipv6");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class WebFetchNetworkError extends Error {
|
|
44
|
+
constructor(message: string) {
|
|
45
|
+
super(`WEB_FETCH_PRIVATE_NETWORK: ${message}`);
|
|
46
|
+
this.name = "WebFetchNetworkError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface Address {
|
|
51
|
+
address: string;
|
|
52
|
+
family: number;
|
|
53
|
+
}
|
|
54
|
+
export interface WebFetchNetworkDependencies {
|
|
55
|
+
resolve?: (hostname: string) => Promise<Address[]>;
|
|
56
|
+
request?: (url: URL, init: RequestInit, address: Address) => Promise<Response>;
|
|
57
|
+
allowPrivateNetwork?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Pin the checked address in the socket lookup while retaining the URL host
|
|
61
|
+
* for Host, TLS SNI and certificate verification. No second DNS resolution,
|
|
62
|
+
* proxy, pooled socket, or automatic redirect can bypass admission. */
|
|
63
|
+
async function requestPinnedWebUrl(url: URL, init: RequestInit, address: Address): Promise<Response> {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const headers = new Headers(init.headers);
|
|
66
|
+
headers.delete("host");
|
|
67
|
+
const request = (url.protocol === "https:" ? httpsRequest : httpRequest)(
|
|
68
|
+
url,
|
|
69
|
+
{
|
|
70
|
+
method: init.method ?? "GET",
|
|
71
|
+
headers: Object.fromEntries(headers),
|
|
72
|
+
agent: false,
|
|
73
|
+
...(init.signal ? { signal: init.signal } : {}),
|
|
74
|
+
lookup: (_hostname, options, callback) => {
|
|
75
|
+
if (options.all) callback(null, [address]);
|
|
76
|
+
else callback(null, address.address, address.family);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
(response) => {
|
|
80
|
+
const responseHeaders = new Headers();
|
|
81
|
+
for (const [key, value] of Object.entries(response.headers)) {
|
|
82
|
+
if (value !== undefined) responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : value);
|
|
83
|
+
}
|
|
84
|
+
const status = response.statusCode ?? 500;
|
|
85
|
+
let stream: Readable = response;
|
|
86
|
+
const encoding = responseHeaders.get("content-encoding");
|
|
87
|
+
const decoder =
|
|
88
|
+
encoding === "gzip"
|
|
89
|
+
? createGunzip()
|
|
90
|
+
: encoding === "br"
|
|
91
|
+
? createBrotliDecompress()
|
|
92
|
+
: encoding === "deflate"
|
|
93
|
+
? createInflate()
|
|
94
|
+
: null;
|
|
95
|
+
if (decoder) {
|
|
96
|
+
response.on("error", (error) => decoder.destroy(error));
|
|
97
|
+
decoder.on("close", () => response.destroy());
|
|
98
|
+
stream = response.pipe(decoder);
|
|
99
|
+
responseHeaders.delete("content-encoding");
|
|
100
|
+
responseHeaders.delete("content-length");
|
|
101
|
+
}
|
|
102
|
+
const noBody = init.method === "HEAD" || [204, 205, 304].includes(status);
|
|
103
|
+
if (noBody) response.resume();
|
|
104
|
+
const result = new Response(noBody ? null : (Readable.toWeb(stream) as ReadableStream<Uint8Array>), {
|
|
105
|
+
status,
|
|
106
|
+
statusText: response.statusMessage ?? "",
|
|
107
|
+
headers: responseHeaders,
|
|
108
|
+
});
|
|
109
|
+
Object.defineProperty(result, "url", { value: url.toString() });
|
|
110
|
+
resolve(result);
|
|
111
|
+
},
|
|
112
|
+
);
|
|
113
|
+
request.on("error", reject);
|
|
114
|
+
request.end(typeof init.body === "string" ? init.body : undefined);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** DNS lookup itself is not cancellable; stop awaiting it on turn cancellation. */
|
|
119
|
+
async function abortableLookup(
|
|
120
|
+
pending: Promise<Address[]>,
|
|
121
|
+
signal: AbortSignal | null | undefined,
|
|
122
|
+
): Promise<Address[]> {
|
|
123
|
+
if (!signal) return pending;
|
|
124
|
+
signal.throwIfAborted();
|
|
125
|
+
return new Promise((resolve, reject) => {
|
|
126
|
+
const onAbort = (): void => reject(signal.reason);
|
|
127
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
128
|
+
pending.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Every hop, including helper URLs, resolves and validates before connecting. */
|
|
133
|
+
export async function fetchWebUrl(
|
|
134
|
+
input: string | URL,
|
|
135
|
+
initial: RequestInit = {},
|
|
136
|
+
dependencies: WebFetchNetworkDependencies = {},
|
|
137
|
+
): Promise<Response> {
|
|
138
|
+
let url = new URL(input);
|
|
139
|
+
const init = { ...initial, headers: new Headers(initial.headers) };
|
|
140
|
+
const allowPrivate = dependencies.allowPrivateNetwork ?? process.env[WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV] === "1";
|
|
141
|
+
for (let hop = 0; hop <= 10; hop++) {
|
|
142
|
+
init.signal?.throwIfAborted();
|
|
143
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password)
|
|
144
|
+
throw new Error("web_fetch: unsupported URL scheme or embedded credentials");
|
|
145
|
+
const hostname = url.hostname.replace(/^\[|\]$/g, "");
|
|
146
|
+
const addresses = isIP(hostname)
|
|
147
|
+
? [{ address: hostname, family: isIP(hostname) }]
|
|
148
|
+
: await abortableLookup((dependencies.resolve ?? ((host) => lookup(host, { all: true })))(hostname), init.signal);
|
|
149
|
+
init.signal?.throwIfAborted();
|
|
150
|
+
const address = addresses[0];
|
|
151
|
+
if (address === undefined) throw new Error("web_fetch: DNS returned no addresses");
|
|
152
|
+
if (!allowPrivate && addresses.some((address) => !isPublicWebAddress(address.address)))
|
|
153
|
+
throw new WebFetchNetworkError(
|
|
154
|
+
`destination ${url.hostname} is not public; operator opt-in ${WEB_FETCH_ALLOW_PRIVATE_NETWORK_ENV}=1 is required`,
|
|
155
|
+
);
|
|
156
|
+
const response = await (dependencies.request ?? requestPinnedWebUrl)(url, init, address);
|
|
157
|
+
const location = response.headers.get("location");
|
|
158
|
+
if (![301, 302, 303, 307, 308].includes(response.status) || location === null) return response;
|
|
159
|
+
await response.body?.cancel();
|
|
160
|
+
if (hop === 10) throw new Error("web_fetch: too many redirects");
|
|
161
|
+
const next = new URL(location, url);
|
|
162
|
+
if (next.origin !== url.origin) {
|
|
163
|
+
// Custom headers can carry credentials too. A cross-origin redirect gets
|
|
164
|
+
// no caller headers; the target still receives the ordinary Host header.
|
|
165
|
+
init.headers = new Headers();
|
|
166
|
+
}
|
|
167
|
+
if (
|
|
168
|
+
(response.status === 303 && init.method !== "HEAD") ||
|
|
169
|
+
([301, 302].includes(response.status) && init.method === "POST")
|
|
170
|
+
) {
|
|
171
|
+
init.method = "GET";
|
|
172
|
+
delete init.body;
|
|
173
|
+
init.headers.delete("content-type");
|
|
174
|
+
init.headers.delete("content-length");
|
|
175
|
+
}
|
|
176
|
+
url = next;
|
|
177
|
+
}
|
|
178
|
+
throw new Error("web_fetch: too many redirects");
|
|
179
|
+
}
|
|
@@ -4,7 +4,8 @@ import type { ToolSurface } from "./lazy-tool.js";
|
|
|
4
4
|
|
|
5
5
|
export const webFetchToolSurface = {
|
|
6
6
|
name: ToolNames.WebFetch,
|
|
7
|
-
description:
|
|
7
|
+
description:
|
|
8
|
+
"Fetch an http(s) URL; HTML is cleaned and converted to Markdown. Non-2xx responses are errors. Non-GET/HEAD methods or any body require outward-action approval; private networks require operator opt-in.",
|
|
8
9
|
parameters: Type.Object({
|
|
9
10
|
url: Type.String({ description: "Fully-qualified http(s) URL." }),
|
|
10
11
|
method: Type.Optional(Type.String({ description: "HTTP method (default GET)." })),
|
package/src/tools/web-fetch.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { UNTRUSTED_CONTENT_BANNER } from "../core/untrusted-content.js";
|
|
1
2
|
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
2
3
|
import { truncateUtf8 } from "./truncate-utf8.js";
|
|
4
|
+
import { fetchWebUrl } from "./web-fetch-network.js";
|
|
3
5
|
import { webFetchToolSurface } from "./web-fetch-surface.js";
|
|
4
6
|
|
|
5
7
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
@@ -374,7 +376,7 @@ async function fetchArxivPaperSummary(
|
|
|
374
376
|
maxBytes: number,
|
|
375
377
|
): Promise<ToolResult | null> {
|
|
376
378
|
const metadataUrl = `https://export.arxiv.org/api/query?id_list=${encodeURIComponent(paperId)}`;
|
|
377
|
-
const response = await
|
|
379
|
+
const response = await fetchWebUrl(metadataUrl, init);
|
|
378
380
|
if (response.status < 200 || response.status >= 300) return null;
|
|
379
381
|
const read = await readResponseText(response, Math.min(120_000, maxBytes));
|
|
380
382
|
const entry = /<entry\b[^>]*>([\s\S]*?)<\/entry>/i.exec(read.text)?.[1];
|
|
@@ -384,7 +386,7 @@ async function fetchArxivPaperSummary(
|
|
|
384
386
|
let alphaxivRead: ReadResult | null = null;
|
|
385
387
|
const alphaUrl = `https://alphaxiv.org/overview/${encodeURIComponent(paperId)}.md`;
|
|
386
388
|
try {
|
|
387
|
-
const alpha = await
|
|
389
|
+
const alpha = await fetchWebUrl(alphaUrl, init);
|
|
388
390
|
if (alpha.status >= 200 && alpha.status < 300) {
|
|
389
391
|
alphaxivRead = await readResponseText(alpha, Math.min(80_000, Math.max(0, maxBytes - read.bytesRead)));
|
|
390
392
|
if (alphaxivRead.text.trim().length > 0) paper.alphaxivOverview = alphaxivRead.text.trim();
|
|
@@ -416,7 +418,7 @@ async function fetchArxivPaperSummary(
|
|
|
416
418
|
const bytesRead = read.bytesRead + (alphaxivRead?.bytesRead ?? 0);
|
|
417
419
|
return {
|
|
418
420
|
kind: "ok",
|
|
419
|
-
output: truncate(lines.join("\n")
|
|
421
|
+
output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, maxBytes),
|
|
420
422
|
details: {
|
|
421
423
|
url: `https://arxiv.org/abs/${paper.id}`,
|
|
422
424
|
status: 200,
|
|
@@ -437,7 +439,7 @@ async function fetchArxivApiSummary(
|
|
|
437
439
|
init: Parameters<typeof fetch>[1],
|
|
438
440
|
maxBytes: number,
|
|
439
441
|
): Promise<ToolResult | null> {
|
|
440
|
-
const response = await
|
|
442
|
+
const response = await fetchWebUrl(url, init);
|
|
441
443
|
if (response.status < 200 || response.status >= 300) return null;
|
|
442
444
|
const read = await readResponseText(response, Math.min(240_000, maxBytes));
|
|
443
445
|
const entries = Array.from(read.text.matchAll(/<entry\b[^>]*>([\s\S]*?)<\/entry>/gi))
|
|
@@ -469,7 +471,7 @@ async function fetchArxivApiSummary(
|
|
|
469
471
|
}
|
|
470
472
|
return {
|
|
471
473
|
kind: "ok",
|
|
472
|
-
output: truncate(lines.join("\n")
|
|
474
|
+
output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, maxBytes),
|
|
473
475
|
details: {
|
|
474
476
|
url: url.toString(),
|
|
475
477
|
status: 200,
|
|
@@ -553,7 +555,7 @@ async function fetchRepoTreeSummary(
|
|
|
553
555
|
init: Parameters<typeof fetch>[1],
|
|
554
556
|
maxBytes: number,
|
|
555
557
|
): Promise<ToolResult | null> {
|
|
556
|
-
const apiResponse = await
|
|
558
|
+
const apiResponse = await fetchWebUrl(target.apiUrl, init);
|
|
557
559
|
if (apiResponse.status < 200 || apiResponse.status >= 300) return null;
|
|
558
560
|
const apiRead = await readResponseText(apiResponse, Math.min(200_000, maxBytes));
|
|
559
561
|
let entries: unknown[];
|
|
@@ -581,7 +583,7 @@ async function fetchRepoTreeSummary(
|
|
|
581
583
|
for (const file of files) {
|
|
582
584
|
if (remaining <= 2000) break;
|
|
583
585
|
const rawUrl = `${target.rawBaseUrl}/${file}`;
|
|
584
|
-
const rawResponse = await
|
|
586
|
+
const rawResponse = await fetchWebUrl(rawUrl, init);
|
|
585
587
|
if (rawResponse.status < 200 || rawResponse.status >= 300) continue;
|
|
586
588
|
const rawRead = await readResponseText(rawResponse, Math.min(80_000, remaining));
|
|
587
589
|
sections.push("", `--- ${file} ---`, rawRead.text.trim());
|
|
@@ -589,7 +591,7 @@ async function fetchRepoTreeSummary(
|
|
|
589
591
|
}
|
|
590
592
|
return {
|
|
591
593
|
kind: "ok",
|
|
592
|
-
output: truncate(sections.join("\n")
|
|
594
|
+
output: truncate(`${UNTRUSTED_CONTENT_BANNER}\n${sections.join("\n")}`, maxBytes),
|
|
593
595
|
details: {
|
|
594
596
|
url: target.apiUrl,
|
|
595
597
|
status: 200,
|
|
@@ -621,7 +623,7 @@ function formatOutput(args: {
|
|
|
621
623
|
if (args.extracted.description) lines.push(`Description: ${args.extracted.description}`);
|
|
622
624
|
if (args.extracted.canonical) lines.push(`Canonical: ${args.extracted.canonical}`);
|
|
623
625
|
lines.push("", "Content:", args.extracted.content || "[empty]");
|
|
624
|
-
return truncate(lines.join("\n")
|
|
626
|
+
return truncate(`${UNTRUSTED_CONTENT_BANNER}\n${lines.join("\n")}`, args.maxBytes);
|
|
625
627
|
}
|
|
626
628
|
|
|
627
629
|
export const webFetchTool: ToolSpec = {
|
|
@@ -683,10 +685,10 @@ export const webFetchTool: ToolSpec = {
|
|
|
683
685
|
method,
|
|
684
686
|
headers,
|
|
685
687
|
signal: controller.signal,
|
|
686
|
-
redirect: "
|
|
688
|
+
redirect: "manual",
|
|
687
689
|
};
|
|
688
690
|
if (body !== undefined) init.body = body;
|
|
689
|
-
if (method === "GET" && body === undefined && format !== "raw") {
|
|
691
|
+
if (method === "GET" && body === undefined && format !== "raw" && Object.keys(userHeaders).length === 0) {
|
|
690
692
|
if (arxivApiUrl(parsed)) {
|
|
691
693
|
const arxivApiSummary = await fetchArxivApiSummary(parsed, init, maxBytes);
|
|
692
694
|
if (arxivApiSummary) return arxivApiSummary;
|
|
@@ -702,7 +704,7 @@ export const webFetchTool: ToolSpec = {
|
|
|
702
704
|
if (repoSummary) return repoSummary;
|
|
703
705
|
}
|
|
704
706
|
}
|
|
705
|
-
const response = await
|
|
707
|
+
const response = await fetchWebUrl(parsed, init);
|
|
706
708
|
const contentType = headerValue(response, "content-type");
|
|
707
709
|
const readLimit =
|
|
708
710
|
response.status >= 200 && response.status < 300 ? maxBytes : Math.min(ERROR_PREVIEW_BYTES, maxBytes);
|
|
@@ -711,7 +713,7 @@ export const webFetchTool: ToolSpec = {
|
|
|
711
713
|
const preview = extractWebFetchContent(read.text, contentType, response.url || parsed.toString(), "auto").content;
|
|
712
714
|
return {
|
|
713
715
|
kind: "error",
|
|
714
|
-
message: `web_fetch: HTTP ${response.status}: ${response.statusText}${preview ? `\nPreview:\n${truncate(preview, ERROR_PREVIEW_BYTES)}` : ""}`,
|
|
716
|
+
message: `web_fetch: HTTP ${response.status}: ${response.statusText}${preview ? `\n${UNTRUSTED_CONTENT_BANNER}\nPreview:\n${truncate(preview, ERROR_PREVIEW_BYTES)}` : ""}`,
|
|
715
717
|
};
|
|
716
718
|
}
|
|
717
719
|
if (isProbablyBinary(contentType, read.text)) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mentionsWorkerToolCallCap } from "../core/guardrails.js";
|
|
2
|
+
import { RESULT_SUMMARY_MAX_BYTES_CEILING, resultContractAuthorship } from "../domains/agents/result-contract.js";
|
|
2
3
|
import {
|
|
3
4
|
formatBudgetPolicy,
|
|
4
5
|
formatBudgetReasons,
|
|
@@ -158,6 +159,7 @@ export function receiptEvidenceLabels(
|
|
|
158
159
|
return [
|
|
159
160
|
...canonical,
|
|
160
161
|
`receipt_integrity=verified/v${receipt.integrity.version}/${receipt.integrity.algorithm}`,
|
|
162
|
+
...documenterDeliveryLabels(receipt),
|
|
161
163
|
`evidence_verification=${verification.state}/${verification.basis}`,
|
|
162
164
|
`host_verification=${receipt.hostVerification?.status ?? "not_requested"}`,
|
|
163
165
|
...(responseModelIdObservation ? [responseModelIdObservation] : []),
|
|
@@ -170,6 +172,31 @@ export function receiptEvidenceLabels(
|
|
|
170
172
|
];
|
|
171
173
|
}
|
|
172
174
|
|
|
175
|
+
/** Delivery guidance uses only an authenticated, terminal mutation report. */
|
|
176
|
+
function documenterDeliveryLabels(receipt: RunReceipt): string[] {
|
|
177
|
+
if (
|
|
178
|
+
receipt.agentId !== "documenter" ||
|
|
179
|
+
!receipt.quality.resultContract?.sourceId.startsWith("agent-result-contract:mutation-report:")
|
|
180
|
+
)
|
|
181
|
+
return [];
|
|
182
|
+
const output = receipt.output;
|
|
183
|
+
// Read at the ceiling: the receipt already sealed conformance under the
|
|
184
|
+
// run's own allowance, which this reader does not know; any conforming
|
|
185
|
+
// summary is within the ceiling, and a reader that re-applied the default
|
|
186
|
+
// would report a delivered 20 KB summary as absent.
|
|
187
|
+
const summary =
|
|
188
|
+
output?.state === "final"
|
|
189
|
+
? resultContractAuthorship(
|
|
190
|
+
{ kind: "mutation-report", maxSummaryBytes: RESULT_SUMMARY_MAX_BYTES_CEILING },
|
|
191
|
+
output.text,
|
|
192
|
+
).summary
|
|
193
|
+
: null;
|
|
194
|
+
return [
|
|
195
|
+
`terminal Documenter result: ${summary === null ? "no inline summary is available" : "the inline deliverable or limitation is in output.text JSON field summary"}. Execution success and contract conformance alone do not prove the requested explanation was delivered.`,
|
|
196
|
+
"Read the summary or the task-authorized artifact once and check it against the requested deliverable. If it is absent, incomplete, or states a limitation, report the specific limitation and the run ID; do not repeatedly read this unchanged terminal receipt or poll it for new output. Keep any separately authorized recovery and its outcome distinct from the original run.",
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
|
|
173
200
|
/**
|
|
174
201
|
* The compact projection first, then the canonical axis line, both from the
|
|
175
202
|
* shared projection so the dispatch and monitor text can never spell a state
|