@vercel/cli-support 65.11.0 → 65.12.0-snapshot-801db9d533c3
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 +8 -120
- package/dist/chunks/add-BDJYCIBT.js +8 -0
- package/dist/chunks/add-LZR4CD7O.js +8 -0
- package/dist/chunks/add-MR6YZTRQ.js +8 -0
- package/dist/chunks/{alerts-JGRRCQA4.js → alerts-VOYMO6NJ.js} +1 -1
- package/dist/chunks/build-H2U56DYB.js +7 -0
- package/dist/chunks/{chunk-UF2E5BDE.js → chunk-23PO6JK6.js} +1 -1
- package/dist/chunks/{chunk-PUKYAALC.js → chunk-24SIHFEW.js} +1 -1
- package/dist/chunks/{chunk-EBIJ26IV.js → chunk-2C6TLXE5.js} +1 -1
- package/dist/chunks/{chunk-QROI2U32.js → chunk-2CQJKBKV.js} +2 -4
- package/dist/chunks/{chunk-7MZLV3KK.js → chunk-2CZL3GJU.js} +1 -1
- package/dist/chunks/{chunk-XH2R2EIK.js → chunk-2EV53VB5.js} +1 -1
- package/dist/chunks/{chunk-5B5CLOKM.js → chunk-2FNOYPRB.js} +1 -1
- package/dist/chunks/{chunk-4E6BGQWR.js → chunk-2LOA3LC6.js} +1 -1
- package/dist/chunks/{chunk-M3Z6NSC2.js → chunk-2V6UURUN.js} +1 -1
- package/dist/chunks/{chunk-B6QVH6IG.js → chunk-32EEQITR.js} +1 -1
- package/dist/chunks/{chunk-4VP57TOJ.js → chunk-33OMDQTW.js} +1 -1
- package/dist/chunks/{chunk-CFYLTZSV.js → chunk-3AGRCSWN.js} +1 -1
- package/dist/chunks/{chunk-42J2KCDF.js → chunk-3EFPSM6M.js} +1 -1
- package/dist/chunks/{chunk-DQASZDQT.js → chunk-3SNWIYU7.js} +1 -1
- package/dist/chunks/{chunk-EVBGFSK5.js → chunk-42Y46TZ3.js} +1 -1
- package/dist/chunks/{chunk-KV3QXTRZ.js → chunk-4OO6TXBM.js} +1 -1
- package/dist/chunks/{chunk-UUDE44NV.js → chunk-54FY6GJ5.js} +1 -1
- package/dist/chunks/{chunk-RIJ45N7C.js → chunk-5HQEYPDO.js} +1 -1
- package/dist/chunks/chunk-5KL6UFII.js +7 -0
- package/dist/chunks/{chunk-ECFLIVEE.js → chunk-5L566FZB.js} +1 -1
- package/dist/chunks/{chunk-NZW3RIQM.js → chunk-5MFGTXWC.js} +1 -1
- package/dist/chunks/{chunk-4ELZOAQH.js → chunk-5TMHRECT.js} +1 -1
- package/dist/chunks/{chunk-74VQ7PQV.js → chunk-5YLKPSZI.js} +1 -1
- package/dist/chunks/chunk-66TKNVRG.js +60 -0
- package/dist/chunks/{chunk-RDWLLSPU.js → chunk-6737KAJP.js} +1 -1
- package/dist/chunks/{chunk-V5TOMLK4.js → chunk-6Q2XEYCJ.js} +1 -1
- package/dist/chunks/{chunk-7VGBGUX7.js → chunk-6S6UZV3V.js} +1 -1
- package/dist/chunks/{chunk-EZLPMOHM.js → chunk-6WTGR7UP.js} +1 -1
- package/dist/chunks/chunk-7BDQUBSO.js +7 -0
- package/dist/chunks/chunk-7M6EHM5B.js +7 -0
- package/dist/chunks/{chunk-42FOKWGX.js → chunk-7PGDJTAH.js} +1 -1
- package/dist/chunks/{chunk-BZIC36KP.js → chunk-7TVNKTN2.js} +1 -1
- package/dist/chunks/{chunk-IIGNDMLO.js → chunk-ABSFPYM4.js} +1 -1
- package/dist/chunks/{chunk-MBXLL2HF.js → chunk-AGLOVMPC.js} +3 -3
- package/dist/chunks/{chunk-B56SRT5W.js → chunk-AIZIVXNX.js} +1 -1
- package/dist/chunks/{chunk-WBSFE6IE.js → chunk-AQBK55BT.js} +1 -1
- package/dist/chunks/chunk-AW33SRYY.js +7 -0
- package/dist/chunks/{chunk-UNPK7LVC.js → chunk-B3IBBNIR.js} +1 -1
- package/dist/chunks/{chunk-VRH7LWOC.js → chunk-B4KA3ZH2.js} +1 -1
- package/dist/chunks/{chunk-2J35YKA2.js → chunk-BC74BRVP.js} +12 -12
- package/dist/chunks/{chunk-PFZCGMJ7.js → chunk-BH5OASEJ.js} +1 -1
- package/dist/chunks/chunk-BIGJEDOA.js +11 -0
- package/dist/chunks/chunk-BOJDM3O7.js +7 -0
- package/dist/chunks/{chunk-375JVQYK.js → chunk-CJZE7647.js} +1 -1
- package/dist/chunks/{chunk-YZKARZ2B.js → chunk-CKJZSRAC.js} +1 -1
- package/dist/chunks/{chunk-TUAS3L5I.js → chunk-D5JRYYTT.js} +1 -1
- package/dist/chunks/{chunk-SF4E3AQ3.js → chunk-E3WP42P2.js} +1 -1
- package/dist/chunks/{chunk-6UMVJ7RL.js → chunk-E7CEQ2PO.js} +1 -1
- package/dist/chunks/chunk-E7IFYSQT.js +12 -0
- package/dist/chunks/chunk-EDO66J3L.js +7 -0
- package/dist/chunks/{chunk-C5QEQSEX.js → chunk-EIFBF3JQ.js} +1 -1
- package/dist/chunks/chunk-EM3U6PRB.js +7 -0
- package/dist/chunks/{chunk-AMPJ6RWT.js → chunk-EZVNGJN5.js} +1 -1
- package/dist/chunks/{chunk-ZPBGAZC2.js → chunk-F6KURUPQ.js} +1 -1
- package/dist/chunks/{chunk-5DXC4TE2.js → chunk-F7L5SXJM.js} +1 -1
- package/dist/chunks/{chunk-ZTHW5VNH.js → chunk-FFS3QJCU.js} +2 -2
- package/dist/chunks/{chunk-FNH3T3CF.js → chunk-FGZXIHGN.js} +1 -1
- package/dist/chunks/chunk-FXOKM2RM.js +7 -0
- package/dist/chunks/{chunk-NUSKXXZZ.js → chunk-FZLCDLWD.js} +1 -1
- package/dist/chunks/{chunk-CD6ZWCKT.js → chunk-G63MSB6N.js} +1 -1
- package/dist/chunks/{chunk-HNH3DPIZ.js → chunk-GAILIG45.js} +1 -1
- package/dist/chunks/{chunk-FVVOHGQE.js → chunk-GHNHUSVK.js} +1 -1
- package/dist/chunks/{chunk-4DMKP6AO.js → chunk-GOI2VVI7.js} +2 -2
- package/dist/chunks/chunk-GORL5DZC.js +11 -0
- package/dist/chunks/{chunk-WMWB7QKG.js → chunk-GP3KGUCK.js} +1 -1
- package/dist/chunks/{chunk-GL66K54F.js → chunk-GPDERS2D.js} +1 -1
- package/dist/chunks/{chunk-CU3LNJZV.js → chunk-GUSOYIW6.js} +1 -1
- package/dist/chunks/{chunk-AO6AMYBF.js → chunk-GY44CQXK.js} +1 -1
- package/dist/chunks/chunk-H64GR57G.js +7 -0
- package/dist/chunks/{chunk-VKCBEW6R.js → chunk-HBWRIR42.js} +1 -1
- package/dist/chunks/{chunk-4U6ACPA4.js → chunk-HR66URIC.js} +1 -1
- package/dist/chunks/chunk-HRGJO4HK.js +7 -0
- package/dist/chunks/chunk-HU5NUOWH.js +7 -0
- package/dist/chunks/{chunk-4KM733OB.js → chunk-HVJN2SSK.js} +1 -1
- package/dist/chunks/chunk-HXLOBW75.js +10 -0
- package/dist/chunks/{chunk-4T57TXQ3.js → chunk-IBBLLUXD.js} +1 -1
- package/dist/chunks/{chunk-MO2G2ND2.js → chunk-IJBRT2AD.js} +1 -1
- package/dist/chunks/{chunk-NT2N5UR4.js → chunk-IRIFXCZW.js} +1 -1
- package/dist/chunks/{chunk-ECGY67NB.js → chunk-J7RNU6AO.js} +1 -1
- package/dist/chunks/{chunk-SDYCW5JM.js → chunk-JONZUKWX.js} +1 -1
- package/dist/chunks/{chunk-P24YBQ6H.js → chunk-JVGENO2R.js} +1 -1
- package/dist/chunks/{chunk-PKNEWN4W.js → chunk-K46QQRUN.js} +1 -1
- package/dist/chunks/{chunk-BJXLR2RE.js → chunk-KKYNEEM7.js} +1 -1
- package/dist/chunks/{chunk-3TDFSO4X.js → chunk-KPSINH7T.js} +1 -1
- package/dist/chunks/chunk-KR4DMT3I.js +7 -0
- package/dist/chunks/{chunk-RCUDI7OF.js → chunk-M32HBBPK.js} +1 -1
- package/dist/chunks/{chunk-ZQXXESKG.js → chunk-MAA5GRIM.js} +1 -1
- package/dist/chunks/chunk-MCYG7CCE.js +7 -0
- package/dist/chunks/{chunk-VAZ7JG2Z.js → chunk-MNZYFYYH.js} +1 -1
- package/dist/chunks/{chunk-HDISAMDF.js → chunk-MQJ4MINN.js} +1 -1
- package/dist/chunks/{chunk-ITQPDXXA.js → chunk-MTZYPCZ7.js} +1 -1
- package/dist/chunks/{chunk-NE6PKR2J.js → chunk-MWWMY5R6.js} +1 -1
- package/dist/chunks/{chunk-UBJVL3NJ.js → chunk-MWXL6HYB.js} +3 -3
- package/dist/chunks/{chunk-UFXIPUNI.js → chunk-MXALPSIX.js} +1 -1
- package/dist/chunks/{chunk-7JMN657A.js → chunk-NBTFAXL4.js} +1 -1
- package/dist/chunks/{chunk-HYOWFNOP.js → chunk-NIZW6D6D.js} +1 -1
- package/dist/chunks/{chunk-KBVYN635.js → chunk-NREH4VSU.js} +1 -1
- package/dist/chunks/{chunk-TPJV5UNE.js → chunk-NTYBDY24.js} +1 -1
- package/dist/chunks/{chunk-NDMQVBTV.js → chunk-NYJTWSSD.js} +1 -1
- package/dist/chunks/{chunk-7ZJ7VUIR.js → chunk-O3DAPRJ3.js} +1 -1
- package/dist/chunks/chunk-O7TFWXLZ.js +13 -0
- package/dist/chunks/{chunk-K7ARJYAG.js → chunk-OFOZ5DBA.js} +1 -1
- package/dist/chunks/{chunk-FYE7ILRR.js → chunk-OFZUWHZW.js} +1 -1
- package/dist/chunks/{chunk-RI6DJAFI.js → chunk-OHEM2CSW.js} +1 -1
- package/dist/chunks/{chunk-6ORJPXDQ.js → chunk-OHK3Y5NS.js} +1 -1
- package/dist/chunks/{chunk-IHTWZEQW.js → chunk-OKKG2FUS.js} +1 -1
- package/dist/chunks/{chunk-7NMC4E66.js → chunk-OR3ZEVBW.js} +1 -1
- package/dist/chunks/{chunk-QDHTI5WK.js → chunk-POR6KNXT.js} +1 -1
- package/dist/chunks/{chunk-JUSNW3IF.js → chunk-PSFHYOLD.js} +1 -1
- package/dist/chunks/{chunk-TZE4CS4K.js → chunk-QBHTNUM5.js} +1 -1
- package/dist/chunks/chunk-QJDWNTYH.js +7 -0
- package/dist/chunks/{chunk-YUHKH4TK.js → chunk-QKOLFLLP.js} +1 -1
- package/dist/chunks/chunk-REJLEESP.js +10 -0
- package/dist/chunks/{chunk-EIMHC5UY.js → chunk-ROKZIMRO.js} +1 -1
- package/dist/chunks/{chunk-DR6OJB6P.js → chunk-RPIBJRIT.js} +1 -1
- package/dist/chunks/chunk-SEHERY6U.js +7 -0
- package/dist/chunks/{chunk-RR5SDYNN.js → chunk-SHMHL6W7.js} +1 -1
- package/dist/chunks/{chunk-5FIY443M.js → chunk-SMETSNPH.js} +1 -1
- package/dist/chunks/{chunk-NMIZSQDN.js → chunk-SP6E7PHW.js} +1 -1
- package/dist/chunks/chunk-SQBDW5FO.js +10 -0
- package/dist/chunks/chunk-SWFG73OS.js +8 -0
- package/dist/chunks/{chunk-CHIYT3V4.js → chunk-TA7KTIDV.js} +1 -1
- package/dist/chunks/{chunk-W24TLPO5.js → chunk-TJBVFVXK.js} +1 -1
- package/dist/chunks/{chunk-JTAUWH5V.js → chunk-TJUZVODP.js} +1 -1
- package/dist/chunks/{chunk-VWJXV5ZM.js → chunk-TKVUWTBK.js} +1 -1
- package/dist/chunks/chunk-U7ZEFVSQ.js +8 -0
- package/dist/chunks/{chunk-WTFD4MDT.js → chunk-UZQJQXGJ.js} +1 -1
- package/dist/chunks/{chunk-UIMJNASP.js → chunk-V7G4VDZI.js} +1 -1
- package/dist/chunks/{chunk-WNDR5HCU.js → chunk-VCJIB3FB.js} +1 -1
- package/dist/chunks/{chunk-EGTJTCCW.js → chunk-VFBELAGX.js} +1 -1
- package/dist/chunks/{chunk-AYZ52QDF.js → chunk-VM6X5BTK.js} +1 -1
- package/dist/chunks/{chunk-HZEKH3RO.js → chunk-VVTMF2AY.js} +1 -1
- package/dist/chunks/{chunk-N65H4JMJ.js → chunk-W25UARQV.js} +1 -1
- package/dist/chunks/chunk-WLMW7K7F.js +7 -0
- package/dist/chunks/{chunk-IHCYNUI2.js → chunk-XJYDISH3.js} +1 -1
- package/dist/chunks/chunk-XSQZ35V6.js +7 -0
- package/dist/chunks/{chunk-YODQLETL.js → chunk-XVDUP67R.js} +1 -1
- package/dist/chunks/{chunk-SLCPSRDR.js → chunk-Y2FVJ7YO.js} +1 -1
- package/dist/chunks/chunk-Y2SQC4GV.js +10 -0
- package/dist/chunks/{chunk-FVTRIRML.js → chunk-Y5S2OEJH.js} +1 -1
- package/dist/chunks/{chunk-EJN55YDV.js → chunk-YANOBY2G.js} +1 -1
- package/dist/chunks/{chunk-2RXUQ72I.js → chunk-YIOMTAUF.js} +1 -1
- package/dist/chunks/{chunk-BW25OFQG.js → chunk-YLCIOXSX.js} +1 -1
- package/dist/chunks/{chunk-GZLYNPNU.js → chunk-YNCWSPPJ.js} +1 -1
- package/dist/chunks/chunk-YQQ3A3YC.js +13 -0
- package/dist/chunks/{chunk-UI2H2EIM.js → chunk-YTRKHRL3.js} +1 -1
- package/dist/chunks/{chunk-MIIHBRKV.js → chunk-Z2K2JR7F.js} +1 -1
- package/dist/chunks/{chunk-F7AVGV4Y.js → chunk-Z73UJVGD.js} +1 -1
- package/dist/chunks/{chunk-6Y2ZL5XJ.js → chunk-ZKNEIE44.js} +2 -2
- package/dist/chunks/chunk-ZXEWWSTH.js +10 -0
- package/dist/chunks/chunk-ZZLCRSES.js +11 -0
- package/dist/chunks/clear-7QUM5KH7.js +8 -0
- package/dist/chunks/{cli-embedded-Y74S252S.js → cli-embedded-ABHGJLYX.js} +1 -1
- package/dist/chunks/compile-vercel-config-RDISBTDC.js +7 -0
- package/dist/chunks/config-2YNYR6YI.js +7 -0
- package/dist/chunks/config-4AOTKKGI.js +8 -0
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{connect-git-provider-GFAJLQLU.js → connect-git-provider-BMUUC7ND.js} +1 -1
- package/dist/chunks/contract-3VSUIBEY.js +10 -0
- package/dist/chunks/delete-EJNR4UYC.js +10 -0
- package/dist/chunks/delete-OYOBFPEG.js +9 -0
- package/dist/chunks/describe-ORIEHT3R.js +25 -0
- package/dist/chunks/detect-projects-AKK2XI76.js +7 -0
- package/dist/chunks/detect-services-3LYPKUVL.js +7 -0
- package/dist/chunks/disable-U6JU546S.js +7 -0
- package/dist/chunks/discard-6SHAFQ2H.js +14 -0
- package/dist/chunks/edit-YMWKFN3H.js +8 -0
- package/dist/chunks/edit-YTTKJFTG.js +9 -0
- package/dist/chunks/enable-A6KBPFXJ.js +7 -0
- package/dist/chunks/{esm-4ZHGYTUV.js → esm-CF5UHWPM.js} +1 -1
- package/dist/chunks/{esm-LNIAU767.js → esm-EYOXGOVF.js} +1 -1
- package/dist/chunks/{esm-IBY43SSX.js → esm-FSME24KA.js} +1 -1
- package/dist/chunks/{esm-7FVTQHRH.js → esm-IUATPKKB.js} +1 -1
- package/dist/chunks/{esm-GTSUYLKG.js → esm-L6OKDFWP.js} +1 -1
- package/dist/chunks/{esm-TEM4KPXZ.js → esm-ORQC2ZSA.js} +1 -1
- package/dist/chunks/{esm-TLAM7FSK.js → esm-PYIZNQIK.js} +1 -1
- package/dist/chunks/{exec-H3X7U4P3.js → exec-RQ257MTR.js} +1 -1
- package/dist/chunks/{export-25TQ3YBT.js → export-MMU6VVFK.js} +1 -1
- package/dist/chunks/future-ANILGGFQ.js +7 -0
- package/dist/chunks/generate-cert-for-deploy-LKKZUKWF.js +7 -0
- package/dist/chunks/image-OWWKVBTU.js +7 -0
- package/dist/chunks/import-builders-VENL23EH.js +7 -0
- package/dist/chunks/{inspect-3W3TUJ6P.js → inspect-BPIJT4OX.js} +1 -1
- package/dist/chunks/inspect-GDZJZGHW.js +13 -0
- package/dist/chunks/{inspect-TN2QY3BP.js → inspect-H7JGEVL7.js} +1 -1
- package/dist/chunks/inspect-I6LQLOBG.js +8 -0
- package/dist/chunks/{inspect-BRYVSQBD.js → inspect-IGFAKTAX.js} +1 -1
- package/dist/chunks/inspect-U6V4UQXC.js +9 -0
- package/dist/chunks/list-763XVNFH.js +8 -0
- package/dist/chunks/{list-WA6Q7DUN.js → list-OX2N4JK7.js} +1 -1
- package/dist/chunks/list-WHZXMZJ5.js +12 -0
- package/dist/chunks/{list-6W4UQBY4.js → list-XLPMNNI7.js} +1 -1
- package/dist/chunks/login-2PGWWOKB.js +7 -0
- package/dist/chunks/login-T63WJL4S.js +9 -0
- package/dist/chunks/logs-S2KJGEIG.js +7 -0
- package/dist/chunks/ls-5HXYPIFR.js +11 -0
- package/dist/chunks/ls-M4GJOBZP.js +8 -0
- package/dist/chunks/ls-N56BWH2L.js +8 -0
- package/dist/chunks/{ls-L5LLKZBV.js → ls-O5B3LY4D.js} +1 -1
- package/dist/chunks/{ls-MAJ4QZTY.js → ls-PNGTHVUK.js} +1 -1
- package/dist/chunks/{ls-UXE5RSZN.js → ls-Q7FAOSVD.js} +1 -1
- package/dist/chunks/{ls-4WP6LHLL.js → ls-R4UDBWS3.js} +1 -1
- package/dist/chunks/migrate-experimental-services-HWJXO4AJ.js +7 -0
- package/dist/chunks/mutate-FM6BLE46.js +9 -0
- package/dist/chunks/{native-self-update-DEVBYOH2.js → native-self-update-7LL6RPJW.js} +1 -1
- package/dist/chunks/notifications-ZSZN35BQ.js +7 -0
- package/dist/chunks/open-4RXUUYQP.js +7 -0
- package/dist/chunks/openapi-457MABMI.js +7 -0
- package/dist/chunks/permissions-UJRTMOT7.js +7 -0
- package/dist/chunks/{plugin-offer-JUYWL4I7.js → plugin-offer-KJCRPUU5.js} +1 -1
- package/dist/chunks/prompt-missing-credentials-B5DGQFI7.js +7 -0
- package/dist/chunks/publish-I3APOD3N.js +15 -0
- package/dist/chunks/pull-2YUNTVPQ.js +7 -0
- package/dist/chunks/purchase-domain-if-available-3YOXUXII.js +7 -0
- package/dist/chunks/push-4QQJQRGZ.js +7 -0
- package/dist/chunks/query-2JO6HH5N.js +12 -0
- package/dist/chunks/reauthenticate-COYQMMAG.js +7 -0
- package/dist/chunks/remove-PWS5EJ7F.js +9 -0
- package/dist/chunks/reorder-COZQX64R.js +10 -0
- package/dist/chunks/reply-XDYZNHW2.js +9 -0
- package/dist/chunks/resolve-6KUFCZRX.js +12 -0
- package/dist/chunks/resolve-agent-team-NOT235ZN.js +7 -0
- package/dist/chunks/{resolve-deployment-framework-preset-AXXYBFCL.js → resolve-deployment-framework-preset-4TKUU6AH.js} +1 -1
- package/dist/chunks/restore-GSSD4ZWH.js +16 -0
- package/dist/chunks/rm-AUNVZPJ5.js +8 -0
- package/dist/chunks/rm-EIMUYBJT.js +8 -0
- package/dist/chunks/rm-EJH37HYN.js +8 -0
- package/dist/chunks/rm-O5NMCBC3.js +8 -0
- package/dist/chunks/rm-PHTOXG4E.js +8 -0
- package/dist/chunks/{routes-BP54NO3Z.js → routes-NEZJKMR5.js} +1 -1
- package/dist/chunks/rule-inspect-7HNYKQ6X.js +8 -0
- package/dist/chunks/{schema-753JMRZA.js → schema-5P7HROXE.js} +1 -1
- package/dist/chunks/schema-MZM5MN5V.js +14 -0
- package/dist/chunks/select-org-3BZWQD6R.js +7 -0
- package/dist/chunks/set-2RH74ZC3.js +7 -0
- package/dist/chunks/set-Q2EJ3V44.js +9 -0
- package/dist/chunks/setup-and-link-BT5TNY4J.js +7 -0
- package/dist/chunks/{skills-QZ4AMS2K.js → skills-DUOUHPBY.js} +1 -1
- package/dist/chunks/{statuspage-KHTMA4WL.js → statuspage-K5SC7KAQ.js} +1 -1
- package/dist/chunks/{detect-projects-K7SVMH5T.js → table-W6LOHWWF.js} +1 -1
- package/dist/chunks/tags-QOJEEMKS.js +7 -0
- package/dist/chunks/{types-NPUAHKSK.js → types-7L6HBXAU.js} +1 -1
- package/dist/chunks/{update-7XH7HM5F.js → update-HS6QFTQK.js} +1 -1
- package/dist/chunks/usage-3N6IA5SX.js +13 -0
- package/dist/chunks/validate-config-YLL6RPCP.js +7 -0
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +19 -37
- package/dist/commands/dev/index.js +4 -4
- package/dist/commands/env/index.js +1 -1
- package/dist/commands/link/index.js +1 -1
- package/dist/commands/list/index.js +1 -1
- package/dist/commands/project/index.js +1 -1
- package/dist/commands-account.js +3 -3
- package/dist/commands-ai.js +6 -6
- package/dist/commands-blob.js +1 -1
- package/dist/commands-core.js +20 -20
- package/dist/commands-deployments.js +5 -5
- package/dist/commands-flags.js +1 -1
- package/dist/commands-integrations.js +1 -1
- package/dist/commands-observability.js +15 -8
- package/dist/commands-routing.js +5 -4
- package/dist/help.js +1 -1
- package/dist/index.js +5 -5
- package/dist/internal-build.js +1 -1
- package/dist/package.json +45 -245
- package/dist/vc.js +47 -695
- package/dist/version.mjs +1 -1
- package/package.json +51 -196
- package/dist/chunks/add-4R6FUHQT.js +0 -8
- package/dist/chunks/add-F3H4BFJZ.js +0 -8
- package/dist/chunks/add-TCOJ4SIQ.js +0 -8
- package/dist/chunks/build-GOLTZF6S.js +0 -7
- package/dist/chunks/chunk-3KJ6HWSX.js +0 -7
- package/dist/chunks/chunk-5X635INY.js +0 -11
- package/dist/chunks/chunk-7LPNDK2O.js +0 -7
- package/dist/chunks/chunk-A3M2BHWR.js +0 -13
- package/dist/chunks/chunk-BUFEV3T4.js +0 -11
- package/dist/chunks/chunk-BVR6OIU5.js +0 -7
- package/dist/chunks/chunk-D7BB5BPA.js +0 -10
- package/dist/chunks/chunk-DBT6PGEH.js +0 -7
- package/dist/chunks/chunk-DRZVM7CB.js +0 -12
- package/dist/chunks/chunk-EICEQXVS.js +0 -7
- package/dist/chunks/chunk-F2R7L3ZB.js +0 -7
- package/dist/chunks/chunk-FHMCTV5E.js +0 -7
- package/dist/chunks/chunk-FOE3MWES.js +0 -7
- package/dist/chunks/chunk-HKU6D7DU.js +0 -8
- package/dist/chunks/chunk-IOTKHTZH.js +0 -7
- package/dist/chunks/chunk-K4JTCVNW.js +0 -13
- package/dist/chunks/chunk-LALPOYIA.js +0 -8
- package/dist/chunks/chunk-M3R7F2N4.js +0 -7
- package/dist/chunks/chunk-MUKXOI2K.js +0 -8
- package/dist/chunks/chunk-NIS66BFX.js +0 -63
- package/dist/chunks/chunk-NSPW47RU.js +0 -7
- package/dist/chunks/chunk-NTDP6RTQ.js +0 -11
- package/dist/chunks/chunk-Q2QVK3TH.js +0 -7
- package/dist/chunks/chunk-RM3ZDRYE.js +0 -7
- package/dist/chunks/chunk-UCRMJMH6.js +0 -10
- package/dist/chunks/chunk-XQDHMFQY.js +0 -7
- package/dist/chunks/chunk-XRIM4BUF.js +0 -7
- package/dist/chunks/chunk-Z64MQIOE.js +0 -10
- package/dist/chunks/chunk-ZS2WS4AM.js +0 -7
- package/dist/chunks/clear-PECHXMV5.js +0 -8
- package/dist/chunks/compile-vercel-config-EM3HYOQC.js +0 -7
- package/dist/chunks/config-DA2NZUDH.js +0 -8
- package/dist/chunks/config-X6O3DT7V.js +0 -7
- package/dist/chunks/contract-RHMWRX4W.js +0 -10
- package/dist/chunks/delete-5RN5VW5L.js +0 -9
- package/dist/chunks/delete-MT6I7R7K.js +0 -10
- package/dist/chunks/detect-services-HSA4JHJX.js +0 -7
- package/dist/chunks/disable-LXPZDQMC.js +0 -7
- package/dist/chunks/discard-PW65T65S.js +0 -14
- package/dist/chunks/edit-WFSONASO.js +0 -8
- package/dist/chunks/edit-YID3FOJ3.js +0 -9
- package/dist/chunks/enable-X2EKQCIY.js +0 -7
- package/dist/chunks/future-DQBK457G.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-OMEACY5G.js +0 -7
- package/dist/chunks/image-AO2OZG4W.js +0 -7
- package/dist/chunks/import-builders-GSDV4K4A.js +0 -7
- package/dist/chunks/inspect-4244CRHI.js +0 -13
- package/dist/chunks/inspect-C43IV7X4.js +0 -9
- package/dist/chunks/inspect-RP5KXOYQ.js +0 -8
- package/dist/chunks/list-2SY6PZLC.js +0 -12
- package/dist/chunks/list-WBKZGIMQ.js +0 -8
- package/dist/chunks/login-K6XBWOFD.js +0 -9
- package/dist/chunks/login-OGMXEW5N.js +0 -7
- package/dist/chunks/logs-R3ZERQ7M.js +0 -7
- package/dist/chunks/ls-EVAQD3LI.js +0 -8
- package/dist/chunks/ls-O5DKK3TY.js +0 -8
- package/dist/chunks/ls-PTHGXQLK.js +0 -11
- package/dist/chunks/mutate-EKZWPQQJ.js +0 -9
- package/dist/chunks/notifications-F5S3RKZF.js +0 -7
- package/dist/chunks/open-KGVG54NN.js +0 -7
- package/dist/chunks/openapi-7TPDTMCU.js +0 -7
- package/dist/chunks/permissions-5K7JZOMB.js +0 -7
- package/dist/chunks/prompt-missing-credentials-DX2KJB5X.js +0 -7
- package/dist/chunks/publish-KIRTO2ZO.js +0 -15
- package/dist/chunks/pull-3CRJK7BX.js +0 -7
- package/dist/chunks/purchase-domain-if-available-55IXEF43.js +0 -7
- package/dist/chunks/push-4YG5HKSD.js +0 -7
- package/dist/chunks/query-67KQVLTR.js +0 -12
- package/dist/chunks/reauthenticate-SWSBFGDU.js +0 -7
- package/dist/chunks/remove-SYTIFVWW.js +0 -9
- package/dist/chunks/reorder-TX5MXJEB.js +0 -10
- package/dist/chunks/reply-XVK33N5T.js +0 -9
- package/dist/chunks/resolve-JZ262ZF4.js +0 -12
- package/dist/chunks/resolve-agent-team-BG5YW55B.js +0 -7
- package/dist/chunks/restore-IPFL7TKT.js +0 -16
- package/dist/chunks/rm-2BCAZGQU.js +0 -8
- package/dist/chunks/rm-3CCU3CE6.js +0 -8
- package/dist/chunks/rm-5CQV5LYG.js +0 -8
- package/dist/chunks/rm-OV4OU6H2.js +0 -8
- package/dist/chunks/rm-WFGMOZ3G.js +0 -8
- package/dist/chunks/rule-inspect-RFJIIXZH.js +0 -8
- package/dist/chunks/schema-SUNFQGUL.js +0 -14
- package/dist/chunks/select-org-MPHPWWPU.js +0 -7
- package/dist/chunks/set-BR6EEOPB.js +0 -7
- package/dist/chunks/set-I3NWZRSI.js +0 -9
- package/dist/chunks/setup-and-link-MRTKVOWD.js +0 -7
- package/dist/chunks/tags-7DIZEAVE.js +0 -7
- package/dist/chunks/usage-3BS7JCCU.js +0 -13
- package/dist/chunks/validate-config-LAD7BU3B.js +0 -7
- package/dist/launcher-errors.js +0 -11
- package/dist/native-download.js +0 -8
package/dist/commands-ai.js
CHANGED
|
@@ -4,7 +4,7 @@ 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-RIJ45N7C.js";import{CHECKBOX_INSTRUCTIONS}from"./chunks/chunk-OFDTADPQ.js";import{selectOrg}from"./chunks/chunk-RR5SDYNN.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{jsonNextStep,runWithJsonOutput,writeJsonFailure,writeJsonResult}from"./chunks/chunk-EVBGFSK5.js";import{readOnOffOption}from"./chunks/chunk-PFZCGMJ7.js";import{buy,deleteCertById,getDomains,getProjectDomain,getProjectDomainByName,getTeamMemberByIdentifier,getTeamMembersByIds,isDomainExternal,removeAliasById,teamMemberLabel,verifyProjectDomain}from"./chunks/chunk-A3M2BHWR.js";import{addDomain,getDomainByName,require_cjs}from"./chunks/chunk-EZLPMOHM.js";import{getDomainPrice,getDomainStatus}from"./chunks/chunk-FHMCTV5E.js";import{amountMatchesPrice,canPromptForCharge,chargeFailureReason,formatAmountArg,formatTerm,parseAmount,parseOrderWait,printChargeRecovery,refuseUnnamedTeam,reportChargeFailure,reportOrderPending,reportPriceChanged,reportUnknownOutcome,reportUsageError,writeChargeAction}from"./chunks/chunk-NUSKXXZZ.js";import{formatUsd}from"./chunks/chunk-RAQ6EUNL.js";import{DEFAULT_ORDER_WAIT_MS,getOrderOutcome,pollForOrder,remainingWait}from"./chunks/chunk-IOTKHTZH.js";import{require_execa}from"./chunks/chunk-RCUDI7OF.js";import"./chunks/chunk-GD7AV7BO.js";import{external_exports}from"./chunks/chunk-2AMO2VMV.js";import{getAliases}from"./chunks/chunk-CD6ZWCKT.js";import{InvalidNextError,getPaginationOpts}from"./chunks/chunk-C6GY2G73.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{validateLsArgs}from"./chunks/chunk-42J2KCDF.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import"./chunks/chunk-PFD7LETF.js";import"./chunks/chunk-UFXIPUNI.js";import{formatTable}from"./chunks/chunk-2RXUQ72I.js";import{DEFAULT_LIST_LIMIT,PaginationError,fetchAllPages,parseListLimit,printNextPageCommand,printNextPageHint}from"./chunks/chunk-TZE4CS4K.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import{table}from"./chunks/chunk-375JVQYK.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError,withWarnings}from"./chunks/chunk-3KJ6HWSX.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{tokensAfterCommand}from"./chunks/chunk-D7BB5BPA.js";import{getTeams}from"./chunks/chunk-SLCPSRDR.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-QROI2U32.js";import"./chunks/chunk-M3Z6NSC2.js";import"./chunks/chunk-ECFLIVEE.js";import"./chunks/chunk-RDWLLSPU.js";import"./chunks/chunk-7ZJ7VUIR.js";import{gatewaySubcommand,pluginSubcommand,setupCommand,skillsSubcommand}from"./chunks/chunk-WTFD4MDT.js";import"./chunks/chunk-IHTWZEQW.js";import"./chunks/chunk-74VQ7PQV.js";import"./chunks/chunk-SNGM6NSO.js";import"./chunks/chunk-P24YBQ6H.js";import"./chunks/chunk-NMIZSQDN.js";import"./chunks/chunk-K7ARJYAG.js";import"./chunks/chunk-V5TOMLK4.js";import"./chunks/chunk-M3R7F2N4.js";import"./chunks/chunk-4E6BGQWR.js";import"./chunks/chunk-6UMVJ7RL.js";import"./chunks/chunk-IIGNDMLO.js";import"./chunks/chunk-N65H4JMJ.js";import"./chunks/chunk-EJN55YDV.js";import"./chunks/chunk-5DXC4TE2.js";import"./chunks/chunk-4U6ACPA4.js";import"./chunks/chunk-7VGBGUX7.js";import"./chunks/chunk-CU3LNJZV.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-BZIC36KP.js";import{printError}from"./chunks/chunk-NDMQVBTV.js";import{help}from"./chunks/chunk-HZEKH3RO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getContextName,getScope}from"./chunks/chunk-NSPW47RU.js";import{TelemetryClient}from"./chunks/chunk-MBXLL2HF.js";import"./chunks/chunk-2EYYB6YN.js";import"./chunks/chunk-NWGBDBZI.js";import{buildCommandWithGlobalFlags,buildCommandWithYes,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeActionRequired}from"./chunks/chunk-5X635INY.js";import"./chunks/chunk-FYE7ILRR.js";import{getLinkedProject,getProjectByNameOrId,getUser}from"./chunks/chunk-2J35YKA2.js";import{require_pluralize}from"./chunks/chunk-4HR3I3ML.js";import{ALIGNED_LABEL_WIDTH,printAlignedLabel}from"./chunks/chunk-PKNEWN4W.js";import"./chunks/chunk-ITQPDXXA.js";import"./chunks/chunk-GL66K54F.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments,parseWithShortFlag}from"./chunks/chunk-AYZ52QDF.js";import{getTeamByIdOrSlug}from"./chunks/chunk-2VBFQZ72.js";import{validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-SDYCW5JM.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-ZS2WS4AM.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-4DMKP6AO.js";import{getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-VRH7LWOC.js";import"./chunks/chunk-DBT6PGEH.js";import{output_manager_default}from"./chunks/chunk-GZLYNPNU.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-PUKYAALC.js";import{getFlagsSpecification,quoteArg,stripSensitiveAuthArgs}from"./chunks/chunk-AMPJ6RWT.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-BULSRTQE.js";import"./chunks/chunk-BRQUZ5NC.js";import"./chunks/chunk-D6REP5QQ.js";import"./chunks/chunk-FBYA6LLM.js";import"./chunks/chunk-MY4MONOH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,getExitCodeForReason}from"./chunks/chunk-Q2QVK3TH.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}
|
|
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-5HQEYPDO.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{selectOrg}from"./chunks/chunk-SHMHL6W7.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import{CHECKBOX_INSTRUCTIONS}from"./chunks/chunk-OFDTADPQ.js";import{jsonNextStep,runWithJsonOutput,writeJsonFailure,writeJsonResult}from"./chunks/chunk-42Y46TZ3.js";import{buy,deleteCertById,getDomains,getProjectDomain,getProjectDomainByName,getTeamMemberByIdentifier,getTeamMembersByIds,isDomainExternal,removeAliasById,teamMemberLabel,verifyProjectDomain}from"./chunks/chunk-O7TFWXLZ.js";import{addDomain,getDomainByName,require_cjs}from"./chunks/chunk-6WTGR7UP.js";import{getDomainPrice,getDomainStatus}from"./chunks/chunk-H64GR57G.js";import{amountMatchesPrice,canPromptForCharge,chargeFailureReason,formatAmountArg,formatTerm,parseAmount,parseOrderWait,printChargeRecovery,refuseUnnamedTeam,reportChargeFailure,reportOrderPending,reportPriceChanged,reportUnknownOutcome,reportUsageError,writeChargeAction}from"./chunks/chunk-FZLCDLWD.js";import{formatUsd}from"./chunks/chunk-RAQ6EUNL.js";import{DEFAULT_ORDER_WAIT_MS,getOrderOutcome,pollForOrder,remainingWait}from"./chunks/chunk-EDO66J3L.js";import{external_exports}from"./chunks/chunk-2AMO2VMV.js";import{getAliases}from"./chunks/chunk-G63MSB6N.js";import{require_execa}from"./chunks/chunk-M32HBBPK.js";import{InvalidNextError,getPaginationOpts}from"./chunks/chunk-C6GY2G73.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import"./chunks/chunk-MXALPSIX.js";import{formatTable}from"./chunks/chunk-YIOMTAUF.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import{tokensAfterCommand}from"./chunks/chunk-SQBDW5FO.js";import{readOnOffOption}from"./chunks/chunk-BH5OASEJ.js";import"./chunks/chunk-GD7AV7BO.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import"./chunks/chunk-PFD7LETF.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError,withWarnings}from"./chunks/chunk-WLMW7K7F.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{DEFAULT_LIST_LIMIT,PaginationError,fetchAllPages,parseListLimit,printNextPageCommand,printNextPageHint}from"./chunks/chunk-QBHTNUM5.js";import{validateLsArgs}from"./chunks/chunk-3EFPSM6M.js";import{table}from"./chunks/chunk-CJZE7647.js";import{getTeams}from"./chunks/chunk-Y2FVJ7YO.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-2CQJKBKV.js";import"./chunks/chunk-2V6UURUN.js";import"./chunks/chunk-OKKG2FUS.js";import"./chunks/chunk-5L566FZB.js";import"./chunks/chunk-6737KAJP.js";import"./chunks/chunk-O3DAPRJ3.js";import{gatewaySubcommand,pluginSubcommand,setupCommand,skillsSubcommand}from"./chunks/chunk-UZQJQXGJ.js";import"./chunks/chunk-5YLKPSZI.js";import"./chunks/chunk-SNGM6NSO.js";import"./chunks/chunk-JVGENO2R.js";import"./chunks/chunk-SP6E7PHW.js";import"./chunks/chunk-OFOZ5DBA.js";import"./chunks/chunk-6Q2XEYCJ.js";import"./chunks/chunk-SEHERY6U.js";import"./chunks/chunk-2LOA3LC6.js";import"./chunks/chunk-E7CEQ2PO.js";import"./chunks/chunk-W25UARQV.js";import"./chunks/chunk-7BDQUBSO.js";import"./chunks/chunk-ABSFPYM4.js";import"./chunks/chunk-YANOBY2G.js";import"./chunks/chunk-F7L5SXJM.js";import"./chunks/chunk-6S6UZV3V.js";import"./chunks/chunk-GUSOYIW6.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-7TVNKTN2.js";import"./chunks/chunk-HR66URIC.js";import{printError}from"./chunks/chunk-NYJTWSSD.js";import{help}from"./chunks/chunk-VVTMF2AY.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getContextName,getScope}from"./chunks/chunk-XSQZ35V6.js";import{TelemetryClient}from"./chunks/chunk-AGLOVMPC.js";import"./chunks/chunk-2EYYB6YN.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,getExitCodeForReason,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeActionRequired}from"./chunks/chunk-GORL5DZC.js";import"./chunks/chunk-OFZUWHZW.js";import{getLinkedProject,getProjectByNameOrId,getUser}from"./chunks/chunk-BC74BRVP.js";import{require_pluralize}from"./chunks/chunk-4HR3I3ML.js";import{ALIGNED_LABEL_WIDTH,printAlignedLabel}from"./chunks/chunk-K46QQRUN.js";import"./chunks/chunk-MTZYPCZ7.js";import"./chunks/chunk-GPDERS2D.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments,parseWithShortFlag}from"./chunks/chunk-VM6X5BTK.js";import{getTeamByIdOrSlug}from"./chunks/chunk-2VBFQZ72.js";import{validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-JONZUKWX.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-D6REP5QQ.js";import"./chunks/chunk-FBYA6LLM.js";import"./chunks/chunk-MY4MONOH.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-GOI2VVI7.js";import{getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-B4KA3ZH2.js";import"./chunks/chunk-BOJDM3O7.js";import{output_manager_default}from"./chunks/chunk-YNCWSPPJ.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-AW33SRYY.js";import"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{require_dist}from"./chunks/chunk-MCYG7CCE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-24SIHFEW.js";import{getFlagsSpecification,quoteArg,stripSensitiveAuthArgs}from"./chunks/chunk-EZVNGJN5.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-BULSRTQE.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
|
|
|
@@ -32,7 +32,7 @@ import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODING_AGENT_BASE_
|
|
|
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,{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.
|
|
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){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,
|
|
@@ -127,7 +127,7 @@ ${sections.join(`
|
|
|
127
127
|
`),output_manager_default.print(` Then import it to Vercel DNS by using:
|
|
128
128
|
`),output_manager_default.print(` ${getCommandName(`dns import ${domainName} <zonefile>`)}
|
|
129
129
|
|
|
130
|
-
`),0)}var import_chalk33=__toESM(require_source(),1);var import_chalk32=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk32.default.gray("-"),sortedCurrent[i]||import_chalk32.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk32.default.green(chars_default.tick):import_chalk32.default.red(chars_default.cross)]);return table([[import_chalk32.default.gray("Intended Nameservers"),import_chalk32.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk2 of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk2.projectDomains){let entry2=domainsByProjectId.get(projectDomain.projectId)??{domains:[],redirects:[]};entry2.domains.push(projectDomain.name),projectDomain.redirect&&entry2.redirects.push({domain:projectDomain.name,redirect:projectDomain.redirect,redirectStatusCode:projectDomain.redirectStatusCode??null}),domainsByProjectId.set(projectDomain.projectId,entry2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,{domains,redirects}])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains,redirects}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain){return domain.boughtAt?"Vercel":typeof domain.orderedAt=="number"&&!domain.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_error_utils2=__toESM(require_dist(),1),VERIFICATION_DELAY_MS=30*60*1e3;function toEpochMillis(value){if(value===void 0)return null;let ms2=typeof value=="number"?value:Date.parse(value);return Number.isFinite(ms2)?ms2:null}async function getRegistrantVerification(client,domainName,boughtAt,now=Date.now()){try{let res=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(domainName)}/contact-verification`,{bailOn429:!0});return res.verified?{status:"verified"}:{status:"unverified",email:res.email??null,verifyBy:toEpochMillis(res.verifyBy)}}catch(err){if(isAPIError(err)&&err.code==="bought_too_recently"){let readyAt=(boughtAt??now)+VERIFICATION_DELAY_MS;return{status:"pending",retryAfter:Math.max(60,Math.ceil((readyAt-now)/1e3))}}return isAPIError(err)&&err.status===404?null:(output_manager_default.debug(`Couldn't read registrant verification for ${domainName}: ${(0,import_error_utils2.errorToString)(err)}`),{status:"unknown"})}}function formatRegistrantVerification(verification){switch(verification.status){case"verified":return"Verified";case"unknown":return"Couldn't check. Run with --debug to see why";case"pending":{let minutes=Math.ceil(verification.retryAfter/60);return`Pending: the registrar reports it 30 minutes after purchase. Check again in ${minutes} ${minutes===1?"minute":"minutes"}`}case"unverified":{let to=verification.email?` sent to ${verification.email}`:"",by=verification.verifyBy?` by ${formatDate(verification.verifyBy)}`:"";return`Not verified: confirm the email${to}${by}, or the registry may suspend the domain`}}}async function inspect4(client,argv){let telemetry=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk33.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName});if(typeof information=="number")return information;let{domain,projects,renewalPrice,domainConfig,registrantVerification}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain.name,registrar:getDomainRegistrar(domain),expiresAt:domain.expiresAt,creator:domain.creator.username,createdAt:domain.createdAt,edgeNetwork:!0,renewalPrice:domain.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain.intendedNameservers,current:domain.nameservers},projects:projects.map(({project,domains,redirects})=>({name:project.name,domains,redirects})),configuration:{misconfigured:domainConfig.misconfigured??null},registrantVerification},null,2)}
|
|
130
|
+
`),0)}var import_chalk33=__toESM(require_source(),1);var import_chalk32=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk32.default.gray("-"),sortedCurrent[i]||import_chalk32.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk32.default.green(chars_default.tick):import_chalk32.default.red(chars_default.cross)]);return table([[import_chalk32.default.gray("Intended Nameservers"),import_chalk32.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk2 of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk2.projectDomains){let entry2=domainsByProjectId.get(projectDomain.projectId)??{domains:[],redirects:[]};entry2.domains.push(projectDomain.name),projectDomain.redirect&&entry2.redirects.push({domain:projectDomain.name,redirect:projectDomain.redirect,redirectStatusCode:projectDomain.redirectStatusCode??null}),domainsByProjectId.set(projectDomain.projectId,entry2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,{domains,redirects}])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains,redirects}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain){return domain.boughtAt?"Vercel":typeof domain.orderedAt=="number"&&!domain.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_error_utils2=__toESM(require_dist(),1),VERIFICATION_DELAY_MS=30*60*1e3;function toEpochMillis(value){if(value===void 0)return null;let ms2=typeof value=="number"?value:Date.parse(value);return Number.isFinite(ms2)?ms2:null}async function getRegistrantVerification(client,domainName,boughtAt,now=Date.now()){try{let res=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(domainName)}/contact-verification`,{bailOn429:!0});return res.verified?{status:"verified"}:{status:"unverified",email:res.email??null,verifyBy:toEpochMillis(res.verifyBy)}}catch(err){if(isAPIError(err)&&err.code==="bought_too_recently"){let readyAt=(boughtAt??now)+VERIFICATION_DELAY_MS;return{status:"pending",retryAfter:Math.max(60,Math.ceil((readyAt-now)/1e3))}}return isAPIError(err)&&err.status===404?null:(output_manager_default.debug(`Couldn't read registrant verification for ${domainName}: ${(0,import_error_utils2.errorToString)(err)}`),{status:"unknown"})}}function formatRegistrantVerification(verification){switch(verification.status){case"verified":return"Verified";case"unknown":return"Couldn't check. Run with --debug to see why";case"pending":{let minutes=Math.ceil(verification.retryAfter/60);return`Pending: the registrar reports it 30 minutes after purchase. Check again in ${minutes} ${minutes===1?"minute":"minutes"}`}case"unverified":{let to=verification.email?` sent to ${verification.email}`:"",by=verification.verifyBy?` by ${formatDate(verification.verifyBy)}`:"";return`Not verified: confirm the email${to}${by}, or the registry may suspend the domain`}}}async function inspect4(client,argv){let telemetry=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);asJson||output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk33.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName,asJson});if(typeof information=="number")return information;let{domain,projects,renewalPrice,domainConfig,registrantVerification}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain.name,registrar:getDomainRegistrar(domain),expiresAt:domain.expiresAt,creator:domain.creator.username,createdAt:domain.createdAt,edgeNetwork:!0,renewalPrice:domain.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain.intendedNameservers,current:domain.nameservers},projects:projects.map(({project,domains,redirects})=>({name:project.name,domains,redirects})),configuration:{misconfigured:domainConfig.misconfigured??null},registrantVerification},null,2)}
|
|
131
131
|
`),0;if(output_manager_default.log(`Domain ${domainName} found under ${import_chalk33.default.bold(contextName)} ${import_chalk33.default.gray(inspectStamp())}`),output_manager_default.print(`
|
|
132
132
|
`),output_manager_default.print(import_chalk33.default.bold(` General
|
|
133
133
|
|
|
@@ -151,7 +151,7 @@ ${sections.join(`
|
|
|
151
151
|
`)}if(domainConfig.misconfigured){let contextNameConst=contextName,projectNames=Array.from(new Set(projects.map(({project})=>project.name))),recordsSource=projectNames.length?"Check the project's Domains settings for the required DNS records":"Assign it to a project to see the required DNS records";output_manager_default.warn(`This domain is not configured properly. ${recordsSource}, or run ${getCommandName("domains verify --help")} for CLI verification options.`,null,null,null),projectNames.length?projectNames.forEach((name,index)=>{let prefix=index===0?" Read more:":" ".repeat(12);output_manager_default.print(`${prefix} https://vercel.com/${contextNameConst}/${name}/settings/domains
|
|
152
152
|
`)}):output_manager_default.print(` Read more: https://vercel.link/domain-configuration
|
|
153
153
|
`),output_manager_default.print(`
|
|
154
|
-
`)}return null}async function fetchInformation({client,contextName,domainName}){let[domain,renewalPrice]=await Promise.all([getDomainByName(client,contextName,domainName,{ignoreWait:!0}),getDomainPrice(client,domainName).then(res=>res instanceof Error?null:res.renewalPrice).catch(()=>null)]);if(domain instanceof DomainNotFound)return output_manager_default.prettyError(domain),1;if(domain instanceof DomainPermissionDenied)return output_manager_default.prettyError(domain),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let[projects,domainConfig,registrantVerification]=await Promise.all([findProjectsForDomain(client,domainName),getDomainConfig(client,domainName),domain.boughtAt?getRegistrantVerification(client,domainName,domain.boughtAt):null]);return projects instanceof Error?(output_manager_default.prettyError(projects),1):{domain,projects,renewalPrice,domainConfig,registrantVerification}}var import_ms=__toESM(require_ms(),1),import_chalk34=__toESM(require_source(),1),import_pluralize=__toESM(require_pluralize(),1);var DomainsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let telemetry=new DomainsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"domains ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionNext(opts["--next"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),err instanceof InvalidNextError?2:1}let contextName=await getContextName(client,{resolveLocalScope:!0}),lsStamp=stamp_default();output_manager_default.spinner(`Fetching Domains under ${import_chalk34.default.bold(contextName)}`);let{domains,pagination}=await getDomains(client,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={domains:domains.map(domain=>({name:domain.name,registrar:getDomainRegistrar(domain),nameservers:isDomainExternal(domain)?"external":"vercel",expiresAt:domain.expiresAt,createdAt:domain.createdAt,creator:domain.creator.username})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
154
|
+
`)}return null}async function fetchInformation({client,contextName,domainName,asJson}){let[domain,renewalPrice]=await Promise.all([getDomainByName(client,contextName,domainName,{ignoreWait:!0}),getDomainPrice(client,domainName).then(res=>res instanceof Error?null:res.renewalPrice).catch(()=>null)]);if(domain instanceof DomainNotFound)return asJson?(output_manager_default.stopSpinner(),writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`Domain not found by "${domainName}" under ${contextName}.`,next:[jsonNextStep(client,["domains","check",domainName],"Find out if the domain can be bought"),jsonNextStep(client,["domains","price",domainName],"Get the price of the domain"),jsonNextStep(client,["domains","list"],"List your domains")]},1)):(output_manager_default.prettyError(domain),output_manager_default.log(`To find out if you can buy it, run ${getCommandName(`domains check ${domainName}`)}.`),output_manager_default.log(`To get its price, run ${getCommandName(`domains price ${domainName}`)}.`),output_manager_default.log(`To see your domains, run ${getCommandName("domains ls")}.`),1);if(domain instanceof DomainPermissionDenied)return output_manager_default.prettyError(domain),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let[projects,domainConfig,registrantVerification]=await Promise.all([findProjectsForDomain(client,domainName),getDomainConfig(client,domainName),domain.boughtAt?getRegistrantVerification(client,domainName,domain.boughtAt):null]);return projects instanceof Error?(output_manager_default.prettyError(projects),1):{domain,projects,renewalPrice,domainConfig,registrantVerification}}var import_ms=__toESM(require_ms(),1),import_chalk34=__toESM(require_source(),1),import_pluralize=__toESM(require_pluralize(),1);var DomainsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let telemetry=new DomainsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"domains ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionNext(opts["--next"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),err instanceof InvalidNextError?2:1}let contextName=await getContextName(client,{resolveLocalScope:!0}),lsStamp=stamp_default();output_manager_default.spinner(`Fetching Domains under ${import_chalk34.default.bold(contextName)}`);let{domains,pagination}=await getDomains(client,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={domains:domains.map(domain=>({name:domain.name,registrar:getDomainRegistrar(domain),nameservers:isDomainExternal(domain)?"external":"vercel",expiresAt:domain.expiresAt,createdAt:domain.createdAt,creator:domain.creator.username})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
155
155
|
`)}else if(output_manager_default.log(`${(0,import_pluralize.default)("Domain",domains.length,!0)} found under ${import_chalk34.default.bold(contextName)} ${import_chalk34.default.gray(lsStamp())}`),domains.length>0&&(output_manager_default.print(formatDomainsTable(domains).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
156
156
|
|
|
157
157
|
`)),pagination?.next){let flags=getCommandFlags(opts,["_","--next","--format"]);printNextPageCommand(getCommandNamePlain(`domains ls${flags} --next ${pagination.next}`))}return 0}function formatDomainsTable(domains){let current=Date.now(),rows=domains.map(domain=>{let expiration=formatDateWithoutTime(domain.expiresAt),age=domain.createdAt?(0,import_ms.default)(current-domain.createdAt):"-";return[domain.name,getDomainRegistrar(domain),isDomainExternal(domain)?"Third Party":"Vercel",expiration,domain.creator.username,import_chalk34.default.gray(age)]});return formatTable(["Domain","Registrar","Nameservers","Expiration Date","Creator","Age"],["l","l","l","l","l","l"],[{rows}])}var import_chalk35=__toESM(require_source(),1),import_pluralize2=__toESM(require_pluralize(),1);async function removeDomainByName(now,contextName,domain){try{return await now.fetch(`/v3/domains/${encodeURIComponent(domain)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain);if(err.code==="forbidden")return new DomainPermissionDenied(domain,contextName);if(err.code==="domain_removal_conflict")return new DomainRemovalConflict({aliases:err.aliases,certs:err.certs,message:err.message,pendingAsyncPurchase:err.pendingAsyncPurchase,resolvable:err.resolvable,suffix:err.suffix,transferring:err.transferring})}throw err}}async function setCustomSuffix(client,contextName,domain,suffix){try{return await client.fetch("/v1/custom-suffix",{method:"PATCH",body:{suffix}})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(domain,contextName);if(err.code==="domain_external")return new DomainExternal(domain);if(err.code==="domain_invalid")return new InvalidDomain(domain);if(err.code==="domain_not_found")return new DomainNotFound(domain);if(err.code==="domain_not_verified")return new DomainNotVerified(domain);if(err.code==="domain_permission_denied")return new DomainPermissionDenied(domain,contextName)}throw err}}var DomainsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function rm(client,argv){return argv.includes("--json")?runWithJsonOutput(client,()=>removeDomainCommand(client,argv,!0)):removeDomainCommand(client,argv,!1)}async function removeDomainCommand(client,argv,json){let telemetry=new DomainsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliFlagYes(opts["--yes"]),telemetry.trackCliFlagJson(opts["--json"]),!domainName)return output_manager_default.error(`${getCommandName("domains remove <domain>")} expects one argument`),2;let contextName=await getContextName(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk35.default.cyan(`${getCommandName("domains remove <domain>")}`)}`),2;let domain=await getDomainByName(client,contextName,domainName);if(domain instanceof DomainNotFound||domain.name!==domainName)return output_manager_default.error(`Domain not found by "${domainName}" under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`Domain not found by "${domainName}" under ${contextName}.`,next:[jsonNextStep(client,["domains","list"],"List your domains")]},1):1;if(domain instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have access to the domain ${domainName} under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:`You don't have access to the domain ${domainName} under ${contextName}.`,next:[jsonNextStep(client,["domains","list"],"List your domains")]},1):1;let projectCount=await countProjectsForDomain(client,domain.name),warnings=[];typeof projectCount=="number"&&projectCount>0&&(output_manager_default.warn(`The domain is currently used by ${(0,import_pluralize2.default)("project",projectCount,!0)}.`),warnings.push({reason:"domain_in_use",message:`The domain is currently used by ${(0,import_pluralize2.default)("project",projectCount,!0)}.`}));let skipConfirmation=opts["--yes"]||!1;if(json&&!skipConfirmation)return writeActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Can't remove ${domainName} without --yes in non-interactive mode.`,next:[{command:buildCommandWithYes(client.argv)}]}),getExitCodeForReason(AGENT_REASON.CONFIRMATION_REQUIRED);if(!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove ${param(domainName)}?`,!1))return output_manager_default.log("Canceled"),0;let exitCode=await removeDomain(client,contextName,skipConfirmation,domain,warnings);return json&&exitCode===0?writeJsonResult(client,{domain:{id:domain.id,name:domain.name},outcome:"removed",...warnings.length>0?{warnings}:{},next:[jsonNextStep(client,["domains","list"],"List the remaining domains")]}):exitCode}async function removeDomain(client,contextName,skipConfirmation,domain,warnings,aliasIds=[],certIds=[],suffix=!1,attempt=1){let removeStamp=stamp_default();output_manager_default.debug("Removing domain");for(let id of aliasIds){output_manager_default.debug(`Removing alias ${id}`);try{await removeAliasById(client,id)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}for(let id of certIds){output_manager_default.debug(`Removing cert ${id}`);try{await deleteCertById(client,id)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}suffix&&(output_manager_default.debug("Removing custom suffix"),await setCustomSuffix(client,contextName,domain.name,null));let removeResult=await removeDomainByName(client,contextName,domain.name);if(removeResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(removeResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk35.default.underline(removeResult.meta.domain)} under ${import_chalk35.default.bold(removeResult.meta.context)}.`),1;if(removeResult instanceof DomainRemovalConflict){if(attempt>=2)return output_manager_default.error(removeResult.message),1;let{aliases,certs,suffix:suffix2,transferring,pendingAsyncPurchase,resolvable}=removeResult.meta;return transferring?(output_manager_default.error(`${param(domain.name)} transfer should be declined or approved before removing.`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain.name)} because it is still in the process of being purchased.`),1):resolvable?(output_manager_default.log(`We found conflicts when attempting to remove ${param(domain.name)}.`),aliases.length>0&&(output_manager_default.warn(`This domain's ${import_chalk35.default.bold((0,import_pluralize2.default)("alias",aliases.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),warnings.push({reason:"aliases_removed",message:`Removed the domain's ${(0,import_pluralize2.default)("alias",aliases.length,!0)}.`})),certs.length>0&&(output_manager_default.warn(`This domain's ${import_chalk35.default.bold((0,import_pluralize2.default)("certificate",certs.length,!0))} will be removed. Run ${getCommandName("cert ls")} to list them.`),warnings.push({reason:"certs_removed",message:`Removed the domain's ${(0,import_pluralize2.default)("certificate",certs.length,!0)}.`})),suffix2&&(output_manager_default.warn(`The ${import_chalk35.default.bold("custom suffix")} associated with this domain.`),warnings.push({reason:"custom_suffix_removed",message:"Removed the domain's custom suffix."})),!skipConfirmation&&!await client.input.confirm("Remove conflicts associated with domain?",!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain,warnings,aliases,certs,suffix2,attempt+1)):(output_manager_default.error(removeResult.message),1)}return output_manager_default.success(`Domain ${import_chalk35.default.bold(domain.name)} removed ${removeStamp()}`),0}var import_chalk36=__toESM(require_source(),1),import_pluralize3=__toESM(require_pluralize(),1);async function moveOutDomain(client,contextName,name,destination){try{return await client.fetch(`/v4/domains/${encodeURIComponent(name)}`,{body:{op:"move-out",destination},method:"PATCH"})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(name,contextName);if(err.code==="not_found")return new DomainNotFound(name);if(err.code==="invalid_move_destination")return new InvalidMoveDestination(destination);if(err.code==="domain_move_conflict"){let{pendingAsyncPurchase,resolvable,suffix,message}=err;return new DomainMoveConflict({message,pendingAsyncPurchase,resolvable,suffix})}}throw err}}async function getDomainAliases(client,domain){let{aliases}=await getAliases(client);return aliases.filter(alias=>alias.alias.endsWith(domain))}var DomainsMoveTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentDestination(destination){destination&&this.trackCliArgument({arg:"destination",value:this.redactedValue})}};async function move(client,argv){let telemetry=new DomainsMoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(moveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry.trackCliFlagYes(opts["--yes"]),telemetry.trackCliArgumentDomain(args[0]),telemetry.trackCliArgumentDestination(args[1]);let{contextName,user}=await getScope(client),{domainName,destination}=await getArgs(client,args);if(!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let domain=await getDomainByName(client,contextName,domainName);if(domain instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk36.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk36.default.underline(domain.meta.domain)} under ${import_chalk36.default.bold(domain.meta.context)}.`),1;let teams=await getTeams(client),matchId=await findDestinationMatch(destination,user,teams);if(matchId&&user&&matchId===user.id&&user.version==="northstar")return output_manager_default.error("You may not move your domain to your user account."),1;if(!matchId&&!opts["--yes"]&&(output_manager_default.warn(`You're not a member of ${param(destination)}. ${param(destination)} will have 24 hours to accept your move request before it expires.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)} to ${param(destination)}?`,!1)))return output_manager_default.log("Canceled"),0;if(!opts["--yes"]){let aliases=await getDomainAliases(client,domainName);if(aliases.length>0&&(output_manager_default.warn(`This domain's ${import_chalk36.default.bold((0,import_pluralize3.default)("alias",aliases.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)}?`,!1)))return output_manager_default.log("Canceled"),0}let context=contextName;output_manager_default.spinner("Moving");let moveTokenResult=await moveOutDomain(client,context,domainName,matchId||destination);if(moveTokenResult instanceof DomainMoveConflict){let{suffix,pendingAsyncPurchase}=moveTokenResult.meta;return suffix?(output_manager_default.error(`Please remove custom suffix for ${param(domainName)} before moving out`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain.name)} because it is still in the process of being purchased.`),1):(output_manager_default.error(moveTokenResult.message),1)}if(moveTokenResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk36.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(moveTokenResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk36.default.underline(moveTokenResult.meta.domain)} under ${import_chalk36.default.bold(moveTokenResult.meta.context)}.`),1;if(moveTokenResult instanceof InvalidMoveDestination)return output_manager_default.error(`Destination ${import_chalk36.default.bold(destination)} is invalid. Please supply a valid username, email, team slug, user id, or team id.`),1;let{moved}=moveTokenResult;return moved?output_manager_default.success(`${param(domainName)} was moved to ${param(destination)}.`):output_manager_default.success(`Sent ${param(destination)} an email to approve the ${param(domainName)} move request.`),0}async function getArgs(client,args){let[domainName,destination]=args;return domainName||(domainName=await client.input.text({message:"- Domain name: ",validate:isRootDomain})),destination||(destination=await client.input.text({message:"- Destination: ",validate:v=>!!(v&&v.length>0)})),{domainName,destination}}async function findDestinationMatch(destination,user,teams){if(user&&(user.id===destination||user.username===destination))return user.id;for(let team of teams)if(team.id===destination||team.slug===destination)return team.id;return null}var import_chalk37=__toESM(require_source(),1);async function price(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(priceSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let domains=parsedArgs.args,hasMultipleInputDomains=domains.length>1,formatResult=validateJsonOutput(parsedArgs.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 price <domain>`"),2;try{let quotes=domains.length===1?await getSingleDomainQuote(client,domains[0]):await getBulkDomainQuotes(client,domains);if(formatResult.jsonOutput)return!hasMultipleInputDomains&"es.length===1?client.stdout.write(`${JSON.stringify(quotes[0],null,2)}
|
|
@@ -163,7 +163,7 @@ ${sections.join(`
|
|
|
163
163
|
`):output_manager_default.error(message),1}return printError(error),1}}async function getSupportedTlds(client,order){let cache=await client.maybeReadConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema),cacheKey=JSON.stringify([client.config.currentTeam??null,order]),cachedEntry=cache?.entries[cacheKey];if(cachedEntry&&isSupportedTldsCacheEntryFresh(cachedEntry.fetchedAt))return output_manager_default.debug("Using cached supported TLD catalog"),cachedEntry.tlds;let params=new URLSearchParams2({order}),supportedTlds=supportedTldsSchema.parse(await client.fetch(`/v1/registrar/tlds/supported?${params}`));try{let fetchedAt=Date.now(),freshEntries=Object.fromEntries(Object.entries(cache?.entries??{}).filter(([,entry2])=>isSupportedTldsCacheEntryFresh(entry2.fetchedAt,fetchedAt)));await client.writeConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema,{entries:{...freshEntries,[cacheKey]:{fetchedAt,tlds:supportedTlds}}})}catch(error){output_manager_default.debug(`Failed to cache supported TLD catalog: ${error}`)}return supportedTlds}function isSupportedTldsCacheEntryFresh(fetchedAt,now=Date.now()){let age=now-fetchedAt;return age>=0&&age<=SUPPORTED_TLDS_CACHE_TTL_MS}function encodeCursor(cursor2){return Buffer.from(JSON.stringify(cursor2),"utf8").toString("base64url")}function decodeCursor(value){if(value===void 0)return{valid:!0,cursor:null};try{if(!value||!/^[A-Za-z0-9_-]+$/.test(value))throw new Error("Invalid base64url value");let cursor2=JSON.parse(Buffer.from(value,"base64url").toString("utf8"));if(!isContinuationCursor(cursor2))throw new Error("Invalid cursor shape");return{valid:!0,cursor:cursor2}}catch{return{valid:!1,error:"Invalid continuation cursor. Run Domain Discovery again without `--next`."}}}function isContinuationCursor(value){if(!value||typeof value!="object"||Array.isArray(value))return!1;let cursor2=value,keys=Object.keys(cursor2).sort();return keys.length!==6||keys.join(",")!=="availableOnly,fragment,lastTld,order,query,tlds"?!1:typeof cursor2.query=="string"&&(typeof cursor2.fragment=="string"||cursor2.fragment===null)&&typeof cursor2.order=="string"&&ORDERS.includes(cursor2.order)&&Array.isArray(cursor2.tlds)&&cursor2.tlds.every(tld=>typeof tld=="string")&&typeof cursor2.availableOnly=="boolean"&&typeof cursor2.lastTld=="string"&&cursor2.lastTld.length>0}function getOffset(tlds,cursor2){if(!cursor2)return{valid:!0,offset:0};let lastTldIndex=tlds.indexOf(cursor2.lastTld);return lastTldIndex===-1?{valid:!1,error:"The continuation cursor is stale. Run Domain Discovery again without `--next`."}:{valid:!0,offset:lastTldIndex+1}}function normalizeQuery(args){if(args.length===0)return{valid:!1,error:"Missing query. Usage: `vercel domains search <query>`"};if(args.length>1)return{valid:!1,error:"Please provide one keyword or domain fragment."};let query=args[0].trim().toLowerCase();if(query.length===0)return{valid:!1,error:"Query cannot be empty."};if(!/^[\x00-\x7F]+$/.test(query))return{valid:!1,error:"Only ASCII queries are supported in Domain Discovery."};if(query.includes("://")||/[/?#]/.test(query))return{valid:!1,error:"URLs are not supported. Provide one keyword or domain fragment."};if(/\s/.test(query))return{valid:!1,error:"Queries cannot contain whitespace. Provide one keyword or domain fragment."};let[keyword,...fragmentParts]=query.split("."),fragment=fragmentParts.length>0?fragmentParts.join("."):null;return isValidLabel(keyword)?fragment!==null&&!fragment.split(".").every(isValidLabel)?{valid:!1,error:`Invalid TLD fragment: "${fragment}".`}:{valid:!0,query,keyword,fragment}:{valid:!1,error:`Invalid keyword: "${keyword}".`}}function isValidLabel(value){return value.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(value)}function getOrder(value){let order=value??DEFAULT_ORDER;return ORDERS.includes(order)?{valid:!0,order}:{valid:!1,error:`Invalid order: "${order}". Valid orders: ${ORDERS.join(", ")}`}}function getContinuationCommand(query,order,tlds,availableOnly,cursor2){let flags=[];return order!==DEFAULT_ORDER&&flags.push(`--order=${order}`),flags.push(...tlds.map(tld=>`--tld=${tld}`)),availableOnly&&flags.push("--available"),flags.push(`--next ${cursor2}`),`domains search ${query} ${flags.join(" ")}`}function normalizeTldFilters(values){if(values===void 0)return{valid:!0,tlds:[]};let tlds=Array.from(new Set(values.map(value=>value.trim().toLowerCase().replace(/^\./,"")))).sort(),invalidTld=tlds.find(tld=>tld.length===0||!tld.split(".").every(isValidLabel));return invalidTld!==void 0?{valid:!1,error:`Invalid TLD filter: "${invalidTld}".`}:{valid:!0,tlds}}function areStringArraysEqual(left,right){return left.length===right.length&&left.every((value,index)=>value===right[index])}function getLimit(value){let limit=value??DEFAULT_LIMIT;return!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT?{valid:!1,error:`Invalid limit: "${limit}". Provide a number from 1 to ${MAX_LIMIT}.`}:{valid:!0,limit}}function filterTlds(tlds,fragment,filters,order){let filterSet=new Set(filters),matchingTlds=tlds.filter(tld=>(fragment===null||tld.startsWith(fragment))&&(filterSet.size===0||filterSet.has(tld)));return order==="relevance"?matchingTlds.sort((a,b)=>a===fragment?-1:b===fragment?1:0):matchingTlds}async function getCandidatePage(client,keyword,tlds,offset,limit,availableOnly){let pageTlds=tlds.slice(offset,offset+limit),candidates=await quoteCandidates(client,pageTlds.map(tld=>`${keyword}.${tld}`));return{results:availableOnly?candidates.filter(candidate=>candidate.available):candidates,lastTld:pageTlds.at(-1)??null,hasMore:offset+pageTlds.length<tlds.length}}async function quoteCandidates(client,domains){if(domains.length===0)return[];let response=domainsSearchResponseSchema.parse(await client.fetch("/v1/registrar/domains/search",{method:"POST",body:{domains}})),resultsByDomain=new Map(response.results.map(result=>[result.domain,result]));return domains.map(domain=>{let result=resultsByDomain.get(domain);if(!result)throw new Error(`Missing registrar search result for ${domain}.`);return result.available?{domain:result.domain,available:!0,purchasePrice:result.price,renewalPrice:result.renewalPrice,years:result.years}:{domain:result.domain,available:!1,purchasePrice:null,renewalPrice:null,years:null}})}function renderTable(results){return table([["Domain","Availability","Purchase","Renewal"],...results.map(result=>[result.domain,result.available?"Available":"Unavailable",result.available?formatPrice(result.purchasePrice,result.years):"-",result.available?formatPrice(result.renewalPrice,result.years):"-"])])}function formatPrice(price2,years){return price2===null||years===null?"-":`$${price2} / ${years} ${years===1?"year":"years"}`}var import_chalk38=__toESM(require_source(),1),import_error_utils3=__toESM(require_dist(),1);async function updateAutoRenew(client,name,autoRenew2){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";return client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/auto-renew${teamParam}`,{method:"PATCH",body:{autoRenew:autoRenew2}})}var DomainsAutoRenewTelemetryClient=class extends TelemetryClient{trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentState(state){(state==="on"||state==="off")&&this.trackCliArgument({arg:"state",value:state})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var ON="on",OFF="off";async function autoRenew(client,argv){let telemetry=new DomainsAutoRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(autoRenewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),printError(error),2}let{args}=parsedArgs,action=args[0]==="enable"||args[0]==="disable"?args[0]:void 0,[domainName,state]=action?args.slice(1):args;action==="enable"?telemetry.trackCliSubcommandEnable(action):action==="disable"&&telemetry.trackCliSubcommandDisable(action),telemetry.trackCliArgumentDomain(domainName),action||telemetry.trackCliArgumentState(state),telemetry.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error}),output_manager_default.error(formatResult.error),2;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail(reason,message2,humanMessage=message2){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:message2}),getExitCodeForReason(reason)):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,domain:domainName,message:message2},null,2)}
|
|
164
164
|
`),getExitCodeForReason(reason)):(output_manager_default.error(humanMessage),getExitCodeForReason(reason))}if(args.length!==2||!domainName||!action&&!state){let usage=getCommandName(`domains auto-renew ${action??"enable|disable"} <domain>`);return fail(AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${usage}`,`Invalid number of arguments. Usage: ${import_chalk38.default.cyan(usage)}`)}if(!isRootDomain(domainName))return fail(AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}".`,`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`);if(!action&&state!==ON&&state!==OFF)return fail(AGENT_REASON.INVALID_ARGUMENTS,`Invalid state "${state}". Expected ${ON} or ${OFF}.`,`Invalid state "${state}". Expected ${import_chalk38.default.bold(ON)} or ${import_chalk38.default.bold(OFF)}.`);let enabled=action?action==="enable":state===ON;action||warnDeprecatedSubcommand(client,`domains auto-renew ${domainName} ${state}`,`domains auto-renew ${enabled?"enable":"disable"} ${domainName}`);let contextName=await getContextName(client);asJson||output_manager_default.spinner(`${enabled?"Enabling":"Disabling"} automatic renewal for ${domainName}`);try{await updateAutoRenew(client,domainName,enabled)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))switch(err.code){case"domain_not_registered":return fail("domain_not_registered",`The domain ${domainName} is not registered with Vercel.`,`The domain ${param(domainName)} is not registered with Vercel.`);case"domain_not_found":return fail(AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`,`Domain ${param(domainName)} not found under ${import_chalk38.default.bold(contextName)}.`);case"domain_not_renewable":return fail("domain_not_renewable",`The domain ${domainName} cannot be renewed, so automatic renewal can't be changed.`);case"domain_already_renewing":return fail("domain_already_renewing",`The domain ${domainName} is already renewing, so automatic renewal can't be changed right now.`);case"forbidden":return fail("forbidden",`You don't have permission to update ${domainName} under ${contextName}.`,`You don't have permission to update ${param(domainName)} under ${import_chalk38.default.bold(contextName)}.`);default:return fail(AGENT_REASON.API_ERROR,err.serverMessage||err.message)}return output_manager_default.debug(`Server response: ${(0,import_error_utils3.errorToString)(err)}`),fail(AGENT_REASON.API_ERROR,"An unexpected error occurred while updating automatic renewal. Please try again later.")}output_manager_default.stopSpinner();let message=enabled?`Automatic renewal turned on for ${domainName}`:`Automatic renewal turned off for ${domainName}`;return asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,autoRenew:enabled,message},null,2)}
|
|
165
165
|
`),0):(output_manager_default.success(`${enabled?"Enabled":"Disabled"} automatic renewal for ${param(domainName)}`),0)}var import_chalk39=__toESM(require_source(),1),import_error_utils4=__toESM(require_dist(),1);async function renewDomain(client,name,expectedPrice,years,{waitMs=DEFAULT_ORDER_WAIT_MS,onOrderAccepted}={}){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"",sentAt=Date.now(),orderId;try{({orderId}=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/renew${teamParam}`,{method:"POST",body:{expectedPrice,years},retry:{retries:0},bailOn429:!0}))}catch(err){if(isAPIError(err)&&err.status<500)throw err;return new DomainChargeOutcomeUnknown(name,"renew")}onOrderAccepted?.(orderId);let pending=poll2=>({status:"pending",orderId,lastStatus:poll2.lastStatus,...poll2.readError&&{readError:poll2.readError}});if(waitMs<=0)return pending({order:null,lastStatus:null});let poll=await pollForOrder(client,orderId,remainingWait(waitMs,sentAt));return poll.order?poll.order:pending(poll)}var DomainsRenewTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionAmount(amount){this.trackRedactedCliOption("amount",amount)}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionTimeout(timeout){timeout&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}};async function renew(client,argv){let telemetry=new DomainsRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(renewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliFlagJson(opts["--json"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliOptionTimeout(opts["--timeout"]),telemetry.trackCliFlagNoWait(opts["--no-wait"]),args.length!==1||!domainName)return reportUsageError(client,AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${getCommandNamePlain("domains renew <domain>")}`);if(!isRootDomain(domainName))return reportUsageError(client,AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}". Use a registrable root domain (no subdomain).`);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,formatResult.error);let asJson=formatResult.jsonOutput,amount=parseAmount(opts["--amount"]);if(amount instanceof Error)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,amount.message);let wait=parseOrderWait(opts);if(typeof wait=="string")return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,wait);let waitArg=wait.noWait?" --no-wait":opts["--timeout"]===void 0?"":` --timeout ${quoteArg(wait.timeout)}`,{contextName,team}=await getScope(client),teamSlug=team?.slug,domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});let{years,renewalPrice}=domainPrice;if(renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The renewal price for ${domainName} is not available. This domain may not be renewable.`});let term=`${years}yr${years>1?"s":""}`,renewCommand=price2=>buildCommandWithGlobalFlags(client.argv,`domains renew ${domainName}${teamSlug?` --scope ${teamSlug}`:""}${price2===void 0?"":` --amount ${formatAmountArg(price2)}`}${waitArg}${asJson?" --json":""}`),inspectCommand=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`);if(amount!==void 0&&!amountMatchesPrice(amount,renewalPrice))return reportPriceChanged(client,{verb:"renew",domain:domainName,amount,price:renewalPrice,nextCommand:renewCommand(renewalPrice),json:asJson});if(amount===void 0){if(!canPromptForCharge(client,asJson)){let headline=`Can't renew ${domainName} without an approved price (--amount) in non-interactive mode.`,priceLine=`Price: ${formatUsd(renewalPrice)} for ${formatTerm(years)}, charged to ${contextName}.`,command=renewCommand(renewalPrice);return writeChargeAction(client,asJson,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`${headline} ${priceLine}`,userActionRequired:!0,hint:"Show the user the renewal price and get their approval before running next[].",data:{domain:domainName,...teamSlug&&{team:teamSlug},amount:renewalPrice,currency:"USD",years},missing:["--amount"],next:[{command,when:`Only after a human approves: charges ${formatUsd(renewalPrice)} now`}]}),printChargeRecovery(`${headline}
|
|
166
|
-
${priceLine}`,"Once a person approves the price, run",command),1}if(output_manager_default.log("An email with the invoice and transaction details will be sent to you after renewal."),!await client.input.confirm(`Renew ${param(domainName)} now for ${import_chalk39.default.bold(formatUsd(renewalPrice))} (${formatTerm(years)})?`,!1))return output_manager_default.log("Canceled"),0}if(!canPromptForCharge(client,asJson)&&team){let refused=refuseUnnamedTeam(client,asJson,{verb:"renew",domain:domainName,team,nextCommand:renewCommand(renewalPrice)});if(refused!==void 0)return refused}let renewStamp=stamp_default();output_manager_default.spinner(`Renewing ${domainName}`);let order;try{order=await renewDomain(client,domainName,renewalPrice,years,{waitMs:wait.waitMs,onOrderAccepted:orderId=>{asJson||wait.noWait||(output_manager_default.stopSpinner(),output_manager_default.log(`Order ${orderId} accepted.`),output_manager_default.spinner(`Waiting on the registrar to renew ${domainName}`))}})}catch(err){if(output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils4.errorToString)(err)}`),isAPIError(err)){if(err.code==="expected_price_mismatch")return reportPriceChanged(client,{verb:"renew",domain:domainName,amount:renewalPrice,nextCommand:renewCommand(),json:asJson});let known={domain_not_registered:[AGENT_REASON.DOMAIN_NOT_FOUND,`The domain ${domainName} is not registered with Vercel.`],domain_not_found:[AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`],tld_not_supported:[AGENT_REASON.TLD_NOT_SUPPORTED,`The TLD for domain name ${domainName} is not supported.`],forbidden:[AGENT_REASON.PERMISSION_DENIED,`You don't have permission to renew ${domainName} under ${contextName}.`]},[reason,message]=known[err.code]??[];return reason&&message?reportChargeFailure(client,asJson,{reason,message}):reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The API returned an error (${err.code}). Nothing was charged.`},{apiMessage:err.serverMessage})}return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The request wasn't sent, so nothing was charged.`})}if(output_manager_default.stopSpinner(),order instanceof DomainChargeOutcomeUnknown)return reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand});if(order.status==="pending")return reportOrderPending(client,asJson,{verb:"renew",domain:domainName,orderId:order.orderId,lastStatus:order.lastStatus,readError:order.readError,inspectCommand,wait});let outcome=getOrderOutcome(order,domainName);return outcome==="unknown"?reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand,orderId:order.orderId}):outcome!=="completed"?reportChargeFailure(client,asJson,{reason:
|
|
166
|
+
${priceLine}`,"Once a person approves the price, run",command),1}if(output_manager_default.log("An email with the invoice and transaction details will be sent to you after renewal."),!await client.input.confirm(`Renew ${param(domainName)} now for ${import_chalk39.default.bold(formatUsd(renewalPrice))} (${formatTerm(years)})?`,!1))return output_manager_default.log("Canceled"),0}if(!canPromptForCharge(client,asJson)&&team){let refused=refuseUnnamedTeam(client,asJson,{verb:"renew",domain:domainName,team,nextCommand:renewCommand(renewalPrice)});if(refused!==void 0)return refused}let renewStamp=stamp_default();output_manager_default.spinner(`Renewing ${domainName}`);let order;try{order=await renewDomain(client,domainName,renewalPrice,years,{waitMs:wait.waitMs,onOrderAccepted:orderId=>{asJson||wait.noWait||(output_manager_default.stopSpinner(),output_manager_default.log(`Order ${orderId} accepted.`),output_manager_default.spinner(`Waiting on the registrar to renew ${domainName}`))}})}catch(err){if(output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils4.errorToString)(err)}`),isAPIError(err)){if(err.code==="expected_price_mismatch")return reportPriceChanged(client,{verb:"renew",domain:domainName,amount:renewalPrice,nextCommand:renewCommand(),json:asJson});let known={domain_not_registered:[AGENT_REASON.DOMAIN_NOT_FOUND,`The domain ${domainName} is not registered with Vercel.`],domain_not_found:[AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`],tld_not_supported:[AGENT_REASON.TLD_NOT_SUPPORTED,`The TLD for domain name ${domainName} is not supported.`],forbidden:[AGENT_REASON.PERMISSION_DENIED,`You don't have permission to renew ${domainName} under ${contextName}.`]},[reason,message]=known[err.code]??[];return reason&&message?reportChargeFailure(client,asJson,{reason,message}):reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The API returned an error (${err.code}). Nothing was charged.`},{apiMessage:err.serverMessage})}return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The request wasn't sent, so nothing was charged.`})}if(output_manager_default.stopSpinner(),order instanceof DomainChargeOutcomeUnknown)return reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand});if(order.status==="pending")return reportOrderPending(client,asJson,{verb:"renew",domain:domainName,orderId:order.orderId,lastStatus:order.lastStatus,readError:order.readError,inspectCommand,wait});let outcome=getOrderOutcome(order,domainName);return outcome==="unknown"?reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand,orderId:order.orderId}):outcome!=="completed"?reportChargeFailure(client,asJson,{reason:{payment_failed:AGENT_REASON.PAYMENT_FAILED,payment_authentication_required:AGENT_REASON.PAYMENT_AUTHENTICATION_REQUIRED,refunded:AGENT_REASON.API_ERROR,refund_failed:AGENT_REASON.API_ERROR,failed:AGENT_REASON.API_ERROR}[outcome],message:{payment_failed:"Your card was declined. Nothing was charged.",payment_authentication_required:`Your bank requires 3-D Secure verification, which can't be completed from the CLI. Nothing was charged. Renew ${domainName} from the Vercel dashboard instead.`,refunded:`Renewal for ${domainName} failed, and the charge was refunded.`,refund_failed:`Renewal for ${domainName} failed, and refunding the charge also failed. Contact Vercel support about the charge.`,failed:`Renewal for ${domainName} failed.`}[outcome]}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,term,years,price:renewalPrice,charge:{amount:renewalPrice,currency:"USD"},orderId:order.orderId,message:`Domain ${domainName} renewed.`},null,2)}
|
|
167
167
|
`),0):(client.stdout.write(`${domainName}
|
|
168
168
|
`),output_manager_default.success(`Domain ${param(domainName)} renewed ${renewStamp()}`),output_manager_default.log(`Charged ${formatUsd(renewalPrice)} for ${formatTerm(years)}.`),0)}var DomainsVerifyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagStrict(strict){strict&&this.trackCliFlag("strict")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function getDomainConfigV6(client,domainName,options={}){let query=new URLSearchParams;options.projectIdOrName&&query.set("projectIdOrName",options.projectIdOrName),options.strict&&query.set("strict","true");let queryString=query.toString();try{return await client.fetch(`/v6/domains/${encodeURIComponent(domainName)}/config${queryString?`?${queryString}`:""}`,{bailOn429:options.bailOn429})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function acquireVerificationFacts(client,options){let{domainName}=options,{contextName,team}=await getScope(client);client.config.currentTeam=team?.id;let requests=[getDomainConfigV6(client,domainName,{projectIdOrName:options.project,strict:options.strict,bailOn429:!0}),resolveProject(client,domainName,options.project),lookupOwnership(client,contextName,domainName)],[config,resolvedProject,owned]=await Promise.all(requests);if(isAPIError(config))return{ok:!1,error:{kind:errorKind(config.code),code:config.code||"api_error",message:configErrorMessage(config,domainName)}};if(resolvedProject.kind==="forbidden")return{ok:!1,error:{kind:"permission-denied",code:"forbidden",message:`You don't have access to the project ${resolvedProject.idOrName} under ${contextName}.`}};if(resolvedProject.kind==="error")return{ok:!1,error:{kind:errorKind(resolvedProject.error.code),code:resolvedProject.error.code||"api_error",message:projectErrorMessage(resolvedProject.error,resolvedProject.idOrName)}};let project=await triggerVerification(client,resolvedProject,domainName);return{ok:!0,facts:{domainName,contextName,teamId:team?.id,config,ownership:owned.ownership,intendedNameservers:owned.intendedNameservers,project}}}async function resolveProject(client,domainName,requestedProject){return requestedProject?resolveRequestedProject(client,domainName,requestedProject):await findLinkedProjectDomain(client,domainName)??await findProjectDomainByName(client,domainName)}async function resolveRequestedProject(client,domainName,idOrName){let result=await getProjectDomain(client,idOrName,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403?{kind:"forbidden",idOrName}:result.status===404?{kind:"missing",idOrName}:{kind:"error",idOrName,error:result}:attachedProject(idOrName,idOrName,result)}async function findLinkedProjectDomain(client,domainName){let link=await getLinkedProject(client);if(link.status!=="linked")return null;let result=await getProjectDomain(client,link.project.id,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403||result.status===404?null:{kind:"error",idOrName:link.project.id,error:result}:attachedProject(link.project.id,link.project.name,result)}async function findProjectDomainByName(client,domainName){let result=await getProjectDomainByName(client,domainName,{bailOn429:!0});if(isAPIError(result))return result.status===403||result.status===404?{kind:"none"}:{kind:"error",idOrName:domainName,error:result};let label=await getProjectLabel(client,result.projectId);return attachedProject(result.projectId,label,result)}function attachedProject(idOrName,label,domain){return{kind:"attached",idOrName,label,domain,verificationError:null}}async function getProjectLabel(client,projectId){try{let project=await getProjectByNameOrId(client,projectId);return project instanceof Error?projectId:project.name}catch{return projectId}}async function lookupOwnership(client,contextName,domainName){if(isPublicSuffix(domainName))return{ownership:"platform-managed",intendedNameservers:[]};try{let domain=await getDomainByName(client,contextName,domainName,{ignoreWait:!0,bailOn429:!0});return domain instanceof DomainPermissionDenied?{ownership:"other-scope",intendedNameservers:[]}:domain instanceof DomainNotFound?{ownership:"not-found",intendedNameservers:[]}:{ownership:"current-scope",intendedNameservers:domain.intendedNameservers}}catch{return{ownership:null,intendedNameservers:[]}}}async function triggerVerification(client,project,domainName){if(project.kind!=="attached"||project.domain.verified)return project;let result=await verifyProjectDomain(client,project.idOrName,domainName,{bailOn429:!0});return isAPIError(result)?{...project,verificationError:result}:{...project,domain:result}}function errorKind(errorCode){return errorCode==="invalid_name"?"invalid-domain":errorCode==="forbidden"?"permission-denied":errorCode==="timeout"?"timeout":errorCode==="unexpected_dns_response"?"unexpected-dns-response":"api-error"}function configErrorMessage(err,domainName){return err.code==="invalid_name"?`${domainName} is not a valid domain name.`:err.code==="timeout"?`Resolving the DNS configuration for ${domainName} timed out. This is usually transient \u2014 try again in a few seconds.`:err.code==="unexpected_dns_response"?`The nameservers for ${domainName} returned an unexpected response while checking its DNS configuration.`:err.serverMessage||`API error (${err.status})`}function projectErrorMessage(err,projectIdOrName){return err.serverMessage||err.message||`Could not check project ${projectIdOrName} (${err.status}).`}var import_tldts3=__toESM(require_cjs(),1);function diagnoseDomain(facts,commands){let configurationStatus=getConfigurationStatus(facts),status=getDomainStatus2(configurationStatus,facts.project),recommendedDnsRecords=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?[]:getRecommendedDnsRecords(facts),domainConnect=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?null:getDomainConnectConfiguration(facts),steps=buildSteps(facts,commands,recommendedDnsRecords,domainConnect),details=statusDetails(facts,status,steps),issues=getDomainIssues(facts,status,configurationStatus,steps),next=buildNextSteps(steps,commands,status),ok=isOkStatus(status);return{facts,status,configurationStatus,ok,exitCode:ok?0:1,details,issues,recommendedDnsRecords,steps,next}}function getConfigurationStatus(facts){let{config}=facts;return requiresScopeResolution(facts)?"scope-resolution-required":isPlatformManagedDomain(facts)?config.misconfigured?"invalid-configuration":"configured-correctly":shouldRecommendProjectAttachment(facts)?"project-attachment-recommended":config.serviceType==="zeit.world"&&config.dnssecEnabled?"dnssec-needs-to-be-disabled":config.misconfigured?"invalid-configuration":config.ipStatus==="required-change"&&hasRecommendedDnsUpdate(config)?isOwnedUnattachedHostname(facts)?"dns-change-recommended":"dns-change-required":config.ipStatus==="optional-change"&&hasRecommendedDnsUpdate(config)?"dns-change-recommended":"configured-correctly"}function getDomainStatus2(configurationStatus,project){return configurationStatus==="scope-resolution-required"?configurationStatus:project.kind==="missing"?"project-domain-missing":configurationStatus!=="configured-correctly"&&configurationStatus!=="dns-change-recommended"?configurationStatus:project.kind==="attached"&&!project.domain.verified?"verification-needed":configurationStatus}function getDomainIssues(facts,status,configurationStatus,steps){let statuses=[],addStatus=candidate=>{candidate!=="configured-correctly"&&!statuses.includes(candidate)&&statuses.push(candidate)};return addStatus(status),status!=="scope-resolution-required"&&(addStatus(configurationStatus),facts.project.kind==="missing"?addStatus("project-domain-missing"):facts.project.kind==="attached"&&!facts.project.domain.verified&&addStatus("verification-needed")),statuses.map(domainStatus=>({domainStatus,...statusDetails(facts,domainStatus,steps)}))}function statusDetails(facts,status,steps){let{domainName,project}=facts,domainConnect=getDomainConnect(steps),attachProject=steps.find(step=>step.kind==="attach-project");if(status==="configured-correctly")return{reason:AGENT_REASON.CONFIGURED_CORRECTLY,message:project.kind==="attached"?`${domainName} has a valid configuration and is verified for project ${project.label}.`:`${domainName} has a valid configuration.`};if(status==="verification-needed")return{reason:AGENT_REASON.VERIFICATION_NEEDED,message:project.kind==="attached"?`${domainName} needs ownership verification for project ${project.label}.`:`${domainName} needs ownership verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Add one of the project verification records at the DNS provider, then run the suggested verify command.")};if(status==="invalid-configuration"){if(isPlatformManagedDomain(facts))return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid Vercel-managed DNS configuration.`,userActionRequired:!0,hint:"No DNS changes are required from you. Retry the check, then contact Vercel Support if the configuration remains invalid."};if(attachProject?.kind==="attach-project"){let target=attachProject.project==="<project>"?"a project":`project ${attachProject.project}`,attachInstruction=attachProject.project==="<project>"?"Attach it to a project":"Attach it";return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} is not attached to ${target} and has an invalid DNS configuration. ${attachInstruction} and apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:attachProject.project==="<project>"?"Replace <project> in next[] with the project that should serve the domain, attach it, apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.":"Run the domains add command in next[], apply the recommended records or nameservers at the DNS provider, then run the suggested verify command."}}else return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid DNS configuration. Apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}}else return status==="dnssec-needs-to-be-disabled"?{reason:AGENT_REASON.DNSSEC_NEEDS_TO_BE_DISABLED,message:`${domainName} uses Vercel nameservers, but DNSSEC must be disabled with the domain registrar so the nameservers can resolve globally.`,userActionRequired:!0,hint:"Disable DNSSEC with the domain registrar, then run the suggested verify command."}:status==="dns-change-required"?{reason:AGENT_REASON.DNS_CHANGE_REQUIRED,message:`${domainName} requires a DNS change to avoid downtime.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}:status==="dns-change-recommended"?{reason:AGENT_REASON.DNS_CHANGE_RECOMMENDED,message:`${domainName} has a valid configuration, but Vercel recommends updating its DNS records.`,hint:dnsActionHint(facts,domainConnect,"The domain is working. Apply the recommended DNS update when convenient, then re-check.")}:status==="project-attachment-recommended"?{reason:AGENT_REASON.PROJECT_ATTACHMENT_RECOMMENDED,message:`${domainName} is owned by ${facts.contextName} but is not attached to a project.`,hint:"To use the domain, replace <project> in next[] with the project that should serve it."}:status==="scope-resolution-required"?{reason:AGENT_REASON.SCOPE_NOT_ACCESSIBLE,message:`${domainName} exists on Vercel but is not accessible under ${facts.contextName}. Retry under the owning team before evaluating its DNS or project status.`,userActionRequired:!0,hint:"Use next[] to find the team that owns the domain, then retry in that scope."}:{reason:AGENT_REASON.PROJECT_DOMAIN_MISSING,message:project.kind==="missing"?`${domainName} is not attached to project ${project.idOrName}.`:`${domainName} is not attached to the requested project.`,hint:facts.ownership==="other-scope"?"Find the team that owns the domain using next[], then retry in that scope before changing project attachments.":"Run the domains add command in next[], then retry verification."}}function dnsActionHint(facts,domainConnect,manualHint){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"?`Resolve the team that owns the domain using next[] before making DNS or project changes. ${manualHint}`:domainConnect?`Open the Cloudflare Domain Connect URL in next[] to apply the DNS changes automatically. ${manualHint}`:manualHint}function buildSteps(facts,commands,recommendedDnsRecords,domainConnect){let scope=requiresScopeResolution(facts)?{kind:"resolve-scope",contextName:facts.contextName,teamsCommand:commands.teamsList,verifyCommand:commands.verify("<team>")}:null;if(scope)return[scope];let attachProject=buildAttachProjectStep(facts,commands);if(shouldRecommendProjectAttachment(facts))return attachProject?[attachProject]:[];let steps=[];attachProject&&steps.push(attachProject);let configureDns=buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect);if(configureDns&&steps.push(configureDns),!isPlatformManagedDomain(facts)&&facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled&&steps.push({kind:"disable-dnssec"}),!isPlatformManagedDomain(facts))for(let conflict of facts.config.conflicts??[])steps.push({kind:"remove-conflict",conflict});let verification=facts.project.kind==="attached"&&!facts.project.domain.verified?{kind:"verify-ownership",challenges:facts.project.domain.verification??[],errorMessage:facts.project.verificationError?facts.project.verificationError.serverMessage||facts.project.verificationError.message:null}:null;return verification&&steps.push(verification),steps}function buildAttachProjectStep(facts,commands){return needsProjectAttachment(facts)?{kind:"attach-project",mode:facts.config.misconfigured?"required":"recommended",project:"<project>",command:commands.attachProject("<project>")}:facts.project.kind==="missing"?{kind:"attach-project",mode:"required",project:facts.project.idOrName,command:commands.attachProject(facts.project.idOrName)}:null}function buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect){if(requiresScopeResolution(facts)||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)||!needsDnsRecordChange(facts.config))return null;let methods=[];domainConnect&&methods.push({kind:"domain-connect",configuration:domainConnect});let aRecords=recommendedDnsRecords.filter(record=>record.type==="A"),cnameRecords=recommendedDnsRecords.filter(record=>record.type==="CNAME");return aRecords.length&&methods.push({kind:"a-records",records:aRecords}),cnameRecords.length&&methods.push({kind:"cname-records",records:cnameRecords}),facts.intendedNameservers.length&&!nameserversMatch(facts.config.nameservers,facts.intendedNameservers)&&methods.push({kind:"nameservers",nameservers:[...facts.intendedNameservers]}),{kind:"configure-dns",change:facts.config.misconfigured&&facts.config.configuredBy===null?"point-domain":facts.config.ipStatus==="optional-change"||isOwnedUnattachedHostname(facts)?"recommended-change":"required-change",methods}}function buildNextSteps(steps,commands,status){let next=[];for(let step of steps)if(step.kind==="resolve-scope")next.push({command:step.teamsCommand,when:"List teams to find the scope that owns the domain"},{command:step.verifyCommand,when:"Replace <team> with the owning team and retry"});else if(step.kind==="attach-project")next.push({command:step.command,when:step.project==="<project>"?"Replace <project> with the project that should serve the domain":"Attach the domain to the requested project"});else if(step.kind==="configure-dns"){let domainConnectMethod=step.methods.find(method=>method.kind==="domain-connect");domainConnectMethod?.kind==="domain-connect"&&next.push({command:commands.openUrl(domainConnectMethod.configuration.applyUrl),when:"Open Cloudflare to review and apply the DNS changes automatically with Domain Connect"})}return!steps.some(step=>step.kind==="resolve-scope")&&status!=="configured-correctly"&&status!=="project-attachment-recommended"&&next.push({command:commands.verify(),when:status==="dns-change-recommended"?"Re-check after applying the recommended DNS change":"Re-check after completing the required changes"}),next}function getDomainConnect(steps){for(let step of steps){if(step.kind!=="configure-dns")continue;let method=step.methods.find(candidate=>candidate.kind==="domain-connect");if(method?.kind==="domain-connect")return method.configuration}return null}function getRecommendedDnsRecords(facts){let recommendedA=facts.config.recommendedIPv4?.find(record=>record.rank===1)?.value??[],recommendedCNAME=facts.config.recommendedCNAME?.find(record=>record.rank===1)?.value,apexName=facts.project.kind==="attached"?facts.project.domain.apexName:(0,import_tldts3.parse)(facts.domainName.replace(/^\*\./,"")).domain,name=getDnsRecordName(facts.domainName,apexName),disableProxy=isCloudflareDns(facts.config),aRecords=recommendedA.map(value=>({type:"A",name,value,...disableProxy?{disableProxy:!0}:{}})),cnameRecords=recommendedCNAME?[{type:"CNAME",name,value:recommendedCNAME,...disableProxy?{disableProxy:!0}:{}}]:[],isApex=apexName?facts.domainName.toLowerCase()===apexName.toLowerCase():null,preferred=isApex===null?[]:isApex&&!disableProxy?aRecords:cnameRecords;return preferred.length?preferred:[...aRecords,...cnameRecords]}function getDomainConnectConfiguration(facts){if(isPlatformManagedDomain(facts)||facts.project.kind!=="attached"||isWildcardDomain(facts.domainName)||!needsDnsRecordChange(facts.config)||!isCloudflareDns(facts.config))return null;let params=new URLSearchParams;facts.teamId&¶ms.set("teamId",facts.teamId);let query=params.toString(),projectId=encodeURIComponent(facts.project.domain.projectId),domain=encodeURIComponent(facts.project.domain.name);return{protocol:"domain-connect",providerId:"cloudflare.com",providerName:"Cloudflare",applyUrl:`https://vercel.com/api/v9/projects/${projectId}/domains/${domain}/domain-connect/apply`+(query?`?${query}`:"")}}function hasRecommendedDnsUpdate(config){return!!(config.recommendedIPv4?.some(record=>record.rank===1&&record.value.length>0)||config.recommendedCNAME?.some(record=>record.rank===1&&!!record.value))}function needsDnsRecordChange(config){return hasRecommendedDnsUpdate(config)&&(config.ipStatus==="required-change"||config.ipStatus==="optional-change"||config.misconfigured&&config.configuredBy===null)}function isOkStatus(status){return status==="configured-correctly"||status==="dns-change-recommended"||status==="project-attachment-recommended"}function isCloudflareDns(config){return config.nameservers.length>0&&config.nameservers.every(nameserver=>nameserver.toLowerCase().replace(/\.$/,"").endsWith(".ns.cloudflare.com"))}function isWildcardDomain(domainName){return domainName.startsWith("*.")}function isOwnedUnattachedHostname(facts){return facts.ownership==="current-scope"&&facts.project.kind==="none"}function needsProjectAttachment(facts){return facts.project.kind==="none"&&(facts.ownership==="current-scope"||facts.ownership==="not-found")}function shouldRecommendProjectAttachment(facts){return isOwnedUnattachedHostname(facts)&&!facts.config.misconfigured&&!(facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled)}function requiresScopeResolution(facts){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"}function isPlatformManagedDomain(facts){return facts.ownership==="platform-managed"}function nameserversMatch(current,intended){let normalize=nameservers=>[...new Set(nameservers.map(normalizeNameserver))].sort(),normalizedCurrent=normalize(current),normalizedIntended=normalize(intended);return normalizedCurrent.length===normalizedIntended.length&&normalizedCurrent.every((nameserver,index)=>nameserver===normalizedIntended[index])}function normalizeNameserver(nameserver){return nameserver.toLowerCase().replace(/\.$/,"")}function getDnsRecordName(domain,apex){let domainName=domain.toLowerCase(),apexName=apex?.toLowerCase();if(!apexName)return domain;if(domainName===apexName)return"@";let suffix=`.${apexName}`;return domainName.endsWith(suffix)?domain.slice(0,-suffix.length):domain}var import_chalk40=__toESM(require_source(),1);function renderHumanOutput(diagnosis,elapsed){return diagnosis.status==="configured-correctly"&&diagnosis.steps.length===0?{lead:{kind:"success",message:`${successMessage(diagnosis)} ${import_chalk40.default.gray(elapsed)}`},sections:[]}:{lead:{kind:"log",message:`Checked ${diagnosis.facts.domainName} under ${import_chalk40.default.bold(diagnosis.facts.contextName)} ${import_chalk40.default.gray(elapsed)}`},sections:[renderStatus(diagnosis),renderFixes(diagnosis),renderResolvedValues(diagnosis),renderNameservers(diagnosis)].filter(section=>section!==null)}}function successMessage(diagnosis){let{facts}=diagnosis,configuredBy=describeConfiguredBy(facts.config.configuredBy),suffix=facts.project.kind==="attached"?` and verified for project ${import_chalk40.default.bold(facts.project.label)}`:"";return`Valid Configuration: ${facts.domainName} is configured${configuredBy?` (${configuredBy})`:""}${suffix}`}function describeConfiguredBy(configuredBy){return configuredBy==="A"?"A record":configuredBy==="CNAME"?"CNAME record":configuredBy==="http"?"HTTP resolution, possibly behind a proxy":configuredBy==="dns-01"?"DNS-01 challenge only, not yet resolving to Vercel":null}var good=text=>`${import_chalk40.default.green(chars_default.tick)} ${text}`,bad=text=>`${import_chalk40.default.red(chars_default.cross)} ${text}`,warning=text=>`${import_chalk40.default.yellow("!")} ${text}`;function renderStatus(diagnosis){let{facts}=diagnosis,rows=[[import_chalk40.default.cyan("DNS Configuration"),dnsStatus(diagnosis)],[import_chalk40.default.cyan("Project"),projectStatus(diagnosis)]];return facts.ownership==="other-scope"?rows.push([import_chalk40.default.cyan("Ownership"),bad(`Not accessible under ${import_chalk40.default.bold(facts.contextName)}`)]):facts.ownership==="platform-managed"&&rows.push([import_chalk40.default.cyan("Ownership"),good("Managed by Vercel")]),facts.config.dnssecEnabled&&diagnosis.configurationStatus!=="scope-resolution-required"&&rows.push([import_chalk40.default.cyan("DNSSEC"),import_chalk40.default.yellow("Enabled")]),`
|
|
169
169
|
${import_chalk40.default.bold(" Status")}
|
|
@@ -190,7 +190,7 @@ ${indent(nameservers.join(`
|
|
|
190
190
|
`).map(line=>` ${line}`).join(`
|
|
191
191
|
`)}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)}
|
|
192
192
|
`}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)}
|
|
193
|
-
`}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-QZ4AMS2K.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
|
+
`}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-DUOUHPBY.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(`
|
|
194
194
|
${import_chalk41.default.bold(` ${STEP_LABELS[step]}`)}
|
|
195
195
|
`);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(`
|
|
196
196
|
${gutter} ${import_chalk41.default.bold(heading)}
|