@vercel/cli-support 65.4.0 → 65.5.0-snapshot-8a613d8ad85d
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/README.md +22 -0
- package/dist/chunks/add-6UOKR26K.js +8 -0
- package/dist/chunks/add-GULZ6EGJ.js +8 -0
- package/dist/chunks/add-RPAOJH5O.js +8 -0
- package/dist/chunks/build-MLAKPRSC.js +7 -0
- package/dist/chunks/{chunk-ADLBLGT3.js → chunk-26QK3I2S.js} +1 -1
- package/dist/chunks/chunk-2BKALEOP.js +7 -0
- package/dist/chunks/chunk-2FHZYQPY.js +7 -0
- package/dist/chunks/{chunk-TIPQQ4TG.js → chunk-2QIJEHNE.js} +1 -1
- package/dist/chunks/{chunk-JP33AIDQ.js → chunk-36NK2Z3C.js} +1 -1
- package/dist/chunks/{chunk-D6REP5QQ.js → chunk-3E364MJE.js} +1 -1
- package/dist/chunks/{chunk-EEUJLJEJ.js → chunk-3H36RI7C.js} +1 -1
- package/dist/chunks/{chunk-JUSR7V2L.js → chunk-3NG2EYQ5.js} +1 -1
- package/dist/chunks/{chunk-AYUUSAB7.js → chunk-4G7ZQONX.js} +1 -1
- package/dist/chunks/{chunk-SYFG2RM6.js → chunk-4HJGSSSZ.js} +1 -1
- package/dist/chunks/{chunk-CWM2F235.js → chunk-55H6G46X.js} +1 -1
- package/dist/chunks/{chunk-6TXEVQA4.js → chunk-5CZNUB7Y.js} +1 -1
- package/dist/chunks/{chunk-ZN6CQWVP.js → chunk-5EMSOR2P.js} +1 -1
- package/dist/chunks/{chunk-NAX6IARA.js → chunk-5K426HWC.js} +1 -1
- package/dist/chunks/{chunk-773GOZIR.js → chunk-5SIC5273.js} +1 -1
- package/dist/chunks/chunk-5WYPJ2T5.js +25 -0
- package/dist/chunks/{chunk-MBEKRUTQ.js → chunk-6IATT2ID.js} +2 -2
- package/dist/chunks/{chunk-KPQLUGFI.js → chunk-6WMO5G45.js} +3 -3
- package/dist/chunks/{chunk-6OVX3PWM.js → chunk-75JI2SZX.js} +1 -1
- package/dist/chunks/{chunk-ECEDD646.js → chunk-7G4PQR6J.js} +1 -1
- package/dist/chunks/chunk-7SAEZ4NC.js +7 -0
- package/dist/chunks/{chunk-363SJ4TN.js → chunk-7VTPAXDC.js} +1 -1
- package/dist/chunks/chunk-A2UZ2O7H.js +7 -0
- package/dist/chunks/{chunk-3LIKVGFT.js → chunk-A3RU52F4.js} +1 -1
- package/dist/chunks/{chunk-CC6FLKIP.js → chunk-AIRQFG5A.js} +1 -1
- package/dist/chunks/{chunk-IOZ3I765.js → chunk-AOC6XXOO.js} +1 -1
- package/dist/chunks/{chunk-EISD3RG7.js → chunk-ARQMFBV4.js} +1 -1
- package/dist/chunks/{chunk-UHBMX3OK.js → chunk-AUY363W7.js} +1 -1
- package/dist/chunks/chunk-BGWS5R5R.js +9 -0
- package/dist/chunks/chunk-C6IITJ5S.js +7 -0
- package/dist/chunks/{chunk-OHEOYFBU.js → chunk-CLVEFWEX.js} +1 -1
- package/dist/chunks/{chunk-KGBIRIFF.js → chunk-CU2FTX57.js} +1 -1
- package/dist/chunks/{chunk-YHULP2KK.js → chunk-CWO4HMKU.js} +1 -1
- package/dist/chunks/{chunk-EU2GBIPC.js → chunk-CZINAGH6.js} +1 -1
- package/dist/chunks/{chunk-QIVX6SCR.js → chunk-DAUAVRFC.js} +1 -1
- package/dist/chunks/{chunk-GA277JFB.js → chunk-DPM33VFZ.js} +1 -1
- package/dist/chunks/{chunk-Q5ODLDCU.js → chunk-DSY2S2YT.js} +1 -1
- package/dist/chunks/{chunk-XP3FT56R.js → chunk-DWOJP4ST.js} +3 -3
- package/dist/chunks/chunk-ED3VA7D4.js +7 -0
- package/dist/chunks/{chunk-GG5RME4X.js → chunk-EE2FTI3R.js} +1 -1
- package/dist/chunks/{chunk-QVZAAMGQ.js → chunk-EFEQQXRU.js} +1 -1
- package/dist/chunks/{chunk-DKJL2KV7.js → chunk-EPO7P734.js} +1 -1
- package/dist/chunks/{chunk-7QAGSRCU.js → chunk-EQT2VHL2.js} +1 -1
- package/dist/chunks/chunk-ETEVOJQJ.js +8 -0
- package/dist/chunks/chunk-EWP5WICJ.js +10 -0
- package/dist/chunks/chunk-F22QLVTX.js +7 -0
- package/dist/chunks/{chunk-XC46OAAT.js → chunk-FAEC4BER.js} +1 -1
- package/dist/chunks/{chunk-LSQREJXO.js → chunk-FAELJM4F.js} +1 -1
- package/dist/chunks/{chunk-7R6TRRG5.js → chunk-FNA4MIOH.js} +1 -1
- package/dist/chunks/{chunk-L3JYCXVB.js → chunk-GFD6UAAO.js} +2 -2
- package/dist/chunks/{chunk-U2OBPULW.js → chunk-GP55VEOQ.js} +1 -1
- package/dist/chunks/{chunk-FSPPKNKN.js → chunk-GVPVWHFK.js} +1 -1
- package/dist/chunks/{chunk-527GBU3K.js → chunk-HMWDOAWO.js} +1 -1
- package/dist/chunks/{chunk-7L2K4OKM.js → chunk-HVDGNAPM.js} +1 -1
- package/dist/chunks/{chunk-QVHXFHBV.js → chunk-I2WEQWCA.js} +1 -1
- package/dist/chunks/{chunk-JRPNHWA3.js → chunk-IC3THLYP.js} +1 -1
- package/dist/chunks/{chunk-IQKGQ2Y2.js → chunk-J6L5MDTX.js} +1 -1
- package/dist/chunks/{chunk-YMZ6WBKB.js → chunk-JCGEXU7T.js} +3 -3
- package/dist/chunks/{chunk-7L5QUDUR.js → chunk-JGMJP4T3.js} +1 -1
- package/dist/chunks/{chunk-ZQBSAMFL.js → chunk-JHNLBVO2.js} +1 -1
- package/dist/chunks/{chunk-HTXDC7E2.js → chunk-JMLKK7RL.js} +2 -2
- package/dist/chunks/{chunk-T6243EDS.js → chunk-JSAY52FE.js} +1 -1
- package/dist/chunks/{chunk-C7FQMC6D.js → chunk-JWUXHL35.js} +1 -1
- package/dist/chunks/{chunk-KQCROPL3.js → chunk-JXAEI2GJ.js} +1 -1
- package/dist/chunks/{chunk-VNIKIQVE.js → chunk-KHADRPBJ.js} +1 -1
- package/dist/chunks/{chunk-GCZVIDNG.js → chunk-KWKEBKUR.js} +1 -1
- package/dist/chunks/chunk-KY7LDQRX.js +7 -0
- package/dist/chunks/{chunk-YEZJNXQX.js → chunk-L4XLDN6T.js} +1 -1
- package/dist/chunks/{chunk-EGNR2DEI.js → chunk-LOO42IMZ.js} +1 -1
- package/dist/chunks/{chunk-CBVKB3DT.js → chunk-LT5UZRMK.js} +1 -1
- package/dist/chunks/{chunk-FUX6LKNP.js → chunk-LUX4PBJL.js} +1 -1
- package/dist/chunks/chunk-M7LUSXMG.js +7 -0
- package/dist/chunks/{chunk-ANMDN3EG.js → chunk-MFW6IJIK.js} +1 -1
- package/dist/chunks/{chunk-UGNIIDHR.js → chunk-MLGQ233X.js} +1 -1
- package/dist/chunks/chunk-MY4MONOH.js +7 -0
- package/dist/chunks/{chunk-N6JBQMOF.js → chunk-MZQEDXOH.js} +1 -1
- package/dist/chunks/chunk-N5CXIFE2.js +7 -0
- package/dist/chunks/{chunk-LQVSU5HR.js → chunk-NM44RWS6.js} +1 -1
- package/dist/chunks/{chunk-FHU2O7ZJ.js → chunk-NVNE3W7S.js} +1 -1
- package/dist/chunks/chunk-NZPGWZLV.js +9 -0
- package/dist/chunks/{chunk-462YCCJZ.js → chunk-O7COT3YB.js} +1 -1
- package/dist/chunks/{chunk-KY335KWI.js → chunk-ODAV7Z2H.js} +1 -1
- package/dist/chunks/{chunk-HCRD3JFL.js → chunk-OKNDHNH6.js} +1 -1
- package/dist/chunks/{chunk-Q4KTAQB3.js → chunk-OQX4YVGU.js} +1 -1
- package/dist/chunks/chunk-ORJBK5FT.js +9 -0
- package/dist/chunks/{chunk-5KUUMQ3M.js → chunk-OTYF3ZZW.js} +1 -1
- package/dist/chunks/{chunk-FGFLTLEA.js → chunk-P6ZTEDX2.js} +1 -1
- package/dist/chunks/{chunk-O72YDZKD.js → chunk-PHHZ6J7Q.js} +1 -1
- package/dist/chunks/{chunk-RMZTB2IU.js → chunk-PRFIFS3Q.js} +1 -1
- package/dist/chunks/{chunk-R2XHJDAP.js → chunk-QDPYU6KS.js} +1 -1
- package/dist/chunks/{chunk-JLEJB6KM.js → chunk-QHM6OK76.js} +1 -1
- package/dist/chunks/{chunk-CR3NBTHV.js → chunk-QNL22LAW.js} +1 -1
- package/dist/chunks/{chunk-5V53NA6C.js → chunk-QUSEBFDO.js} +1 -1
- package/dist/chunks/{chunk-DQ2SVW4R.js → chunk-R3BEQTZZ.js} +1 -1
- package/dist/chunks/{chunk-BUJITHGZ.js → chunk-RCUDI7OF.js} +1 -1
- package/dist/chunks/{chunk-Y5ZMKL7E.js → chunk-RMW2FDXS.js} +1 -1
- package/dist/chunks/{chunk-KRPY5FHJ.js → chunk-RQVIMYKN.js} +1 -1
- package/dist/chunks/chunk-RWPQOJTT.js +22 -0
- package/dist/chunks/{chunk-2TUVL6WE.js → chunk-SDOPVIKJ.js} +1 -1
- package/dist/chunks/{chunk-3XW7N4W3.js → chunk-SKSOCUDZ.js} +1 -1
- package/dist/chunks/chunk-SLDWAIO3.js +18 -0
- package/dist/chunks/{chunk-JWCEHQQF.js → chunk-SW3JRXUW.js} +1 -1
- package/dist/chunks/{chunk-M2NXKZKX.js → chunk-TGOGYSBO.js} +1 -1
- package/dist/chunks/chunk-TZT3VYZ3.js +7 -0
- package/dist/chunks/{chunk-F6EBOT64.js → chunk-UJQ6PBRF.js} +1 -1
- package/dist/chunks/{chunk-BVGGTBYE.js → chunk-UWMPVTXG.js} +1 -1
- package/dist/chunks/{chunk-R6BEOVTU.js → chunk-VAWZZK3Y.js} +1 -1
- package/dist/chunks/{chunk-4N6LMERQ.js → chunk-VLYVVC3P.js} +11 -11
- package/dist/chunks/{chunk-HSFKISDH.js → chunk-VQ755MPP.js} +1 -1
- package/dist/chunks/{chunk-QB7F3UAP.js → chunk-VUQWLLNI.js} +1 -1
- package/dist/chunks/chunk-VWHIWUGJ.js +7 -0
- package/dist/chunks/chunk-WDUHDLUA.js +14 -0
- package/dist/chunks/{chunk-K5U47EVH.js → chunk-WICRM2JL.js} +1 -1
- package/dist/chunks/{chunk-KJA2GKPT.js → chunk-WSVYZKI6.js} +1 -1
- package/dist/chunks/{chunk-N2FLYCCO.js → chunk-XAU3KTPX.js} +1 -1
- package/dist/chunks/chunk-XCKUJZUG.js +10 -0
- package/dist/chunks/{chunk-WDXW6A4H.js → chunk-XE24Y6NM.js} +2 -2
- package/dist/chunks/{chunk-RW3X523R.js → chunk-XSQVCDSD.js} +1 -1
- package/dist/chunks/{chunk-KW6GSQXV.js → chunk-XTKGBVSF.js} +1 -1
- package/dist/chunks/{chunk-2K3ISCQ6.js → chunk-YALEYPMP.js} +1 -1
- package/dist/chunks/chunk-YCJHUYBJ.js +19 -0
- package/dist/chunks/{chunk-TEYREL44.js → chunk-YIRSRF6D.js} +1 -1
- package/dist/chunks/chunk-YQDOADMG.js +10 -0
- package/dist/chunks/{chunk-PFPJLIFF.js → chunk-YT3QAZQF.js} +1 -1
- package/dist/chunks/{chunk-R2BUF6Z7.js → chunk-ZQUVDDPB.js} +1 -1
- package/dist/chunks/{chunk-XVDRGWXM.js → chunk-ZUNQHI5Y.js} +1 -1
- package/dist/chunks/{chunk-KQCFC2JL.js → chunk-ZUYPTLVO.js} +1 -1
- package/dist/chunks/clear-UZWOOGOH.js +8 -0
- package/dist/chunks/compile-vercel-config-2RQDL3RD.js +7 -0
- package/dist/chunks/config-C76IGJ6B.js +8 -0
- package/dist/chunks/config-RMJWRS7O.js +7 -0
- package/dist/chunks/{connect-git-provider-FS5Q2HO4.js → connect-git-provider-IQ7N2NPY.js} +1 -1
- package/dist/chunks/delete-2WBR5JQW.js +9 -0
- package/dist/chunks/delete-OKOBDL7Z.js +10 -0
- package/dist/chunks/{detect-projects-OD4JEAW2.js → detect-projects-XPB3R7VS.js} +1 -1
- package/dist/chunks/detect-services-DRHV22O5.js +7 -0
- package/dist/chunks/disable-DFEABU2Z.js +7 -0
- package/dist/chunks/discard-KGBEMNFT.js +14 -0
- package/dist/chunks/edit-5XIRLUKG.js +9 -0
- package/dist/chunks/edit-PJIDMKUS.js +8 -0
- package/dist/chunks/enable-UDWDPFOI.js +7 -0
- package/dist/chunks/{exec-OZSY46V6.js → exec-PX4GTZNE.js} +1 -1
- package/dist/chunks/{export-EPLYZF2Q.js → export-W75EA6EQ.js} +1 -1
- package/dist/chunks/future-PHSAEQIE.js +7 -0
- package/dist/chunks/generate-cert-for-deploy-C67VL5Z6.js +7 -0
- package/dist/chunks/image-U5CV2PRP.js +7 -0
- package/dist/chunks/import-builders-PHIIX7HW.js +7 -0
- package/dist/chunks/inspect-AU3MX7E2.js +13 -0
- package/dist/chunks/{inspect-CZ7WXYE5.js → inspect-DQQI3PM7.js} +1 -1
- package/dist/chunks/inspect-LJK7I6RZ.js +9 -0
- package/dist/chunks/{inspect-T2AIREYK.js → inspect-RNWLPR7I.js} +1 -1
- package/dist/chunks/{inspect-HFDGZNWC.js → inspect-WHPWW4BI.js} +1 -1
- package/dist/chunks/list-JV26NNYL.js +16 -0
- package/dist/chunks/{list-ON4YTQRN.js → list-QNRFVMMQ.js} +1 -1
- package/dist/chunks/list-YF4FXWUZ.js +12 -0
- package/dist/chunks/login-A4KNOUNA.js +9 -0
- package/dist/chunks/login-COGE7JQU.js +7 -0
- package/dist/chunks/logs-KMQATUYR.js +7 -0
- package/dist/chunks/{ls-FK5XEJEU.js → ls-DTFLHFOW.js} +1 -1
- package/dist/chunks/{ls-A7K4XDQB.js → ls-FOKMPVIB.js} +1 -1
- package/dist/chunks/ls-HMYU2ZGA.js +11 -0
- package/dist/chunks/{ls-2HUJHVLA.js → ls-IHF33MQP.js} +1 -1
- package/dist/chunks/{ls-QGUKJJY5.js → ls-QD54I4S7.js} +1 -1
- package/dist/chunks/{ls-3DVM5HLK.js → ls-RNRMYD3V.js} +1 -1
- package/dist/chunks/ls-ZQLCDIQJ.js +8 -0
- package/dist/chunks/mutate-RMIFQOF6.js +9 -0
- package/dist/chunks/notifications-BFBNV2HY.js +7 -0
- package/dist/chunks/open-L6HEXHAI.js +7 -0
- package/dist/chunks/openapi-6JKCOR7K.js +7 -0
- package/dist/chunks/permissions-UYGTYRKA.js +7 -0
- package/dist/chunks/{plugin-offer-TEGYA3TA.js → plugin-offer-NBHRXMNR.js} +1 -1
- package/dist/chunks/prompt-missing-credentials-2IYIF2JI.js +7 -0
- package/dist/chunks/publish-T2VSTPG4.js +15 -0
- package/dist/chunks/pull-4GL47Z2S.js +7 -0
- package/dist/chunks/purchase-domain-if-available-BHFBD3LW.js +7 -0
- package/dist/chunks/push-CQPIDVTL.js +7 -0
- package/dist/chunks/{query-FXXLX6UB.js → query-HN45ORIB.js} +1 -1
- package/dist/chunks/reauthenticate-FTHGAWK3.js +7 -0
- package/dist/chunks/reorder-7BD5JZKQ.js +10 -0
- package/dist/chunks/reply-2INQJ5KM.js +9 -0
- package/dist/chunks/resolve-DHAJC3I7.js +12 -0
- package/dist/chunks/resolve-agent-team-KGYPHN5F.js +7 -0
- package/dist/chunks/restore-OQKNWEFQ.js +16 -0
- package/dist/chunks/rm-CTP4UZH7.js +8 -0
- package/dist/chunks/rm-GFHEXQQW.js +8 -0
- package/dist/chunks/rm-OG3OXA6H.js +8 -0
- package/dist/chunks/rm-PFZYHXEN.js +8 -0
- package/dist/chunks/rm-XAW3WJ3I.js +8 -0
- package/dist/chunks/{routes-PKTWMDWQ.js → routes-XKEWEA3P.js} +1 -1
- package/dist/chunks/rule-inspect-MKQE5IVJ.js +8 -0
- package/dist/chunks/{schema-ZWE5MNMG.js → schema-TFN5PSYE.js} +2 -2
- package/dist/chunks/schema-XFER2RCF.js +14 -0
- package/dist/chunks/select-org-PFTR6HQZ.js +7 -0
- package/dist/chunks/set-KWOZNGRL.js +7 -0
- package/dist/chunks/setup-and-link-BRYK42L7.js +7 -0
- package/dist/chunks/{skills-RKIGVVNM.js → skills-2MOFBKIE.js} +1 -1
- package/dist/chunks/tags-BHZUQTOQ.js +7 -0
- package/dist/chunks/{types-YM7TMHXW.js → types-IWO5QLAV.js} +1 -1
- package/dist/chunks/{update-BGDQ5TXO.js → update-LP7ZZUFZ.js} +1 -1
- package/dist/commands/build/index.js +2 -2
- package/dist/commands/deploy/index.js +8 -8
- package/dist/commands/dev/index.js +6 -6
- package/dist/commands/env/index.js +3 -3
- package/dist/commands/link/index.js +2 -2
- package/dist/commands/list/index.js +1 -1
- package/dist/commands/project/index.js +4 -4
- package/dist/commands-account.js +18 -18
- package/dist/commands-ai.js +12 -12
- package/dist/commands-blob.js +7 -7
- package/dist/commands-core.js +23 -23
- package/dist/commands-deployments.js +3 -3
- package/dist/commands-flags.js +29 -29
- package/dist/commands-integrations.js +98 -83
- package/dist/commands-observability.js +4 -4
- package/dist/commands-routing.js +23 -23
- package/dist/help.js +1 -1
- package/dist/index.js +7 -7
- package/dist/internal-build.js +2 -2
- package/dist/native-download.js +7 -0
- package/dist/package.json +27 -26
- package/dist/root-help-commands.mjs +1 -1
- package/dist/vc.js +172 -17
- package/dist/version.mjs +1 -1
- package/package.json +20 -19
- package/dist/chunks/add-7NS6HIWC.js +0 -8
- package/dist/chunks/add-NMYFDVXW.js +0 -8
- package/dist/chunks/add-PMJ5BECU.js +0 -8
- package/dist/chunks/build-BCY6HQJG.js +0 -7
- package/dist/chunks/chunk-5IWFRZQT.js +0 -10
- package/dist/chunks/chunk-6I6QJHCY.js +0 -7
- package/dist/chunks/chunk-6VH56CX2.js +0 -19
- package/dist/chunks/chunk-6YXIWZ3X.js +0 -25
- package/dist/chunks/chunk-7E3WREH5.js +0 -7
- package/dist/chunks/chunk-EAXMWCOL.js +0 -63
- package/dist/chunks/chunk-EKZTFGDX.js +0 -7
- package/dist/chunks/chunk-FLHO75XC.js +0 -8
- package/dist/chunks/chunk-GYVJIIYL.js +0 -7
- package/dist/chunks/chunk-JLE7K4SY.js +0 -9
- package/dist/chunks/chunk-KCKYPLIH.js +0 -7
- package/dist/chunks/chunk-LOBA3E72.js +0 -7
- package/dist/chunks/chunk-LW4N3CW6.js +0 -9
- package/dist/chunks/chunk-NGKO2OOU.js +0 -8
- package/dist/chunks/chunk-NW7WWUCQ.js +0 -9
- package/dist/chunks/chunk-O4WNSKQR.js +0 -15
- package/dist/chunks/chunk-OZCQTXI4.js +0 -7
- package/dist/chunks/chunk-QVXS234E.js +0 -7
- package/dist/chunks/chunk-SLGUYM42.js +0 -10
- package/dist/chunks/chunk-TAISZMA2.js +0 -7
- package/dist/chunks/chunk-WEH6XC4Y.js +0 -22
- package/dist/chunks/chunk-WVHCBDTB.js +0 -7
- package/dist/chunks/clear-FKVWDCVA.js +0 -8
- package/dist/chunks/compile-vercel-config-GWAJE44R.js +0 -7
- package/dist/chunks/config-5WVLG5SE.js +0 -8
- package/dist/chunks/config-RMOHN5YT.js +0 -7
- package/dist/chunks/delete-5WMB4WFR.js +0 -9
- package/dist/chunks/delete-EM4JZPFA.js +0 -10
- package/dist/chunks/detect-services-BSJGB4RM.js +0 -7
- package/dist/chunks/disable-QOM7UHQC.js +0 -7
- package/dist/chunks/discard-L5ZH7P5B.js +0 -14
- package/dist/chunks/edit-F3VJGCG2.js +0 -9
- package/dist/chunks/edit-TM7YCWBU.js +0 -8
- package/dist/chunks/enable-72C3QX34.js +0 -7
- package/dist/chunks/future-V77DRMQG.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-Y3YHBMPU.js +0 -7
- package/dist/chunks/image-CVXEXU5R.js +0 -7
- package/dist/chunks/import-builders-PGRKJOOE.js +0 -7
- package/dist/chunks/inspect-BTRNXRJT.js +0 -9
- package/dist/chunks/inspect-FGDVWAQP.js +0 -13
- package/dist/chunks/list-CKRRHAOE.js +0 -12
- package/dist/chunks/list-FLREMGJR.js +0 -16
- package/dist/chunks/login-55LJ5ZA6.js +0 -9
- package/dist/chunks/login-DQRZSD4Z.js +0 -7
- package/dist/chunks/logs-2HQXWOHM.js +0 -7
- package/dist/chunks/ls-4B3QYHCI.js +0 -8
- package/dist/chunks/ls-VTKHPDWS.js +0 -11
- package/dist/chunks/mutate-7ADZBCZM.js +0 -9
- package/dist/chunks/notifications-XZJXE2K4.js +0 -7
- package/dist/chunks/open-EE5IZQD7.js +0 -7
- package/dist/chunks/openapi-QBX62ZXC.js +0 -7
- package/dist/chunks/permissions-VYJ4LL5R.js +0 -7
- package/dist/chunks/prompt-missing-credentials-VP6OVCFM.js +0 -7
- package/dist/chunks/publish-2HEK5UMJ.js +0 -15
- package/dist/chunks/pull-WRTTSY7J.js +0 -7
- package/dist/chunks/purchase-domain-if-available-6S3NLTUI.js +0 -7
- package/dist/chunks/push-L3QRGGLC.js +0 -7
- package/dist/chunks/reauthenticate-IXQDC4UZ.js +0 -7
- package/dist/chunks/reorder-B4OXSYCI.js +0 -10
- package/dist/chunks/reply-F637K6XH.js +0 -9
- package/dist/chunks/resolve-E3F6NYQZ.js +0 -12
- package/dist/chunks/resolve-agent-team-EIPCH766.js +0 -7
- package/dist/chunks/restore-Q25KRZPH.js +0 -16
- package/dist/chunks/rm-FWD2NUGX.js +0 -8
- package/dist/chunks/rm-JMQ4QKCC.js +0 -8
- package/dist/chunks/rm-PPG7P3GN.js +0 -8
- package/dist/chunks/rm-SH3DYKNS.js +0 -8
- package/dist/chunks/rm-UEBLKFVC.js +0 -8
- package/dist/chunks/rule-inspect-LKQA5I4V.js +0 -8
- package/dist/chunks/schema-FBV42W7N.js +0 -14
- package/dist/chunks/select-org-WMB752Z6.js +0 -7
- package/dist/chunks/set-UTYIPOLC.js +0 -7
- package/dist/chunks/setup-and-link-ZLY5XQW5.js +0 -7
- package/dist/chunks/tags-UCLZ5UMX.js +0 -7
package/dist/commands-ai.js
CHANGED
|
@@ -4,17 +4,17 @@ import { dirname as __dirname_ } from 'node:path';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __dirname_(__filename);
|
|
7
|
-
import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,backupFile,claudeCode,codex,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,readFileOrNull,resolveGatewayBaseUrl,setupCodexPlugin,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-PFPJLIFF.js";import{selectOrg}from"./chunks/chunk-7L5QUDUR.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{init_main,parse as parse2}from"./chunks/chunk-J24BABG4.js";import{init_dist,parse,stringify}from"./chunks/chunk-U4Z2MMOF.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import{CHECKBOX_INSTRUCTIONS}from"./chunks/chunk-OFDTADPQ.js";import{tokensAfterCommand}from"./chunks/chunk-5IWFRZQT.js";import"./chunks/chunk-2EYYB6YN.js";import{amountMatchesPrice,buy,canPromptForCharge,chargeFailureReason,deleteCertById,formatAmountArg,formatTerm,formatUsd,getDomains,getTeamMemberByIdentifier,getTeamMembersByIds,isDomainExternal,parseAmount,printChargeRecovery,refuseUnnamedTeam,removeAliasById,reportChargeFailure,reportPriceChanged,reportUnknownOutcome,reportUsageError,teamMemberLabel,writeChargeAction}from"./chunks/chunk-TIPQQ4TG.js";import{addDomain,getDomainByName,require_cjs}from"./chunks/chunk-U2OBPULW.js";import{getDomainPrice,getDomainStatus,getOrderOutcome,pollForOrder}from"./chunks/chunk-IOZ3I765.js";import{external_exports}from"./chunks/chunk-2NABMKFV.js";import{getAliases}from"./chunks/chunk-2K3ISCQ6.js";import{require_execa}from"./chunks/chunk-BUJITHGZ.js";import{InvalidNextError,getPaginationOpts}from"./chunks/chunk-C6GY2G73.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{formatTable}from"./chunks/chunk-LSQREJXO.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-FBYA6LLM.js";import{readOnOffOption}from"./chunks/chunk-Y5ZMKL7E.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-GD7AV7BO.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{DEFAULT_LIST_LIMIT,PaginationError,fetchAllPages,parseListLimit,printNextPageCommand,printNextPageHint}from"./chunks/chunk-VNIKIQVE.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError,withWarnings}from"./chunks/chunk-T6243EDS.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{validateLsArgs}from"./chunks/chunk-KW6GSQXV.js";import{getTeams}from"./chunks/chunk-FGFLTLEA.js";import"./chunks/chunk-SCV7XEEO.js";import{addSubcommand,aiGatewayCommand,apiKeysSubcommand,autoRenewSubcommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buySubcommand,checkSubcommand,codingAgentsSubcommand,createSubcommand,domainsCommand,getCommandAliases,inspectSubcommand2 as inspectSubcommand,inspectSubcommand3 as inspectSubcommand2,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listSubcommand2 as listSubcommand,listSubcommand4 as listSubcommand2,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,priceSubcommand,removeSubcommand,removeSubcommand3 as removeSubcommand2,renewSubcommand,rulesAddSubcommand,rulesEditSubcommand,rulesListSubcommand,rulesRemoveSubcommand,rulesSubcommand,searchSubcommand,setupSubcommand,transferInSubcommand,verifySubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand}from"./chunks/chunk-O4WNSKQR.js";import"./chunks/chunk-6I6QJHCY.js";import"./chunks/chunk-EKZTFGDX.js";import"./chunks/chunk-462YCCJZ.js";import{gatewaySubcommand,pluginSubcommand,setupCommand,skillsSubcommand}from"./chunks/chunk-WVHCBDTB.js";import"./chunks/chunk-TAISZMA2.js";import"./chunks/chunk-527GBU3K.js";import"./chunks/chunk-CR3NBTHV.js";import"./chunks/chunk-BVGGTBYE.js";import"./chunks/chunk-6TXEVQA4.js";import"./chunks/chunk-5KUUMQ3M.js";import"./chunks/chunk-UHBMX3OK.js";import"./chunks/chunk-EEUJLJEJ.js";import"./chunks/chunk-NW7WWUCQ.js";import"./chunks/chunk-F6EBOT64.js";import"./chunks/chunk-LFOWP74R.js";import"./chunks/chunk-LOBA3E72.js";import"./chunks/chunk-7R6TRRG5.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-OZCQTXI4.js";import"./chunks/chunk-FSPPKNKN.js";import{help}from"./chunks/chunk-FLHO75XC.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-HSFKISDH.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-6YXIWZ3X.js";import"./chunks/chunk-PUKYAALC.js";import{getContextName,getScope}from"./chunks/chunk-K5U47EVH.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,getExitCodeForReason,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags}from"./chunks/chunk-WDXW6A4H.js";import"./chunks/chunk-DKJL2KV7.js";import{getLinkedProject,getProjectByNameOrId,getUser,require_pluralize}from"./chunks/chunk-4N6LMERQ.js";import{ALIGNED_LABEL_WIDTH,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-CWM2F235.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments,parseWithShortFlag}from"./chunks/chunk-KCKYPLIH.js";import{getTeamByIdOrSlug,quoteArg}from"./chunks/chunk-F53OKXYI.js";import{getFlagsSpecification,stripSensitiveAuthArgs,validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-QVXS234E.js";import"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{APIError,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainRemovalConflict,InvalidDomain,InvalidMoveDestination,ProjectNotFound,UnexpectedDomainTransferError,UnsupportedTLD,code,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-JESNVRVR.js";import{chars_default,output_manager_default}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_chalk=__toESM(require_source(),1);var MAX_PAGE_SIZE=100,MAX_SEARCH_QUERY_CHARS=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search2=identifier.length<=MAX_SEARCH_QUERY_CHARS?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search2})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionBudget(budget){budget!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token=>token.trim()).filter(token=>token.length>0);for(let token of tokens){let num=Number(token);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],amountFlag=opts["--amount"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"],tokenPass2=opts["--token-pass"];if(telemetry.trackCliOptionName(name),telemetry.trackCliOptionAmount(amountFlag),telemetry.trackCliOptionBudget(budgetFlag),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagIncludeByok(includeByok),telemetry.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry.trackCliOptionExpiration(expiration),telemetry.trackCliFlagZdrExempt(zdrExempt),telemetry.trackCliFlagBypassAllSettings(bypassAll),telemetry.trackCliFlagTokenPass(tokenPass2),tokenPass2&&(zdrExempt||bypassAll)){let message="Cannot combine --token-pass with --zdr-exempt or --bypass-all-settings. Remove the exemption flags to create a Token Pass key.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --token-pass")}]},2),output_manager_default.error(message),2}if(budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (Both are deprecated; use --amount.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --amount 500")}]},2),output_manager_default.error(message),2}let amount=getRenamedOption(opts,"--amount",budgetFlag!==void 0?"--budget":"--limit");if("error"in amount)return reportRenamedOptionError(client,amount.error);let budget=amount.value;if(budget!==void 0&&budget<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --amount 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget,refreshPeriod,includeByok,alertThresholds});if(!await client.resolveCurrentTeam()){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...tokenPass2&&{tokenPass:!0},...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
7
|
+
import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,backupFile,claudeCode,codex,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,readFileOrNull,resolveGatewayBaseUrl,setupCodexPlugin,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-YT3QAZQF.js";import{selectOrg}from"./chunks/chunk-JGMJP4T3.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{init_main,parse as parse2}from"./chunks/chunk-J24BABG4.js";import{init_dist,parse,stringify}from"./chunks/chunk-U4Z2MMOF.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import{CHECKBOX_INSTRUCTIONS}from"./chunks/chunk-OFDTADPQ.js";import{readOnOffOption}from"./chunks/chunk-RMW2FDXS.js";import{tokensAfterCommand}from"./chunks/chunk-YQDOADMG.js";import{amountMatchesPrice,buy,canPromptForCharge,chargeFailureReason,deleteCertById,formatAmountArg,formatTerm,formatUsd,getDomains,getTeamMemberByIdentifier,getTeamMembersByIds,isDomainExternal,parseAmount,printChargeRecovery,refuseUnnamedTeam,removeAliasById,reportChargeFailure,reportPriceChanged,reportUnknownOutcome,reportUsageError,teamMemberLabel,writeChargeAction}from"./chunks/chunk-2QIJEHNE.js";import{addDomain,getDomainByName,require_cjs}from"./chunks/chunk-GP55VEOQ.js";import{getDomainPrice,getDomainStatus,getOrderOutcome,pollForOrder}from"./chunks/chunk-AOC6XXOO.js";import{external_exports}from"./chunks/chunk-2NABMKFV.js";import{getAliases}from"./chunks/chunk-YALEYPMP.js";import{InvalidNextError,getPaginationOpts}from"./chunks/chunk-C6GY2G73.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{DEFAULT_LIST_LIMIT,PaginationError,fetchAllPages,parseListLimit,printNextPageCommand,printNextPageHint}from"./chunks/chunk-KHADRPBJ.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import{require_execa}from"./chunks/chunk-RCUDI7OF.js";import"./chunks/chunk-GD7AV7BO.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import"./chunks/chunk-PFD7LETF.js";import{validateLsArgs}from"./chunks/chunk-XTKGBVSF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{formatTable}from"./chunks/chunk-FAELJM4F.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{table}from"./chunks/chunk-5SIC5273.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError,withWarnings}from"./chunks/chunk-JSAY52FE.js";import"./chunks/chunk-Q7D7RGXM.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{getTeams}from"./chunks/chunk-P6ZTEDX2.js";import{addSubcommand,aiGatewayCommand,apiKeysSubcommand,autoRenewSubcommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buySubcommand,checkSubcommand,codingAgentsSubcommand,createSubcommand,domainsCommand,getCommandAliases,inspectSubcommand2 as inspectSubcommand,inspectSubcommand3 as inspectSubcommand2,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listSubcommand2 as listSubcommand,listSubcommand4 as listSubcommand2,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,priceSubcommand,removeSubcommand,removeSubcommand3 as removeSubcommand2,renewSubcommand,rulesAddSubcommand,rulesEditSubcommand,rulesListSubcommand,rulesRemoveSubcommand,rulesSubcommand,searchSubcommand,setupSubcommand,transferInSubcommand,verifySubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand}from"./chunks/chunk-WDUHDLUA.js";import"./chunks/chunk-O7COT3YB.js";import"./chunks/chunk-2FHZYQPY.js";import"./chunks/chunk-M7LUSXMG.js";import{gatewaySubcommand,pluginSubcommand,setupCommand,skillsSubcommand}from"./chunks/chunk-C6IITJ5S.js";import"./chunks/chunk-TZT3VYZ3.js";import"./chunks/chunk-HMWDOAWO.js";import"./chunks/chunk-QNL22LAW.js";import"./chunks/chunk-UWMPVTXG.js";import"./chunks/chunk-5CZNUB7Y.js";import"./chunks/chunk-AUY363W7.js";import"./chunks/chunk-OTYF3ZZW.js";import"./chunks/chunk-3H36RI7C.js";import"./chunks/chunk-BGWS5R5R.js";import"./chunks/chunk-UJQ6PBRF.js";import"./chunks/chunk-LFOWP74R.js";import"./chunks/chunk-GVPVWHFK.js";import"./chunks/chunk-N5CXIFE2.js";import"./chunks/chunk-FNA4MIOH.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-VWHIWUGJ.js";import{printError}from"./chunks/chunk-VQ755MPP.js";import{help}from"./chunks/chunk-SLDWAIO3.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-5WYPJ2T5.js";import"./chunks/chunk-2EYYB6YN.js";import{getContextName,getScope}from"./chunks/chunk-WICRM2JL.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,getExitCodeForReason,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags}from"./chunks/chunk-XE24Y6NM.js";import"./chunks/chunk-EPO7P734.js";import{getLinkedProject,getProjectByNameOrId,getUser,require_pluralize}from"./chunks/chunk-VLYVVC3P.js";import{ALIGNED_LABEL_WIDTH,printAlignedLabel}from"./chunks/chunk-26QK3I2S.js";import"./chunks/chunk-55H6G46X.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments,parseWithShortFlag}from"./chunks/chunk-F22QLVTX.js";import{getTeamByIdOrSlug,quoteArg}from"./chunks/chunk-F53OKXYI.js";import{validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-7SAEZ4NC.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{APIError,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainRemovalConflict,InvalidDomain,InvalidMoveDestination,ProjectNotFound,UnexpectedDomainTransferError,UnsupportedTLD,code,isAPIError}from"./chunks/chunk-YCJHUYBJ.js";import{getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-JESNVRVR.js";import{output_manager_default}from"./chunks/chunk-DWOJP4ST.js";import"./chunks/chunk-BLUPZPAS.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-PUKYAALC.js";import{getFlagsSpecification,stripSensitiveAuthArgs}from"./chunks/chunk-A2UZ2O7H.js";import{chars_default}from"./chunks/chunk-2BKALEOP.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import"./chunks/chunk-FBYA6LLM.js";import"./chunks/chunk-SCV7XEEO.js";import"./chunks/chunk-MY4MONOH.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_chalk=__toESM(require_source(),1);var MAX_PAGE_SIZE=100,MAX_SEARCH_QUERY_CHARS=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search2=identifier.length<=MAX_SEARCH_QUERY_CHARS?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search2})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionBudget(budget){budget!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token=>token.trim()).filter(token=>token.length>0);for(let token of tokens){let num=Number(token);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],amountFlag=opts["--amount"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"],tokenPass2=opts["--token-pass"];if(telemetry.trackCliOptionName(name),telemetry.trackCliOptionAmount(amountFlag),telemetry.trackCliOptionBudget(budgetFlag),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagIncludeByok(includeByok),telemetry.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry.trackCliOptionExpiration(expiration),telemetry.trackCliFlagZdrExempt(zdrExempt),telemetry.trackCliFlagBypassAllSettings(bypassAll),telemetry.trackCliFlagTokenPass(tokenPass2),tokenPass2&&(zdrExempt||bypassAll)){let message="Cannot combine --token-pass with --zdr-exempt or --bypass-all-settings. Remove the exemption options to create a Token Pass key.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --token-pass")}]},2),output_manager_default.error(message),2}if(budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (Both are deprecated; use --amount.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --amount 500")}]},2),output_manager_default.error(message),2}let amount=getRenamedOption(opts,"--amount",budgetFlag!==void 0?"--budget":"--limit");if("error"in amount)return reportRenamedOptionError(client,amount.error);let budget=amount.value;if(budget!==void 0&&budget<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --amount 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget,refreshPeriod,includeByok,alertThresholds});if(!await client.resolveCurrentTeam()){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...tokenPass2&&{tokenPass:!0},...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
8
8
|
`),output_manager_default.success(`API key ${import_chalk.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),client.isAgent&&output_manager_default.log(`Prefer OIDC over long-lived API keys: code on Vercel can authenticate to AI Gateway with VERCEL_OIDC_TOKEN, and local development can get one with ${getCommandName("link")} and ${getCommandName("env pull")}. Revoke this key with ${getCommandName(`ai-gateway api-keys revoke ${result.apiKey.id} --yes`)} if you don't need it.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk2=__toESM(require_source(),1);var import_async_sema=__toESM(require_async_sema(),1);var DIRECTORY_KEY_SORTS=["createdAt:desc","createdAt:asc","lastActiveAt:desc","lastActiveAt:asc","name:asc","name:desc","expiresAt:asc","expiresAt:desc"],DIRECTORY_KEY_STATES=["active","expired","deleted","purged","any"],MAX_DIRECTORY_RESOLVE_IDS=100,FETCH_OPTS={retry:{retries:0},bailOn429:!0},DIRECTORY_KILL_SWITCH="VERCEL_AI_GATEWAY_DIRECTORY";function isDirectoryEnabledByEnv(env=process.env){let value=env[DIRECTORY_KILL_SWITCH]?.trim().toLowerCase();return value!=="0"&&value!=="false"}async function listDirectoryKeysPage(client,opts={}){let query=new URLSearchParams,search2=opts.search?.trim();search2&&query.set("search",search2),opts.createdBy&&query.set("createdBy",opts.createdBy),opts.accessPolicyId&&query.set("accessPolicyId",opts.accessPolicyId),opts.state&&query.set("state",opts.state),opts.sort&&query.set("sort",opts.sort),opts.cursor&&query.set("cursor",opts.cursor),opts.limit!==void 0&&query.set("limit",String(opts.limit));let qs=query.toString(),page=await client.fetch(`/ai-gateway/directory/keys${qs?`?${qs}`:""}`,{method:"GET",...FETCH_OPTS});return{items:page.data??[],next:page.cursor??null}}function chunk(items,size){let chunks=[];for(let i=0;i<items.length;i+=size)chunks.push(items.slice(i,i+size));return chunks}var BATCH_CONCURRENCY=4;async function mapConcurrent(items,fn){let sema=new import_async_sema.default(BATCH_CONCURRENCY);return Promise.all(items.map(async item=>{await sema.acquire();try{return await fn(item)}finally{sema.release()}}))}async function resolveDirectoryIdentities(client,input){let keyChunks=chunk([...new Set(input.keyIds??[])],MAX_DIRECTORY_RESOLVE_IDS),userChunks=chunk([...new Set(input.userIds??[])],MAX_DIRECTORY_RESOLVE_IDS),requests=Math.max(keyChunks.length,userChunks.length),bodies=Array.from({length:requests},(_,i)=>{let body={};return keyChunks[i]?.length&&(body.keyIds=keyChunks[i]),userChunks[i]?.length&&(body.userIds=userChunks[i]),body}),pages=await mapConcurrent(bodies,body=>client.fetch("/ai-gateway/directory/identities/resolve",{method:"POST",body,...FETCH_OPTS})),keys=new Map,users=new Map;return pages.forEach((res,i)=>{for(let key of res.data?.keys??[])keys.set(key.keyId,key);if(Array.isArray(res.data?.users))for(let user of res.data.users)users?.set(user.uid,user);else bodies[i].userIds&&(users=null)}),{keys,users}}async function resolveDirectoryKeyQuotas(client,keyIds){let pages=await mapConcurrent(chunk([...new Set(keyIds)],MAX_DIRECTORY_RESOLVE_IDS),ids=>client.fetch("/ai-gateway/directory/keys/quotas",{method:"POST",body:{keyIds:ids},...FETCH_OPTS})),quotas=new Map;for(let res of pages)for(let quota of res.data?.quotas??[])quotas.set(quota.apiKeyId,quota);return quotas}function isDirectoryUnavailable(err){return isAPIError(err)&&(err.status===429||err.status>=500)}function isDirectoryCursor(cursor2){try{let parsed=JSON.parse(Buffer.from(cursor2,"base64url").toString());return typeof parsed=="object"&&parsed!==null&&parsed.v===1&&typeof parsed.fp=="string"&&Array.isArray(parsed.sa)}catch{return!1}}function toApiKey(key,quota){let apiKey={id:key.keyId,name:key.name,partialKey:key.suffix??"",teamId:key.teamId,purpose:"ai-gateway",projectId:key.projectId??null,expiresAt:key.expiresAt??null,activeAt:key.lastActiveAt??key.createdAt,createdAt:key.createdAt,createdBy:key.createdBy??"",leakedAt:key.leakedAt??null,leakedUrl:null,createdByAppId:key.attribution?.createdByAppId??null};if(quota){let{apiKeyId:_apiKeyId,...rest}=quota;apiKey.quota=rest}return apiKey}async function ensureTeam(client){if(await client.resolveCurrentTeam())return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionQuery(query){query&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(search2){search2&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionCreator(creator){creator&&this.trackCliOption({option:"creator",value:creator==="me"?"me":this.redactedValue})}trackCliOptionState(state){state&&this.trackCliOption({option:"state",value:state})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function renderResource(client,{asJson,spinnerText,fetch,toJSON,isEmpty,emptyMessage:emptyMessage2,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&¬FoundMessage?notFoundMessage:err.message),1;if(err instanceof PaginationError)return output_manager_default.error(err.message),1;throw err}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
|
|
9
9
|
`),0;if(isEmpty(data)){let nextCursor=next?.(data)??null;return nextCursor?(output_manager_default.log("No results on this page."),printNextPageHint(client,nextCursor),0):(output_manager_default.log(emptyMessage2),0)}return output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function listBudgetsPage(client,opts){let query=new URLSearchParams;opts.scopeType&&query.set("scopeType",opts.scopeType),query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDefaultCovered!==void 0&&query.set("includeDefaultCovered",String(opts.includeDefaultCovered));let{budgets:budgets2,nextCursor,defaultCoveredCounts}=await client.fetch(`/ai-gateway/budgets/list?${query.toString()}`,{method:"GET"});return{items:budgets2??[],next:nextCursor??null,defaultCoveredCounts:defaultCoveredCounts??{}}}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&¶ms.set("projectId",opts.projectId),opts.userId&¶ms.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}var STATE_FLAG_VALUES=DIRECTORY_KEY_STATES.filter(s=>s!=="purged"),SORT_FIELDS=["createdAt","lastActiveAt","name","expiresAt"],DEFAULT_STATE="active",DEFAULT_SORT="lastActiveAt:desc";async function list(client,argv){let telemetry=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,queryFlag=opts["--query"],searchFlag=opts["--search"],search2=queryFlag??searchFlag,creator=opts["--creator"],stateFlag=opts["--state"],sortFlag=opts["--sort"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliOptionQuery(queryFlag),telemetry.trackCliOptionSearch(searchFlag),telemetry.trackCliOptionCreator(creator),telemetry.trackCliOptionState(stateFlag),telemetry.trackCliOptionSort(sortFlag),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(queryFlag!==void 0&&searchFlag!==void 0&&queryFlag!==searchFlag)return usageError(client,"Pass only one of --query or --search.");if(search2!==void 0&&search2.trim().length===0)return usageError(client,"The --query option requires some text.");if(search2&&search2.length>MAX_SEARCH_QUERY_CHARS)return usageError(client,`The --query option must be at most ${MAX_SEARCH_QUERY_CHARS} characters.`);if(stateFlag!==void 0&&!STATE_FLAG_VALUES.includes(stateFlag))return usageError(client,`The --state option must be one of: ${STATE_FLAG_VALUES.join(", ")}.`);let sort=sortFlag===void 0?void 0:parseSortFlag(sortFlag);if(sortFlag!==void 0&&!sort)return usageError(client,`The --sort option must be one of ${SORT_FIELDS.join(", ")}, optionally followed by :asc or :desc.`);if(creator!==void 0&&creator.trim().length===0)return usageError(client,"The --creator option requires a team member.");let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}let directoryOnly=creator!==void 0||stateFlag!==void 0||sortFlag!==void 0||next!==void 0&&isDirectoryCursor(next),legacyOnly=!isDirectoryEnabledByEnv()||next!==void 0&&!isDirectoryCursor(next);if(directoryOnly&&legacyOnly){let message;return isDirectoryEnabledByEnv()?message="The --next cursor does not belong to this query. Rerun without --next to start from the first page.":next!==void 0&&isDirectoryCursor(next)?message=`The --next cursor came from the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment. Rerun without --next to start from the first page.`:message=`The --creator, --state, and --sort options need the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment.`,usageError(client,message)}let createdBy;if(creator!==void 0)try{createdBy=await resolveCreator(client,creator.trim())}catch(err){if(err instanceof UnknownCreatorError)return usageError(client,err.message);if(isAPIError(err))return output_manager_default.error(`Could not look up team member "${creator}": ${err.message}`),1;throw err}let legacyPage=async()=>({...await listApiKeysPage(client,{limit,next,search:search2}),metadataKnown:!0}),fetch=async()=>{if(legacyOnly)return legacyPage();try{return await fetchDirectoryPage(client,{search:search2,createdBy,state:stateFlag??DEFAULT_STATE,sort:sort??DEFAULT_SORT,cursor:next,limit})}catch(err){if(!isDirectoryUnavailable(err))throw err;if(output_manager_default.debug(`AI Gateway key directory unavailable: ${err instanceof Error?err.message:String(err)}`),directoryOnly)throw new DirectoryUnavailableError;return legacyPage()}};try{return await renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch,toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:emptyMessage({next,search:search2,creator,stateFlag}),header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault,page.metadataKnown),next:page=>page.next})}catch(err){if(err instanceof DirectoryUnavailableError)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:err.message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},1),output_manager_default.error(err.message),1;throw err}}var DirectoryUnavailableError=class extends Error{constructor(){super("The AI Gateway key directory is temporarily unavailable, so --creator, --state, --sort, and directory cursors cannot be served. Retry shortly, or list without those options."),this.name="DirectoryUnavailableError"}};function usageError(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},2),output_manager_default.error(message),2}function parseSortFlag(value){if(DIRECTORY_KEY_SORTS.includes(value))return value;if(SORT_FIELDS.includes(value))return`${value}:${value==="name"?"asc":"desc"}`}var UnknownCreatorError=class extends Error{constructor(identifier){super(`No team member matches "${identifier}".`),this.name="UnknownCreatorError"}};async function resolveCreator(client,identifier){if(identifier==="me")return(await getUser(client)).id;let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,identifier);if(member)return member.uid;if(identifier.includes("@"))throw new UnknownCreatorError(identifier);return output_manager_default.debug(`No team member matches "${identifier}"; using it as a user id.`),identifier}async function fetchDirectoryPage(client,opts){let page=await listDirectoryKeysPage(client,opts),liveIds=page.items.filter(key=>key.state==="active").map(key=>key.keyId),quotas=new Map;if(liveIds.length>0)try{quotas=await resolveDirectoryKeyQuotas(client,liveIds)}catch(err){output_manager_default.debug(`Skipping AI Gateway key budgets in list output: ${err instanceof Error?err.message:String(err)}`)}return{items:page.items.map(key=>toApiKey(key,quotas.get(key.keyId))),next:page.next,metadataKnown:!1}}function emptyMessage({next,search:search2,creator,stateFlag}){return next?"No more API keys.":search2||creator||stateFlag?"No API keys match these filters.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`}function printApiKeysTable(apiKeys2,keyDefault,metadataKnown){return`${table([["id","name","key","token pass","budget","spend","refresh","created"].map(header=>import_chalk2.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk2.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk2.default.gray("\u2013"),metadataKnown?apiKey.metadata?.tokenPass?"yes":"no":import_chalk2.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk2.default.gray("(default)")}`:import_chalk2.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk2.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk2.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk2.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
10
10
|
|
|
11
11
|
`}var import_chalk3=__toESM(require_source(),1);var AiGatewayApiKeysInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect(client,argv){let telemetry=new AiGatewayApiKeysInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id]=args;telemetry.trackCliArgumentId(id),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(!id)return output_manager_default.error(`${getCommandName("ai-gateway api-keys inspect <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API key",fetch:()=>getApiKey(client,id),toJSON:apiKey=>({apiKey}),isEmpty:()=>!1,emptyMessage:"",header:apiKey=>`API key ${import_chalk3.default.bold(apiKey.name||apiKey.id)}`,renderTable:apiKey=>printApiKeyDetails(apiKey,keyDefault)})}function dim(value){return import_chalk3.default.gray(value)}function yesNo(value){return value?"yes":"no"}function printApiKeyDetails(apiKey,keyDefault){let rows=[["id",apiKey.id],["name",apiKey.name||dim("\u2013")],["key",apiKey.partialKey?`\u2026${apiKey.partialKey}`:dim("\u2013")],["token pass",yesNo(apiKey.metadata?.tokenPass??!1)],["purpose",apiKey.purpose],["project",apiKey.projectId??dim("all projects")],["created",apiKey.createdAt?new Date(apiKey.createdAt).toLocaleString():dim("\u2013")],["last used",apiKey.activeAt?new Date(apiKey.activeAt).toLocaleString():dim("never")],["expires",apiKey.expiresAt?new Date(apiKey.expiresAt).toLocaleString():dim("never")],["created by",apiKey.createdBy||dim("\u2013")]];apiKey.metadata?.zdr?.enableNonZdrModels&&rows.push(["zdr exempt","yes"]),apiKey.metadata?.bypassAll&&rows.push(["bypass all settings","yes"]);let quota=apiKey.quota;return quota?rows.push(["budget",`$${quota.limitAmount}`],["spend",`$${quota.currentSpend}`],["byok spend",`$${quota.currentByokSpend}`],["include byok",yesNo(quota.includeByokInQuota)],["refresh",quota.refreshPeriod],["alerts",quota.alertThresholds&"a.alertThresholds.length>0?quota.alertThresholds.map(threshold=>`${threshold}%`).join(", "):dim("none")],["active",yesNo(quota.active)]):keyDefault?rows.push(["budget",`${formatBudgetCap(keyDefault.limitAmount,keyDefault.refreshPeriod)} ${dim("(default)")}`]):rows.push(["budget",dim("none")]),`${table(rows.map(([label,value])=>[dim(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
|
|
12
12
|
|
|
13
13
|
`}var import_chalk4=__toESM(require_source(),1);var AiGatewayApiKeysRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove(client,argv){let telemetry=new AiGatewayApiKeysRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id]=args,yes=opts["--yes"];telemetry.trackCliArgumentId(id),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!id)return output_manager_default.error(`${getCommandName("ai-gateway api-keys revoke <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To revoke in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Revoke API key ${import_chalk4.default.bold(id)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Revoking API key");try{return await deleteApiKey(client,id),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({id,removed:!0},null,2)}
|
|
14
|
-
`):output_manager_default.success(`API key ${import_chalk4.default.bold(id)} revoked ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`API key "${id}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayApiKeysTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRevoke(actual){this.trackCliSubcommand({subcommand:"revoke",value:actual})}};var COMMAND_CONFIG={create:getCommandAliases(createSubcommand),list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),revoke:getCommandAliases(removeSubcommand)};async function apiKeys(client){let telemetry=new AiGatewayApiKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(apiKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommand),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:apiKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(createSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(listSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect(client,args));case"revoke":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(removeSubcommand),0):(telemetry.trackCliSubcommandRevoke(subcommandOriginal),subcommandOriginal!=="revoke"&&warnDeprecatedSubcommand(client,`ai-gateway api-keys ${subcommandOriginal}`,"ai-gateway api-keys revoke"),remove(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG)),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),2}}async function setScopeDefault(client,opts){output_manager_default.spinner("Setting budget default\u2026");try{let budgetDefault=await upsertScopeBudgetDefault(client,{scopeType:opts.scopeType,limitAmount:opts.limit,...opts.refreshPeriod?{refreshPeriod:opts.refreshPeriod}:{}});return output_manager_default.stopSpinner(),opts.asJson?client.stdout.write(`${JSON.stringify(withWarnings(budgetDefault,opts.warnings??[]),null,2)}
|
|
14
|
+
`):output_manager_default.success(`API key ${import_chalk4.default.bold(id)} revoked ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`API key "${id}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayApiKeysTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRevoke(actual){this.trackCliSubcommand({subcommand:"revoke",value:actual})}};var COMMAND_CONFIG={create:getCommandAliases(createSubcommand),list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),revoke:getCommandAliases(removeSubcommand)};async function apiKeys(client){let telemetry=new AiGatewayApiKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(apiKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommand),output_manager_default.print(help(apiKeysSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:apiKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(createSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(listSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect(client,args));case"revoke":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(removeSubcommand),0):(telemetry.trackCliSubcommandRevoke(subcommandOriginal),subcommandOriginal!=="revoke"&&warnDeprecatedSubcommand(client,`ai-gateway api-keys ${subcommandOriginal}`,"ai-gateway api-keys revoke"),remove(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG)),output_manager_default.print(help(apiKeysSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}async function setScopeDefault(client,opts){output_manager_default.spinner("Setting budget default\u2026");try{let budgetDefault=await upsertScopeBudgetDefault(client,{scopeType:opts.scopeType,limitAmount:opts.limit,...opts.refreshPeriod?{refreshPeriod:opts.refreshPeriod}:{}});return output_manager_default.stopSpinner(),opts.asJson?client.stdout.write(`${JSON.stringify(withWarnings(budgetDefault,opts.warnings??[]),null,2)}
|
|
15
15
|
`):(printAlignedLabel("Set default",opts.scopeType,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budgetDefault.limitAmount}`),printAlignedLabel("Refresh",budgetDefault.refreshPeriod),printAlignedLabel("Applies to",`${BUDGET_DEFAULT_APPLIES_TO[opts.scopeType]}, including existing ones`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}async function removeScopeDefault(client,scopeType,{yes,asJson}){if(!yes&&(client.nonInteractive||!client.stdin.isTTY))return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(await listScopeBudgetDefaults(client).then(defaults=>defaults.find(d=>d.scopeType===scopeType&&d.active!==!1)??null).catch(()=>{})===null)return output_manager_default.error(`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`),1;if(!yes){let affected=BUDGET_DEFAULT_COVERED[scopeType];if(!await client.input.confirm(`Remove the ${scopeType} budget default? ${affected} without their own budget will have no default cap.`,!1))return output_manager_default.log("Canceled"),0}output_manager_default.spinner("Removing budget default\u2026");try{return await deleteScopeBudgetDefault(client,scopeType),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({scopeType,removed:!0},null,2)}
|
|
16
|
-
`):printAlignedLabel("Removed",`${scopeType} default`,{gutter:"\u2713"}),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayBudgetsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var REFRESH_PERIODS=["daily","weekly","monthly","none"];async function set(client,argv){let telemetry=new AiGatewayBudgetsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,refreshPeriod=opts["--refresh-period"],isDefault=opts["--default"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliArgumentName(args[1]),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagDefault(isDefault),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,amount=getRenamedOption(opts,"--amount","--limit",{json:asJson});if("error"in amount)return reportRenamedOptionError(client,amount.error,{json:asJson});let limit=amount.value,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(limit===void 0||Number.isNaN(limit)||limit<1)return output_manager_default.error("The --amount
|
|
17
|
-
`):(printAlignedLabel("Set budget",scopeLabel,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budget.limitAmount}`),printAlignedLabel("Refresh",budget.refreshPeriod)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk5=__toESM(require_source(),1),import_async_sema2=__toESM(require_async_sema(),1);var AiGatewayBudgetsListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliOptionScopeType(scopeType){scopeType&&this.trackCliOption({option:"scope-type",value:scopeType})}trackCliFlagDefaults(defaults){defaults&&this.trackCliFlag("defaults")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list2(client,argv){let telemetry=new AiGatewayBudgetsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,scopeType=opts["--scope-type"],showDefaults=opts["--defaults"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliOptionScopeType(scopeType),telemetry.trackCliFlagDefaults(showDefaults);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(scopeType!==void 0&&!BUDGET_SCOPE_TYPES.includes(scopeType))return output_manager_default.error(`The --scope-type
|
|
16
|
+
`):printAlignedLabel("Removed",`${scopeType} default`,{gutter:"\u2713"}),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayBudgetsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var REFRESH_PERIODS=["daily","weekly","monthly","none"];async function set(client,argv){let telemetry=new AiGatewayBudgetsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,refreshPeriod=opts["--refresh-period"],isDefault=opts["--default"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliArgumentName(args[1]),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagDefault(isDefault),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,amount=getRenamedOption(opts,"--amount","--limit",{json:asJson});if("error"in amount)return reportRenamedOptionError(client,amount.error,{json:asJson});let limit=amount.value,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(limit===void 0||Number.isNaN(limit)||limit<1)return output_manager_default.error("The --amount option is required and must be at least 1."),2;if(refreshPeriod!==void 0&&!REFRESH_PERIODS.includes(refreshPeriod))return output_manager_default.error(`The --refresh-period option must be one of: ${REFRESH_PERIODS.join(", ")}.`),2;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await setScopeDefault(client,{scopeType:scope.scopeType,limit,refreshPeriod,asJson,warnings:[amount.warning]});let projectId,userId,apiKeyId,scopeLabel="team";if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;apiKeyId=resolved.apiKey.id,scopeLabel=`api key ${resolved.apiKey.name||apiKeyId}`}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;projectId=resolved.id,scopeLabel=`project ${scope.name}`}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;userId=member.uid,scopeLabel=`user ${teamMemberLabel(member)}`}output_manager_default.spinner("Setting budget\u2026");try{let budget=scope.scopeType==="api-key"?(await updateApiKeyQuota(client,apiKeyId,{limitAmount:limit,...refreshPeriod?{refreshPeriod}:{},active:!0,archived:!1})).quota:await setBudget(client,{scopeType:scope.scopeType,...projectId?{projectId}:{},...userId?{userId}:{},limitAmount:limit,...refreshPeriod?{refreshPeriod}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(withWarnings(budget,[amount.warning]),null,2)}
|
|
17
|
+
`):(printAlignedLabel("Set budget",scopeLabel,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budget.limitAmount}`),printAlignedLabel("Refresh",budget.refreshPeriod)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk5=__toESM(require_source(),1),import_async_sema2=__toESM(require_async_sema(),1);var AiGatewayBudgetsListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliOptionScopeType(scopeType){scopeType&&this.trackCliOption({option:"scope-type",value:scopeType})}trackCliFlagDefaults(defaults){defaults&&this.trackCliFlag("defaults")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list2(client,argv){let telemetry=new AiGatewayBudgetsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,scopeType=opts["--scope-type"],showDefaults=opts["--defaults"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliOptionScopeType(scopeType),telemetry.trackCliFlagDefaults(showDefaults);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(scopeType!==void 0&&!BUDGET_SCOPE_TYPES.includes(scopeType))return output_manager_default.error(`The --scope-type option must be one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`),2;let scopeFilter=scopeType;if(showDefaults&&scopeFilter==="team")return output_manager_default.error("The team scope does not support --default. Drop --defaults to list the team budget."),1;if(showDefaults&&(limitFlag!==void 0||next!==void 0))return output_manager_default.error("The --limit and --next options do not apply to --defaults, which lists every default in one page."),1;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;if(showDefaults)return await listDefaults(client,{scopeType:scopeFilter,asJson});output_manager_default.spinner("Fetching budgets\u2026");let page,defaults;try{[page,defaults]=await Promise.all([listBudgetsPage(client,{scopeType:scopeFilter,limit,next,includeDefaultCovered:!1}),asJson||next?[]:listScopeBudgetDefaults(client).catch(err=>(output_manager_default.debug(`Skipping budget defaults in list output: ${err instanceof Error?err.message:String(err)}`),[]))])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}let configured=page.items,counts=page.defaultCoveredCounts;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({budgets:configured,pagination:{next:page.next},defaultCoveredCounts:counts},null,2)}
|
|
18
18
|
`),0;if(configured.length===0)return output_manager_default.stopSpinner(),next?(output_manager_default.log("No more budgets."),0):(output_manager_default.log(scopeType?`No ${scopeType} budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`:`No budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`),printDefaultsSection(defaults,counts,scopeFilter),printNextPageHint(client,page.next),0);let names=await resolveScopeNames(client,configured);return output_manager_default.stopSpinner(),printDefaultsSection(defaults,counts,scopeFilter),output_manager_default.log("Custom budgets"),client.stdout.write(printBudgetsTable(configured,names)),printNextPageHint(client,page.next),0}var KEY_LOOKUP_BY_ID_MAX=DEFAULT_LIST_LIMIT,KEY_LOOKUP_CONCURRENCY=5,KEY_ROSTER_PAGE_SIZE=100,KEY_ROSTER_MAX_PAGES=1e3,DIRECTORY_SKIPPED={keys:new Map,users:null};async function resolveDirectoryLabels(client,input){if(!isDirectoryEnabledByEnv()||input.keyIds.length===0&&input.userIds.length===0)return DIRECTORY_SKIPPED;try{return await resolveDirectoryIdentities(client,input)}catch(err){return output_manager_default.debug(`Skipping AI Gateway key directory labels: ${err instanceof Error?err.message:String(err)}`),DIRECTORY_SKIPPED}}async function resolveApiKeyNames(client,ids,{directoryAnswered=!1}={}){let names=new Map;if(ids.length===0)return names;if(directoryAnswered&&(ids=ids.slice(0,KEY_LOOKUP_BY_ID_MAX)),ids.length<=KEY_LOOKUP_BY_ID_MAX){let sema=new import_async_sema2.default(KEY_LOOKUP_CONCURRENCY);return await Promise.all(ids.map(async id=>{await sema.acquire();try{let key=await getApiKey(client,id).catch(()=>null);key?.name&&names.set(id,key.name)}finally{sema.release()}})),names}let wanted=new Set(ids),seen=new Set,next;try{for(let pages=0;pages<KEY_ROSTER_MAX_PAGES;pages++){let page=await listApiKeysPage(client,{limit:KEY_ROSTER_PAGE_SIZE,next});for(let key of page.items)wanted.delete(key.id)&&key.name&&names.set(key.id,key.name);if(!page.next||wanted.size===0||seen.has(page.next))break;seen.add(page.next),next=page.next}}catch{}return names}async function resolveScopeNames(client,configured){let ids=scopeType=>[...new Set(configured.filter(b=>b.scopeType===scopeType).map(b=>b.scopeId))],userIds=ids("user").map(id=>id.replace(/^usr_/,"")),unnamedKeyIds=[...new Set(configured.filter(b=>b.scopeType==="api-key"&&!b.name).map(b=>b.scopeId))],directory=await resolveDirectoryLabels(client,{keyIds:unnamedKeyIds,userIds}),directoryAnswered=directory!==DIRECTORY_SKIPPED,apiKeyNames=new Map;for(let[id,key]of directory.keys)key.name&&apiKeyNames.set(id,key.name);let members=new Map;for(let[uid,label]of directory.users??[])members.set(uid,{uid,username:label.username,name:label.name});let leftoverKeyIds=unnamedKeyIds.filter(id=>!apiKeyNames.has(id)),leftoverUserIds=directory.users===null?userIds:userIds.filter(uid=>!members.has(uid)),[legacyKeyNames,legacyMembers,projects,teams]=await Promise.all([resolveApiKeyNames(client,leftoverKeyIds,{directoryAnswered}),leftoverUserIds.length?getTeamMembersByIds(client,client.config.currentTeam,leftoverUserIds).catch(()=>new Map):new Map,Promise.all(ids("project").map(async id=>{let project=await getProjectByNameOrId(client,id).catch(()=>null),name=project&&!(project instanceof ProjectNotFound)?project.name:void 0;return[id,name||id]})),Promise.all(ids("team").map(async id=>{let team=await getTeamByIdOrSlug(client,id).catch(()=>null);return[id,team?.slug||team?.name||id]}))]),projectNames=new Map(projects),teamNames=new Map(teams);for(let[id,name]of legacyKeyNames)apiKeyNames.set(id,name);for(let[uid,member]of legacyMembers)members.set(uid,member);return configured.map(budget=>{switch(budget.scopeType){case"team":return teamNames.get(budget.scopeId)||budget.scopeId;case"project":return projectNames.get(budget.scopeId)||budget.scopeId;case"user":{let member=members.get(budget.scopeId.replace(/^usr_/,""));return member?teamMemberLabel(member):budget.scopeId}default:return budget.name||apiKeyNames.get(budget.scopeId)||budget.scopeId}})}function defaultRows(defaults,counts,filter){return BUDGET_DEFAULT_SCOPE_TYPES.flatMap(scopeType=>{if(filter&&scopeType!==filter)return[];let row=defaults.find(d=>d.scopeType===scopeType&&d.active!==!1);if(!row)return[];let applied=counts[scopeType]??0,covered=BUDGET_DEFAULT_COVERED[scopeType],noun=applied===1?covered.toLowerCase().replace(/s$/,""):covered.toLowerCase();return[[scopeType,`$${row.limitAmount}`,row.refreshPeriod,`${applied} ${noun}`]]})}async function listDefaults(client,{scopeType,asJson}){output_manager_default.spinner("Fetching budget defaults\u2026");let counts,defaults;try{[counts,defaults]=await Promise.all([asJson?{}:fetchDefaultCoveredCounts(client,scopeType),listScopeBudgetDefaults(client)])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let policyRows=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType)&&(scopeType===void 0||d.scopeType===scopeType));if(asJson)return client.stdout.write(`${JSON.stringify({defaults:policyRows},null,2)}
|
|
19
19
|
`),0;let rows=defaultRows(defaults,counts,scopeType);return rows.length===0?(output_manager_default.log(scopeType?`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`:`No budget defaults set. Set one with ${getCommandName("ai-gateway budgets set <scope> --default")}.`),0):(output_manager_default.log("Budget defaults"),client.stdout.write(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk5.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
20
20
|
`),0)}async function fetchDefaultCoveredCounts(client,scopeType){return(await listBudgetsPage(client,{scopeType,limit:1,includeDefaultCovered:!1})).defaultCoveredCounts}function printDefaultsSection(defaults,counts,filter){let rows=defaultRows(defaults,counts,filter);rows.length!==0&&(output_manager_default.log("Scopes without their own budget inherit the following defaults:"),output_manager_default.print(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk5.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
@@ -26,13 +26,13 @@ import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODING_AGENT_BASE_
|
|
|
26
26
|
`);else{let removedValue=scope.scopeType==="team"?"team budget":`budget for ${targetName}`;printAlignedLabel("Removed",removedValue,{gutter:"\u2713"}),fallbackDefault&&printAlignedLabel("Falls back to",`${scope.scopeType} default (${formatBudgetCap(fallbackDefault.limitAmount,fallbackDefault.refreshPeriod)})`)}return 0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);var AiGatewayBudgetsDefaultsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};async function list3(client,argv){let telemetry=new AiGatewayBudgetsDefaultsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs;telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!await ensureTeam(client))return 1;output_manager_default.spinner("Fetching budget defaults\u2026");let defaults;try{defaults=await listScopeBudgetDefaults(client)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let shown=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType));return asJson?(client.stdout.write(`${JSON.stringify({defaults:shown},null,2)}
|
|
27
27
|
`),0):shown.length===0?(output_manager_default.log(`No budget defaults set. Set one with ${getCommandName("ai-gateway budgets set <scope> --default")}.`),0):(output_manager_default.log("Budget defaults"),client.stdout.write(printDefaultsTable(shown)),0)}function printDefaultsTable(defaults){return`${table([["scope","limit","refresh"].map(header=>import_chalk7.default.gray(header)),...defaults.map(d=>[d.scopeType,`$${d.limitAmount}`,d.refreshPeriod])],{align:["l","r","l"],hsep:4}).replace(/^/gm," ")}
|
|
28
28
|
|
|
29
|
-
`}var AiGatewayBudgetsDefaultsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};var REFRESH_PERIODS2=["daily","weekly","monthly","none"];async function set2(client,argv){let telemetry=new AiGatewayBudgetsDefaultsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,refreshPeriod=opts["--refresh-period"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,amount=getRenamedOption(opts,"--amount","--limit",{json:asJson});if("error"in amount)return reportRenamedOptionError(client,amount.error,{json:asJson});let limit=amount.value,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return limit===void 0||Number.isNaN(limit)||limit<1?(output_manager_default.error("The --amount flag is required and must be at least 1."),2):refreshPeriod!==void 0&&!REFRESH_PERIODS2.includes(refreshPeriod)?(output_manager_default.error(`The --refresh-period flag must be one of: ${REFRESH_PERIODS2.join(", ")}.`),2):await ensureTeam(client)?await setScopeDefault(client,{scopeType,limit,refreshPeriod,asJson,warnings:[amount.warning]}):1}var AiGatewayBudgetsDefaultsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};async function remove3(client,argv){let telemetry=new AiGatewayBudgetsDefaultsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,yes=opts["--yes"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return await ensureTeam(client)?await removeScopeDefault(client,scopeType,{yes,asJson}):1}var AiGatewayBudgetsDefaultsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG2={list:getCommandAliases(budgetsDefaultsListSubcommand),set:getCommandAliases(budgetsDefaultsSetSubcommand),remove:getCommandAliases(budgetsDefaultsRemoveSubcommand)};async function budgetsDefaults(client){let telemetry=new AiGatewayBudgetsDefaultsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsDefaultsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(3),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),output_manager_default.print(help(budgetsDefaultsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:budgetsDefaultsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets defaults delete","ai-gateway budgets defaults remove"),remove3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG2)),output_manager_default.print(help(budgetsDefaultsSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayBudgetsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandDefaults(actual){this.trackCliSubcommand({subcommand:"defaults",value:actual})}};var COMMAND_CONFIG3={set:getCommandAliases(budgetsSetSubcommand),list:getCommandAliases(budgetsListSubcommand),inspect:getCommandAliases(budgetsInspectSubcommand),remove:getCommandAliases(budgetsRemoveSubcommand),defaults:getCommandAliases(budgetsDefaultsSubcommand)};async function budgets(client){let telemetry=new AiGatewayBudgetsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG3),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),output_manager_default.print(help(budgetsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:budgetsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets delete","ai-gateway budgets remove"),remove2(client,args));case"defaults":return telemetry.trackCliSubcommandDefaults(subcommandOriginal),needHelp||output_manager_default.warn(`The ${getCommandName("ai-gateway budgets defaults")} command group is deprecated. Use \`--default\` with \`budgets set\`, \`budgets inspect\`, or \`budgets remove\` (e.g. ${getCommandName("ai-gateway budgets set user --default --amount 50")}), or ${getCommandName("ai-gateway budgets ls --defaults")}.`),budgetsDefaults(client);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),output_manager_default.print(help(budgetsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk8=__toESM(require_source(),1);async function createRule(client,input){return client.fetch("/ai-gateway/rules",{method:"POST",body:input})}async function listRulesPage(client,opts={}){let query=new URLSearchParams;opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDisabled&&query.set("includeDisabled","true");let qs=query.toString(),{rules:rules2,nextCursor}=await client.fetch(`/ai-gateway/rules${qs?`?${qs}`:""}`,{method:"GET"});return{items:rules2??[],next:nextCursor??null}}async function updateRule(client,input){return client.fetch("/ai-gateway/rules",{method:"PATCH",body:input})}async function deleteRule(client,ruleId){await client.fetch(`/ai-gateway/rules?ruleId=${encodeURIComponent(ruleId)}`,{method:"DELETE"})}var AiGatewayRulesAddTelemetryClient=class extends TelemetryClient{trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}trackCliOptionSource(source){source&&this.trackCliOption({option:"source",value:this.redactedValue})}trackCliOptionDestination(destination){destination&&this.trackCliOption({option:"destination",value:this.redactedValue})}trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var RULE_TYPES=["rewrite","deny"];async function add(client,argv){let telemetry=new AiGatewayRulesAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesAddSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,type=opts["--type"],source=opts["--source"],destination=opts["--destination"],reason=opts["--reason"],description=opts["--description"];telemetry.trackCliOptionType(type),telemetry.trackCliOptionSource(source),telemetry.trackCliOptionDestination(destination),telemetry.trackCliOptionReason(reason),telemetry.trackCliOptionDescription(description),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!type||!RULE_TYPES.includes(type))return output_manager_default.error(`The --type flag is required and must be one of: ${RULE_TYPES.join(", ")}.`),2;if(!source)return output_manager_default.error("The --source flag is required (the model the rule matches)."),2;if(type==="rewrite"&&!destination)return output_manager_default.error("A rewrite rule requires --destination (the model to route to)."),2;if(type==="deny"&&destination)return output_manager_default.error("A deny rule cannot set --destination."),1;let action;if(type==="rewrite"&&destination?action={rewriteModel:destination,...reason?{reason}:{}}:reason&&(action={reason}),!await ensureTeam(client))return 1;let addStamp=stamp_default();output_manager_default.spinner("Adding routing rule");try{let rule=await createRule(client,{type,match:{model:source},...action?{action}:{},...description?{description}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(rule,null,2)}
|
|
29
|
+
`}var AiGatewayBudgetsDefaultsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliOptionAmount(amount){amount!==void 0&&this.trackCliOption({option:"amount",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};var REFRESH_PERIODS2=["daily","weekly","monthly","none"];async function set2(client,argv){let telemetry=new AiGatewayBudgetsDefaultsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,refreshPeriod=opts["--refresh-period"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,amount=getRenamedOption(opts,"--amount","--limit",{json:asJson});if("error"in amount)return reportRenamedOptionError(client,amount.error,{json:asJson});let limit=amount.value,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return limit===void 0||Number.isNaN(limit)||limit<1?(output_manager_default.error("The --amount option is required and must be at least 1."),2):refreshPeriod!==void 0&&!REFRESH_PERIODS2.includes(refreshPeriod)?(output_manager_default.error(`The --refresh-period option must be one of: ${REFRESH_PERIODS2.join(", ")}.`),2):await ensureTeam(client)?await setScopeDefault(client,{scopeType,limit,refreshPeriod,asJson,warnings:[amount.warning]}):1}var AiGatewayBudgetsDefaultsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};async function remove3(client,argv){let telemetry=new AiGatewayBudgetsDefaultsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,yes=opts["--yes"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return await ensureTeam(client)?await removeScopeDefault(client,scopeType,{yes,asJson}):1}var AiGatewayBudgetsDefaultsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG2={list:getCommandAliases(budgetsDefaultsListSubcommand),set:getCommandAliases(budgetsDefaultsSetSubcommand),remove:getCommandAliases(budgetsDefaultsRemoveSubcommand)};async function budgetsDefaults(client){let telemetry=new AiGatewayBudgetsDefaultsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsDefaultsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(3),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),output_manager_default.print(help(budgetsDefaultsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:budgetsDefaultsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets defaults delete","ai-gateway budgets defaults remove"),remove3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG2)),output_manager_default.print(help(budgetsDefaultsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var AiGatewayBudgetsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandDefaults(actual){this.trackCliSubcommand({subcommand:"defaults",value:actual})}};var COMMAND_CONFIG3={set:getCommandAliases(budgetsSetSubcommand),list:getCommandAliases(budgetsListSubcommand),inspect:getCommandAliases(budgetsInspectSubcommand),remove:getCommandAliases(budgetsRemoveSubcommand),defaults:getCommandAliases(budgetsDefaultsSubcommand)};async function budgets(client){let telemetry=new AiGatewayBudgetsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG3),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),output_manager_default.print(help(budgetsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:budgetsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets delete","ai-gateway budgets remove"),remove2(client,args));case"defaults":return telemetry.trackCliSubcommandDefaults(subcommandOriginal),needHelp||output_manager_default.warn(`The ${getCommandName("ai-gateway budgets defaults")} command group is deprecated. Use \`--default\` with \`budgets set\`, \`budgets inspect\`, or \`budgets remove\` (e.g. ${getCommandName("ai-gateway budgets set user --default --amount 50")}), or ${getCommandName("ai-gateway budgets ls --defaults")}.`),budgetsDefaults(client);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),output_manager_default.print(help(budgetsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk8=__toESM(require_source(),1);async function createRule(client,input){return client.fetch("/ai-gateway/rules",{method:"POST",body:input})}async function listRulesPage(client,opts={}){let query=new URLSearchParams;opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDisabled&&query.set("includeDisabled","true");let qs=query.toString(),{rules:rules2,nextCursor}=await client.fetch(`/ai-gateway/rules${qs?`?${qs}`:""}`,{method:"GET"});return{items:rules2??[],next:nextCursor??null}}async function updateRule(client,input){return client.fetch("/ai-gateway/rules",{method:"PATCH",body:input})}async function deleteRule(client,ruleId){await client.fetch(`/ai-gateway/rules?ruleId=${encodeURIComponent(ruleId)}`,{method:"DELETE"})}var AiGatewayRulesAddTelemetryClient=class extends TelemetryClient{trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}trackCliOptionSource(source){source&&this.trackCliOption({option:"source",value:this.redactedValue})}trackCliOptionDestination(destination){destination&&this.trackCliOption({option:"destination",value:this.redactedValue})}trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var RULE_TYPES=["rewrite","deny"];async function add(client,argv){let telemetry=new AiGatewayRulesAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesAddSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,type=opts["--type"],source=opts["--source"],destination=opts["--destination"],reason=opts["--reason"],description=opts["--description"];telemetry.trackCliOptionType(type),telemetry.trackCliOptionSource(source),telemetry.trackCliOptionDestination(destination),telemetry.trackCliOptionReason(reason),telemetry.trackCliOptionDescription(description),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!type||!RULE_TYPES.includes(type))return output_manager_default.error(`The --type option is required and must be one of: ${RULE_TYPES.join(", ")}.`),2;if(!source)return output_manager_default.error("The --source option is required (the model the rule matches)."),2;if(type==="rewrite"&&!destination)return output_manager_default.error("A rewrite rule requires --destination (the model to route to)."),2;if(type==="deny"&&destination)return output_manager_default.error("A deny rule cannot set --destination."),1;let action;if(type==="rewrite"&&destination?action={rewriteModel:destination,...reason?{reason}:{}}:reason&&(action={reason}),!await ensureTeam(client))return 1;let addStamp=stamp_default();output_manager_default.spinner("Adding routing rule");try{let rule=await createRule(client,{type,match:{model:source},...action?{action}:{},...description?{description}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(rule,null,2)}
|
|
30
30
|
`):(client.stdout.write(`${rule.ruleId}
|
|
31
31
|
`),output_manager_default.success(`Routing rule ${import_chalk8.default.bold(rule.ruleId)} added ${addStamp()}`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk9=__toESM(require_source(),1);var AiGatewayRulesListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagIncludeDisabled(includeDisabled){includeDisabled&&this.trackCliFlag("include-disabled")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list4(client,argv){let telemetry=new AiGatewayRulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,includeDisabled=opts["--include-disabled"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliFlagIncludeDisabled(includeDisabled),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}return await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching routing rules",fetch:()=>listRulesPage(client,{limit,next,includeDisabled:!!includeDisabled}),toJSON:page=>({rules:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more rules.":`No routing rules found. Add one with ${getCommandName("ai-gateway rules add")}.`,header:()=>"Routing rules",renderTable:page=>printRulesTable(page.items),next:page=>page.next}):1}function printRulesTable(rules2){return`${table([["id","type","model","action","enabled"].map(header=>import_chalk9.default.gray(header)),...rules2.map(rule=>[rule.ruleId,rule.type,rule.match?.model??import_chalk9.default.gray("\u2013"),rule.type==="rewrite"?`\u2192 ${rule.action?.rewriteModel??import_chalk9.default.gray("\u2013")}`:import_chalk9.default.gray("deny"),rule.enabled===!1?import_chalk9.default.gray("no"):"yes"])],{align:["l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
32
32
|
|
|
33
33
|
`}var import_chalk10=__toESM(require_source(),1);var AiGatewayRulesEditTelemetryClient=class extends TelemetryClient{trackCliArgumentRuleId(ruleId){ruleId&&this.trackCliArgument({arg:"ruleId",value:this.redactedValue})}trackCliFlagEnable(enable){enable&&this.trackCliFlag("enable")}trackCliFlagNoEnable(value){value&&this.trackCliFlag("no-enable")}trackCliFlagDisable(disable){disable&&this.trackCliFlag("disable")}trackCliOptionDestination(destination){destination&&this.trackCliOption({option:"destination",value:this.redactedValue})}trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit(client,argv){let telemetry=new AiGatewayRulesEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[ruleId]=args,destination=opts["--destination"],reason=opts["--reason"],description=opts["--description"];telemetry.trackCliArgumentRuleId(ruleId),telemetry.trackCliFlagEnable(opts["--enable"]),telemetry.trackCliFlagNoEnable(opts["--no-enable"]),telemetry.trackCliFlagDisable(opts["--disable"]),telemetry.trackCliOptionDestination(destination),telemetry.trackCliOptionReason(reason),telemetry.trackCliOptionDescription(description),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!ruleId)return output_manager_default.error(`${getCommandName("ai-gateway rules update <ruleId>")} expects a rule id.`),2;let enable=readOnOffOption(client,opts,{on:"--enable",off:"--no-enable",oldOff:"--disable"});if("error"in enable)return output_manager_default.error(enable.error),2;let action=destination||reason?{...destination?{rewriteModel:destination}:{},...reason?{reason}:{}}:void 0,enabled=enable.value;if(enabled===void 0&&description===void 0&&!action)return output_manager_default.error("Nothing to edit. Pass --enable, --no-enable, --destination, --reason, or --description."),1;if(!await ensureTeam(client))return 1;let editStamp=stamp_default();output_manager_default.spinner("Updating routing rule");try{let rule=await updateRule(client,{ruleId,...enabled!==void 0?{enabled}:{},...description!==void 0?{description}:{},...action?{action}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(rule,null,2)}
|
|
34
34
|
`):output_manager_default.success(`Routing rule ${import_chalk10.default.bold(rule.ruleId)} updated ${editStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Routing rule "${ruleId}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk11=__toESM(require_source(),1);var AiGatewayRulesRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentRuleId(ruleId){ruleId&&this.trackCliArgument({arg:"ruleId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove4(client,argv){let telemetry=new AiGatewayRulesRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[ruleId]=args,yes=opts["--yes"];telemetry.trackCliArgumentRuleId(ruleId),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!ruleId)return output_manager_default.error(`${getCommandName("ai-gateway rules remove <ruleId>")} expects a rule id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Remove routing rule ${import_chalk11.default.bold(ruleId)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing routing rule");try{return await deleteRule(client,ruleId),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({ruleId,removed:!0},null,2)}
|
|
35
|
-
`):output_manager_default.success(`Routing rule ${import_chalk11.default.bold(ruleId)} removed ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Routing rule "${ruleId}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayRulesTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG4={add:getCommandAliases(rulesAddSubcommand),list:getCommandAliases(rulesListSubcommand),update:getCommandAliases(rulesEditSubcommand),remove:getCommandAliases(rulesRemoveSubcommand)};async function rules(client){let telemetry=new AiGatewayRulesTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(rulesSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG4),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),output_manager_default.print(help(rulesSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:rulesSubcommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&output_manager_default.warn("AI Gateway routing rules are in beta and may change. Avoid relying on them in production. Share feedback at https://vercel.com/feedback"),subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesAddSubcommand),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list4(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway rules edit","ai-gateway rules update"),edit(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway rules delete","ai-gateway rules remove"),remove4(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG4)),output_manager_default.print(help(rulesSubcommand,{columns:client.stderr.columns})),2}}var import_chalk12=__toESM(require_source(),1);var VIRTUAL_MODEL_KINDS=["alias","relay"],MAX_PAGE_SIZE2=200;async function listVirtualModelsPage(client,opts){let query=new URLSearchParams({includeArchived:String(opts.includeArchived)});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next);let page=await client.fetch(`/ai-gateway/virtual-model-configs/list?${query.toString()}`,{method:"GET"});return{items:page.virtualModelConfigs??[],next:page.cursor??null}}async function listVirtualModels(client){return fetchAllPages(next=>listVirtualModelsPage(client,{limit:MAX_PAGE_SIZE2,next,includeArchived:!0}))}async function getVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"GET"})}function virtualModelPath(virtualModelSlug){return`/ai-gateway/virtual-model-configs/${encodeURIComponent(virtualModelSlug)}`}async function createVirtualModel(client,input){return client.fetch("/ai-gateway/virtual-model-configs",{method:"POST",body:input})}async function updateVirtualModel(client,input){let{virtualModelSlug,...updates}=input;return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:updates})}async function restoreVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:{deleted:!1}})}async function deleteVirtualModel(client,virtualModelSlug){await client.fetch(virtualModelPath(virtualModelSlug),{method:"DELETE"})}function parseConfigFlag(raw,subject="The --config flag",settableFields=SETTABLE_FIELDS){if(!raw)return{ok:!0,value:{}};let parsed;try{parsed=JSON.parse(raw)}catch{return{ok:!1,error:`${subject} must be valid JSON.`}}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return{ok:!1,error:`${subject} must be a JSON object.`};let unknownFields=Object.keys(parsed).filter(field=>!Object.hasOwn(settableFields,field));if(unknownFields.length>0){let objectValued=unknownFields.filter(field=>{let v=parsed[field];return typeof v=="object"&&v!==null&&!Array.isArray(v)}),hint=objectValued.length>0?` ${objectValued.length===1?"That looks":"Those look"} like provider options; wrap ${objectValued.length===1?"it":"them"} as { "providerOptions": { "${objectValued[0]}": { ... } } }.`:"";return{ok:!1,error:`${unknownFields.length===1?"Unknown field":"Unknown fields"}: ${unknownFields.join(", ")}.${hint} Settable fields are: ${Object.keys(settableFields).sort().join(", ")}.`}}for(let[field,allowed]of Object.entries(ENUM_FIELD_VALUES)){let v=parsed[field];if(v!==void 0&&(typeof v!="string"||!allowed.includes(v)))return{ok:!1,error:`Invalid ${field}: ${JSON.stringify(v)}. Valid values are: ${allowed.join(", ")}.`}}let has=parsed.has;if(has!==void 0){if(!Array.isArray(has))return{ok:!1,error:`has must be an array of: ${HAS_VALUES.join(", ")}.`};let bad2=has.find(entry2=>!HAS_VALUES.includes(entry2));if(bad2!==void 0)return{ok:!1,error:`Invalid has entry: ${JSON.stringify(bad2)}. Valid values are: ${HAS_VALUES.join(", ")}.`}}let providerOptions=parsed.providerOptions;if(providerOptions!==void 0){let shapeError=invalidProviderOptions(providerOptions);if(shapeError)return{ok:!1,error:shapeError}}for(let field of BOOLEAN_FIELDS){let v=parsed[field];if(v!==void 0&&typeof v!="boolean")return{ok:!1,error:`${field} must be true or false.`}}return{ok:!0,value:parsed}}function invalidProviderOptions(value){let isRecord=v=>typeof v=="object"&&v!==null&&!Array.isArray(v);if(!isRecord(value)||Object.values(value).some(v=>!isRecord(v)))return'providerOptions must be an object of per-provider objects, e.g. {"anthropic": {"effort": "high"}}.'}var ENUM_FIELD_VALUES={sort:["@default","cost","ttft","tps","price","latency","throughput"],serviceTier:["@default","flex","priority","fast"],caching:["@default","auto"],speed:["fast"]},HAS_VALUES=["implicit-caching","vision"],BOOLEAN_FIELDS=["zeroDataRetention","disallowPromptTraining","allowFallbackFromFast"];function splitList(value){if(value===void 0)return;let items=value.split(",").map(item=>item.trim()).filter(Boolean);return items.length>0?items:void 0}var SETTABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,kind:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0},UPDATEABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0};var DEFAULT_AI_GATEWAY_URL="https://ai-gateway.vercel.sh";function gatewayBase(){return process.env.VERCEL_AI_GATEWAY_URL??DEFAULT_AI_GATEWAY_URL}async function listModels(client,opts={}){let{data}=await client.fetch(`${gatewayBase()}/v1/models`,{method:"GET",...opts});return data??[]}async function listModelEndpoints(client,model){let path=model.split("/").map(encodeURIComponent).join("/"),{data}=await client.fetch(`${gatewayBase()}/v1/models/${path}/endpoints`,{method:"GET"});return data}var AiGatewayVirtualModelsCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionKind(kind){kind&&this.trackCliOption({option:"kind",value:VIRTUAL_MODEL_KINDS.includes(kind)?kind:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var MAX_PROVIDERS_IN_PROMPT=8;async function create2(client,argv){let telemetry=new AiGatewayVirtualModelsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsCreateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"]);if(!config.ok)return output_manager_default.error(config.error),1;let[slugArg]=args,kindFlag=opts["--kind"],modelFlag=opts["--model"];telemetry.trackCliArgumentSlug(slugArg),telemetry.trackCliOptionKind(kindFlag),telemetry.trackCliOptionModel(modelFlag),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,merged={...config.value,...definedOnly({virtualModelSlug:slugArg,kind:kindFlag,modelSlug:modelFlag,displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})},canPrompt2=!!client.stdin.isTTY&&!client.nonInteractive&&!client.isAgent,wizard=!1;if(!merged.virtualModelSlug){if(!canPrompt2){let message="A slug is required. Pass it as an argument, in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0,merged.virtualModelSlug=await client.input.text({message:"Slug for the virtual model (called as vmc/<slug>):",validate:async value=>{let slug=value.trim();if(!slug)return"A slug is required.";if(!/^[a-zA-Z0-9_.-]+$/.test(slug))return"Letters, numbers, hyphens, underscores, periods only.";if(!client.config.currentTeam)return!0;try{return await getVirtualModel(client,slug),"That slug is already taken."}catch{return!0}}})}if(merged.kind??="alias",!VIRTUAL_MODEL_KINDS.includes(merged.kind))return output_manager_default.error(`--kind must be one of: ${VIRTUAL_MODEL_KINDS.join(", ")}.`),2;let catalogPromise,getCatalog=()=>(catalogPromise??=listModels(client).catch(()=>[]),catalogPromise),providersPromise,getProviders=()=>(providersPromise??=listModelEndpoints(client,String(merged.modelSlug)).then(data=>[...new Set(data.endpoints.map(endpoint=>endpoint.provider_name))]).catch(()=>[]),providersPromise);if(!merged.modelSlug){if(!canPrompt2){let message="A target model is required. Pass --model, put modelSlug in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0;let catalog=await getCatalog();catalog.length>0?merged.modelSlug=await client.input.search({message:`Model this virtual model points at (${catalog.length} available):`,pageSize:15,source:term=>{let searchTerm=term?.trim().toLowerCase();return(searchTerm?catalog.filter(model=>model.id.toLowerCase().includes(searchTerm)||(model.name??"").toLowerCase().includes(searchTerm)):catalog).map(model=>({name:model.id,value:model.id}))}}):merged.modelSlug=await client.input.text({message:"Model this virtual model points at (e.g. openai/gpt-5.1):",validate:value=>value.trim().length>0?!0:"A model is required."})}if(wizard&&opts["--config"]===void 0){let picked=await client.input.checkbox({message:`Which fields would you like to set?${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Display name",value:"displayName"},{name:"Description",value:"description"},{name:"Model fallbacks",value:"models"},{name:"Provider order",value:"providerOrder"},{name:"Only these providers",value:"providerOnly"},{name:"Sort by",value:"sort"},{name:"Service tier",value:"serviceTier"},{name:"Prompt caching",value:"caching"},{name:"Fast mode",value:"speed"},{name:"Required capabilities",value:"has"},{name:"Observability tags",value:"observabilityTags"},{name:"Zero data retention",value:"zeroDataRetention"},{name:"Disallow prompt training",value:"disallowPromptTraining"},{name:"Provider options (JSON)",value:"providerOptions"},{name:"Other fields (raw JSON)",value:"otherJson"}]}),csvPrompt=async(message,field,validateEntry)=>{let value=splitList(await client.input.text({message,validate:async v=>{let entries=splitList(v);if(!entries)return"Enter at least one value.";if(validateEntry)for(let entry2 of entries){let result=await validateEntry(entry2);if(result!==!0)return result}return!0}}));value&&merged[field]===void 0&&(merged[field]=value)},providerEntryValidator=async entry2=>{let providers2=await getProviders();return providers2.length===0||providers2.includes(entry2)?!0:`Unknown provider: ${entry2}. This model is served by: ${providers2.join(", ")}.`},providerPrompt=async label=>{let providers2=await getProviders();if(providers2.length<2)return`${label}, comma-separated:`;let shown=providers2.slice(0,MAX_PROVIDERS_IN_PROMPT).join(", "),rest=providers2.length-MAX_PROVIDERS_IN_PROMPT;return rest>0?`${label}, comma-separated (available: ${shown}, and ${rest} more):`:`${label}, comma-separated (available: ${shown}):`},modelEntryValidator=async entry2=>{let catalog=await getCatalog();return catalog.length===0||catalog.some(model=>model.id===entry2)?!0:`Unknown model: ${entry2}.`};for(let field of picked)switch(field){case"displayName":case"description":{let label=field==="displayName"?"Display name":"Description",value=await client.input.text({message:`${label}:`});value.trim()&&merged[field]===void 0&&(merged[field]=value.trim());break}case"models":await csvPrompt("Fallback models, comma-separated (e.g. moonshotai/kimi-k2-thinking, zai/glm-5.1):","models",modelEntryValidator);break;case"providerOrder":await csvPrompt(await providerPrompt("Providers to try first"),"providerOrder",providerEntryValidator);break;case"providerOnly":await csvPrompt(await providerPrompt("Restrict to these providers"),"providerOnly",providerEntryValidator);break;case"observabilityTags":await csvPrompt("Observability tags, comma-separated (letters, numbers, . _ -):","observabilityTags",async entry2=>/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(entry2)?!0:`Invalid tag: ${entry2}. Letters, numbers, . _ -, starting alphanumeric.`);break;case"sort":{let value=await client.input.select({message:"Sort providers by:",choices:[{name:"Cost (cheapest first)",value:"cost"},{name:"Time to first token",value:"ttft"},{name:"Tokens per second",value:"tps"}]});merged.sort===void 0&&(merged.sort=value);break}case"serviceTier":{let value=await client.input.select({message:"Service tier:",choices:[{name:"Flex (cheaper, may be slower)",value:"flex"},{name:"Priority (higher per-token rate)",value:"priority"}]});merged.serviceTier===void 0&&(merged.serviceTier=value);break}case"caching":{await client.input.confirm("Enable automatic prompt caching?",!0)&&merged.caching===void 0&&(merged.caching="auto");break}case"speed":{await client.input.confirm("Enable fast mode?",!1)&&merged.speed===void 0&&(merged.speed="fast",await client.input.confirm("Allow fallback to standard providers when fast ones are unavailable?",!1)&&merged.allowFallbackFromFast===void 0&&(merged.allowFallbackFromFast=!0));break}case"has":{let value=await client.input.checkbox({message:`Require providers with these capabilities:${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Implicit caching",value:"implicit-caching"},{name:"Vision",value:"vision"}]});value.length>0&&merged.has===void 0&&(merged.has=value);break}case"zeroDataRetention":case"disallowPromptTraining":{let labels={zeroDataRetention:"Require zero data retention?",disallowPromptTraining:"Disallow providers that train on prompts?"};await client.input.confirm(labels[field],!1)&&merged[field]===void 0&&(merged[field]=!0);break}case"providerOptions":{let raw=await client.input.text({message:'Provider options as JSON, e.g. {"anthropic": {"effort": "high"}}:',validate:v=>{let parsed;try{parsed=JSON.parse(v)}catch{return"Provider options must be valid JSON."}return invalidProviderOptions(parsed)??!0}});merged.providerOptions===void 0&&(merged.providerOptions=JSON.parse(raw));break}case"otherJson":{let raw=await client.input.text({message:`JSON object of additional fields.
|
|
35
|
+
`):output_manager_default.success(`Routing rule ${import_chalk11.default.bold(ruleId)} removed ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Routing rule "${ruleId}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayRulesTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG4={add:getCommandAliases(rulesAddSubcommand),list:getCommandAliases(rulesListSubcommand),update:getCommandAliases(rulesEditSubcommand),remove:getCommandAliases(rulesRemoveSubcommand)};async function rules(client){let telemetry=new AiGatewayRulesTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(rulesSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG4),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),output_manager_default.print(help(rulesSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:rulesSubcommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&output_manager_default.warn("AI Gateway routing rules are in beta and may change. Avoid relying on them in production. Share feedback at https://vercel.com/feedback"),subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesAddSubcommand),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list4(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway rules edit","ai-gateway rules update"),edit(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway rules delete","ai-gateway rules remove"),remove4(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG4)),output_manager_default.print(help(rulesSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk12=__toESM(require_source(),1);var VIRTUAL_MODEL_KINDS=["alias","relay"],MAX_PAGE_SIZE2=200;async function listVirtualModelsPage(client,opts){let query=new URLSearchParams({includeArchived:String(opts.includeArchived)});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next);let page=await client.fetch(`/ai-gateway/virtual-model-configs/list?${query.toString()}`,{method:"GET"});return{items:page.virtualModelConfigs??[],next:page.cursor??null}}async function listVirtualModels(client){return fetchAllPages(next=>listVirtualModelsPage(client,{limit:MAX_PAGE_SIZE2,next,includeArchived:!0}))}async function getVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"GET"})}function virtualModelPath(virtualModelSlug){return`/ai-gateway/virtual-model-configs/${encodeURIComponent(virtualModelSlug)}`}async function createVirtualModel(client,input){return client.fetch("/ai-gateway/virtual-model-configs",{method:"POST",body:input})}async function updateVirtualModel(client,input){let{virtualModelSlug,...updates}=input;return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:updates})}async function restoreVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:{deleted:!1}})}async function deleteVirtualModel(client,virtualModelSlug){await client.fetch(virtualModelPath(virtualModelSlug),{method:"DELETE"})}function parseConfigFlag(raw,subject="The --config option",settableFields=SETTABLE_FIELDS){if(!raw)return{ok:!0,value:{}};let parsed;try{parsed=JSON.parse(raw)}catch{return{ok:!1,error:`${subject} must be valid JSON.`}}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return{ok:!1,error:`${subject} must be a JSON object.`};let unknownFields=Object.keys(parsed).filter(field=>!Object.hasOwn(settableFields,field));if(unknownFields.length>0){let objectValued=unknownFields.filter(field=>{let v=parsed[field];return typeof v=="object"&&v!==null&&!Array.isArray(v)}),hint=objectValued.length>0?` ${objectValued.length===1?"That looks":"Those look"} like provider options; wrap ${objectValued.length===1?"it":"them"} as { "providerOptions": { "${objectValued[0]}": { ... } } }.`:"";return{ok:!1,error:`${unknownFields.length===1?"Unknown field":"Unknown fields"}: ${unknownFields.join(", ")}.${hint} Settable fields are: ${Object.keys(settableFields).sort().join(", ")}.`}}for(let[field,allowed]of Object.entries(ENUM_FIELD_VALUES)){let v=parsed[field];if(v!==void 0&&(typeof v!="string"||!allowed.includes(v)))return{ok:!1,error:`Invalid ${field}: ${JSON.stringify(v)}. Valid values are: ${allowed.join(", ")}.`}}let has=parsed.has;if(has!==void 0){if(!Array.isArray(has))return{ok:!1,error:`has must be an array of: ${HAS_VALUES.join(", ")}.`};let bad2=has.find(entry2=>!HAS_VALUES.includes(entry2));if(bad2!==void 0)return{ok:!1,error:`Invalid has entry: ${JSON.stringify(bad2)}. Valid values are: ${HAS_VALUES.join(", ")}.`}}let providerOptions=parsed.providerOptions;if(providerOptions!==void 0){let shapeError=invalidProviderOptions(providerOptions);if(shapeError)return{ok:!1,error:shapeError}}for(let field of BOOLEAN_FIELDS){let v=parsed[field];if(v!==void 0&&typeof v!="boolean")return{ok:!1,error:`${field} must be true or false.`}}return{ok:!0,value:parsed}}function invalidProviderOptions(value){let isRecord=v=>typeof v=="object"&&v!==null&&!Array.isArray(v);if(!isRecord(value)||Object.values(value).some(v=>!isRecord(v)))return'providerOptions must be an object of per-provider objects, e.g. {"anthropic": {"effort": "high"}}.'}var ENUM_FIELD_VALUES={sort:["@default","cost","ttft","tps","price","latency","throughput"],serviceTier:["@default","flex","priority","fast"],caching:["@default","auto"],speed:["fast"]},HAS_VALUES=["implicit-caching","vision"],BOOLEAN_FIELDS=["zeroDataRetention","disallowPromptTraining","allowFallbackFromFast"];function splitList(value){if(value===void 0)return;let items=value.split(",").map(item=>item.trim()).filter(Boolean);return items.length>0?items:void 0}var SETTABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,kind:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0},UPDATEABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0};var DEFAULT_AI_GATEWAY_URL="https://ai-gateway.vercel.sh";function gatewayBase(){return process.env.VERCEL_AI_GATEWAY_URL??DEFAULT_AI_GATEWAY_URL}async function listModels(client,opts={}){let{data}=await client.fetch(`${gatewayBase()}/v1/models`,{method:"GET",...opts});return data??[]}async function listModelEndpoints(client,model){let path=model.split("/").map(encodeURIComponent).join("/"),{data}=await client.fetch(`${gatewayBase()}/v1/models/${path}/endpoints`,{method:"GET"});return data}var AiGatewayVirtualModelsCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionKind(kind){kind&&this.trackCliOption({option:"kind",value:VIRTUAL_MODEL_KINDS.includes(kind)?kind:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var MAX_PROVIDERS_IN_PROMPT=8;async function create2(client,argv){let telemetry=new AiGatewayVirtualModelsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsCreateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"]);if(!config.ok)return output_manager_default.error(config.error),1;let[slugArg]=args,kindFlag=opts["--kind"],modelFlag=opts["--model"];telemetry.trackCliArgumentSlug(slugArg),telemetry.trackCliOptionKind(kindFlag),telemetry.trackCliOptionModel(modelFlag),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,merged={...config.value,...definedOnly({virtualModelSlug:slugArg,kind:kindFlag,modelSlug:modelFlag,displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})},canPrompt2=!!client.stdin.isTTY&&!client.nonInteractive&&!client.isAgent,wizard=!1;if(!merged.virtualModelSlug){if(!canPrompt2){let message="A slug is required. Pass it as an argument, in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0,merged.virtualModelSlug=await client.input.text({message:"Slug for the virtual model (called as vmc/<slug>):",validate:async value=>{let slug=value.trim();if(!slug)return"A slug is required.";if(!/^[a-zA-Z0-9_.-]+$/.test(slug))return"Letters, numbers, hyphens, underscores, periods only.";if(!client.config.currentTeam)return!0;try{return await getVirtualModel(client,slug),"That slug is already taken."}catch{return!0}}})}if(merged.kind??="alias",!VIRTUAL_MODEL_KINDS.includes(merged.kind))return output_manager_default.error(`--kind must be one of: ${VIRTUAL_MODEL_KINDS.join(", ")}.`),2;let catalogPromise,getCatalog=()=>(catalogPromise??=listModels(client).catch(()=>[]),catalogPromise),providersPromise,getProviders=()=>(providersPromise??=listModelEndpoints(client,String(merged.modelSlug)).then(data=>[...new Set(data.endpoints.map(endpoint=>endpoint.provider_name))]).catch(()=>[]),providersPromise);if(!merged.modelSlug){if(!canPrompt2){let message="A target model is required. Pass --model, put modelSlug in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0;let catalog=await getCatalog();catalog.length>0?merged.modelSlug=await client.input.search({message:`Model this virtual model points at (${catalog.length} available):`,pageSize:15,source:term=>{let searchTerm=term?.trim().toLowerCase();return(searchTerm?catalog.filter(model=>model.id.toLowerCase().includes(searchTerm)||(model.name??"").toLowerCase().includes(searchTerm)):catalog).map(model=>({name:model.id,value:model.id}))}}):merged.modelSlug=await client.input.text({message:"Model this virtual model points at (e.g. openai/gpt-5.1):",validate:value=>value.trim().length>0?!0:"A model is required."})}if(wizard&&opts["--config"]===void 0){let picked=await client.input.checkbox({message:`Which fields would you like to set?${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Display name",value:"displayName"},{name:"Description",value:"description"},{name:"Model fallbacks",value:"models"},{name:"Provider order",value:"providerOrder"},{name:"Only these providers",value:"providerOnly"},{name:"Sort by",value:"sort"},{name:"Service tier",value:"serviceTier"},{name:"Prompt caching",value:"caching"},{name:"Fast mode",value:"speed"},{name:"Required capabilities",value:"has"},{name:"Observability tags",value:"observabilityTags"},{name:"Zero data retention",value:"zeroDataRetention"},{name:"Disallow prompt training",value:"disallowPromptTraining"},{name:"Provider options (JSON)",value:"providerOptions"},{name:"Other fields (raw JSON)",value:"otherJson"}]}),csvPrompt=async(message,field,validateEntry)=>{let value=splitList(await client.input.text({message,validate:async v=>{let entries=splitList(v);if(!entries)return"Enter at least one value.";if(validateEntry)for(let entry2 of entries){let result=await validateEntry(entry2);if(result!==!0)return result}return!0}}));value&&merged[field]===void 0&&(merged[field]=value)},providerEntryValidator=async entry2=>{let providers2=await getProviders();return providers2.length===0||providers2.includes(entry2)?!0:`Unknown provider: ${entry2}. This model is served by: ${providers2.join(", ")}.`},providerPrompt=async label=>{let providers2=await getProviders();if(providers2.length<2)return`${label}, comma-separated:`;let shown=providers2.slice(0,MAX_PROVIDERS_IN_PROMPT).join(", "),rest=providers2.length-MAX_PROVIDERS_IN_PROMPT;return rest>0?`${label}, comma-separated (available: ${shown}, and ${rest} more):`:`${label}, comma-separated (available: ${shown}):`},modelEntryValidator=async entry2=>{let catalog=await getCatalog();return catalog.length===0||catalog.some(model=>model.id===entry2)?!0:`Unknown model: ${entry2}.`};for(let field of picked)switch(field){case"displayName":case"description":{let label=field==="displayName"?"Display name":"Description",value=await client.input.text({message:`${label}:`});value.trim()&&merged[field]===void 0&&(merged[field]=value.trim());break}case"models":await csvPrompt("Fallback models, comma-separated (e.g. moonshotai/kimi-k2-thinking, zai/glm-5.1):","models",modelEntryValidator);break;case"providerOrder":await csvPrompt(await providerPrompt("Providers to try first"),"providerOrder",providerEntryValidator);break;case"providerOnly":await csvPrompt(await providerPrompt("Restrict to these providers"),"providerOnly",providerEntryValidator);break;case"observabilityTags":await csvPrompt("Observability tags, comma-separated (letters, numbers, . _ -):","observabilityTags",async entry2=>/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(entry2)?!0:`Invalid tag: ${entry2}. Letters, numbers, . _ -, starting alphanumeric.`);break;case"sort":{let value=await client.input.select({message:"Sort providers by:",choices:[{name:"Cost (cheapest first)",value:"cost"},{name:"Time to first token",value:"ttft"},{name:"Tokens per second",value:"tps"}]});merged.sort===void 0&&(merged.sort=value);break}case"serviceTier":{let value=await client.input.select({message:"Service tier:",choices:[{name:"Flex (cheaper, may be slower)",value:"flex"},{name:"Priority (higher per-token rate)",value:"priority"}]});merged.serviceTier===void 0&&(merged.serviceTier=value);break}case"caching":{await client.input.confirm("Enable automatic prompt caching?",!0)&&merged.caching===void 0&&(merged.caching="auto");break}case"speed":{await client.input.confirm("Enable fast mode?",!1)&&merged.speed===void 0&&(merged.speed="fast",await client.input.confirm("Allow fallback to standard providers when fast ones are unavailable?",!1)&&merged.allowFallbackFromFast===void 0&&(merged.allowFallbackFromFast=!0));break}case"has":{let value=await client.input.checkbox({message:`Require providers with these capabilities:${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Implicit caching",value:"implicit-caching"},{name:"Vision",value:"vision"}]});value.length>0&&merged.has===void 0&&(merged.has=value);break}case"zeroDataRetention":case"disallowPromptTraining":{let labels={zeroDataRetention:"Require zero data retention?",disallowPromptTraining:"Disallow providers that train on prompts?"};await client.input.confirm(labels[field],!1)&&merged[field]===void 0&&(merged[field]=!0);break}case"providerOptions":{let raw=await client.input.text({message:'Provider options as JSON, e.g. {"anthropic": {"effort": "high"}}:',validate:v=>{let parsed;try{parsed=JSON.parse(v)}catch{return"Provider options must be valid JSON."}return invalidProviderOptions(parsed)??!0}});merged.providerOptions===void 0&&(merged.providerOptions=JSON.parse(raw));break}case"otherJson":{let raw=await client.input.text({message:`JSON object of additional fields.
|
|
36
36
|
Available: status, visibility, baseUrl, inferenceRegion,
|
|
37
37
|
providerTimeouts, displayName, description, models, providerOrder,
|
|
38
38
|
providerOnly, sort, serviceTier, caching, speed, allowFallbackFromFast,
|
|
@@ -44,10 +44,10 @@ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"
|
|
|
44
44
|
|
|
45
45
|
`}var import_chalk14=__toESM(require_source(),1);var AiGatewayVirtualModelsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect3(client,argv){let telemetry=new AiGatewayVirtualModelsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);return formatResult.valid?slug?await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching virtual model ${slug}`,fetch:()=>getVirtualModel(client,slug),toJSON:virtualModel=>virtualModel,isEmpty:()=>!1,emptyMessage:"",header:virtualModel=>`Virtual model ${import_chalk14.default.bold(virtualModel.virtualModelSlug)}`,renderTable:printVirtualModelDetails,notFoundMessage:`Virtual model "${slug}" not found.`}):1:(output_manager_default.error(`${getCommandName("ai-gateway virtual-models inspect <slug>")} expects a virtual model slug.`),2):(output_manager_default.error(formatResult.error),2)}function dim2(value){return import_chalk14.default.gray(value)}function printVirtualModelDetails(vm){let rows=[["slug",vm.virtualModelSlug],["kind",vm.kind??"alias"],["model",vm.modelSlug],["display name",vm.displayName],["description",vm.description],["status",vm.status??"active"],["visibility",vm.visibility],["base url",vm.baseUrl],["fallback models",vm.models?.join(", ")],["provider order",vm.providerOrder?.join(", ")],["provider only",vm.providerOnly?.join(", ")],["observability tags",vm.observabilityTags?.join(", ")],["inference region",formatRegion(vm.inferenceRegion)],["sort",vm.sort],["has",vm.has?.join(", ")],["caching",vm.caching],["service tier",vm.serviceTier],["provider timeouts",formatTimeouts(vm.providerTimeouts)],["speed",vm.speed],["allow fallback from fast",yesNo2(vm.allowFallbackFromFast)],["zero data retention",yesNo2(vm.zeroDataRetention)],["disallow prompt training",yesNo2(vm.disallowPromptTraining)],["created",new Date(vm.createdAt).toLocaleString()],["updated",new Date(vm.updatedAt).toLocaleString()]];return`${table(rows.filter(([,value])=>value!==void 0&&value!=="").map(([label,value])=>[dim2(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
|
|
46
46
|
|
|
47
|
-
`}function yesNo2(value){return value===void 0?void 0:value?"yes":"no"}function formatRegion(region){if(!region)return;let base=[region.scope,region.geoRegion,region.providerRegion].filter(Boolean).join(" / "),providers2=region.providers?Object.entries(region.providers).map(([name,value])=>value===null?`${name}: none`:`${name}: ${[value.scope,value.geoRegion,value.providerRegion].filter(Boolean).join(" / ")}`).join(", "):void 0;return[base,providers2].filter(Boolean).join(" | ")||void 0}function formatTimeouts(timeouts){if(timeouts?.byok)return Object.entries(timeouts.byok).map(([provider,ms2])=>`${provider}: ${ms2}ms`).join(", ")}var import_chalk15=__toESM(require_source(),1);var AiGatewayVirtualModelsEditTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit2(client,argv){let telemetry=new AiGatewayVirtualModelsEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"],void 0,UPDATEABLE_FIELDS);if(!config.ok)return output_manager_default.error(config.error),1;let[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionModel(opts["--model"]),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models update <slug>")} expects a virtual model slug.`),2;let updates={...config.value,...definedOnly2({modelSlug:opts["--model"],displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})};if(delete updates.virtualModelSlug,Object.keys(updates).length===0)return output_manager_default.error("Provide at least one field to change, with
|
|
47
|
+
`}function yesNo2(value){return value===void 0?void 0:value?"yes":"no"}function formatRegion(region){if(!region)return;let base=[region.scope,region.geoRegion,region.providerRegion].filter(Boolean).join(" / "),providers2=region.providers?Object.entries(region.providers).map(([name,value])=>value===null?`${name}: none`:`${name}: ${[value.scope,value.geoRegion,value.providerRegion].filter(Boolean).join(" / ")}`).join(", "):void 0;return[base,providers2].filter(Boolean).join(" | ")||void 0}function formatTimeouts(timeouts){if(timeouts?.byok)return Object.entries(timeouts.byok).map(([provider,ms2])=>`${provider}: ${ms2}ms`).join(", ")}var import_chalk15=__toESM(require_source(),1);var AiGatewayVirtualModelsEditTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit2(client,argv){let telemetry=new AiGatewayVirtualModelsEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"],void 0,UPDATEABLE_FIELDS);if(!config.ok)return output_manager_default.error(config.error),1;let[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionModel(opts["--model"]),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models update <slug>")} expects a virtual model slug.`),2;let updates={...config.value,...definedOnly2({modelSlug:opts["--model"],displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})};if(delete updates.virtualModelSlug,Object.keys(updates).length===0)return output_manager_default.error("Provide at least one field to change, with an option or --config."),2;if(!await ensureTeam(client))return 1;let updateStamp=stamp_default();output_manager_default.spinner(`Updating virtual model ${slug}`);try{let virtualModel=await updateVirtualModel(client,{...updates,virtualModelSlug:slug});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
|
|
48
48
|
`):output_manager_default.success(`Virtual model ${import_chalk15.default.bold(virtualModel.virtualModelSlug)} updated ${updateStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly2(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk16=__toESM(require_source(),1);var AiGatewayVirtualModelsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove5(client,argv){let telemetry=new AiGatewayVirtualModelsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models delete <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let removeStamp=stamp_default();output_manager_default.spinner("Deleting virtual model");try{return await deleteVirtualModel(client,slug),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({virtualModelSlug:slug,removed:!0},null,2)}
|
|
49
49
|
`):output_manager_default.success(`Virtual model ${import_chalk16.default.bold(slug)} deleted ${removeStamp()}. Restore it with ${getCommandName(`ai-gateway virtual-models restore ${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk17=__toESM(require_source(),1);var AiGatewayVirtualModelsRestoreTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function restore(client,argv){let telemetry=new AiGatewayVirtualModelsRestoreTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRestoreSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models restore <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let restoreStamp=stamp_default();output_manager_default.spinner("Restoring virtual model");try{let virtualModel=await restoreVirtualModel(client,slug);return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
|
|
50
|
-
`):output_manager_default.success(`Virtual model ${import_chalk17.default.bold(slug)} restored ${restoreStamp()}. Call it as ${import_chalk17.default.bold(`vmc/${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayVirtualModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG5={create:getCommandAliases(virtualModelsCreateSubcommand),list:getCommandAliases(virtualModelsListSubcommand),inspect:getCommandAliases(virtualModelsInspectSubcommand),update:getCommandAliases(virtualModelsEditSubcommand),delete:getCommandAliases(virtualModelsRemoveSubcommand),restore:getCommandAliases(virtualModelsRestoreSubcommand)};async function virtualModels(client){let telemetry=new AiGatewayVirtualModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(virtualModelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG5),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:virtualModelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsCreateSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list5(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect3(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models edit","ai-gateway virtual-models update"),edit2(client,args));case"delete":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),0):(telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models remove","ai-gateway virtual-models delete"),remove5(client,args));case"restore":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),0):(telemetry.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk23=__toESM(require_source(),1);import{homedir}from"node:os";import{existsSync as existsSync2}from"node:fs";import{dirname as dirname5,resolve as resolve2}from"node:path";var import_chalk19=__toESM(require_source(),1);import{dirname,join,resolve}from"node:path";var METADATA_FILE=".aider.model.metadata.json",SETTINGS_FILE=".aider.model.settings.yml";function aiderModelId(gatewayModelId){return`openai/${gatewayModelId}`}function chatModels(ctx){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&m.context_window)}function costPerToken(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelMetadata(models3){let entries={};for(let model of models3){let input=costPerToken(model.pricing?.input),output=costPerToken(model.pricing?.output);entries[aiderModelId(model.id)]={max_input_tokens:model.context_window,...model.max_tokens?{max_output_tokens:model.max_tokens,max_tokens:model.max_tokens}:{},...input===void 0?{}:{input_cost_per_token:input},...output===void 0?{}:{output_cost_per_token:output},litellm_provider:"openai",mode:"chat"}}return entries}function modelSettings(models3){return models3.map(model=>({name:aiderModelId(model.id),settings:{edit_format:"diff",use_repo_map:!0}}))}function asObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertNamedYamlList(current,entries){let loaded=current?.trim()?load(current):[];if(loaded!=null&&!Array.isArray(loaded))throw new Error("existing file is not a YAML list");let list7=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list7.forEach((item,i)=>{let name=asObject(item).name;name!==void 0&&!indexByName.has(name)&&indexByName.set(name,i)});for(let{name,settings}of entries){let index=indexByName.get(name);index===void 0?(indexByName.set(name,list7.length),list7.push({name,...settings})):list7[index]={name,...asObject(list7[index]),...settings}}return dump(list7,{lineWidth:120})}var aider={id:"aider",displayName:"Aider",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return await pathExists(join(home,".aider"))||pathExists(join(home,".aider.conf.yml"))},configPath(ctx){return ctx.overrides?.aider??join(ctx.home,".aider.conf.yml")},buildPlan(ctx){let model=aiderModelId(ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL),path=this.configPath(ctx),dir=dirname(path),metadataPath=join(dir,METADATA_FILE),settingsPath=join(dir,SETTINGS_FILE),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=chatModels(ctx),needsExplicitPaths=models3.length>0&&resolve(dir)!==resolve(ctx.home);return{fileChanges:[{path,label:"Aider config",format:"yaml",transform:current=>{let config=asObject(load(current??"")??{});return config["openai-api-base"]=base,config.model=model,needsExplicitPaths&&(config["model-metadata-file"]=metadataPath,config["model-settings-file"]=settingsPath),dump(config,{lineWidth:120})}},...models3.length?[{path:metadataPath,label:"Aider model metadata",format:"json",transform:current=>mergeJson(current,modelMetadata(models3))},{path:settingsPath,label:"Aider model settings",format:"yaml",transform:current=>upsertNamedYamlList(current,modelSettings(models3))}]:[]],envExports:[{name:"AIDER_OPENAI_API_KEY",value:ctx.apiKey}],notes:[`Aider will use the gateway with ${model}; switch with \`aider --model openai/<gateway-model-id>\` or /model in a session.`,...models3.length?[`${models3.length} gateway models are registered in ${METADATA_FILE}; re-run setup to pick up models added since.`]:[],"Open a new terminal first so AIDER_OPENAI_API_KEY is loaded."]}}};import{join as join2}from"node:path";var cline={id:"cline",displayName:"Cline",needsTopModels:!0,async detect(home){return pathExists(join2(home,".cline"))},configPath(ctx){return ctx.overrides?.cline??join2(ctx.home,".cline","data","settings","providers.json")},buildPlan(ctx){let path=this.configPath(ctx),defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,keepUpdatedAt=current=>{try{let providers2=JSON.parse(current)?.providers?.["vercel-ai-gateway"],settings=providers2?.settings;if((ctx.apiKey===KEY_PLACEHOLDER||settings?.apiKey===ctx.apiKey)&&settings?.provider==="vercel-ai-gateway"&&settings?.model===defaultModel&&providers2?.tokenSource==="manual"&&typeof providers2?.updatedAt=="string")return providers2.updatedAt}catch{}};return{fileChanges:[{path,label:"Cline providers",format:"json",mode:384,transform:current=>{let isNew=!current||!current.trim(),updatedAt=(current&&keepUpdatedAt(current))??new Date().toISOString();return mergeJson(current,{...isNew?{version:1}:{},lastUsedProvider:"vercel-ai-gateway",providers:{"vercel-ai-gateway":{settings:{provider:"vercel-ai-gateway",apiKey:ctx.apiKey,model:defaultModel},updatedAt,tokenSource:"manual"}}})}}],envExports:[],notes:[`Cline will use its native Vercel AI Gateway provider with ${defaultModel}; switch models in-session or with \`cline auth -p vercel-ai-gateway -m <gateway-model-id>\`.`,"In the VS Code extension, pick the Vercel AI Gateway provider under Settings \u2192 API Provider."]}}};import{dirname as dirname2,join as join3}from"node:path";function agenticModels(ctx,opts={}){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&(m.tags??[]).includes("tool-use")&&!m.deprecated_at&&(!opts.requireContextWindow||!!m.context_window)&&(!opts.requireMaxTokens||!!m.max_tokens))}function defaultFirst(models3){let rest=models3.filter(m=>m.id!==GATEWAY_DEFAULT_MODEL).sort((a,b)=>a.id.localeCompare(b.id)),preferred=models3.find(m=>m.id===GATEWAY_DEFAULT_MODEL);return preferred?[preferred,...rest]:rest}function shortlistModels(ctx,opts={}){let{creator,creatorLimit=5,overallLimit=10,ensureDefault}=opts,eligible=agenticModels(ctx,opts),byId=new Map(eligible.map(m=>[m.id,m])),picked=[],take=m=>{m&&!picked.includes(m)&&picked.push(m)};if(creator){let rank=new Map((ctx.topModels??[]).map((t,i)=>[t.id,i])),unranked=Number.MAX_SAFE_INTEGER;eligible.filter(m=>m.id.startsWith(`${creator}/`)).sort((a,b)=>(rank.get(a.id)??unranked)-(rank.get(b.id)??unranked)||(b.released??b.created??0)-(a.released??a.created??0)||a.id.localeCompare(b.id)).slice(0,creatorLimit).forEach(take)}let overallStart=picked.length,room=()=>picked.length-overallStart<overallLimit;if(ensureDefault&&take(byId.get(GATEWAY_DEFAULT_MODEL)),ctx.topModels)for(let top of ctx.topModels){if(!room())break;take(byId.get(top.id))}else for(let m of defaultFirst(eligible)){if(!room())break;take(m)}return picked}var FALLBACK_MODELS=[GATEWAY_DEFAULT_MODEL];function chatModelIds(ctx){let ids=shortlistModels(ctx).map(m=>m.id);return ids.length?ids:FALLBACK_MODELS}var ONBOARDING_MARKER=".onboarding_complete",SECRET_REF="${{ secrets.AI_GATEWAY_API_KEY }}";function asObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var continueCli={id:"continue",displayName:"Continue CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join3(home,".continue"))},configPath(ctx){return ctx.overrides?.continue??join3(ctx.home,".continue","config.yaml")},buildPlan(ctx){let apiBase=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,configPath=this.configPath(ctx),modelIds=chatModelIds(ctx);return{fileChanges:[{path:configPath,label:"Continue config",format:"yaml",transform:current=>{let config=asObject2(load(current??"")??{});typeof config.name!="string"&&(config.name="Local Config"),typeof config.version!="string"&&(config.version="1.0.0"),typeof config.schema!="string"&&(config.schema="v1");let models3=Array.isArray(config.models)?[...config.models]:[],writtenIds=new Set(modelIds),kept=models3.filter(entry2=>{let e=asObject2(entry2);return!(e.apiKey===SECRET_REF||writtenIds.has(e.name))}),entries=modelIds.map(id=>({...asObject2(models3.find(m=>asObject2(m).name===id)),name:id,provider:"openai",model:id,apiBase,apiKey:SECRET_REF}));return config.models=[...kept,...entries],dump(config,{lineWidth:120})}},{path:join3(dirname2(configPath),ONBOARDING_MARKER),label:"Continue onboarding marker",format:"text",transform:current=>current??`${new Date().toISOString()}
|
|
50
|
+
`):output_manager_default.success(`Virtual model ${import_chalk17.default.bold(slug)} restored ${restoreStamp()}. Call it as ${import_chalk17.default.bold(`vmc/${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayVirtualModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG5={create:getCommandAliases(virtualModelsCreateSubcommand),list:getCommandAliases(virtualModelsListSubcommand),inspect:getCommandAliases(virtualModelsInspectSubcommand),update:getCommandAliases(virtualModelsEditSubcommand),delete:getCommandAliases(virtualModelsRemoveSubcommand),restore:getCommandAliases(virtualModelsRestoreSubcommand)};async function virtualModels(client){let telemetry=new AiGatewayVirtualModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(virtualModelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG5),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),output_manager_default.print(help(virtualModelsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:virtualModelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsCreateSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list5(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect3(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models edit","ai-gateway virtual-models update"),edit2(client,args));case"delete":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),0):(telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models remove","ai-gateway virtual-models delete"),remove5(client,args));case"restore":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),0):(telemetry.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),output_manager_default.print(help(virtualModelsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk23=__toESM(require_source(),1);import{homedir}from"node:os";import{existsSync as existsSync2}from"node:fs";import{dirname as dirname5,resolve as resolve2}from"node:path";var import_chalk19=__toESM(require_source(),1);import{dirname,join,resolve}from"node:path";var METADATA_FILE=".aider.model.metadata.json",SETTINGS_FILE=".aider.model.settings.yml";function aiderModelId(gatewayModelId){return`openai/${gatewayModelId}`}function chatModels(ctx){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&m.context_window)}function costPerToken(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelMetadata(models3){let entries={};for(let model of models3){let input=costPerToken(model.pricing?.input),output=costPerToken(model.pricing?.output);entries[aiderModelId(model.id)]={max_input_tokens:model.context_window,...model.max_tokens?{max_output_tokens:model.max_tokens,max_tokens:model.max_tokens}:{},...input===void 0?{}:{input_cost_per_token:input},...output===void 0?{}:{output_cost_per_token:output},litellm_provider:"openai",mode:"chat"}}return entries}function modelSettings(models3){return models3.map(model=>({name:aiderModelId(model.id),settings:{edit_format:"diff",use_repo_map:!0}}))}function asObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertNamedYamlList(current,entries){let loaded=current?.trim()?load(current):[];if(loaded!=null&&!Array.isArray(loaded))throw new Error("existing file is not a YAML list");let list7=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list7.forEach((item,i)=>{let name=asObject(item).name;name!==void 0&&!indexByName.has(name)&&indexByName.set(name,i)});for(let{name,settings}of entries){let index=indexByName.get(name);index===void 0?(indexByName.set(name,list7.length),list7.push({name,...settings})):list7[index]={name,...asObject(list7[index]),...settings}}return dump(list7,{lineWidth:120})}var aider={id:"aider",displayName:"Aider",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return await pathExists(join(home,".aider"))||pathExists(join(home,".aider.conf.yml"))},configPath(ctx){return ctx.overrides?.aider??join(ctx.home,".aider.conf.yml")},buildPlan(ctx){let model=aiderModelId(ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL),path=this.configPath(ctx),dir=dirname(path),metadataPath=join(dir,METADATA_FILE),settingsPath=join(dir,SETTINGS_FILE),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=chatModels(ctx),needsExplicitPaths=models3.length>0&&resolve(dir)!==resolve(ctx.home);return{fileChanges:[{path,label:"Aider config",format:"yaml",transform:current=>{let config=asObject(load(current??"")??{});return config["openai-api-base"]=base,config.model=model,needsExplicitPaths&&(config["model-metadata-file"]=metadataPath,config["model-settings-file"]=settingsPath),dump(config,{lineWidth:120})}},...models3.length?[{path:metadataPath,label:"Aider model metadata",format:"json",transform:current=>mergeJson(current,modelMetadata(models3))},{path:settingsPath,label:"Aider model settings",format:"yaml",transform:current=>upsertNamedYamlList(current,modelSettings(models3))}]:[]],envExports:[{name:"AIDER_OPENAI_API_KEY",value:ctx.apiKey}],notes:[`Aider will use the gateway with ${model}; switch with \`aider --model openai/<gateway-model-id>\` or /model in a session.`,...models3.length?[`${models3.length} gateway models are registered in ${METADATA_FILE}; re-run setup to pick up models added since.`]:[],"Open a new terminal first so AIDER_OPENAI_API_KEY is loaded."]}}};import{join as join2}from"node:path";var cline={id:"cline",displayName:"Cline",needsTopModels:!0,async detect(home){return pathExists(join2(home,".cline"))},configPath(ctx){return ctx.overrides?.cline??join2(ctx.home,".cline","data","settings","providers.json")},buildPlan(ctx){let path=this.configPath(ctx),defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,keepUpdatedAt=current=>{try{let providers2=JSON.parse(current)?.providers?.["vercel-ai-gateway"],settings=providers2?.settings;if((ctx.apiKey===KEY_PLACEHOLDER||settings?.apiKey===ctx.apiKey)&&settings?.provider==="vercel-ai-gateway"&&settings?.model===defaultModel&&providers2?.tokenSource==="manual"&&typeof providers2?.updatedAt=="string")return providers2.updatedAt}catch{}};return{fileChanges:[{path,label:"Cline providers",format:"json",mode:384,transform:current=>{let isNew=!current||!current.trim(),updatedAt=(current&&keepUpdatedAt(current))??new Date().toISOString();return mergeJson(current,{...isNew?{version:1}:{},lastUsedProvider:"vercel-ai-gateway",providers:{"vercel-ai-gateway":{settings:{provider:"vercel-ai-gateway",apiKey:ctx.apiKey,model:defaultModel},updatedAt,tokenSource:"manual"}}})}}],envExports:[],notes:[`Cline will use its native Vercel AI Gateway provider with ${defaultModel}; switch models in-session or with \`cline auth -p vercel-ai-gateway -m <gateway-model-id>\`.`,"In the VS Code extension, pick the Vercel AI Gateway provider under Settings \u2192 API Provider."]}}};import{dirname as dirname2,join as join3}from"node:path";function agenticModels(ctx,opts={}){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&(m.tags??[]).includes("tool-use")&&!m.deprecated_at&&(!opts.requireContextWindow||!!m.context_window)&&(!opts.requireMaxTokens||!!m.max_tokens))}function defaultFirst(models3){let rest=models3.filter(m=>m.id!==GATEWAY_DEFAULT_MODEL).sort((a,b)=>a.id.localeCompare(b.id)),preferred=models3.find(m=>m.id===GATEWAY_DEFAULT_MODEL);return preferred?[preferred,...rest]:rest}function shortlistModels(ctx,opts={}){let{creator,creatorLimit=5,overallLimit=10,ensureDefault}=opts,eligible=agenticModels(ctx,opts),byId=new Map(eligible.map(m=>[m.id,m])),picked=[],take=m=>{m&&!picked.includes(m)&&picked.push(m)};if(creator){let rank=new Map((ctx.topModels??[]).map((t,i)=>[t.id,i])),unranked=Number.MAX_SAFE_INTEGER;eligible.filter(m=>m.id.startsWith(`${creator}/`)).sort((a,b)=>(rank.get(a.id)??unranked)-(rank.get(b.id)??unranked)||(b.released??b.created??0)-(a.released??a.created??0)||a.id.localeCompare(b.id)).slice(0,creatorLimit).forEach(take)}let overallStart=picked.length,room=()=>picked.length-overallStart<overallLimit;if(ensureDefault&&take(byId.get(GATEWAY_DEFAULT_MODEL)),ctx.topModels)for(let top of ctx.topModels){if(!room())break;take(byId.get(top.id))}else for(let m of defaultFirst(eligible)){if(!room())break;take(m)}return picked}var FALLBACK_MODELS=[GATEWAY_DEFAULT_MODEL];function chatModelIds(ctx){let ids=shortlistModels(ctx).map(m=>m.id);return ids.length?ids:FALLBACK_MODELS}var ONBOARDING_MARKER=".onboarding_complete",SECRET_REF="${{ secrets.AI_GATEWAY_API_KEY }}";function asObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var continueCli={id:"continue",displayName:"Continue CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join3(home,".continue"))},configPath(ctx){return ctx.overrides?.continue??join3(ctx.home,".continue","config.yaml")},buildPlan(ctx){let apiBase=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,configPath=this.configPath(ctx),modelIds=chatModelIds(ctx);return{fileChanges:[{path:configPath,label:"Continue config",format:"yaml",transform:current=>{let config=asObject2(load(current??"")??{});typeof config.name!="string"&&(config.name="Local Config"),typeof config.version!="string"&&(config.version="1.0.0"),typeof config.schema!="string"&&(config.schema="v1");let models3=Array.isArray(config.models)?[...config.models]:[],writtenIds=new Set(modelIds),kept=models3.filter(entry2=>{let e=asObject2(entry2);return!(e.apiKey===SECRET_REF||writtenIds.has(e.name))}),entries=modelIds.map(id=>({...asObject2(models3.find(m=>asObject2(m).name===id)),name:id,provider:"openai",model:id,apiBase,apiKey:SECRET_REF}));return config.models=[...kept,...entries],dump(config,{lineWidth:120})}},{path:join3(dirname2(configPath),ONBOARDING_MARKER),label:"Continue onboarding marker",format:"text",transform:current=>current??`${new Date().toISOString()}
|
|
51
51
|
`}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[modelIds.length>1?`Continue CLI will use the gateway with ${modelIds[0]}; /model lists the top ${modelIds.length} gateway models -- re-run setup to refresh the list.`:`Continue CLI will use the gateway with ${GATEWAY_DEFAULT_MODEL}; the gateway catalogue could not be fetched, so /model lists only that model until setup is re-run.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded, then run \`cn\`.`,`If \`cn\` ever asks for an Anthropic API key, ${ONBOARDING_MARKER} is missing next to the config -- re-run setup rather than answering the prompt, which would overwrite the gateway models.`]}}};import{join as join4}from"node:path";function copilotDir(home){let dir=process.env.COPILOT_HOME;return dir&&dir.trim()?dir:join4(home,".copilot")}var copilot={id:"copilot",needsTopModels:!0,displayName:"GitHub Copilot CLI",async detect(home){return pathExists(copilotDir(home))},configPath(ctx){return ctx.overrides?.copilot??copilotDir(ctx.home)},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[],envExports:[{name:"COPILOT_PROVIDER_BASE_URL",value:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),plain:!0},{name:"COPILOT_PROVIDER_API_KEY",value:ctx.apiKey},{name:"COPILOT_MODEL",value:defaultModel,plain:!0}],notes:[`Copilot CLI will use the gateway with ${defaultModel}; set COPILOT_MODEL (or pass --model) to any gateway model id to switch.`,"Open a new terminal so the COPILOT_* variables are loaded; GitHub sign-in is not required in this mode."]}}};import{isAbsolute,join as join5}from"node:path";var SMALL_MODEL="anthropic/claude-haiku-4.5";function crushConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute(xdg)?xdg:join5(home,".config");return join5(base,"crush")}var crush={id:"crush",needsTopModels:!0,displayName:"Crush",async detect(home){return await pathExists(crushConfigDir(home))||pathExists(join5(home,".local","share","crush"))},configPath(ctx){return ctx.overrides?.crush??join5(crushConfigDir(ctx.home),"crush.json")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,base=ctx.baseUrlOverride?.trim();return{fileChanges:[{path:this.configPath(ctx),label:"Crush config",format:"json",transform:current=>mergeJson(current,{providers:{vercel:{api_key:`$${GATEWAY_API_KEY_ENV}`,...base?{base_url:base}:{}}},models:{large:{provider:"vercel",model:defaultModel},small:{provider:"vercel",model:SMALL_MODEL}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Crush will use its native Vercel AI Gateway provider with ${defaultModel} (${SMALL_MODEL} for small tasks); switch models in-session with ctrl+p.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join6}from"node:path";var cursor={id:"cursor",displayName:"Cursor",async detect(home){return pathExists(join6(home,".cursor"))},configPath(ctx){return ctx.overrides?.cursor??join6(ctx.home,".cursor")},buildPlan(ctx){return{fileChanges:[],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],actionRequired:!0,notes:["Cursor keeps its API-key settings in the app itself, so finish the setup there:","1. Open Cursor \u2192 Settings (Cmd+Shift+J) \u2192 Models.",`2. Under OpenAI API Key: paste your gateway key, then enable "Override OpenAI Base URL" and set it to ${ctx.baseUrlOverride??GATEWAY_CURSOR_BASE_URL}`,'3. Copy the key from a new terminal without echoing it: printf %s "$AI_GATEWAY_API_KEY" | pbcopy','4. Use "Add model" to add gateway model ids you want in the picker (e.g. anthropic/claude-fable-5, openai/gpt-5.6-sol).',"While the override is on, Cursor's built-in non-OpenAI models stop working \u2014 use gateway model ids for everything, or toggle the override off to go back.","Cursor chats are stored by its backend, so there are no local sessions to migrate.","Cursor limitations: Tab completions never use custom keys, and Agent/Auto modes may bypass the override."]}}};import{join as join7}from"node:path";var PROVIDER_KEY="vercel-ai-gateway";function profiles(models3){let out={};for(let model of models3)out[model.id]={name:model.name,...model.context_window?{max_input_tokens:model.context_window}:{},...model.max_tokens?{max_output_tokens:model.max_tokens}:{}};return out}var deepagents={id:"deepagents",displayName:"Deep Agents CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join7(home,".deepagents"))},configPath(ctx){return ctx.overrides?.deepagents??join7(ctx.home,".deepagents","config.toml")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx),ids=models3.length?models3.map(m=>m.id):[GATEWAY_DEFAULT_MODEL];return{fileChanges:[{path:this.configPath(ctx),label:"Deep Agents config",format:"toml",transform:current=>mergeToml(current,{models:{default:`${PROVIDER_KEY}:${ids[0]}`,providers:{[PROVIDER_KEY]:{display_name:"Vercel AI Gateway",api_key_env:"AI_GATEWAY_API_KEY",base_url:baseUrl,class_path:"langchain_openai:ChatOpenAI",models:ids,...models3.length?{profile:profiles(models3)}:{},params:{use_responses_api:!1}}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Deep Agents (dcode) will default to ${PROVIDER_KEY}:${ids[0]}.`,...models3.length?[`The top ${models3.length} gateway models are in the /model switcher, which filters as you type. Any other gateway id also works directly: /model ${PROVIDER_KEY}:<gateway-model-id>.`]:[],"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{join as join8}from"node:path";var PROVIDER_KEY2="vercel-ai-gateway",DEFAULT_MODEL="deepseek/deepseek-v4-flash";function asObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function dshDir(home){let dir=process.env.DSH_HOME;return dir&&dir.trim()?dir:join8(home,".dsh")}var deepseek={id:"deepseek",displayName:"DeepSeek Harness",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(dshDir(home))},configPath(ctx){return ctx.overrides?.deepseek??join8(dshDir(ctx.home),"settings.yaml")},buildPlan(ctx){let path=this.configPath(ctx),models3=shortlistModels(ctx,{creator:"deepseek"}).map(m=>({id:m.id,name:m.name})),defaultId=models3[0]?.id??DEFAULT_MODEL;return{fileChanges:[{path,label:"DeepSeek Harness settings",format:"yaml",transform:current=>{let config=asObject3(load(current??"")??{}),llm=asObject3(config["llm-pi-ai"]),providers2=asObject3(llm.providers),entry2=asObject3(providers2[PROVIDER_KEY2]);return delete entry2.api,delete entry2.baseURL,delete entry2.models,providers2[PROVIDER_KEY2]={...entry2,apiKeyEnv:GATEWAY_API_KEY_ENV,...models3.length?{models:models3}:{}},llm.providers=providers2,config["llm-pi-ai"]=llm,config["agent-default-model"]={provider:PROVIDER_KEY2,model:defaultId},dump(config,{lineWidth:120})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[models3.length?`DeepSeek Harness will default to ${PROVIDER_KEY2}/${defaultId}; the shortlist in settings.yaml is the picker \u2014 add any gateway model id there.`:`DeepSeek Harness will default to ${PROVIDER_KEY2}/${DEFAULT_MODEL}; every gateway model pi-ai ships is selectable with /model \u2014 no per-model config needed.`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, then run \`dsh\` \u2014 headless runs use the gateway route too.`]}}};import{join as join9}from"node:path";var API_KEY_REF="${AI_GATEWAY_API_KEY}",PROVIDER="generic-chat-completion-api",FALLBACK_MAX_OUTPUT_TOKENS=64e3;function gatewayEntries(ctx,baseUrl){let models3=shortlistModels(ctx,{requireMaxTokens:!0});return models3.length?models3.map(m=>entry(m.id,baseUrl,m.max_tokens)):[entry(GATEWAY_DEFAULT_MODEL,baseUrl,FALLBACK_MAX_OUTPUT_TOKENS)]}function entry(model,baseUrl,maxOutputTokens){return{model,displayName:model,baseUrl,apiKey:API_KEY_REF,provider:PROVIDER,maxOutputTokens}}function isOurs(value){return value?.apiKey===API_KEY_REF}function mergeCustomModels(current,entries){let existing;try{existing=current?.trim()?JSON.parse(current):{}}catch(err){throw new Error(`existing file is not valid JSON (${err.message})`)}let currentModels=existing.customModels,kept=Array.isArray(currentModels)?currentModels.filter(m=>!isOurs(m)):[];return mergeJson(current,{customModels:[...kept,...entries]})}var droid={id:"droid",displayName:"Factory Droid",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join9(home,".factory"))},configPath(ctx){return ctx.overrides?.droid??join9(ctx.home,".factory","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,entries=gatewayEntries(ctx,baseUrl);return{fileChanges:[{path:this.configPath(ctx),label:"Factory Droid settings",format:"json",transform:current=>mergeCustomModels(current,entries)}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[entries.length>1?`The top ${entries.length} gateway models are in Droid's /model picker, leaderboard order -- re-run setup to refresh the list.`:`Factory Droid gets ${GATEWAY_DEFAULT_MODEL}; pick it with /model in a session or \`droid exec -m ${GATEWAY_DEFAULT_MODEL}\`.`,`\`droid exec\` defaults to a Factory-hosted model this key cannot use -- always pass \`-m ${entries[0]?.model??GATEWAY_DEFAULT_MODEL}\` (or another gateway model above).`]}}};init_dist();import{dirname as dirname3,join as join10}from"node:path";var PROVIDER_ID="vercel-ai-gateway";function asObject4(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertById(list7,merge){let index=list7.findIndex(item=>asObject4(item).id===PROVIDER_ID),merged={id:PROVIDER_ID,...merge(asObject4(list7[index]))};return index===-1?[...list7,merged]:list7.map((item,i)=>i===index?merged:item)}var forge={id:"forge",needsTopModels:!0,displayName:"ForgeCode",async detect(home){return pathExists(join10(home,".forge"))},configPath(ctx){return ctx.overrides?.forge??join10(ctx.home,".forge",".forge.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:configPath,label:"ForgeCode config",format:"toml",transform:current=>{let config=current?.trim()?parse(current):{},providers2=Array.isArray(config.providers)?config.providers:[];return config.providers=upsertById(providers2,existing=>({...existing,url:`${base}/chat/completions`,models:`${base}/models`,api_key_vars:GATEWAY_API_KEY_ENV,response_type:"OpenAI",auth_methods:["api_key"]})),config.session={...asObject4(config.session),provider_id:PROVIDER_ID,model_id:defaultModel},`${stringify(config)}
|
|
52
52
|
`}},{path:join10(dirname3(configPath),".credentials.json"),label:"ForgeCode credentials",format:"json",mode:384,transform:current=>{let parsed=current?.trim()?JSON.parse(current):[];if(!Array.isArray(parsed))throw new Error("existing file is not a JSON array");return JSON.stringify(upsertById(parsed,existing=>({...existing,auth_details:{...asObject4(existing.auth_details),api_key:ctx.apiKey}})))}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`ForgeCode will use the gateway with ${defaultModel}; switch models in-session with :config-model (the picker fills from the gateway catalog).`,"Current ForgeCode reads the key from ~/.forge/.credentials.json (0600), not the environment, so the key is stored there."]}}};import{join as join11}from"node:path";var fx={id:"fx",displayName:"fx",async detect(home){return pathExists(join11(home,".fx"))},configPath(ctx){return ctx.overrides?.fx??join11(ctx.home,".fx","settings.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"fx settings",format:"json",transform:current=>mergeJson(current,{credential_source:"ai_gateway_api_key"})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`fx will authenticate with ${GATEWAY_API_KEY_ENV}; open a new terminal so it is loaded, then confirm with fx status.`,...ctx.tokenPass?[]:["Pick a model with /model or browse the catalog with /models \u2014 the whole gateway catalog is available."]]}}};import{dirname as dirname4,join as join12}from"node:path";var PROVIDER_ID2="vercel_ai_gateway";function contextLimits(ctx){return defaultFirst(agenticModels(ctx,{requireContextWindow:!0})).map(m=>({name:m.id,context_limit:m.context_window}))}function asObject5(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function gooseConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join12(home,".config");return join12(base,"goose")}var goose={id:"goose",needsTopModels:!0,displayName:"Goose",needsModelCatalogue:!0,async detect(home){return pathExists(gooseConfigDir(home))},configPath(ctx){return ctx.overrides?.goose??join12(gooseConfigDir(ctx.home),"config.yaml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=contextLimits(ctx);return{fileChanges:[{path:configPath,label:"Goose config",format:"yaml",transform:current=>{let config=asObject5(load(current??"")??{});return config.GOOSE_PROVIDER=PROVIDER_ID2,config.GOOSE_MODEL=defaultModel,dump(config,{lineWidth:120})}},{path:join12(dirname4(configPath),"custom_providers",`${PROVIDER_ID2}.json`),label:"Goose provider",format:"json",transform:current=>mergeJson(current,{name:PROVIDER_ID2,engine:"openai",display_name:"Vercel AI Gateway",api_key_env:GATEWAY_API_KEY_ENV,base_url:`${base}/chat/completions`,...models3.length?{models:models3}:{}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Goose will use the gateway with ${defaultModel}; switch models with GOOSE_MODEL in config.yaml or \`goose configure\` (the picker fills from the gateway catalog).`,...models3.length?[`Context limits for ${models3.length} gateway models are recorded in custom_providers/${PROVIDER_ID2}.json; without them Goose sizes most models at 128k. Re-run setup to refresh.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};init_dist();import{isAbsolute as isAbsolute2,join as join13}from"node:path";import{isDeepStrictEqual}from"node:util";var PROVIDER_NAME="vercel-ai-gateway";function isTable(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function gptmeConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute2(xdg)?xdg:join13(home,".config");return join13(base,"gptme")}var gptme={id:"gptme",needsTopModels:!0,displayName:"gptme",async detect(home){return pathExists(gptmeConfigDir(home))},configPath(ctx){return ctx.overrides?.gptme??join13(gptmeConfigDir(ctx.home),"config.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path,label:"gptme config",format:"toml",transform:current=>{let doc={};if(current&¤t.trim())try{doc=parse(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],entry2={name:PROVIDER_NAME,base_url:baseUrl,api_key_env:GATEWAY_API_KEY_ENV,default_model:defaultModel},index=providers2.findIndex(value=>isTable(value)&&value.name===PROVIDER_NAME);index===-1?providers2.push(entry2):providers2[index]={...providers2[index],...entry2};let desired={...doc,providers:providers2,models:{...isTable(doc.models)?doc.models:{},default:`${PROVIDER_NAME}/${defaultModel}`}};return current&&isDeepStrictEqual(doc,desired)?current:`${stringify(desired)}
|
|
53
53
|
`}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`gptme will default to ${PROVIDER_NAME}/${defaultModel}; run other gateway models with -m ${PROVIDER_NAME}/<gateway-model-id>.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join14}from"node:path";var MODEL_KEY="vercel-ai-gateway",DEFAULT_MODEL2="xai/grok-4.6",GROK_KEY_ENV="GROK_CODE_XAI_API_KEY";function grokDir(home){let dir=process.env.GROK_HOME;return dir&&dir.trim()?dir:join14(home,".grok")}var grok={id:"grok",displayName:"Grok Build",async detect(home){return pathExists(grokDir(home))},configPath(ctx){return ctx.overrides?.grok??join14(grokDir(ctx.home),"config.toml")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path,label:"Grok Build config",format:"toml",transform:current=>mergeToml(current,{endpoints:{models_base_url:baseUrl},models:{default:MODEL_KEY},model:{[MODEL_KEY]:{model:DEFAULT_MODEL2,base_url:baseUrl,name:"Grok 4.6 (Vercel AI Gateway)",env_key:GATEWAY_API_KEY_ENV,context_window:5e5}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey},{name:GROK_KEY_ENV,value:ctx.apiKey}],notes:[`Grok Build will default to ${DEFAULT_MODEL2} through the gateway; Ctrl+M (or /model) lists the full catalog \u2014 open a new terminal first so ${GROK_KEY_ENV} is loaded for those models.`,"If you previously ran `grok login`, run `grok logout` so the stored xAI session does not shadow the gateway key."]}}};import{join as join15}from"node:path";var PROVIDER_KEY3="vercel-ai-gateway";function asObject6(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var hermes={id:"hermes",displayName:"Hermes",needsTopModels:!0,async detect(home){return pathExists(join15(home,".hermes"))},configPath(ctx){return ctx.overrides?.hermes??join15(ctx.home,".hermes","config.yaml")},buildPlan(ctx){let path=this.configPath(ctx),api=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path,label:"Hermes config",format:"yaml",transform:current=>{let config=asObject6(load(current??"")??{}),providers2=asObject6(config.providers);return providers2[PROVIDER_KEY3]={...asObject6(providers2[PROVIDER_KEY3]),api,key_env:"AI_GATEWAY_API_KEY",transport:"chat_completions",discover_models:!0},config.providers=providers2,config.model={...asObject6(config.model),provider:`custom:${PROVIDER_KEY3}`,default:defaultModel},dump(config,{lineWidth:120})}}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Hermes will use the gateway with ${defaultModel}; switch models in-session with /model custom:${PROVIDER_KEY3}:<gateway-model-id>.`,"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{isAbsolute as isAbsolute3,join as join16}from"node:path";var PROFILE_NAME="vercel-ai-gateway",MODEL_PROFILE_PREFIX="vercel-",PROVIDER_LABEL="Vercel AI Gateway";function junieHome(home){let env=process.env.JUNIE_HOME;return env&&isAbsolute3(env)?env:join16(home,".junie")}function profileId(modelId){return`${MODEL_PROFILE_PREFIX}${modelId.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}var junie={id:"junie",displayName:"Junie CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(junieHome(home))},configPath(ctx){return ctx.overrides?.junie??join16(junieHome(ctx.home),"models",`${PROFILE_NAME}.json`)},buildPlan(ctx){let baseUrl=`${(ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL).replace(/\/+$/,"")}/chat/completions`,configPath=this.configPath(ctx),models3=shortlistModels(ctx),stableId=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,stableModel=models3.find(m=>m.id===stableId),changes=[{path:configPath,label:"Junie model profile",format:"json",transform:current=>{let isNew=!current||!current.trim();return mergeJson(current,{...isNew?{id:stableId,providerName:PROVIDER_LABEL,...stableModel?{displayName:stableModel.name,...stableModel.context_window?{maxContextLength:stableModel.context_window}:{}}:{}}:{},baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}"})}}];for(let model of models3)changes.push({path:join16(configPath,"..",`${profileId(model.id)}.json`),label:`Junie model profile (${model.id})`,format:"json",transform:current=>mergeJson(current,{id:model.id,displayName:model.name,providerName:PROVIDER_LABEL,baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}",...model.context_window?{maxContextLength:model.context_window}:{}})});return{fileChanges:changes,envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Run \`junie --model custom:${PROFILE_NAME}\` or pick the model with /model in a session; the profile defaults to ${stableId} \u2014 change its \`id\` to any gateway model.`,...models3.length?[`The top ${models3.length} gateway models are also written as their own \`custom:${MODEL_PROFILE_PREFIX}<model-id>\` profiles, grouped under ${PROVIDER_LABEL} in /model after the built-in providers \u2014 re-run setup to refresh the shortlist; profiles from earlier runs stay in place. Junie prices custom profiles at 0; it has no config hook for real rates.`]:[],`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded \u2014 Junie resolves it when the profile loads and errors if it is unset.`]}}};import{join as join17}from"node:path";function kiloConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join17(home,".config");return join17(base,"kilo")}var kilo={id:"kilo",displayName:"Kilo Code",async detect(home){return pathExists(kiloConfigDir(home))},configPath(ctx){return ctx.overrides?.kilo??join17(kiloConfigDir(ctx.home),"kilo.json")},buildPlan(ctx){let path=this.configPath(ctx),baseURL=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path,label:"Kilo Code config",format:"json",transform:current=>mergeJson(current,{provider:{"openai-compatible":{options:{apiKey:"{env:AI_GATEWAY_API_KEY}",baseURL}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Kilo Code lists the gateway catalog automatically \u2014 pick a model with /models in a session (ids look like openai-compatible/anthropic/claude-fable-5).","If you keep your Kilo config in kilo.jsonc instead of kilo.json, merge the new provider block into it manually."]}}};init_dist();import{join as join18}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var PROVIDER_KEY4="vercel-ai-gateway",PREFERRED_MODEL="moonshotai/kimi-k3";function isTable2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function kimiDir(home){let dir=process.env.KIMI_SHARE_DIR;return dir&&dir.trim()?dir:join18(home,".kimi")}function shortlist(ctx){return shortlistModels(ctx,{creator:"moonshotai",requireContextWindow:!0})}function defaultModelKey(models3){return models3[0]?.id??PREFERRED_MODEL}var kimi={id:"kimi",displayName:"Kimi CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(kimiDir(home))},configPath(ctx){return ctx.overrides?.kimi??join18(kimiDir(ctx.home),"config.toml")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist(ctx),defaultKey=defaultModelKey(models3);return{fileChanges:[{path,label:"Kimi CLI config",format:"toml",mode:384,transform:current=>{let doc={};if(current&¤t.trim())try{doc=parse(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=isTable2(doc.providers)?doc.providers:{},keptModels=Object.fromEntries(Object.entries(isTable2(doc.models)?doc.models:{}).filter(([,value])=>!(isTable2(value)&&value.provider===PROVIDER_KEY4))),ours={};for(let model of models3)ours[model.id]={provider:PROVIDER_KEY4,model:model.id,max_context_size:model.context_window,display_name:model.name};models3.length||(ours[defaultKey]={provider:PROVIDER_KEY4,model:defaultKey,max_context_size:128e3});let desired={...doc,default_model:defaultKey,providers:{...providers2,[PROVIDER_KEY4]:{...isTable2(providers2[PROVIDER_KEY4])?providers2[PROVIDER_KEY4]:{},type:"openai_legacy",base_url:baseUrl,api_key:ctx.apiKey}},models:{...keptModels,...ours}};return current&&isDeepStrictEqual2(doc,desired)?current:`${stringify(desired)}
|
|
@@ -109,15 +109,15 @@ ${sections.join(`
|
|
|
109
109
|
`);for(let result of migration.results)printAlignedLabel("Sessions",`Copied ${result.copied} ${result.copied===1?"session":"sessions"} for ${result.agent}; originals unchanged`,gutter?{gutter:"\u2713"}:void 0),gutter=!1;for(let error of migration.errors)printWarning(`Could not migrate ${error.agent} sessions: ${error.message}. Original sessions were left unchanged.`)}function emitAgentPrompt(client,prompt,writeToStdout,subject){let copied=copyToClipboard(prompt);writeToStdout?(printStatus(`Generated the ${subject} prompt${copied?" (also copied to clipboard)":""}.`),client.stdout.write(`${prompt}
|
|
110
110
|
`)):copied?printStatus(`Prompt copied. Paste it into your coding agent for the ${subject}.`):(printStatus("Could not access the clipboard. Prompt printed below:"),client.stdout.write(`${prompt}
|
|
111
111
|
`))}function buildConsentCommand(argv,consentFlags){let args=stripSensitiveAuthArgs(argv.slice(2)),redacted=[];for(let i=0;i<args.length;i++){let arg=args[i];if(arg==="--key"){redacted.push(arg,"<key>"),i+1<args.length&&!args[i+1].startsWith("-")&&i++;continue}if(arg.startsWith("--key=")){redacted.push("--key=<key>");continue}redacted.push(arg)}return`${packageName} ${redacted.join(" ")} ${consentFlags}`.trim()}function failConsent(client,machine,warnings,skipped){let consentFlags=skipped.map(s=>`--agent ${s.target}`).join(" "),message=`All selected agents need explicit consent to configure. Pass ${consentFlags} (or --all) to consent, or run interactively without --yes.`;return machine?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:AGENT_REASON.REQUIRES_CONSENT,message,warnings,skipped,next:[{command:buildConsentCommand(renameOptionInArgs(client.argv,"--budget","--amount"),consentFlags)}]},null,2)}
|
|
112
|
-
`):output_manager_default.error(message),{exitCode:1,outcome:"failed"}}function isValidBaseUrl(value){try{let{protocol}=new URL(value);return protocol==="http:"||protocol==="https:"}catch{return!1}}function failValidation(client,machine,reason,message){return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}),output_manager_default.error(message),{exitCode:1,outcome:"failed"}}var AiGatewayCodingAgentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}};var COMMAND_CONFIG6={setup:getCommandAliases(setupSubcommand)};async function codingAgents(client){let telemetry=new AiGatewayCodingAgentsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(codingAgentsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG6),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommand),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:codingAgentsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommandOriginal),printHelp(setupSubcommand),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG6)),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk24=__toESM(require_source(),1);var AiGatewayModelsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVirtual(virtual){virtual&&this.trackCliFlag("virtual")}trackCliFlagNoVirtual(noVirtual){noVirtual&&this.trackCliFlag("no-virtual")}};async function list6(client,argv){let telemetry=new AiGatewayModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs;telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagVirtual(opts["--virtual"]),telemetry.trackCliFlagNoVirtual(opts["--no-virtual"]);let onlyVirtual=!!opts["--virtual"],hideVirtual=!!opts["--no-virtual"];if(onlyVirtual&&hideVirtual)return output_manager_default.error("Pass only one of --virtual and --no-virtual."),2;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching models",fetch:()=>fetchModels(client,{onlyVirtual,hideVirtual}),toJSON:models3=>({models:models3}),isEmpty:models3=>models3.length===0,emptyMessage:onlyVirtual?"No virtual models found.":"No models found.",header:()=>"Models",renderTable:printModelsTable}):(output_manager_default.error(formatResult.error),2)}async function fetchModels(client,filter){let fetchVirtual=(filter.hideVirtual?void 0:await client.resolveCurrentTeam({ask:filter.onlyVirtual}))&&!filter.hideVirtual?filter.onlyVirtual?listVirtualModels(client):listVirtualModels(client).catch(()=>[]):Promise.resolve([]),[catalog,virtualModels2]=await Promise.all([filter.onlyVirtual?Promise.resolve([]):listModels(client),fetchVirtual]);return[...filter.hideVirtual?catalog.filter(model=>!model.id.startsWith("vmc/")):catalog.filter(model=>!virtualModels2.some(vmc=>`vmc/${vmc.virtualModelSlug}`===model.id)),...virtualModels2.map(vmc=>({id:`vmc/${vmc.virtualModelSlug}`,object:"model",owned_by:"you",name:vmc.displayName??vmc.virtualModelSlug,type:"virtual"}))]}function printModelsTable(models3){return`${table([["id","name","owner","type"].map(header=>import_chalk24.default.gray(header)),...models3.map(model=>[model.id,model.name??import_chalk24.default.gray("\u2013"),model.owned_by??import_chalk24.default.gray("\u2013"),model.type??import_chalk24.default.gray("\u2013")])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
112
|
+
`):output_manager_default.error(message),{exitCode:1,outcome:"failed"}}function isValidBaseUrl(value){try{let{protocol}=new URL(value);return protocol==="http:"||protocol==="https:"}catch{return!1}}function failValidation(client,machine,reason,message){return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}),output_manager_default.error(message),{exitCode:1,outcome:"failed"}}var AiGatewayCodingAgentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}};var COMMAND_CONFIG6={setup:getCommandAliases(setupSubcommand)};async function codingAgents(client){let telemetry=new AiGatewayCodingAgentsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(codingAgentsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG6),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommand),output_manager_default.print(help(codingAgentsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:codingAgentsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommandOriginal),printHelp(setupSubcommand),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG6)),output_manager_default.print(help(codingAgentsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk24=__toESM(require_source(),1);var AiGatewayModelsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVirtual(virtual){virtual&&this.trackCliFlag("virtual")}trackCliFlagNoVirtual(noVirtual){noVirtual&&this.trackCliFlag("no-virtual")}};async function list6(client,argv){let telemetry=new AiGatewayModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs;telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagVirtual(opts["--virtual"]),telemetry.trackCliFlagNoVirtual(opts["--no-virtual"]);let onlyVirtual=!!opts["--virtual"],hideVirtual=!!opts["--no-virtual"];if(onlyVirtual&&hideVirtual)return output_manager_default.error("Pass only one of --virtual and --no-virtual."),2;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching models",fetch:()=>fetchModels(client,{onlyVirtual,hideVirtual}),toJSON:models3=>({models:models3}),isEmpty:models3=>models3.length===0,emptyMessage:onlyVirtual?"No virtual models found.":"No models found.",header:()=>"Models",renderTable:printModelsTable}):(output_manager_default.error(formatResult.error),2)}async function fetchModels(client,filter){let fetchVirtual=(filter.hideVirtual?void 0:await client.resolveCurrentTeam({ask:filter.onlyVirtual}))&&!filter.hideVirtual?filter.onlyVirtual?listVirtualModels(client):listVirtualModels(client).catch(()=>[]):Promise.resolve([]),[catalog,virtualModels2]=await Promise.all([filter.onlyVirtual?Promise.resolve([]):listModels(client),fetchVirtual]);return[...filter.hideVirtual?catalog.filter(model=>!model.id.startsWith("vmc/")):catalog.filter(model=>!virtualModels2.some(vmc=>`vmc/${vmc.virtualModelSlug}`===model.id)),...virtualModels2.map(vmc=>({id:`vmc/${vmc.virtualModelSlug}`,object:"model",owned_by:"you",name:vmc.displayName??vmc.virtualModelSlug,type:"virtual"}))]}function printModelsTable(models3){return`${table([["id","name","owner","type"].map(header=>import_chalk24.default.gray(header)),...models3.map(model=>[model.id,model.name??import_chalk24.default.gray("\u2013"),model.owned_by??import_chalk24.default.gray("\u2013"),model.type??import_chalk24.default.gray("\u2013")])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
113
113
|
|
|
114
114
|
`}var import_chalk25=__toESM(require_source(),1);var AiGatewayModelsEndpointsTelemetryClient=class extends TelemetryClient{trackCliArgumentModel(model){model&&this.trackCliArgument({arg:"model",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function endpoints(client,argv){let telemetry=new AiGatewayModelsEndpointsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsEndpointsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts,args}=parsedArgs,model=args[0];if(telemetry.trackCliArgumentModel(model),telemetry.trackCliOptionFormat(opts["--format"]),!model)return output_manager_default.error(`Specify a model. Run ${getCommandName("ai-gateway models ls")} to see available models.`),2;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching endpoints for ${model}`,fetch:()=>listModelEndpoints(client,model),toJSON:data=>data,isEmpty:data=>(data?.endpoints??[]).length===0,emptyMessage:`No endpoints found for ${model}.`,header:data=>`Endpoints for ${data.id}`,renderTable:data=>printEndpointsTable(data.endpoints??[])}):(output_manager_default.error(formatResult.error),2)}var dash=()=>import_chalk25.default.gray("\u2013"),positive=value=>value!=null&&Number(value)>0,count=value=>value!=null&&value>0?String(value):dash();function inputPrice(p){if(positive(p?.prompt))return p?.prompt;if(positive(p?.image))return`${p?.image}/img`;let perSec=p?.video_duration_pricing?.map(v=>v.cost_per_second).filter(positive).sort((a,b)=>Number(a)-Number(b))[0];return perSec?`${perSec}/s`:positive(p?.speech_input_character_cost)?`${p?.speech_input_character_cost}/char`:positive(p?.request)?`${p?.request}/req`:dash()}function outputPrice(p){return positive(p?.completion)?p?.completion:positive(p?.image_output)?`${p?.image_output}/img`:dash()}function printEndpointsTable(list7){return`${table([["provider","context","input","output","p50 ttft","uptime"].map(header=>import_chalk25.default.gray(header)),...list7.map(e=>[e.provider_name,count(e.context_length),inputPrice(e.pricing),outputPrice(e.pricing),e.latency_last_1h?.p50!=null?`${Math.round(e.latency_last_1h.p50)}ms`:dash(),e.uptime_last_1h!=null?`${e.uptime_last_1h.toFixed(1)}%`:dash()])],{align:["l","r","r","r","r","r"],hsep:3}).replace(/^/gm," ")}
|
|
115
115
|
|
|
116
|
-
`}var AiGatewayModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandEndpoints(actual){this.trackCliSubcommand({subcommand:"endpoints",value:actual})}};var COMMAND_CONFIG7={list:getCommandAliases(modelsListSubcommand),endpoints:getCommandAliases(modelsEndpointsSubcommand)};async function models(client){let telemetry=new AiGatewayModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(modelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:modelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list6(client,args));case"endpoints":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsEndpointsSubcommand),0):(telemetry.trackCliSubcommandEndpoints(subcommandOriginal),endpoints(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk26=__toESM(require_source(),1);import{writeFile}from"node:fs/promises";var dash2=()=>import_chalk26.default.gray("\u2013");function outputPathFlag(flags){return flags["--output"]??flags["--out"]}function warnOutsideJsonResult(flags,format,warning2){warning2&&(format!=="json"||outputPathFlag(flags)!==void 0)&&output_manager_default.warning(warning2.message)}function resolveFormat(client,flags){let raw=flags["--format"],out=outputPathFlag(flags);if(raw!==void 0){let format=raw.toLowerCase();return format!=="table"&&format!=="json"&&format!=="csv"?{error:`Invalid format: "${raw}". Valid formats: table, json, csv`}:format==="table"&&out!==void 0?{error:"Cannot write the table view to a file. Use --format json or --format csv with --output."}:{format}}return out!==void 0?{format:"json"}:{format:!!client.stdout.isTTY&&!client.nonInteractive?"table":"json"}}function parseEnum(value,allowed,label){if(value===void 0)return{value:void 0};let normalized=value.toLowerCase(),match=allowed.find(member=>member.toLowerCase()===normalized);return match===void 0?{error:`Invalid ${label}: "${value}". Valid values: ${allowed.join(", ")}`}:{value:match}}async function fetchWithSpinner(fetch,spinnerText){output_manager_default.spinner(spinnerText);try{let data=await fetch();return output_manager_default.stopSpinner(),{data}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1};throw err}}async function writeToFile(client,out,content,label){let writeStamp=stamp_default();try{await writeFile(out,content)}catch(err){return output_manager_default.error(`Failed to write ${out}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Wrote ${label} to ${import_chalk26.default.bold(out)} ${writeStamp()}`),0}async function runTimeseriesLeaderboard(client,flags,telemetry,config){telemetry.trackCliOptionModality(flags["--modality"]),telemetry.trackCliOptionMetric(flags["--metric"]),telemetry.trackCliOptionDate(flags["--date"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliOptionOutput(flags["--output"]),telemetry.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format}=formatResult;warnOutsideJsonResult(flags,format,config.warning);let modalityResult=parseEnum(flags["--modality"],LEADERBOARD_MODALITIES,"modality");if("error"in modalityResult)return output_manager_default.error(modalityResult.error),1;let metricResult=parseEnum(flags["--metric"],LEADERBOARD_METRICS,"metric");if("error"in metricResult)return output_manager_default.error(metricResult.error),1;let modality=modalityResult.value,metric=metricResult.value;format==="table"&&canPrompt(client)&&(modality===void 0&&(modality=await client.input.select({message:"Modality",choices:LEADERBOARD_MODALITIES.map(value=>({name:value,value})),default:"all"})),metric===void 0&&(metric=await client.input.select({message:"Metric",choices:LEADERBOARD_METRICS.map(value=>({name:value,value})),default:"requests"})));let resolvedModality=modality??"all",resolvedMetric=metric??"requests";if(format==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result2)return result2.exitCode;let outputFile=outputPathFlag(flags);return outputFile!==void 0?writeToFile(client,outputFile,result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format==="json"){let outputFile=outputPathFlag(flags),content=`${JSON.stringify(outputFile===void 0?withWarnings(data,[config.warning]):data,null,2)}
|
|
116
|
+
`}var AiGatewayModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandEndpoints(actual){this.trackCliSubcommand({subcommand:"endpoints",value:actual})}};var COMMAND_CONFIG7={list:getCommandAliases(modelsListSubcommand),endpoints:getCommandAliases(modelsEndpointsSubcommand)};async function models(client){let telemetry=new AiGatewayModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(modelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),output_manager_default.print(help(modelsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:modelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list6(client,args));case"endpoints":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsEndpointsSubcommand),0):(telemetry.trackCliSubcommandEndpoints(subcommandOriginal),endpoints(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(modelsSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk26=__toESM(require_source(),1);import{writeFile}from"node:fs/promises";var dash2=()=>import_chalk26.default.gray("\u2013");function outputPathFlag(flags){return flags["--output"]??flags["--out"]}function warnOutsideJsonResult(flags,format,warning2){warning2&&(format!=="json"||outputPathFlag(flags)!==void 0)&&output_manager_default.warning(warning2.message)}function resolveFormat(client,flags){let raw=flags["--format"],out=outputPathFlag(flags);if(raw!==void 0){let format=raw.toLowerCase();return format!=="table"&&format!=="json"&&format!=="csv"?{error:`Invalid format: "${raw}". Valid formats: table, json, csv`}:format==="table"&&out!==void 0?{error:"Cannot write the table view to a file. Use --format json or --format csv with --output."}:{format}}return out!==void 0?{format:"json"}:{format:!!client.stdout.isTTY&&!client.nonInteractive?"table":"json"}}function parseEnum(value,allowed,label){if(value===void 0)return{value:void 0};let normalized=value.toLowerCase(),match=allowed.find(member=>member.toLowerCase()===normalized);return match===void 0?{error:`Invalid ${label}: "${value}". Valid values: ${allowed.join(", ")}`}:{value:match}}async function fetchWithSpinner(fetch,spinnerText){output_manager_default.spinner(spinnerText);try{let data=await fetch();return output_manager_default.stopSpinner(),{data}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1};throw err}}async function writeToFile(client,out,content,label){let writeStamp=stamp_default();try{await writeFile(out,content)}catch(err){return output_manager_default.error(`Failed to write ${out}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Wrote ${label} to ${import_chalk26.default.bold(out)} ${writeStamp()}`),0}async function runTimeseriesLeaderboard(client,flags,telemetry,config){telemetry.trackCliOptionModality(flags["--modality"]),telemetry.trackCliOptionMetric(flags["--metric"]),telemetry.trackCliOptionDate(flags["--date"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliOptionOutput(flags["--output"]),telemetry.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format}=formatResult;warnOutsideJsonResult(flags,format,config.warning);let modalityResult=parseEnum(flags["--modality"],LEADERBOARD_MODALITIES,"modality");if("error"in modalityResult)return output_manager_default.error(modalityResult.error),1;let metricResult=parseEnum(flags["--metric"],LEADERBOARD_METRICS,"metric");if("error"in metricResult)return output_manager_default.error(metricResult.error),1;let modality=modalityResult.value,metric=metricResult.value;format==="table"&&canPrompt(client)&&(modality===void 0&&(modality=await client.input.select({message:"Modality",choices:LEADERBOARD_MODALITIES.map(value=>({name:value,value})),default:"all"})),metric===void 0&&(metric=await client.input.select({message:"Metric",choices:LEADERBOARD_METRICS.map(value=>({name:value,value})),default:"requests"})));let resolvedModality=modality??"all",resolvedMetric=metric??"requests";if(format==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result2)return result2.exitCode;let outputFile=outputPathFlag(flags);return outputFile!==void 0?writeToFile(client,outputFile,result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format==="json"){let outputFile=outputPathFlag(flags),content=`${JSON.stringify(outputFile===void 0?withWarnings(data,[config.warning]):data,null,2)}
|
|
117
117
|
`;return outputFile!==void 0?writeToFile(client,outputFile,content,config.label):(client.stdout.write(content),0)}return renderTimeseriesTable(client,data,{metric:resolvedMetric,modality:resolvedModality,date:flags["--date"],entityLabel:config.entityLabel,label:config.label})}function renderTimeseriesTable(client,data,options){let rows=data.rows??[];if(options.date!==void 0&&!rows.some(r=>r.date===options.date)){let dates=availableDates(rows);return output_manager_default.error(`No data for ${options.date}.${dates.length?` Available dates: ${dates.slice(0,5).join(", ")}${dates.length>5?", \u2026":""}`:""}`),1}let filtered=filterTimeseries(rows,{metric:options.metric,date:options.date});if(filtered.length===0)return output_manager_default.log(`No ${options.label} data for ${options.metric}.`),0;let day=options.date??latestDate(rows);return output_manager_default.log(`${options.label} \xB7 ${import_chalk26.default.bold(options.metric)} \xB7 ${options.modality} \xB7 ${day}`),client.stdout.write(`${table([["#",options.entityLabel,"share"].map(header=>import_chalk26.default.gray(header)),...filtered.map((row,index)=>[String(index+1),row.name,`${row.share_percent.toFixed(2)}%`])],{align:["r","l","r"],hsep:3}).replace(/^/gm," ")}
|
|
118
118
|
`),printLicense(),0}async function runRankedLeaderboard(client,flags,telemetry,config){telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliOptionOutput(flags["--output"]),telemetry.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format}=formatResult;if(warnOutsideJsonResult(flags,format,config.warning),format==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result2)return result2.exitCode;let outputFile=outputPathFlag(flags);return outputFile!==void 0?writeToFile(client,outputFile,result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format==="json"){let outputFile=outputPathFlag(flags),content=`${JSON.stringify(outputFile===void 0?withWarnings(data,[config.warning]):data,null,2)}
|
|
119
119
|
`;return outputFile!==void 0?writeToFile(client,outputFile,content,config.label):(client.stdout.write(content),0)}return renderRankedTable(client,data,config.label)}function renderRankedTable(client,data,label){let rows=data.rows??[];if(rows.length===0)return output_manager_default.log(`No ${label} data.`),0;let lsStamp=stamp_default(),rankedBy=rows[0]?.ranked_by;return output_manager_default.log(`${label}${rankedBy?` \xB7 ${import_chalk26.default.bold(rankedBy)}`:""} ${lsStamp()}`),client.stdout.write(`${table([["#","name","description"].map(header=>import_chalk26.default.gray(header)),...rows.map(row=>[String(row.rank),row.name,row.description?row.description:dash2()])],{align:["r","l","l"],hsep:3}).replace(/^/gm," ")}
|
|
120
|
-
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk26.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags,json=wantsMachineReadableOutput(void 0,client.argv),resolvedFlags=flags["--out"]!==void 0&&flags["--output"]!==void 0&&parseWithShortFlag(argv,flagsSpecification,"-o",String)["--output"]===void 0?{...flags,"--output":void 0,"--out":parseWithShortFlag(argv,flagsSpecification,"-o","--out")["--out"]}:flags,outputPath=getRenamedOption({"--output":resolvedFlags["--output"],"--out":resolvedFlags["--out"]},"--output","--out",{json:!0});return"error"in outputPath?reportRenamedOptionError(client,outputPath.error,{json}):variant.kind==="timeseries"?runTimeseriesLeaderboard(client,resolvedFlags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label,warning:outputPath.warning}):runRankedLeaderboard(client,resolvedFlags,variant.telemetry,{dataset:variant.dataset,label:variant.label,warning:outputPath.warning})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG8={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG8)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG9={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var import_chalk29=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk27=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain){output_manager_default.spinner(`Adding domain ${domain} to project ${import_chalk27.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain})})).find(aliasTarget2=>aliasTarget2.domain===domain);return aliasTarget||new Error(`Adding domain '${domain}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init){try{return await client.fetch(url,init)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk28=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain){output_manager_default.spinner(`Removing domain ${domain} from project ${import_chalk28.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"to buy the domain; it returns the price and needed details, and charges nothing until a person approves the price"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add2(client,argv){let telemetry=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,force=opts["--force"];telemetry.trackCliFlagForce(force);let contextName=await getContextName(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd}`,next:[{command:cmd,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},2)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),2}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to ${import_chalk29.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk29.default.bold(domainName)} is already assigned to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk30=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,domains=args,hasMultipleInputDomains=domains.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),2;if(domains.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains.filter(domain=>!isRootDomain(domain));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain=>param(domain)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains.length===1?[{domain:domains[0],available:(await getDomainStatus(client,domains[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
|
|
120
|
+
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk26.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags,json=wantsMachineReadableOutput(void 0,client.argv),resolvedFlags=flags["--out"]!==void 0&&flags["--output"]!==void 0&&parseWithShortFlag(argv,flagsSpecification,"-o",String)["--output"]===void 0?{...flags,"--output":void 0,"--out":parseWithShortFlag(argv,flagsSpecification,"-o","--out")["--out"]}:flags,outputPath=getRenamedOption({"--output":resolvedFlags["--output"],"--out":resolvedFlags["--out"]},"--output","--out",{json:!0});return"error"in outputPath?reportRenamedOptionError(client,outputPath.error,{json}):variant.kind==="timeseries"?runTimeseriesLeaderboard(client,resolvedFlags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label,warning:outputPath.warning}):runRankedLeaderboard(client,resolvedFlags,variant.telemetry,{dataset:variant.dataset,label:variant.label,warning:outputPath.warning})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG8={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG8)),output_manager_default.print(help(leaderboardSubcommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG9={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{stream:client.stderr,parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{stream:client.stderr,columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var import_chalk29=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk27=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain){output_manager_default.spinner(`Adding domain ${domain} to project ${import_chalk27.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain})})).find(aliasTarget2=>aliasTarget2.domain===domain);return aliasTarget||new Error(`Adding domain '${domain}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init){try{return await client.fetch(url,init)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk28=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain){output_manager_default.spinner(`Removing domain ${domain} from project ${import_chalk28.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"to buy the domain; it returns the price and needed details, and charges nothing until a person approves the price"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add2(client,argv){let telemetry=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,force=opts["--force"];telemetry.trackCliFlagForce(force);let contextName=await getContextName(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd}`,next:[{command:cmd,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},2)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),2}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to ${import_chalk29.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk29.default.bold(domainName)} is already assigned to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk30=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,domains=args,hasMultipleInputDomains=domains.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),2;if(domains.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains.filter(domain=>!isRootDomain(domain));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain=>param(domain)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains.length===1?[{domain:domains[0],available:(await getDomainStatus(client,domains[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
|
|
121
121
|
`):client.stdout.write(`${JSON.stringify({results:results.map(result=>({domain:result.domain,available:!!result.available}))},null,2)}
|
|
122
122
|
`),0;for(let result of results)output_manager_default.log(`The domain ${param(result.domain)} is ${import_chalk30.default.underline(result.available?"available":"unavailable")}.`);return 0}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
|
|
123
123
|
`):output_manager_default.error(message),1}return printError(error),1}}var import_chalk31=__toESM(require_source(),1);async function transferInDomain(client,name,authCode,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";try{let{orderId}=await client.fetch(`/v1/registrar/domains/${name}/transfer${teamParam}`,{body:{authCode,autoRenew:!0,years,expectedPrice,contactInformation:{firstName:"Vercel",lastName:"Whois",email:"domains@registrar.vercel.com",phone:"+14153985463",address1:"100 First Street, Suite 2400",city:"San Fransisco",state:"CA",zip:"94105",country:"US",companyName:"Vercel Inc."}},method:"POST"}),order=await pollForOrder(client,orderId);return order===null?new UnexpectedDomainTransferError(name):order.status==="completed"&&order.domains.find(domain2=>domain2.domainName===name)?.status==="completed"?{ok:!0}:order.error?.code==="payment-failed"?new DomainPaymentError:new UnexpectedDomainTransferError(name)}catch(err){if(isAPIError(err)){if(err.code==="invalid_name")return new InvalidDomain(name);if(err.code==="tld_not_supported")return new UnsupportedTLD(name);if(err.code==="domain_not_available")return new DomainNotAvailable(name)}throw err}}async function getAuthCode(client,code2){return isValidAuthCode(code2)?code2:client.input.text({message:"- Transfer auth code: ",validate:isValidAuthCode})}function isValidAuthCode(code2){return!!(code2&&code2.length>0)}var DomainsTransferInTelemetryClient=class extends TelemetryClient{trackCliOptionCode(code2){code2&&this.trackCliOption({option:"code",value:this.redactedValue})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}};async function transferIn(client,argv){let telemetry=new DomainsTransferInTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(transferInSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry.trackCliOptionCode(opts["--code"]);let[domainName]=args;if(!domainName)return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2;if(telemetry.trackCliArgumentDomain(domainName),!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name ${param(domainName)}. Run ${getCommandName("domains --help")}`),1;let availableStamp=stamp_default(),domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return output_manager_default.prettyError(domainPrice),1;let{transferPrice,years}=domainPrice;if(transferPrice===null)return output_manager_default.error(`The domain ${param(domainName)} is not transferable.`),1;let contextName=await getContextName(client);output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk31.default.underline("available")} to transfer under ${import_chalk31.default.bold(contextName)}! ${availableStamp()}`);let authCode=await getAuthCode(client,opts["--code"]);if(!await client.input.confirm(`Transfer now with 1yr renewal for ${import_chalk31.default.bold(`$${transferPrice}`)}?`,!1))return 0;let transferStamp=stamp_default();output_manager_default.spinner(`Initiating transfer for domain ${domainName}`);let transferInResult=await transferInDomain(client,domainName,authCode,transferPrice,years);return transferInResult instanceof InvalidDomain?(output_manager_default.error(`The domain ${transferInResult.meta.domain} is not valid.`),1):transferInResult instanceof DomainNotAvailable?(output_manager_default.error(`The domain "${transferInResult.meta.domain}" is not transferable.`),1):transferInResult instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${transferInResult.meta.domain} is not supported.`),1):transferInResult instanceof DomainPaymentError?(output_manager_default.error("Your card was declined."),1):transferInResult instanceof UnexpectedDomainTransferError?(output_manager_default.error("An unexpected error happened while initiating the transfer."),1):(output_manager_default.success(`Domain ${param(domainName)} transfer started ${transferStamp()}`),output_manager_default.print(` To finalize the transfer, we are waiting for approval from your current registrar.
|
|
@@ -189,7 +189,7 @@ ${indent(nameservers.join(`
|
|
|
189
189
|
`).map(line=>` ${line}`).join(`
|
|
190
190
|
`)}function renderStructuredOutput(diagnosis){let{facts}=diagnosis,{config}=facts,dnsMethods=getDnsMethods(diagnosis),domainConnectMethod=dnsMethods.find(method=>method.kind==="domain-connect"),domainConnect=domainConnectMethod?.kind==="domain-connect"?domainConnectMethod.configuration:null,canRecommendDns=diagnosis.configurationStatus!=="scope-resolution-required"&&diagnosis.configurationStatus!=="project-attachment-recommended"&&facts.ownership!=="platform-managed",payload={status:diagnosis.ok?AGENT_STATUS.OK:AGENT_STATUS.ACTION_REQUIRED,...diagnosis.details,...diagnosis.next.length?{next:diagnosis.next}:{},...domainConnect?{domainConnect}:{},domain:facts.domainName,domainStatus:diagnosis.status,configurationStatus:diagnosis.configurationStatus,ok:diagnosis.ok,issues:diagnosis.issues,misconfigured:config.misconfigured,configuredBy:config.configuredBy,serviceType:config.serviceType,ipStatus:config.ipStatus??null,dnssecEnabled:config.dnssecEnabled??null,acceptedChallenges:config.acceptedChallenges??[],current:{nameservers:config.nameservers??[],cnames:config.cnames??[],aValues:config.aValues??[]},recommended:{ipv4:canRecommendDns?config.recommendedIPv4??[]:[],cname:canRecommendDns?config.recommendedCNAME??[]:[],records:diagnosis.recommendedDnsRecords,nameservers:getRecommendedNameservers(dnsMethods)},conflicts:diagnosis.steps.flatMap(step=>step.kind==="remove-conflict"?[step.conflict]:[]),domainOwnership:facts.ownership,project:serializeProject(facts.project)};return`${JSON.stringify(payload,null,2)}
|
|
191
191
|
`}function renderStructuredError(error){return`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:error.reason,error:error.code,message:error.message,...error.next?.length?{next:error.next}:{}},null,2)}
|
|
192
|
-
`}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliFlagStrict(flags["--strict"]),telemetry.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run(client,options){let elapsed=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),getExitCodeForReason(error.reason)}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG10={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let telemetry=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{parent:domainsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand)):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand2)):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"move":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand)):(telemetry.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand2)):(telemetry.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"transferIn":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand2)):(telemetry.trackCliSubcommandList(subcommandOriginal),ls(client,args))}}var import_chalk41=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa=__toESM(require_execa(),1);init_main();import{isAbsolute as isAbsolute6,join as join29}from"node:path";var PLUGIN_SOURCE="github:vercel/vercel-plugin",PLUGIN_ID="vercel-plugin";async function openCodeMajorVersion(){try{let{stdout}=await(0,import_execa.default)("opencode",["--version"],{stdin:"ignore",timeout:1e4}),match=/(\d+)\.\d+\.\d+/.exec(stdout);return match?Number(match[1]):void 0}catch{return}}function selectsPlugin(selector){return selector==="*"||(selector.endsWith(".*")?PLUGIN_ID.startsWith(selector.slice(0,-1)):selector===PLUGIN_ID)}async function pluginConfigState(home){let xdg=process.env.XDG_CONFIG_HOME,dir=process.env.OPENCODE_CONFIG_DIR||join29(xdg&&isAbsolute6(xdg)?xdg:join29(home,".config"),"opencode"),state={status:"missing"};for(let file of["opencode.json","opencode.jsonc"]){let path=join29(dir,file),text=await readFileOrNull(path);if(!text)continue;let errors=[],config=parse2(text,errors,{allowTrailingComma:!0});if(errors.length>0||!Array.isArray(config?.plugins))continue;let plugins=config.plugins;for(let entry2 of plugins){if(typeof entry2=="string"&&entry2.startsWith("-")){state.status!=="missing"&&selectsPlugin(entry2.slice(1))&&(state={status:"disabled",rule:entry2,file:path});continue}let target=typeof entry2=="string"?entry2:entry2?.package;(target===PLUGIN_SOURCE||state.status!=="missing"&&target&&selectsPlugin(target))&&(state={status:"enabled"})}}return state}async function setupOpenCodePlugin(client,opts){let majorVersion=await openCodeMajorVersion();if(majorVersion===void 0)return{status:"not_detected",message:"OpenCode was not detected on this machine."};if(majorVersion<2)return{status:"unsupported",message:"The Vercel plugin needs OpenCode 2. Upgrade OpenCode, then re-run `vercel setup plugin --agent opencode`."};let state=await pluginConfigState(opts.home);if(state.status==="disabled")return{status:"disabled",message:`The Vercel plugin is disabled by "${state.rule}" in ${state.file}. Remove that entry or add "${PLUGIN_ID}" after it to enable the plugin.`};if(state.status==="enabled")return{status:"up_to_date",message:"Vercel plugin for OpenCode is installed."};if(opts.dryRun)return{status:"dry_run",action:"install",message:"Setup would install the Vercel plugin for OpenCode."};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:"Re-run with --yes to install the Vercel plugin for OpenCode."};if(printAlignedLabel("Plugin",`Vercel for OpenCode (${PLUGIN_SOURCE})`),!await client.input.confirm("Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for OpenCode."}}output_manager_default.spinner("Installing the Vercel plugin for OpenCode\u2026");try{await(0,import_execa.default)("opencode",["plugin","add",PLUGIN_SOURCE],{stdin:"ignore",timeout:12e4})}catch{return{status:"failed",message:`Failed to install the Vercel plugin for OpenCode. Run \`opencode plugin add ${PLUGIN_SOURCE}\` to finish setup.`}}finally{output_manager_default.stopSpinner()}return{status:"installed",message:"Installed the Vercel plugin for OpenCode. Restart OpenCode, then run /mcps to sign in to the Vercel MCP server."}}var SetupTelemetryClient=class extends TelemetryClient{trackCliSubcommandPlugin(actual){this.trackCliSubcommand({subcommand:"plugin",value:actual})}trackCliSubcommandGateway(actual){this.trackCliSubcommand({subcommand:"gateway",value:actual})}trackCliSubcommandSkills(actual){this.trackCliSubcommand({subcommand:"skills",value:actual})}trackCliOptionAgent(agents){for(let agent of agents??[])this.trackCliOption({option:"agent",value:agent})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionKey(v){v!==void 0&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliFlagReconfigure(v){v&&this.trackCliFlag("reconfigure")}trackCliFlagNoSessionMigration(v){v&&this.trackCliFlag("no-session-migration")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var COMMAND_CONFIG11={plugin:getCommandAliases(pluginSubcommand),gateway:getCommandAliases(gatewaySubcommand),skills:getCommandAliases(skillsSubcommand)},STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),routingArgs;try{routingArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(setupCommand.options),{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand(routingArgs.args.slice(1),COMMAND_CONFIG11);if(subcommand==="skills"){if(routingArgs.flags["--help"])return telemetry.trackCliFlagHelp("setup",subcommandOriginal),output_manager_default.print(help(skillsSubcommand,{parent:setupCommand,columns:client.stderr.columns})),0;telemetry.trackCliSubcommandSkills(subcommandOriginal);let{default:setupSkills}=await import("./chunks/skills-RKIGVVNM.js");return setupSkills(client)}let stepSubcommand=subcommand==="plugin"||subcommand==="gateway"?subcommand:void 0,command=stepSubcommand==="plugin"?pluginSubcommand:stepSubcommand==="gateway"?gatewaySubcommand:setupCommand,parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(command.options))}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,`Invalid setup arguments. Run vercel setup${stepSubcommand?` ${stepSubcommand}`:""} --help for usage.`),printError(error),2}let flags=parsedArgs.flags;if(flags["--help"])return telemetry.trackCliFlagHelp("setup",stepSubcommand?subcommandOriginal:void 0),output_manager_default.print(help(command,{parent:stepSubcommand?setupCommand:void 0,columns:client.stderr.columns})),0;if(parsedArgs.args.length>(stepSubcommand?2:1)){let message="The setup command does not accept positional arguments. Use vercel setup plugin, gateway, or skills to run one step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}flags["--plugin"]&&warnDeprecatedSubcommand(client,"setup --plugin","setup plugin"),flags["--gateway"]&&warnDeprecatedSubcommand(client,"setup --gateway","setup gateway");let onlyPlugin=stepSubcommand==="plugin"||!!flags["--plugin"],onlyGateway=stepSubcommand==="gateway"||!!flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent=>agent.toLowerCase()))]:void 0;if(agents?.some(agent=>!getAgentById(agent)||onlyPlugin&&!onlyGateway&&!["claude-code","codex","opencode"].includes(agent))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code, --agent codex, and --agent opencode.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}stepSubcommand==="plugin"?telemetry.trackCliSubcommandPlugin(subcommandOriginal):stepSubcommand==="gateway"&&telemetry.trackCliSubcommandGateway(subcommandOriginal),telemetry.trackCliOptionAgent(agents),telemetry.trackCliFlagPlugin(flags["--plugin"]),telemetry.trackCliFlagGateway(flags["--gateway"]),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagYes(yes),telemetry.trackCliFlagAll(flags["--all"]),telemetry.trackCliOptionKey(flags["--key"]),telemetry.trackCliFlagReconfigure(flags["--reconfigure"]),telemetry.trackCliFlagNoSessionMigration(flags["--no-session-migration"]);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
|
|
192
|
+
`}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and options"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliFlagStrict(flags["--strict"]),telemetry.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run(client,options){let elapsed=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),getExitCodeForReason(error.reason)}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG10={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let telemetry=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{stream:client.stderr,parent:domainsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand)):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand2)):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"move":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand)):(telemetry.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand2)):(telemetry.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"transferIn":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand2)):(telemetry.trackCliSubcommandList(subcommandOriginal),ls(client,args))}}var import_chalk41=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa=__toESM(require_execa(),1);init_main();import{isAbsolute as isAbsolute6,join as join29}from"node:path";var PLUGIN_SOURCE="github:vercel/vercel-plugin",PLUGIN_ID="vercel-plugin";async function openCodeMajorVersion(){try{let{stdout}=await(0,import_execa.default)("opencode",["--version"],{stdin:"ignore",timeout:1e4}),match=/(\d+)\.\d+\.\d+/.exec(stdout);return match?Number(match[1]):void 0}catch{return}}function selectsPlugin(selector){return selector==="*"||(selector.endsWith(".*")?PLUGIN_ID.startsWith(selector.slice(0,-1)):selector===PLUGIN_ID)}async function pluginConfigState(home){let xdg=process.env.XDG_CONFIG_HOME,dir=process.env.OPENCODE_CONFIG_DIR||join29(xdg&&isAbsolute6(xdg)?xdg:join29(home,".config"),"opencode"),state={status:"missing"};for(let file of["opencode.json","opencode.jsonc"]){let path=join29(dir,file),text=await readFileOrNull(path);if(!text)continue;let errors=[],config=parse2(text,errors,{allowTrailingComma:!0});if(errors.length>0||!Array.isArray(config?.plugins))continue;let plugins=config.plugins;for(let entry2 of plugins){if(typeof entry2=="string"&&entry2.startsWith("-")){state.status!=="missing"&&selectsPlugin(entry2.slice(1))&&(state={status:"disabled",rule:entry2,file:path});continue}let target=typeof entry2=="string"?entry2:entry2?.package;(target===PLUGIN_SOURCE||state.status!=="missing"&&target&&selectsPlugin(target))&&(state={status:"enabled"})}}return state}async function setupOpenCodePlugin(client,opts){let majorVersion=await openCodeMajorVersion();if(majorVersion===void 0)return{status:"not_detected",message:"OpenCode was not detected on this machine."};if(majorVersion<2)return{status:"unsupported",message:"The Vercel plugin needs OpenCode 2. Upgrade OpenCode, then re-run `vercel setup plugin --agent opencode`."};let state=await pluginConfigState(opts.home);if(state.status==="disabled")return{status:"disabled",message:`The Vercel plugin is disabled by "${state.rule}" in ${state.file}. Remove that entry or add "${PLUGIN_ID}" after it to enable the plugin.`};if(state.status==="enabled")return{status:"up_to_date",message:"Vercel plugin for OpenCode is installed."};if(opts.dryRun)return{status:"dry_run",action:"install",message:"Setup would install the Vercel plugin for OpenCode."};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:"Re-run with --yes to install the Vercel plugin for OpenCode."};if(printAlignedLabel("Plugin",`Vercel for OpenCode (${PLUGIN_SOURCE})`),!await client.input.confirm("Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for OpenCode."}}output_manager_default.spinner("Installing the Vercel plugin for OpenCode\u2026");try{await(0,import_execa.default)("opencode",["plugin","add",PLUGIN_SOURCE],{stdin:"ignore",timeout:12e4})}catch{return{status:"failed",message:`Failed to install the Vercel plugin for OpenCode. Run \`opencode plugin add ${PLUGIN_SOURCE}\` to finish setup.`}}finally{output_manager_default.stopSpinner()}return{status:"installed",message:"Installed the Vercel plugin for OpenCode. Restart OpenCode, then run /mcps to sign in to the Vercel MCP server."}}var SetupTelemetryClient=class extends TelemetryClient{trackCliSubcommandPlugin(actual){this.trackCliSubcommand({subcommand:"plugin",value:actual})}trackCliSubcommandGateway(actual){this.trackCliSubcommand({subcommand:"gateway",value:actual})}trackCliSubcommandSkills(actual){this.trackCliSubcommand({subcommand:"skills",value:actual})}trackCliOptionAgent(agents){for(let agent of agents??[])this.trackCliOption({option:"agent",value:agent})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionKey(v){v!==void 0&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliFlagReconfigure(v){v&&this.trackCliFlag("reconfigure")}trackCliFlagNoSessionMigration(v){v&&this.trackCliFlag("no-session-migration")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var COMMAND_CONFIG11={plugin:getCommandAliases(pluginSubcommand),gateway:getCommandAliases(gatewaySubcommand),skills:getCommandAliases(skillsSubcommand)},STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),routingArgs;try{routingArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(setupCommand.options),{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand(routingArgs.args.slice(1),COMMAND_CONFIG11);if(subcommand==="skills"){if(routingArgs.flags["--help"])return telemetry.trackCliFlagHelp("setup",subcommandOriginal),output_manager_default.print(help(skillsSubcommand,{stream:client.stderr,parent:setupCommand,columns:client.stderr.columns})),0;telemetry.trackCliSubcommandSkills(subcommandOriginal);let{default:setupSkills}=await import("./chunks/skills-2MOFBKIE.js");return setupSkills(client)}let stepSubcommand=subcommand==="plugin"||subcommand==="gateway"?subcommand:void 0,command=stepSubcommand==="plugin"?pluginSubcommand:stepSubcommand==="gateway"?gatewaySubcommand:setupCommand,parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(command.options))}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,`Invalid setup arguments. Run vercel setup${stepSubcommand?` ${stepSubcommand}`:""} --help for usage.`),printError(error),2}let flags=parsedArgs.flags;if(flags["--help"])return telemetry.trackCliFlagHelp("setup",stepSubcommand?subcommandOriginal:void 0),output_manager_default.print(help(command,{stream:client.stderr,parent:stepSubcommand?setupCommand:void 0,columns:client.stderr.columns})),0;if(parsedArgs.args.length>(stepSubcommand?2:1)){let message="The setup command does not accept positional arguments. Use vercel setup plugin, gateway, or skills to run one step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}flags["--plugin"]&&warnDeprecatedSubcommand(client,"setup --plugin","setup plugin"),flags["--gateway"]&&warnDeprecatedSubcommand(client,"setup --gateway","setup gateway");let onlyPlugin=stepSubcommand==="plugin"||!!flags["--plugin"],onlyGateway=stepSubcommand==="gateway"||!!flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent=>agent.toLowerCase()))]:void 0;if(agents?.some(agent=>!getAgentById(agent)||onlyPlugin&&!onlyGateway&&!["claude-code","codex","opencode"].includes(agent))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code, --agent codex, and --agent opencode.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}stepSubcommand==="plugin"?telemetry.trackCliSubcommandPlugin(subcommandOriginal):stepSubcommand==="gateway"&&telemetry.trackCliSubcommandGateway(subcommandOriginal),telemetry.trackCliOptionAgent(agents),telemetry.trackCliFlagPlugin(flags["--plugin"]),telemetry.trackCliFlagGateway(flags["--gateway"]),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagYes(yes),telemetry.trackCliFlagAll(flags["--all"]),telemetry.trackCliOptionKey(flags["--key"]),telemetry.trackCliFlagReconfigure(flags["--reconfigure"]),telemetry.trackCliFlagNoSessionMigration(flags["--no-session-migration"]);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
|
|
193
193
|
${import_chalk41.default.bold(` ${STEP_LABELS[step]}`)}
|
|
194
194
|
`);let outcome=step==="plugin"?await runPluginStep(client,{yes:!!yes,dryRun:!!dryRun,canPrompt:canPrompt2,home,machine,onlyStep:steps.length===1,agents}):await runGatewayStep(client,{yes:!!yes,dryRun:!!dryRun,agents,all:!!flags["--all"],key:flags["--key"],reconfigure:!!flags["--reconfigure"],noSessionMigration:!!flags["--no-session-migration"]});if(outcomes.set(step,outcome),machine&&!outcome.ok)break}}catch(error){return output_manager_default.stopSpinner(),machine&&writeSetupError(client,"setup_failed","Failed to complete setup."),printError(error),1}let failed=[...outcomes.values()].some(o=>!o.ok),complete=[...outcomes.values()].every(o=>o.complete),gutter=failed?import_chalk41.default.red("\u2717"):complete?import_chalk41.default.green("\u2713"):" ",heading=complete?dryRun?"Dry run complete":"Setup complete":"Setup incomplete";output_manager_default.print(`
|
|
195
195
|
${gutter} ${import_chalk41.default.bold(heading)}
|