@iowarp/clio-coder 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -2
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
- package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/{chunk-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
- package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
- package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
- package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
- package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
- package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
- package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
- package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
- package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +44 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
- package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
- package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
- package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
- package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
- package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
- package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
- package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
- package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -88
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/context-engine.md +44 -59
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +49 -36
- package/docs/guide/configuration-and-targets.md +7 -2
- package/docs/guide/configuration-reference.md +13 -3
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +9 -2
- package/docs/process/development-pipeline.md +10 -10
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/release-cut-checklist.md +6 -6
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -14
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +9 -6
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/config.ts +33 -14
- package/src/core/defaults.ts +5 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +72 -10
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +42 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +6 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/contract.ts +10 -2
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/types.ts +4 -3
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +5 -1
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +4 -2
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +53 -15
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +17 -2
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/interactive-application.ts +8 -2
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +15 -7
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-commands.ts +9 -7
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +54 -17
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +6 -1
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
|
@@ -117,6 +117,15 @@ export function buildAgyArgs(input: WorkerRunInput, gateEnv: NodeJS.ProcessEnv =
|
|
|
117
117
|
"--disable-slash-commands",
|
|
118
118
|
];
|
|
119
119
|
if (input.wireModelId.trim().length > 0) args.push("--model", input.wireModelId.trim());
|
|
120
|
+
if (typeof input.sessionId === "string" && input.sessionId.length > 0) {
|
|
121
|
+
if (Buffer.byteLength(input.sessionId, "utf8") > MAX_CONVERSATION_ID_BYTES) {
|
|
122
|
+
throw new Error(`Antigravity sessionId exceeded ${MAX_CONVERSATION_ID_BYTES} bytes`);
|
|
123
|
+
}
|
|
124
|
+
if (/\p{Cc}/u.test(input.sessionId)) {
|
|
125
|
+
throw new Error("Antigravity sessionId must not contain control characters");
|
|
126
|
+
}
|
|
127
|
+
args.push("--conversation", input.sessionId);
|
|
128
|
+
}
|
|
120
129
|
return args;
|
|
121
130
|
}
|
|
122
131
|
|
|
@@ -245,7 +254,12 @@ function emitTextDelta(emit: WorkerEventEmit, state: StreamState, delta: string)
|
|
|
245
254
|
} as AgentEvent);
|
|
246
255
|
}
|
|
247
256
|
|
|
248
|
-
async function readStream(
|
|
257
|
+
async function readStream(
|
|
258
|
+
child: AntigravityChildProcess,
|
|
259
|
+
emit: WorkerEventEmit,
|
|
260
|
+
state: StreamState,
|
|
261
|
+
requestedConversationId: string | undefined,
|
|
262
|
+
): Promise<void> {
|
|
249
263
|
for await (const bounded of readBoundedLines(child.stdout, {
|
|
250
264
|
maxLineBytes: ANTIGRAVITY_MAX_STREAM_LINE_BYTES,
|
|
251
265
|
maxTotalBytes: ANTIGRAVITY_MAX_STREAM_BYTES,
|
|
@@ -272,6 +286,9 @@ async function readStream(child: AntigravityChildProcess, emit: WorkerEventEmit,
|
|
|
272
286
|
break;
|
|
273
287
|
}
|
|
274
288
|
state.initSeen = true;
|
|
289
|
+
if (requestedConversationId && event.conversationId !== requestedConversationId) {
|
|
290
|
+
protocolFailure(state, "requested conversation was not resumed");
|
|
291
|
+
}
|
|
275
292
|
state.conversationId = boundedConversationId(event.conversationId);
|
|
276
293
|
if (event.model?.trim()) state.model = event.model.trim();
|
|
277
294
|
break;
|
|
@@ -354,8 +371,7 @@ function buildAssistantMessage(input: {
|
|
|
354
371
|
stopReason: input.aborted ? "aborted" : succeeded ? "stop" : "error",
|
|
355
372
|
timestamp: Date.now(),
|
|
356
373
|
} as AgentMessage & { role: "assistant" };
|
|
357
|
-
// Opaque provider observation only
|
|
358
|
-
// resumable Clio session id.
|
|
374
|
+
// Opaque provider observation only; callers must explicitly request resume.
|
|
359
375
|
if (input.conversationId) message.responseId = input.conversationId;
|
|
360
376
|
if (input.diagnostic) message.errorMessage = boundedExternalDiagnostic(input.diagnostic);
|
|
361
377
|
return message;
|
|
@@ -414,7 +430,7 @@ export function startAntigravityWorkerRun(
|
|
|
414
430
|
emit({ type: "agent_start" } as AgentEvent);
|
|
415
431
|
try {
|
|
416
432
|
const stderrPromise = readStderr(child);
|
|
417
|
-
const stdoutPromise = readStream(child, emit, streamState).catch((cause) => {
|
|
433
|
+
const stdoutPromise = readStream(child, emit, streamState, input.sessionId).catch((cause) => {
|
|
418
434
|
streamError = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
|
|
419
435
|
terminator.terminate();
|
|
420
436
|
});
|
|
@@ -27,6 +27,7 @@ import "@earendil-works/pi-ai/providers/images/register-builtins";
|
|
|
27
27
|
|
|
28
28
|
import { getEngineEnvApiKey } from "./env-api-keys.js";
|
|
29
29
|
import { engineModels } from "./models.js";
|
|
30
|
+
import { instrumentProviderCall } from "./provider-diagnostics.js";
|
|
30
31
|
|
|
31
32
|
export interface EngineRegisteredApiProvider extends ProviderStreams {
|
|
32
33
|
api: Api;
|
|
@@ -134,7 +135,7 @@ function hasCloudflareAuth(options?: StreamOptions): boolean {
|
|
|
134
135
|
);
|
|
135
136
|
}
|
|
136
137
|
|
|
137
|
-
|
|
138
|
+
function dispatchEngineStream(
|
|
138
139
|
model: Model<Api>,
|
|
139
140
|
context: Context,
|
|
140
141
|
options?: StreamOptions,
|
|
@@ -151,7 +152,7 @@ export function engineStream(
|
|
|
151
152
|
return resolved(model.api).stream(model, context, withEnvApiKey(model, options));
|
|
152
153
|
}
|
|
153
154
|
|
|
154
|
-
|
|
155
|
+
function dispatchEngineStreamSimple(
|
|
155
156
|
model: Model<Api>,
|
|
156
157
|
context: Context,
|
|
157
158
|
options?: SimpleStreamOptions,
|
|
@@ -168,6 +169,22 @@ export function engineStreamSimple(
|
|
|
168
169
|
return resolved(model.api).streamSimple(model, context, withEnvApiKey(model, options));
|
|
169
170
|
}
|
|
170
171
|
|
|
172
|
+
export function engineStream(
|
|
173
|
+
model: Model<Api>,
|
|
174
|
+
context: Context,
|
|
175
|
+
options?: StreamOptions,
|
|
176
|
+
): AssistantMessageEventStream {
|
|
177
|
+
return instrumentProviderCall(model, options, (effective) => dispatchEngineStream(model, context, effective));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function engineStreamSimple(
|
|
181
|
+
model: Model<Api>,
|
|
182
|
+
context: Context,
|
|
183
|
+
options?: SimpleStreamOptions,
|
|
184
|
+
): AssistantMessageEventStream {
|
|
185
|
+
return instrumentProviderCall(model, options, (effective) => dispatchEngineStreamSimple(model, context, effective));
|
|
186
|
+
}
|
|
187
|
+
|
|
171
188
|
export async function completeEngineSimple(
|
|
172
189
|
model: Model<Api>,
|
|
173
190
|
context: Context,
|
|
@@ -297,13 +297,14 @@ function withLiteLLMRouteFailureAdvice(
|
|
|
297
297
|
(async () => {
|
|
298
298
|
try {
|
|
299
299
|
for await (const event of source) {
|
|
300
|
-
if (event.type === "error") {
|
|
300
|
+
if (event.type === "error" && event.reason !== "aborted" && event.error.stopReason !== "aborted") {
|
|
301
301
|
event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata.targetId, model.id);
|
|
302
302
|
}
|
|
303
303
|
advised.push(event as AssistantMessageEvent);
|
|
304
304
|
}
|
|
305
305
|
advised.end();
|
|
306
306
|
} catch (err) {
|
|
307
|
+
if (err instanceof Error && err.name === "AbortError") throw err;
|
|
307
308
|
const message = err instanceof Error ? err.message : String(err);
|
|
308
309
|
throw new Error(liteLLMRouteFailureMessage(message, metadata.targetId, model.id));
|
|
309
310
|
}
|
|
@@ -922,11 +923,17 @@ function guardMalformedToolCalls(
|
|
|
922
923
|
(async () => {
|
|
923
924
|
try {
|
|
924
925
|
for await (const event of source) {
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
926
|
+
// The final stop reason distinguishes malformed output from a token
|
|
927
|
+
// limit. pi rejects every call in a length-truncated message (even
|
|
928
|
+
// salvage-parsed arguments) and continues with error tool results.
|
|
929
|
+
// Turning that into an error here aborts the worker before recovery.
|
|
930
|
+
if (event.type === "done" && event.message.stopReason !== "length") {
|
|
931
|
+
const malformed = event.message.content.find(
|
|
932
|
+
(block) => block.type === "toolCall" && requiredByTool.has(block.name) && hasEmptyArguments(block.arguments),
|
|
933
|
+
);
|
|
934
|
+
if (malformed?.type === "toolCall") {
|
|
935
|
+
const message = malformedToolArgsMessage(model, malformed.name, requiredByTool.get(malformed.name) ?? []);
|
|
936
|
+
const error = finalErrorFromPartial(event.message, message);
|
|
930
937
|
guarded.push({ type: "error", reason: "error", error });
|
|
931
938
|
guarded.end(error);
|
|
932
939
|
return;
|
|
@@ -32,18 +32,38 @@ export function setGlobalDefaultMaxOutputTokens(value: number): void {
|
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Tokens a preflight context check should hold back for the response: the
|
|
35
|
-
* smaller of the model's advertised output limit and the
|
|
36
|
-
* budget
|
|
35
|
+
* smaller of the model's advertised output limit and the configured output
|
|
36
|
+
* budget, falling back to the product default when no budget is configured.
|
|
37
|
+
* The safety margin is deliberately not added here; at request time
|
|
37
38
|
* {@link remainingContextMaxTokens} subtracts it from the window and degrades
|
|
38
39
|
* the output budget gracefully, so a hard preflight reservation of
|
|
39
40
|
* limit + safety would compact earlier than the engine actually needs.
|
|
40
41
|
*/
|
|
41
|
-
export function resolveReservedOutputTokens(
|
|
42
|
+
export function resolveReservedOutputTokens(
|
|
43
|
+
maxOutputTokens?: number | null,
|
|
44
|
+
request?: { api: string; contextWindow: number; inputTokens: number },
|
|
45
|
+
): number {
|
|
46
|
+
const requested = globalDefaultMaxOutputTokens > 0 ? globalDefaultMaxOutputTokens : DEFAULT_MAX_OUTPUT_TOKENS;
|
|
42
47
|
const limit =
|
|
43
48
|
typeof maxOutputTokens === "number" && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0
|
|
44
49
|
? maxOutputTokens
|
|
45
|
-
:
|
|
46
|
-
|
|
50
|
+
: Number.POSITIVE_INFINITY;
|
|
51
|
+
const ceiling = Math.min(limit, requested);
|
|
52
|
+
// These Clio transports already reduce the wire ceiling to remaining room.
|
|
53
|
+
// Preflight must use that same allocation, rather than demanding room for
|
|
54
|
+
// the entire configured maximum (which may equal the context window).
|
|
55
|
+
// Other transports retain their existing reservation contract.
|
|
56
|
+
return request && (request.api === "openai-completions" || request.api === "ollama-native")
|
|
57
|
+
? clampOutputToRemainingContext(ceiling, request.contextWindow, request.inputTokens)
|
|
58
|
+
: ceiling;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function clampOutputToRemainingContext(ceiling: number, contextWindow: number, inputTokens: number): number {
|
|
62
|
+
const available =
|
|
63
|
+
contextWindow > 0 && Number.isFinite(contextWindow)
|
|
64
|
+
? Math.max(1, contextWindow - inputTokens - CONTEXT_BUDGET_SAFETY_TOKENS)
|
|
65
|
+
: Number.POSITIVE_INFINITY;
|
|
66
|
+
return Math.min(ceiling, available);
|
|
47
67
|
}
|
|
48
68
|
|
|
49
69
|
export function estimateInputTokensFromContext(context: Context): number {
|
|
@@ -59,15 +79,11 @@ export function remainingContextMaxTokens(
|
|
|
59
79
|
options: Pick<StreamOptions, "maxTokens"> | undefined,
|
|
60
80
|
limits?: { contextWindow?: number; maxOutputTokens?: number },
|
|
61
81
|
): number {
|
|
62
|
-
const safety = CONTEXT_BUDGET_SAFETY_TOKENS;
|
|
63
82
|
const inputTokens = estimateInputTokensFromContext(context);
|
|
64
83
|
const configuredContextWindow = model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;
|
|
65
84
|
const loadedContextWindow =
|
|
66
85
|
limits?.contextWindow !== undefined && limits.contextWindow > 0 ? limits.contextWindow : Number.POSITIVE_INFINITY;
|
|
67
86
|
const contextWindow = Math.min(configuredContextWindow, loadedContextWindow);
|
|
68
|
-
const budget = Number.isFinite(contextWindow)
|
|
69
|
-
? Math.max(1, contextWindow - inputTokens - safety)
|
|
70
|
-
: Number.POSITIVE_INFINITY;
|
|
71
87
|
const modelLimit = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
|
|
72
88
|
// Precedence for the requested ceiling when the caller gave no explicit
|
|
73
89
|
// maxTokens: a more-specific tool-turn limit, then the global default, then
|
|
@@ -84,6 +100,6 @@ export function remainingContextMaxTokens(
|
|
|
84
100
|
? modelLimit
|
|
85
101
|
: DEFAULT_MAX_OUTPUT_TOKENS;
|
|
86
102
|
const requested = options?.maxTokens ?? defaultLimit;
|
|
87
|
-
const resolved = Math.min(requested, modelLimit,
|
|
103
|
+
const resolved = clampOutputToRemainingContext(Math.min(requested, modelLimit), contextWindow, inputTokens);
|
|
88
104
|
return Number.isFinite(resolved) ? resolved : DEFAULT_MAX_OUTPUT_TOKENS;
|
|
89
105
|
}
|
|
@@ -314,7 +314,7 @@ export interface ClaudeWorkerBudgetGate {
|
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
/** Canonical call counter shared by the SDK's PreToolUse/canUseTool mediation seam. */
|
|
317
|
-
function createClaudeWorkerBudgetGate(
|
|
317
|
+
export function createClaudeWorkerBudgetGate(
|
|
318
318
|
budget: WorkerBudget,
|
|
319
319
|
onBoundary: () => void,
|
|
320
320
|
onHardCap: () => void,
|
|
@@ -330,6 +330,7 @@ function createClaudeWorkerBudgetGate(
|
|
|
330
330
|
let admitted = 0;
|
|
331
331
|
let locked = false;
|
|
332
332
|
const phaseDecision = (canonicalToolName: string): { kind: "allow" } | { kind: "deny"; reason: string } => {
|
|
333
|
+
if (budget.mode === "advisory") return { kind: "allow" };
|
|
333
334
|
const reserveAdmits = isReserveAdmittedTool(canonicalToolName, deliveryTools);
|
|
334
335
|
if (locked || admitted >= budget.toolCalls) {
|
|
335
336
|
// Same rule the native guard applies: the soft budget ends discovery,
|
|
@@ -365,7 +366,7 @@ function createClaudeWorkerBudgetGate(
|
|
|
365
366
|
return {
|
|
366
367
|
attempt(canonicalToolName) {
|
|
367
368
|
attempts += 1;
|
|
368
|
-
if (attempts > budget.hardCap) {
|
|
369
|
+
if (budget.mode !== "advisory" && attempts > budget.hardCap) {
|
|
369
370
|
onHardCap();
|
|
370
371
|
return { kind: "deny", reason: `workerToolCallCap reached (${budget.hardCap}); abort run` };
|
|
371
372
|
}
|
|
@@ -381,7 +382,7 @@ function createClaudeWorkerBudgetGate(
|
|
|
381
382
|
// Locking here is what ends the work phase. A delivery-capable agent is
|
|
382
383
|
// not locked at its soft budget: it still owes the files it was
|
|
383
384
|
// dispatched to write, and hardCap in attempt() is its bound.
|
|
384
|
-
if (admitted >= budget.toolCalls && deliveryTools.length === 0) {
|
|
385
|
+
if (budget.mode !== "advisory" && admitted >= budget.toolCalls && deliveryTools.length === 0) {
|
|
385
386
|
locked = true;
|
|
386
387
|
onBoundary();
|
|
387
388
|
}
|
|
@@ -12,6 +12,7 @@ const ENV_KEYS: Readonly<Record<string, string>> = {
|
|
|
12
12
|
"ant-ling": "ANT_LING_API_KEY",
|
|
13
13
|
"qwen-token-plan": "QWEN_TOKEN_PLAN_API_KEY",
|
|
14
14
|
"qwen-token-plan-cn": "QWEN_TOKEN_PLAN_CN_API_KEY",
|
|
15
|
+
"qwen-token-plan-individual": "QWEN_TOKEN_PLAN_API_KEY",
|
|
15
16
|
openai: "OPENAI_API_KEY",
|
|
16
17
|
"azure-openai-responses": "AZURE_OPENAI_API_KEY",
|
|
17
18
|
nvidia: "NVIDIA_API_KEY",
|
|
@@ -59,7 +60,7 @@ function apiKeyEnvVars(provider: string): readonly string[] | undefined {
|
|
|
59
60
|
return name ? [name] : undefined;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
/** Synchronous provider-key discovery pinned to pi-ai 0.
|
|
63
|
+
/** Synchronous provider-key discovery pinned to pi-ai 0.85's public behavior. */
|
|
63
64
|
export function findEngineEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {
|
|
64
65
|
const names = apiKeyEnvVars(provider);
|
|
65
66
|
if (!names) return undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ChildProcessByStdio, spawn } from "node:child_process";
|
|
2
2
|
import type { Readable } from "node:stream";
|
|
3
3
|
|
|
4
4
|
import { boundedExternalDiagnostic } from "../core/external-diagnostic.js";
|
|
@@ -81,15 +81,18 @@ export interface ProcessTreeTerminator {
|
|
|
81
81
|
cleanup(): void;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
/** POSIX process
|
|
84
|
+
/** POSIX process groups or Windows taskkill trees, with a direct-child fallback. */
|
|
85
85
|
export function createProcessTreeTerminator(
|
|
86
86
|
child: { pid?: number | undefined; exitCode: number | null; kill(signal?: NodeJS.Signals): boolean },
|
|
87
87
|
graceMs = 1500,
|
|
88
|
+
options: { platform?: NodeJS.Platform; spawn?: typeof spawn } = {},
|
|
88
89
|
): ProcessTreeTerminator {
|
|
90
|
+
const platform = options.platform ?? process.platform;
|
|
91
|
+
const spawnKiller = options.spawn ?? spawn;
|
|
89
92
|
let sent = false;
|
|
90
93
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
91
94
|
const signal = (name: NodeJS.Signals): void => {
|
|
92
|
-
if (child.pid &&
|
|
95
|
+
if (child.pid && platform !== "win32") {
|
|
93
96
|
try {
|
|
94
97
|
process.kill(-child.pid, name);
|
|
95
98
|
return;
|
|
@@ -97,6 +100,14 @@ export function createProcessTreeTerminator(
|
|
|
97
100
|
// The child may not have established its group yet.
|
|
98
101
|
}
|
|
99
102
|
}
|
|
103
|
+
if (platform === "win32" && child.pid !== undefined && Number.isSafeInteger(child.pid) && child.pid > 0) {
|
|
104
|
+
const args = ["/PID", String(child.pid), "/T", ...(name === "SIGKILL" ? ["/F"] : [])];
|
|
105
|
+
const killer = spawnKiller("taskkill.exe", args, { stdio: "ignore", windowsHide: true });
|
|
106
|
+
killer.once("error", () => {
|
|
107
|
+
if (child.exitCode === null) child.kill(name);
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
100
111
|
if (child.exitCode !== null) return;
|
|
101
112
|
child.kill(name);
|
|
102
113
|
};
|
package/src/engine/loop-guard.ts
CHANGED
|
@@ -441,6 +441,8 @@ export interface CreateLoopGuardRegistrationOptions {
|
|
|
441
441
|
* operator who can intervene; workers do not).
|
|
442
442
|
*/
|
|
443
443
|
toolCallCap?: number;
|
|
444
|
+
/** Observe estimated work without disabling tools; fault-loop detection remains active. */
|
|
445
|
+
toolBudgetAdvisory?: boolean;
|
|
444
446
|
/**
|
|
445
447
|
* Worker only: successful exploration attempts allowed before a graceful,
|
|
446
448
|
* text-only synthesis phase. Unlike {@link toolCallCap}, crossing this soft
|
|
@@ -523,8 +525,10 @@ export interface LoopGuardRegistration extends MiddlewareHookRegistration {
|
|
|
523
525
|
|
|
524
526
|
export function createLoopGuardRegistration(options: CreateLoopGuardRegistrationOptions): LoopGuardRegistration {
|
|
525
527
|
const budget = options.turnBlockBudget ?? INTERACTIVE_LOOP_BLOCK_BUDGET;
|
|
526
|
-
const cap = options.toolCallCap;
|
|
528
|
+
const cap = options.toolBudgetAdvisory ? undefined : options.toolCallCap;
|
|
529
|
+
let advisoryEmitted = false;
|
|
527
530
|
let softLimit =
|
|
531
|
+
!options.toolBudgetAdvisory &&
|
|
528
532
|
options.toolCallSoftLimit !== undefined &&
|
|
529
533
|
Number.isSafeInteger(options.toolCallSoftLimit) &&
|
|
530
534
|
options.toolCallSoftLimit > 0 &&
|
|
@@ -561,7 +565,8 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
561
565
|
* has no cap and no bound here; it has an operator instead.
|
|
562
566
|
*/
|
|
563
567
|
let deniedAttempts = 0;
|
|
564
|
-
const denialBudget =
|
|
568
|
+
const denialBudget =
|
|
569
|
+
options.toolCallCap === undefined ? undefined : Math.max(options.toolCallCap, WIDE_BATCH_DENIAL_FLOOR);
|
|
565
570
|
const boundRunDenials = (
|
|
566
571
|
effects: ReadonlyArray<MiddlewareEffect>,
|
|
567
572
|
input: MiddlewareHookInput,
|
|
@@ -948,6 +953,18 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
948
953
|
recordSuccessfulResult(input);
|
|
949
954
|
recordResultForStagnation(input);
|
|
950
955
|
const effects = [...crossArgumentResultEffects(input)];
|
|
956
|
+
if (
|
|
957
|
+
options.toolBudgetAdvisory &&
|
|
958
|
+
!advisoryEmitted &&
|
|
959
|
+
count >= (options.toolCallSoftLimit ?? options.toolCallCap ?? Infinity)
|
|
960
|
+
) {
|
|
961
|
+
advisoryEmitted = true;
|
|
962
|
+
effects.push({
|
|
963
|
+
kind: "annotate_tool_result",
|
|
964
|
+
message: `Advisory tool estimate reached (${count} calls). Reassess remaining work and finish the assignment; tools remain available. Explicit task requirements still apply.`,
|
|
965
|
+
severity: "warn",
|
|
966
|
+
});
|
|
967
|
+
}
|
|
951
968
|
if (
|
|
952
969
|
softReadReserveEntered &&
|
|
953
970
|
softLockout === null &&
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { closeSync, constants, fstatSync, openSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { isAbsolute } from "node:path";
|
|
4
|
+
import type { Api, AssistantMessageEventStream, Model, StreamOptions } from "@earendil-works/pi-ai";
|
|
5
|
+
import { findEngineEnvKeys } from "./env-api-keys.js";
|
|
6
|
+
|
|
7
|
+
/** Process-owned opt-in reaches every native engine call, including prewarm and workers. */
|
|
8
|
+
export function instrumentProviderCall<T extends StreamOptions>(
|
|
9
|
+
model: Model<Api>,
|
|
10
|
+
options: T | undefined,
|
|
11
|
+
invoke: (options: T | undefined) => AssistantMessageEventStream,
|
|
12
|
+
): AssistantMessageEventStream {
|
|
13
|
+
let effective = options;
|
|
14
|
+
if (model.api === "anthropic-messages" && options?.cacheRetention === undefined) {
|
|
15
|
+
const retention = process.env.CLIO_CODER_ANTHROPIC_CACHE_RETENTION;
|
|
16
|
+
if (retention !== undefined && retention !== "") {
|
|
17
|
+
if (retention !== "none" && retention !== "short" && retention !== "long") {
|
|
18
|
+
throw new Error("CLIO_CODER_ANTHROPIC_CACHE_RETENTION must be none, short, or long");
|
|
19
|
+
}
|
|
20
|
+
effective = { ...options, cacheRetention: retention } as T;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const path = process.env.CLIO_CODER_PROVIDER_DUMP_PATH;
|
|
24
|
+
if (!path) return invoke(effective);
|
|
25
|
+
const sink = openDump(path);
|
|
26
|
+
const payloads: unknown[] = [];
|
|
27
|
+
const redact = diagnosticSerializer(model, effective);
|
|
28
|
+
const callId = randomUUID();
|
|
29
|
+
const onPayload = effective?.onPayload;
|
|
30
|
+
const instrumented = {
|
|
31
|
+
...effective,
|
|
32
|
+
onPayload: async (payload: unknown, currentModel: Model<Api>) => {
|
|
33
|
+
// Caller-owned thinking/tool/schema patches finish first. Snapshot now:
|
|
34
|
+
// providers and callbacks can retain or mutate their objects afterward.
|
|
35
|
+
const replacement = await onPayload?.(payload, currentModel);
|
|
36
|
+
try {
|
|
37
|
+
payloads.push(JSON.parse(redact(replacement === undefined ? payload : replacement)));
|
|
38
|
+
} catch {
|
|
39
|
+
payloads.push({ diagnosticError: "payload could not be serialized" });
|
|
40
|
+
}
|
|
41
|
+
return replacement;
|
|
42
|
+
},
|
|
43
|
+
} as T;
|
|
44
|
+
const finish = (terminal: { response: unknown } | { error: string }) => {
|
|
45
|
+
try {
|
|
46
|
+
writeFileSync(sink, `${redact({ callId, api: model.api, model: model.id, payloads, ...terminal })}\n`, "utf8");
|
|
47
|
+
} catch {
|
|
48
|
+
// Diagnostics must not turn a completed provider call into a retry or
|
|
49
|
+
// inject content into the ledger. Report only the sink failure category.
|
|
50
|
+
process.emitWarning("Provider diagnostic dump could not be written", { code: "CLIO_CODER_PROVIDER_DUMP_FAILED" });
|
|
51
|
+
} finally {
|
|
52
|
+
try {
|
|
53
|
+
closeSync(sink);
|
|
54
|
+
} catch {
|
|
55
|
+
process.emitWarning("Provider diagnostic dump could not be closed", { code: "CLIO_CODER_PROVIDER_DUMP_FAILED" });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
const stream = invoke(instrumented);
|
|
61
|
+
// result() observes the existing terminal promise; it never consumes the
|
|
62
|
+
// event iterator that the agent and durable ledger projection own.
|
|
63
|
+
void stream.result().then(
|
|
64
|
+
(response) => finish({ response }),
|
|
65
|
+
(error) => finish({ error: String(error) }),
|
|
66
|
+
);
|
|
67
|
+
return stream;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
finish({ error: error instanceof Error ? error.message : String(error) });
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Refuse insecure existing files instead of silently changing their permissions. */
|
|
75
|
+
function openDump(path: string): number {
|
|
76
|
+
if (!isAbsolute(path)) throw new Error("CLIO_CODER_PROVIDER_DUMP_PATH must be an absolute file path");
|
|
77
|
+
const fd = openSync(
|
|
78
|
+
path,
|
|
79
|
+
constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND | constants.O_NOFOLLOW | constants.O_NONBLOCK,
|
|
80
|
+
0o600,
|
|
81
|
+
);
|
|
82
|
+
try {
|
|
83
|
+
const stat = fstatSync(fd);
|
|
84
|
+
if (
|
|
85
|
+
!stat.isFile() ||
|
|
86
|
+
(stat.mode & 0o777) !== 0o600 ||
|
|
87
|
+
(process.getuid !== undefined && stat.uid !== process.getuid())
|
|
88
|
+
) {
|
|
89
|
+
throw new Error("CLIO_CODER_PROVIDER_DUMP_PATH must be an operator-owned regular file with mode 0600");
|
|
90
|
+
}
|
|
91
|
+
return fd;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
closeSync(fd);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function diagnosticSerializer(model: Model<Api>, options: StreamOptions | undefined): (value: unknown) => string {
|
|
99
|
+
const secrets = new Set<string>();
|
|
100
|
+
const ambientKeys = (findEngineEnvKeys(model.provider, options?.env) ?? []).map(
|
|
101
|
+
(name) => options?.env?.[name] || process.env[name],
|
|
102
|
+
);
|
|
103
|
+
for (const key of [options?.apiKey, ...ambientKeys]) {
|
|
104
|
+
if (key && key !== "<authenticated>") secrets.add(key);
|
|
105
|
+
}
|
|
106
|
+
for (const headers of [options?.headers, model.headers]) {
|
|
107
|
+
for (const [key, value] of Object.entries(headers ?? {})) {
|
|
108
|
+
if (typeof value === "string" && value.length > 0 && /auth|api[-_]?key|cookie|token|secret/iu.test(key)) {
|
|
109
|
+
secrets.add(value);
|
|
110
|
+
const token = value.match(/^(?:Bearer|Basic)\s+(.+)$/iu)?.[1];
|
|
111
|
+
if (token) secrets.add(token);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return (value) => {
|
|
116
|
+
// This is a body-level diagnostic, never an HTTP/auth/options dump. Keep
|
|
117
|
+
// nested tool schemas intact, including tools with a parameter named headers.
|
|
118
|
+
const body =
|
|
119
|
+
typeof value === "object" && value !== null && !Array.isArray(value)
|
|
120
|
+
? Object.fromEntries(
|
|
121
|
+
Object.entries(value).filter(([key]) => !/^(?:headers|env|apiKey|api_key|authorization)$/iu.test(key)),
|
|
122
|
+
)
|
|
123
|
+
: value;
|
|
124
|
+
let serialized = JSON.stringify(body);
|
|
125
|
+
if (serialized === undefined) serialized = "null";
|
|
126
|
+
for (const secret of secrets) serialized = serialized.replaceAll(JSON.stringify(secret).slice(1, -1), "[REDACTED]");
|
|
127
|
+
return serialized;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
@@ -150,7 +150,9 @@ export function patchToolChoiceNamedPayload(
|
|
|
150
150
|
if (Object.keys(outputConfig).length > 0) patched.output_config = outputConfig;
|
|
151
151
|
else delete patched.output_config;
|
|
152
152
|
}
|
|
153
|
-
|
|
153
|
+
// Keep the cacheable schema prefix intact. The request-level choice
|
|
154
|
+
// already identifies the required tool; narrowing changes it twice.
|
|
155
|
+
return { ...patched, tool_choice: { type: "tool", name: toolName } };
|
|
154
156
|
}
|
|
155
157
|
if (model.api === "google-generative-ai" || model.api === "google-vertex") {
|
|
156
158
|
if (!isRecord(payload.config) || payload.config.tools === undefined || payload.config.tools === null)
|
|
@@ -215,6 +215,14 @@ function assistantMessageText(message: AgentMessage | undefined): string | null
|
|
|
215
215
|
*/
|
|
216
216
|
function isTerminalAssistantMessage(message: AgentMessage | undefined): boolean {
|
|
217
217
|
if (!isAssistantMessage(message)) return false;
|
|
218
|
+
// pi refuses truncated tool calls and continues with their error results.
|
|
219
|
+
// That turn has no final artifact/report to repair yet.
|
|
220
|
+
if (
|
|
221
|
+
message.stopReason === "length" &&
|
|
222
|
+
Array.isArray(message.content) &&
|
|
223
|
+
message.content.some((block) => block.type === "toolCall")
|
|
224
|
+
)
|
|
225
|
+
return false;
|
|
218
226
|
return message.stopReason !== "toolUse" && message.stopReason !== "error";
|
|
219
227
|
}
|
|
220
228
|
|
|
@@ -442,6 +450,7 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
|
|
|
442
450
|
const loopGuardRegistration = createLoopGuardRegistration({
|
|
443
451
|
safety,
|
|
444
452
|
toolCallCap: workerBudget.hardCap,
|
|
453
|
+
toolBudgetAdvisory: workerBudget.mode === "advisory",
|
|
445
454
|
toolCallSoftLimit: workerBudget.toolCalls,
|
|
446
455
|
// A worker's blocks all land in one run-long bucket, so the bound on
|
|
447
456
|
// them is a statement about this run's length, not about a turn.
|
|
@@ -600,6 +609,7 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
|
|
|
600
609
|
invokeOptions: () => ({
|
|
601
610
|
correlationId: `worker-model-round-${workerModelRound}`,
|
|
602
611
|
toolResultMaxBytes: workerSettings.context.toolResultMaxBytes,
|
|
612
|
+
supportsImages: model.input.includes("image"),
|
|
603
613
|
...(agentSkillPolicy ? { pendingSkillPolicy: agentSkillPolicy } : {}),
|
|
604
614
|
}),
|
|
605
615
|
});
|
|
@@ -724,8 +734,9 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
|
|
|
724
734
|
stopAfterToolResultCallId = null;
|
|
725
735
|
}
|
|
726
736
|
}
|
|
727
|
-
const revisionToolsAvailable =
|
|
728
|
-
|
|
737
|
+
const revisionToolsAvailable =
|
|
738
|
+
(workerBudget.mode === "advisory" || resultContractRevisionActive) && !synthesisToolLock;
|
|
739
|
+
// Legacy enforced budgets need preauthorized growth to retain repair tools.
|
|
729
740
|
if (!revisionToolsAvailable) synthesisToolLock = true;
|
|
730
741
|
// Delivered as a paired tool exchange, never a user turn. Templates
|
|
731
742
|
// that key history rendering off the last `user` message re-render
|
|
@@ -114,7 +114,11 @@ export function createWorkerSafety(options: WorkerSafetyOptions = {}): SafetyCon
|
|
|
114
114
|
},
|
|
115
115
|
scopes: { readonly: READONLY_SCOPE, workspace: WORKSPACE_SCOPE, confirmed: CONFIRMED_SCOPE },
|
|
116
116
|
isSubset,
|
|
117
|
-
policy: {
|
|
117
|
+
policy: {
|
|
118
|
+
metadata: (posture) => policyEngine.metadata(posture),
|
|
119
|
+
allowsObservationPath: (path) =>
|
|
120
|
+
policyEngine.evaluate({ tool: "read", args: { path } }).reasonCode !== "path-policy:zeroAccessPaths",
|
|
121
|
+
},
|
|
118
122
|
audit: { recordCount: () => 0 },
|
|
119
123
|
};
|
|
120
124
|
}
|
|
@@ -125,6 +125,7 @@ export function createExtensionReloadCoordinator(deps: ExtensionReloadCoordinato
|
|
|
125
125
|
workspaceRoot: workspace,
|
|
126
126
|
...(captured !== null ? { capturedSources: captured } : {}),
|
|
127
127
|
recordReceipt: deps.recordReceipt,
|
|
128
|
+
report: deps.report,
|
|
128
129
|
...(deps.runCommand !== undefined ? { runCommand: deps.runCommand } : {}),
|
|
129
130
|
...(deps.now !== undefined ? { now: deps.now } : {}),
|
|
130
131
|
});
|