@vercel/cli-support 65.9.0 → 65.10.0-snapshot-b8e5bb846796
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/dist/chunks/add-4VXTYDC7.js +8 -0
- package/dist/chunks/add-K3ZHVAYL.js +8 -0
- package/dist/chunks/add-M26FXXGH.js +8 -0
- package/dist/chunks/build-ESY72OCS.js +7 -0
- package/dist/chunks/chunk-2AMO2VMV.js +68 -0
- package/dist/chunks/{chunk-U6KJOCXX.js → chunk-2DHDKWYN.js} +1 -1
- package/dist/chunks/chunk-2VBFQZ72.js +7 -0
- package/dist/chunks/{chunk-BZNRYQ6U.js → chunk-37LESFVW.js} +1 -1
- package/dist/chunks/{chunk-CMHL66LK.js → chunk-3F5BOG4A.js} +1 -1
- package/dist/chunks/{chunk-ZCXKEZS4.js → chunk-3HC4F32I.js} +1 -1
- package/dist/chunks/{chunk-VZKQP67Q.js → chunk-4FV4I3KH.js} +1 -1
- package/dist/chunks/{chunk-R5ZLTWKB.js → chunk-4LGAV2WN.js} +1 -1
- package/dist/chunks/{chunk-DUJAQS7I.js → chunk-4MPQZWQV.js} +1 -1
- package/dist/chunks/{chunk-7WY7ASKE.js → chunk-56UH6NQ3.js} +1 -1
- package/dist/chunks/{chunk-QQA2OMXJ.js → chunk-5KE67O45.js} +1 -1
- package/dist/chunks/chunk-6EQWP4LZ.js +10 -0
- package/dist/chunks/{chunk-USYEDO7R.js → chunk-6SJHJBJH.js} +1 -1
- package/dist/chunks/{chunk-TRZDIAX3.js → chunk-77LSSWXL.js} +1 -1
- package/dist/chunks/{chunk-DASHFOKO.js → chunk-7DA25VTX.js} +1 -1
- package/dist/chunks/chunk-7DP4DHQW.js +7 -0
- package/dist/chunks/{chunk-ZERZX6BZ.js → chunk-7JY4LSW4.js} +2 -2
- package/dist/chunks/{chunk-EW62WSXG.js → chunk-7NNA4VRN.js} +1 -1
- package/dist/chunks/{chunk-EXLKCL5I.js → chunk-7VICILSF.js} +1 -1
- package/dist/chunks/{chunk-4XJVEKTD.js → chunk-7XRM7NEF.js} +1 -1
- package/dist/chunks/chunk-A5D7MVRH.js +7 -0
- package/dist/chunks/{chunk-EVH5524J.js → chunk-A5NC6IDR.js} +1 -1
- package/dist/chunks/{chunk-EDOTKQ7L.js → chunk-ADQRYOJK.js} +1 -1
- package/dist/chunks/{chunk-D2JHIOVH.js → chunk-AEYIIPUZ.js} +1 -1
- package/dist/chunks/{chunk-GHEGWXH2.js → chunk-ANCWFEOM.js} +1 -1
- package/dist/chunks/{chunk-IFCMWIRB.js → chunk-APM4DYNZ.js} +1 -1
- package/dist/chunks/chunk-BB3N7F4F.js +7 -0
- package/dist/chunks/{chunk-7ULVGK67.js → chunk-BB5UMZMF.js} +1 -1
- package/dist/chunks/{chunk-4Z3APEBF.js → chunk-BJXLR2RE.js} +1 -1
- package/dist/chunks/{chunk-Y6WXTTZS.js → chunk-BPRGAX62.js} +1 -1
- package/dist/chunks/{chunk-43P35KUA.js → chunk-BQVKEPOO.js} +1 -1
- package/dist/chunks/{chunk-MXURT5TX.js → chunk-BRKI6NTF.js} +1 -1
- package/dist/chunks/{chunk-G6HUSV7F.js → chunk-BZV2S4H6.js} +1 -1
- package/dist/chunks/chunk-C4N4LKPM.js +7 -0
- package/dist/chunks/{chunk-WFOJ2LEA.js → chunk-CCMABJKN.js} +1 -1
- package/dist/chunks/chunk-CFYTFXX6.js +7 -0
- package/dist/chunks/chunk-CKTLP5GX.js +7 -0
- package/dist/chunks/{chunk-OZPBJWYU.js → chunk-CSOIXUCL.js} +7 -7
- package/dist/chunks/{chunk-GCPPL24C.js → chunk-CUBRYWA2.js} +1 -1
- package/dist/chunks/{chunk-M73W4XNR.js → chunk-CZOD25BC.js} +1 -1
- package/dist/chunks/{chunk-UIJYRI3G.js → chunk-DBPN2VGJ.js} +1 -1
- package/dist/chunks/{chunk-XBWISZCG.js → chunk-EJ34DLV4.js} +1 -1
- package/dist/chunks/{chunk-T5TOBY4D.js → chunk-EJZNJN4N.js} +1 -1
- package/dist/chunks/{chunk-TMXIVQ45.js → chunk-F2LNGJOZ.js} +1 -1
- package/dist/chunks/{chunk-G3LWP5CH.js → chunk-FAVZ6WVS.js} +1 -1
- package/dist/chunks/{chunk-5K4UTJSY.js → chunk-FHGWXXAS.js} +1 -1
- package/dist/chunks/{chunk-2DODPQ5J.js → chunk-FI2N3SE5.js} +1 -1
- package/dist/chunks/{chunk-D4ZEJM3T.js → chunk-FI5O4WHD.js} +1 -1
- package/dist/chunks/chunk-FTACGWII.js +14 -0
- package/dist/chunks/chunk-FUYVYZWT.js +7 -0
- package/dist/chunks/{chunk-FWTBSC7Z.js → chunk-FY4ORPZH.js} +1 -1
- package/dist/chunks/{chunk-VBKFCR5W.js → chunk-G5T6UQAL.js} +1 -1
- package/dist/chunks/chunk-G7H33IKQ.js +10 -0
- package/dist/chunks/{chunk-33U57CNE.js → chunk-GKALP6QD.js} +1 -1
- package/dist/chunks/{chunk-DUPAU76G.js → chunk-HJ45TAM4.js} +1 -1
- package/dist/chunks/{chunk-E5CN62HO.js → chunk-I6TWYNZF.js} +1 -1
- package/dist/chunks/{chunk-JOXGYP5S.js → chunk-JVNIDSP5.js} +1 -1
- package/dist/chunks/chunk-K6T65WB2.js +7 -0
- package/dist/chunks/chunk-KCJ7RU5I.js +10 -0
- package/dist/chunks/{chunk-TCB4XM23.js → chunk-L3YSOZTP.js} +1 -1
- package/dist/chunks/chunk-LNVODBR2.js +8 -0
- package/dist/chunks/{chunk-32AS5X7G.js → chunk-MUNGQJGO.js} +1 -1
- package/dist/chunks/{chunk-SNCQOAFU.js → chunk-MWEC2PBL.js} +1 -1
- package/dist/chunks/{chunk-UZTDRGCW.js → chunk-NAEY6HG5.js} +1 -1
- package/dist/chunks/{chunk-GN5IAG3M.js → chunk-NGHFFOD2.js} +1 -1
- package/dist/chunks/{chunk-4BZ3DNGM.js → chunk-NLKM5LR5.js} +1 -1
- package/dist/chunks/{chunk-UOQGI6CL.js → chunk-NNGNQNGM.js} +1 -1
- package/dist/chunks/{chunk-7PGGP2QT.js → chunk-NT5ITDTD.js} +1 -1
- package/dist/chunks/{chunk-NEUQZYBL.js → chunk-PMEYNJU2.js} +1 -1
- package/dist/chunks/{chunk-BWS3ZOHJ.js → chunk-Q4GX2UTG.js} +1 -1
- package/dist/chunks/{chunk-4SJU5QSD.js → chunk-QBEIKXKY.js} +1 -1
- package/dist/chunks/{chunk-CBVVVYUP.js → chunk-QCIIUQV3.js} +1 -1
- package/dist/chunks/{chunk-UVE5COCG.js → chunk-QR2Y6RI6.js} +1 -1
- package/dist/chunks/chunk-QSMWJAN7.js +7 -0
- package/dist/chunks/{chunk-GCXUSXB4.js → chunk-QVMU7ZKQ.js} +1 -1
- package/dist/chunks/{chunk-ZGKJLJ47.js → chunk-R2P4PNRQ.js} +1 -1
- package/dist/chunks/{chunk-Y5YXAXK3.js → chunk-R3D4M5RE.js} +1 -1
- package/dist/chunks/{chunk-QJAIUZVZ.js → chunk-ROOOBR3O.js} +5 -5
- package/dist/chunks/{chunk-H34SGIVS.js → chunk-S5JBQCBA.js} +1 -1
- package/dist/chunks/{chunk-PBX7RJ2K.js → chunk-SAIROH4Y.js} +1 -1
- package/dist/chunks/{chunk-2JNDJISE.js → chunk-SIN64EHW.js} +1 -1
- package/dist/chunks/{chunk-QBOY2CXL.js → chunk-SODZSOOL.js} +1 -1
- package/dist/chunks/{chunk-KV2DYFUG.js → chunk-T7HE23VK.js} +1 -1
- package/dist/chunks/{chunk-2JXQWOK5.js → chunk-TKJUKKR6.js} +1 -1
- package/dist/chunks/{chunk-2H4DUZJZ.js → chunk-TL4ZLZ2Q.js} +1 -1
- package/dist/chunks/{chunk-WGWGDC3N.js → chunk-TRYRN6OD.js} +1 -1
- package/dist/chunks/chunk-UWJ3UPS5.js +11 -0
- package/dist/chunks/{chunk-6RCFEJZK.js → chunk-UXRXHNSX.js} +1 -1
- package/dist/chunks/chunk-V32V4SXB.js +7 -0
- package/dist/chunks/{chunk-ECQKK4JU.js → chunk-VD2FK6OF.js} +1 -1
- package/dist/chunks/{chunk-QKWJN6OE.js → chunk-VDKY5KRE.js} +1 -1
- package/dist/chunks/chunk-VPUYTI5E.js +25 -0
- package/dist/chunks/{chunk-EBBDSEEU.js → chunk-VS3S5CU4.js} +1 -1
- package/dist/chunks/{chunk-JMAXX2I6.js → chunk-VU4PHRVP.js} +1 -1
- package/dist/chunks/{chunk-ZBZPCKTW.js → chunk-W5GHMAHP.js} +1 -1
- package/dist/chunks/{chunk-QY5RG6BB.js → chunk-WYFRVK6K.js} +1 -1
- package/dist/chunks/{chunk-BRETAWE7.js → chunk-XEXOSJIU.js} +1 -1
- package/dist/chunks/{chunk-5M3WBT3N.js → chunk-XXEGRTU6.js} +1 -1
- package/dist/chunks/{chunk-4OTI552J.js → chunk-Y45SSWNH.js} +1 -1
- package/dist/chunks/{chunk-WKYFWE37.js → chunk-YO6SJCZP.js} +1 -1
- package/dist/chunks/{chunk-TGPYWWX3.js → chunk-Z57NF2SA.js} +1 -1
- package/dist/chunks/chunk-ZUI5EMXD.js +11 -0
- package/dist/chunks/clear-56POXUP7.js +8 -0
- package/dist/chunks/{compile-vercel-config-DRTOWZK6.js → compile-vercel-config-ZO4Q4DSX.js} +1 -1
- package/dist/chunks/{config-MNRKCDQA.js → config-3BJHSDR3.js} +1 -1
- package/dist/chunks/config-BQPB2VFM.js +8 -0
- package/dist/chunks/delete-2IZGMSOT.js +9 -0
- package/dist/chunks/delete-32N2EHLH.js +10 -0
- package/dist/chunks/{detect-services-GXKWIX52.js → detect-services-JFILAIAL.js} +1 -1
- package/dist/chunks/disable-U2L3EAT3.js +7 -0
- package/dist/chunks/discard-LCQCHKT3.js +14 -0
- package/dist/chunks/edit-7UYV2SKA.js +8 -0
- package/dist/chunks/edit-IE6MRAGU.js +9 -0
- package/dist/chunks/enable-TRHJ4KBM.js +7 -0
- package/dist/chunks/{export-N5F7EY7B.js → export-FCEURR7W.js} +1 -1
- package/dist/chunks/future-MJBIKCOK.js +7 -0
- package/dist/chunks/generate-cert-for-deploy-CFEVTFEH.js +7 -0
- package/dist/chunks/image-47MBJMHO.js +7 -0
- package/dist/chunks/{import-builders-OAGJKQNW.js → import-builders-2DIXZXHK.js} +1 -1
- package/dist/chunks/inspect-BEBHGVAE.js +13 -0
- package/dist/chunks/{inspect-UDUI3ETL.js → inspect-C6XCE3L6.js} +1 -1
- package/dist/chunks/{inspect-35WHAXL2.js → inspect-FZJIVQKV.js} +1 -1
- package/dist/chunks/{inspect-GX34WQGR.js → inspect-KHEUFRVD.js} +1 -1
- package/dist/chunks/inspect-VHDOPOMX.js +9 -0
- package/dist/chunks/{list-BINT67HQ.js → list-IU7VXCG3.js} +1 -1
- package/dist/chunks/{list-VVND632B.js → list-ULHYVEMI.js} +1 -1
- package/dist/chunks/list-VRPHMTAV.js +12 -0
- package/dist/chunks/login-333JR3X5.js +7 -0
- package/dist/chunks/login-N3AJJ2TI.js +9 -0
- package/dist/chunks/logs-QCK5IEZ6.js +7 -0
- package/dist/chunks/{ls-6HYUGM62.js → ls-324AYCJH.js} +1 -1
- package/dist/chunks/{ls-YT3MWU4U.js → ls-7PMEAWRR.js} +1 -1
- package/dist/chunks/{ls-2MJY6EKD.js → ls-EKSX4DUZ.js} +1 -1
- package/dist/chunks/ls-K27L6SBM.js +11 -0
- package/dist/chunks/ls-Q6XVCKO3.js +8 -0
- package/dist/chunks/{ls-7OZ5TSNW.js → ls-S6RG3GU3.js} +1 -1
- package/dist/chunks/{ls-HTNWWU45.js → ls-WSX4L6GY.js} +1 -1
- package/dist/chunks/mutate-VQBALKRN.js +9 -0
- package/dist/chunks/{native-self-update-75UJCHGZ.js → native-self-update-7OAY4AVR.js} +1 -1
- package/dist/chunks/notifications-OQQ3ELSK.js +7 -0
- package/dist/chunks/open-ULGKVY4O.js +7 -0
- package/dist/chunks/{openapi-KYC6JIXI.js → openapi-YAZA3237.js} +1 -1
- package/dist/chunks/permissions-FCZAXNBP.js +7 -0
- package/dist/chunks/{plugin-offer-URT5JNEU.js → plugin-offer-REA2ZSBW.js} +1 -1
- package/dist/chunks/prompt-missing-credentials-AENJOWAN.js +7 -0
- package/dist/chunks/{publish-LH5CIXCP.js → publish-LUVUXRPN.js} +1 -1
- package/dist/chunks/pull-734D2SIQ.js +7 -0
- package/dist/chunks/purchase-domain-if-available-J32OZAAB.js +7 -0
- package/dist/chunks/push-7N63IRGS.js +7 -0
- package/dist/chunks/{query-POTX2HYL.js → query-ZRFRACJR.js} +1 -1
- package/dist/chunks/reauthenticate-A5TEIS2T.js +7 -0
- package/dist/chunks/reorder-A2GYXTE5.js +10 -0
- package/dist/chunks/reply-VRPDRYSF.js +9 -0
- package/dist/chunks/resolve-5IVOTHCA.js +12 -0
- package/dist/chunks/resolve-agent-team-U7H6YKBF.js +7 -0
- package/dist/chunks/{restore-L3T5KOG7.js → restore-2UIAA4WJ.js} +1 -1
- package/dist/chunks/rm-2VW3MMXV.js +8 -0
- package/dist/chunks/rm-KVDVCRHH.js +8 -0
- package/dist/chunks/rm-QLWZ7DR3.js +8 -0
- package/dist/chunks/rm-QTZDIV5M.js +8 -0
- package/dist/chunks/rm-RNC3IRNA.js +8 -0
- package/dist/chunks/{routes-S75L7Z7A.js → routes-4WGST7VN.js} +1 -1
- package/dist/chunks/rule-inspect-B6R3WIIR.js +8 -0
- package/dist/chunks/{schema-P4T4GQBF.js → schema-HIEZSFBL.js} +1 -1
- package/dist/chunks/{schema-TOVLKRPJ.js → schema-RP3BSWFK.js} +1 -1
- package/dist/chunks/select-org-A2QMWNDE.js +7 -0
- package/dist/chunks/set-VV3OH6P6.js +7 -0
- package/dist/chunks/setup-and-link-F5DSGQMW.js +7 -0
- package/dist/chunks/{skills-DZYJV7BE.js → skills-X5TPVYXW.js} +1 -1
- package/dist/chunks/{statuspage-45LJ2XYT.js → statuspage-KHTMA4WL.js} +1 -1
- package/dist/chunks/tags-KDAQZ5W2.js +7 -0
- package/dist/chunks/{types-YA6BOCRV.js → types-SENK43U4.js} +1 -1
- package/dist/chunks/{update-YSAO36V7.js → update-VT4MVVJF.js} +1 -1
- package/dist/chunks/zod-Y3ZBY67C.js +7 -0
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +30 -23
- package/dist/commands/dev/index.js +2 -2
- 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 +7 -7
- package/dist/commands-account.js +18 -3
- package/dist/commands-ai.js +2 -2
- package/dist/commands-blob.js +1 -1
- package/dist/commands-core.js +6 -6
- package/dist/commands-deployments.js +1 -1
- package/dist/commands-flags.js +7 -9
- package/dist/commands-integrations.js +1 -1
- package/dist/commands-observability.js +5 -5
- package/dist/commands-routing.js +2 -2
- package/dist/help.js +1 -1
- package/dist/index.js +4 -4
- package/dist/internal-build-worker.js +1 -1
- package/dist/internal-build.js +1 -1
- package/dist/launcher-errors.js +11 -0
- package/dist/native-download.js +1 -1
- package/dist/package.json +26 -26
- package/dist/vc.js +355 -86
- package/dist/version.mjs +1 -1
- package/package.json +19 -19
- package/dist/chunks/add-6YFDZCAK.js +0 -8
- package/dist/chunks/add-QDZPCCUD.js +0 -8
- package/dist/chunks/add-Z24IIQDY.js +0 -8
- package/dist/chunks/build-HLU4YO37.js +0 -7
- package/dist/chunks/chunk-2CSCY66I.js +0 -11
- package/dist/chunks/chunk-2NABMKFV.js +0 -29
- package/dist/chunks/chunk-2TRNHR72.js +0 -7
- package/dist/chunks/chunk-32NXYHYC.js +0 -10
- package/dist/chunks/chunk-4CQKN5TW.js +0 -10
- package/dist/chunks/chunk-7DM3IJ7L.js +0 -10
- package/dist/chunks/chunk-AUCTNGW2.js +0 -7
- package/dist/chunks/chunk-C6525MLX.js +0 -10
- package/dist/chunks/chunk-CGTD4QFC.js +0 -7
- package/dist/chunks/chunk-DSNIVABS.js +0 -7
- package/dist/chunks/chunk-F53OKXYI.js +0 -7
- package/dist/chunks/chunk-K5YO4UD7.js +0 -7
- package/dist/chunks/chunk-NAU6URTI.js +0 -25
- package/dist/chunks/chunk-NNIQPNGP.js +0 -7
- package/dist/chunks/chunk-NTUDWWSL.js +0 -14
- package/dist/chunks/chunk-RZY54T7B.js +0 -7
- package/dist/chunks/chunk-SR2SHYJA.js +0 -7
- package/dist/chunks/chunk-WGVIQTOI.js +0 -8
- package/dist/chunks/chunk-YPPDRKVC.js +0 -7
- package/dist/chunks/clear-RU72IUXU.js +0 -8
- package/dist/chunks/config-PIFTR3UF.js +0 -8
- package/dist/chunks/delete-47BF6SIO.js +0 -9
- package/dist/chunks/delete-QNSKEIGO.js +0 -10
- package/dist/chunks/disable-SBFW3F7B.js +0 -7
- package/dist/chunks/discard-DUZR3OWZ.js +0 -14
- package/dist/chunks/edit-6BQ7FZC4.js +0 -8
- package/dist/chunks/edit-WO7FLNW2.js +0 -9
- package/dist/chunks/enable-OK4MR3Z6.js +0 -7
- package/dist/chunks/future-5AQIYILU.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-7ERAHVOV.js +0 -7
- package/dist/chunks/image-IRC2NJVA.js +0 -7
- package/dist/chunks/inspect-5FKOSDTK.js +0 -13
- package/dist/chunks/inspect-ACNGICEF.js +0 -9
- package/dist/chunks/list-TRFGY6WP.js +0 -12
- package/dist/chunks/login-MYVTOBRG.js +0 -9
- package/dist/chunks/login-SOZ5ME3D.js +0 -7
- package/dist/chunks/logs-EMAGPMIZ.js +0 -7
- package/dist/chunks/ls-KU35N6DP.js +0 -8
- package/dist/chunks/ls-WFC636QK.js +0 -11
- package/dist/chunks/mutate-JVDDZLVE.js +0 -9
- package/dist/chunks/notifications-CXDBNBHU.js +0 -7
- package/dist/chunks/open-3CD5ZNKU.js +0 -7
- package/dist/chunks/permissions-PNBST4WN.js +0 -7
- package/dist/chunks/prompt-missing-credentials-Q5JCRP3R.js +0 -7
- package/dist/chunks/pull-XLZXPTLS.js +0 -7
- package/dist/chunks/purchase-domain-if-available-PDJGZ6MY.js +0 -7
- package/dist/chunks/push-XB57XK6H.js +0 -7
- package/dist/chunks/reauthenticate-CRI4D2BQ.js +0 -7
- package/dist/chunks/reorder-KUQ5EQBV.js +0 -10
- package/dist/chunks/reply-LO76EKEE.js +0 -9
- package/dist/chunks/resolve-KZJYJJLA.js +0 -12
- package/dist/chunks/resolve-agent-team-N7QMB7UO.js +0 -7
- package/dist/chunks/rm-7UKXTIZW.js +0 -8
- package/dist/chunks/rm-AKKEQN32.js +0 -8
- package/dist/chunks/rm-ELC57ULY.js +0 -8
- package/dist/chunks/rm-K7XEZ7TY.js +0 -8
- package/dist/chunks/rm-MOYCAXNO.js +0 -8
- package/dist/chunks/rule-inspect-ZCS4EBKR.js +0 -8
- package/dist/chunks/select-org-6NEM7F25.js +0 -7
- package/dist/chunks/set-NXFB6JXG.js +0 -7
- package/dist/chunks/setup-and-link-L67MMSUD.js +0 -7
- package/dist/chunks/tags-5AV6WAOF.js +0 -7
- package/dist/chunks/zod-2C2SXNIK.js +0 -7
package/dist/commands-flags.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{FILTER_DEPRECATION_WARNING,alignTimeRangeToGranularity,canonicalResponseToMetricsResponse,createCanonicalMetricsRequest,usesODataSyntax}from"./chunks/chunk-UZTDRGCW.js";import{init_dist,prepareFlagsDefinitions}from"./chunks/chunk-OAM5NJCU.js";import{EncryptJWT,base64url_exports,jwtDecrypt}from"./chunks/chunk-S3L2OHPO.js";import{sanitizeForTerminal}from"./chunks/chunk-UUBPAYTG.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{getLinkedFlagsProject,getProjectNameFromFlags}from"./chunks/chunk-SNCQOAFU.js";import{parseSubcommandArguments,requireProjectContext}from"./chunks/chunk-SR2SHYJA.js";import{computeGranularity,formatText,generateSparkline}from"./chunks/chunk-UIJYRI3G.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-WKYFWE37.js";import"./chunks/chunk-IVSSTHB6.js";import"./chunks/chunk-GZNDA6SV.js";import{require_dist}from"./chunks/chunk-JELLVPCM.js";import{readStdinText}from"./chunks/chunk-PSOVLGHP.js";import{require_raw_body}from"./chunks/chunk-XOETL6DB.js";import{findCommandShorthands}from"./chunks/chunk-VBKFCR5W.js";import{STANDARD_ENVIRONMENTS}from"./chunks/chunk-7YKFF6CE.js";import{resolveProjectContext}from"./chunks/chunk-QKWJN6OE.js";import{formatProject}from"./chunks/chunk-TD7AL545.js";import{normalizeRepeatableStringFilters,outputError,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-AX3V7N44.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-TOTTVS5P.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-EBBDSEEU.js";import{readOnOffOption}from"./chunks/chunk-E7DYXF6G.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{canPrompt,canPromptOnTerminal}from"./chunks/chunk-IQ7FPAI4.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import"./chunks/chunk-PFD7LETF.js";import{printNextPageCommand}from"./chunks/chunk-NEUQZYBL.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{formatTable}from"./chunks/chunk-2RXUQ72I.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{table}from"./chunks/chunk-375JVQYK.js";import{getRenamedOption,reportRenamedOptionError,withWarnings}from"./chunks/chunk-K5YO4UD7.js";import"./chunks/chunk-Q7D7RGXM.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,archiveSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,botManagementSubcommand,cleanupSubcommand,commandsStructs,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,createSubcommand6 as createSubcommand,datafileSubcommand,diffSubcommand,disableSubcommand,discardSubcommand,enableSubcommand2 as enableSubcommand,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,feedbackCommand,firewallCommand,flagsCommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getFlagAttributeType,inspectSubcommand9 as inspectSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isTimestampAttributeType,labelsListSubcommand,labelsSubcommand,listSubcommand14 as listSubcommand,openSubcommand3 as openSubcommand,overrideSubcommand,overviewSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,prepareSubcommand,publishSubcommand,removeSubcommand8 as removeSubcommand,rolloutSubcommand,rulesAddSubcommand2 as rulesAddSubcommand,rulesAddSubcommand3 as rulesAddSubcommand2,rulesDisableSubcommand,rulesEditSubcommand2 as rulesEditSubcommand,rulesEnableSubcommand,rulesInspectSubcommand,rulesListSubcommand2 as rulesListSubcommand,rulesListSubcommand3 as rulesListSubcommand2,rulesMoveSubcommand,rulesRemoveSubcommand2 as rulesRemoveSubcommand,rulesRemoveSubcommand3 as rulesRemoveSubcommand2,rulesReorderSubcommand,rulesSubcommand2 as rulesSubcommand,rulesSubcommand3 as rulesSubcommand2,rulesUpdateSubcommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setSubcommand2 as setSubcommand,splitSubcommand,staleSubcommand,statusSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetingEnableSubcommand,targetingSubcommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,unarchiveSubcommand,updateSubcommand5 as updateSubcommand,useTargetingSubcommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand}from"./chunks/chunk-NTUDWWSL.js";import"./chunks/chunk-M73W4XNR.js";import"./chunks/chunk-32AS5X7G.js";import"./chunks/chunk-ZBZPCKTW.js";import"./chunks/chunk-TRZDIAX3.js";import"./chunks/chunk-GHEGWXH2.js";import"./chunks/chunk-GCXUSXB4.js";import"./chunks/chunk-2H4DUZJZ.js";import"./chunks/chunk-ECQKK4JU.js";import"./chunks/chunk-JOXGYP5S.js";import"./chunks/chunk-7ULVGK67.js";import"./chunks/chunk-4BZ3DNGM.js";import"./chunks/chunk-R5ZLTWKB.js";import"./chunks/chunk-T5TOBY4D.js";import"./chunks/chunk-H34SGIVS.js";import"./chunks/chunk-5DXC4TE2.js";import"./chunks/chunk-G3LWP5CH.js";import"./chunks/chunk-QQA2OMXJ.js";import"./chunks/chunk-KV2DYFUG.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-GCPPL24C.js";import{printError}from"./chunks/chunk-BWS3ZOHJ.js";import{help,remoteText}from"./chunks/chunk-33U57CNE.js";import{getScope}from"./chunks/chunk-DSNIVABS.js";import{TelemetryClient}from"./chunks/chunk-NAU6URTI.js";import"./chunks/chunk-2EYYB6YN.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,clientObservabilityPlanRecovery,getExitCodeForReason,outputAgentError,shouldEmitNonInteractiveCommandError,writeActionRequired,writeAgentError}from"./chunks/chunk-32NXYHYC.js";import"./chunks/chunk-FWTBSC7Z.js";import{getProjectByNameOrId,isPromptCanceledError,require_pluralize,sleep}from"./chunks/chunk-OZPBJWYU.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-64UCX5JM.js";import{ua_default}from"./chunks/chunk-ITQPDXXA.js";import"./chunks/chunk-7WY7ASKE.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments}from"./chunks/chunk-CGTD4QFC.js";import{quoteArg,teamCache}from"./chunks/chunk-F53OKXYI.js";import{warnDeprecatedInput,warnDeprecatedOption,warnDeprecatedSubcommand}from"./chunks/chunk-GJCVOEC2.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-4SAVH3H7.js";import{ProjectNotFound,isAPIError}from"./chunks/chunk-T2FCF46I.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-VRH7LWOC.js";import{pkg_default}from"./chunks/chunk-DBT6PGEH.js";import{output_manager_default,recordCliError}from"./chunks/chunk-W634OFUG.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-ZS2WS4AM.js";import"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-PUKYAALC.js";import{SDK_KEY_PATTERN,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs}from"./chunks/chunk-YPPDRKVC.js";import"./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{fetch,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_raw_body=__toESM(require_raw_body(),1);var FeedbackTelemetryClient=class extends TelemetryClient{trackCliArgumentNote(note){note!==void 0&&this.trackCliArgument({arg:"note",value:this.redactedValue})}trackCliOptionField(fields){fields?.length&&this.trackCliOption({option:"field",value:this.redactedValue})}};var FEEDBACK_URL="https://vercel.com/api/feedback/cli",MAX_FEEDBACK_BYTES=1024*1024,FETCH_TIMEOUT_MS=1e4;async function feedback(client){let fail=(reason,message,code)=>(recordCliError({code:reason}),output_manager_default.error(message),code),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(feedbackCommand.options))}catch{return fail(AGENT_REASON.INVALID_ARGUMENTS,"Invalid feedback arguments. Run vercel feedback --help for usage.",2)}let notes=parsed.args.slice(1),fields=parsed.flags["--field"]??[];if(notes.length===0&&fields.length===0)return client.stdout.write(help(feedbackCommand,{stream:client.stdout,columns:client.stdout.columns??client.stderr.columns})),0;if(notes.length>1)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Pass one note. Quote notes containing spaces, or use vercel feedback - to read stdin.",2);let telemetry=new FeedbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliArgumentNote(notes[0]),telemetry.trackCliOptionField(fields);let data=Object.create(null);for(let field of fields){let separator=field.indexOf("="),key=field.slice(0,separator).trim();if(separator<1||key==="")return fail(AGENT_REASON.INVALID_ARGUMENTS,"Each --field needs a non-empty key followed by =value. Example: vercel feedback --field topic=deploy.",2);data[key]=field.slice(separator+1)}if(notes.length&&Object.hasOwn(data,"note"))return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide the note once: use a positional note or --field note=..., rather than both.",2);if(notes[0]==="-"){if(client.stdin.isTTY)return fail(AGENT_REASON.INVALID_ARGUMENTS,"No input was piped to stdin. Pipe a note with: cat notes.md | vercel feedback -",2);try{data.note=await readStdinText(client.stdin,MAX_FEEDBACK_BYTES)}catch(error){return error.type==="entity.too.large"?fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2):fail(AGENT_REASON.STDIN_ERROR,"Could not read the feedback note from stdin. Check the input pipe and try again.",1)}}else notes[0]!==void 0&&(data.note=notes[0]);for(let key of Object.keys(data))data[key].trim()||delete data[key];if(!Object.keys(data).length)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide a note or at least one named field. Run vercel feedback --help for examples.",2);let canSendTelemetry=client.telemetryEventStore?.enabled??!1,body=JSON.stringify({metadata:canSendTelemetry?{agent:client.isAgent,agent_name:client.isAgent?client.agentName:void 0,cli_version:pkg_default.version,operating_system:process.platform,team_id:client.config.currentTeam??null,user_id:client.authConfig.userId??null,invocation_id:client.telemetryEventStore?.currentInvocationId??null,session_id:client.telemetryEventStore?.currentSessionId??null}:null,data});if(Buffer.byteLength(body)>MAX_FEEDBACK_BYTES)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2);let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let response=await fetch(FEEDBACK_URL,{method:"POST",headers:{"content-type":"application/json","user-agent":ua_default},body,redirect:"manual",signal:controller.signal});if(!response.ok)return await response.body?.cancel(),fail(response.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,`Feedback could not be submitted (HTTP ${response.status}). Try again later.`,1);let responseBody=toNodeReadable(response.body);return JSON.parse(await(0,import_raw_body.default)(responseBody,{limit:64*1024,encoding:"utf8"}).finally(()=>responseBody.destroy()))?.success!==!0?fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. It may have been submitted; no automatic retry was made.",1):(client.stdout.write(`Feedback sent
|
|
7
|
+
import{FILTER_DEPRECATION_WARNING,alignTimeRangeToGranularity,canonicalResponseToMetricsResponse,createCanonicalMetricsRequest,usesODataSyntax}from"./chunks/chunk-NAEY6HG5.js";import{init_dist,prepareFlagsDefinitions}from"./chunks/chunk-OAM5NJCU.js";import{require_dist}from"./chunks/chunk-JELLVPCM.js";import{EncryptJWT,base64url_exports,jwtDecrypt}from"./chunks/chunk-S3L2OHPO.js";import{sanitizeForTerminal}from"./chunks/chunk-UUBPAYTG.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{readStdinText}from"./chunks/chunk-PSOVLGHP.js";import{require_raw_body}from"./chunks/chunk-XOETL6DB.js";import{getLinkedFlagsProject,getProjectNameFromFlags}from"./chunks/chunk-MWEC2PBL.js";import{parseSubcommandArguments,requireProjectContext}from"./chunks/chunk-K6T65WB2.js";import{computeGranularity,formatText,generateSparkline}from"./chunks/chunk-DBPN2VGJ.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-YO6SJCZP.js";import"./chunks/chunk-IVSSTHB6.js";import"./chunks/chunk-GZNDA6SV.js";import{findCommandShorthands}from"./chunks/chunk-G5T6UQAL.js";import{STANDARD_ENVIRONMENTS}from"./chunks/chunk-7YKFF6CE.js";import{resolveProjectContext}from"./chunks/chunk-VDKY5KRE.js";import{formatProject}from"./chunks/chunk-TD7AL545.js";import{readOnOffOption}from"./chunks/chunk-E7DYXF6G.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{canPrompt,canPromptOnTerminal}from"./chunks/chunk-IQ7FPAI4.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import"./chunks/chunk-PFD7LETF.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-TOTTVS5P.js";import{formatTable}from"./chunks/chunk-2RXUQ72I.js";import{normalizeRepeatableStringFilters,outputError,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-AX3V7N44.js";import{printNextPageCommand}from"./chunks/chunk-PMEYNJU2.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-VS3S5CU4.js";import{table}from"./chunks/chunk-375JVQYK.js";import{getRenamedOption,reportRenamedOptionError,withWarnings}from"./chunks/chunk-V32V4SXB.js";import"./chunks/chunk-Q7D7RGXM.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,archiveSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,botManagementSubcommand,cleanupSubcommand,commandsStructs,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,createSubcommand6 as createSubcommand,datafileSubcommand,diffSubcommand,disableSubcommand,discardSubcommand,enableSubcommand2 as enableSubcommand,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,feedbackCommand,firewallCommand,flagsCommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getFlagAttributeType,inspectSubcommand9 as inspectSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isTimestampAttributeType,labelsListSubcommand,labelsSubcommand,listSubcommand14 as listSubcommand,openSubcommand3 as openSubcommand,overrideSubcommand,overviewSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,prepareSubcommand,publishSubcommand,removeSubcommand8 as removeSubcommand,rolloutSubcommand,rulesAddSubcommand2 as rulesAddSubcommand,rulesAddSubcommand3 as rulesAddSubcommand2,rulesDisableSubcommand,rulesEditSubcommand2 as rulesEditSubcommand,rulesEnableSubcommand,rulesInspectSubcommand,rulesListSubcommand2 as rulesListSubcommand,rulesListSubcommand3 as rulesListSubcommand2,rulesMoveSubcommand,rulesRemoveSubcommand2 as rulesRemoveSubcommand,rulesRemoveSubcommand3 as rulesRemoveSubcommand2,rulesReorderSubcommand,rulesSubcommand2 as rulesSubcommand,rulesSubcommand3 as rulesSubcommand2,rulesUpdateSubcommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setSubcommand2 as setSubcommand,splitSubcommand,staleSubcommand,statusSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetingEnableSubcommand,targetingSubcommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,unarchiveSubcommand,updateSubcommand5 as updateSubcommand,useTargetingSubcommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand}from"./chunks/chunk-FTACGWII.js";import"./chunks/chunk-CZOD25BC.js";import"./chunks/chunk-77LSSWXL.js";import"./chunks/chunk-MUNGQJGO.js";import"./chunks/chunk-W5GHMAHP.js";import"./chunks/chunk-ANCWFEOM.js";import"./chunks/chunk-QVMU7ZKQ.js";import"./chunks/chunk-TL4ZLZ2Q.js";import"./chunks/chunk-VD2FK6OF.js";import"./chunks/chunk-JVNIDSP5.js";import"./chunks/chunk-NLKM5LR5.js";import"./chunks/chunk-BB5UMZMF.js";import"./chunks/chunk-4LGAV2WN.js";import"./chunks/chunk-EJZNJN4N.js";import"./chunks/chunk-S5JBQCBA.js";import"./chunks/chunk-5DXC4TE2.js";import"./chunks/chunk-FAVZ6WVS.js";import"./chunks/chunk-5KE67O45.js";import"./chunks/chunk-T7HE23VK.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-CUBRYWA2.js";import{printError}from"./chunks/chunk-Q4GX2UTG.js";import{help,remoteText}from"./chunks/chunk-GKALP6QD.js";import{getScope}from"./chunks/chunk-7DP4DHQW.js";import{TelemetryClient}from"./chunks/chunk-VPUYTI5E.js";import"./chunks/chunk-2EYYB6YN.js";import"./chunks/chunk-NWGBDBZI.js";import{buildCommandWithGlobalFlags,buildCommandWithYes,clientObservabilityPlanRecovery,outputAgentError,shouldEmitNonInteractiveCommandError,writeActionRequired,writeAgentError}from"./chunks/chunk-ZUI5EMXD.js";import"./chunks/chunk-FY4ORPZH.js";import{getProjectByNameOrId,isPromptCanceledError,require_pluralize,sleep}from"./chunks/chunk-CSOIXUCL.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-64UCX5JM.js";import{ua_default}from"./chunks/chunk-ITQPDXXA.js";import"./chunks/chunk-56UH6NQ3.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments}from"./chunks/chunk-C4N4LKPM.js";import{teamCache}from"./chunks/chunk-2VBFQZ72.js";import{warnDeprecatedInput,warnDeprecatedOption,warnDeprecatedSubcommand}from"./chunks/chunk-GJCVOEC2.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{ProjectNotFound,isAPIError}from"./chunks/chunk-T2FCF46I.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-VRH7LWOC.js";import{pkg_default}from"./chunks/chunk-DBT6PGEH.js";import{output_manager_default,recordCliError}from"./chunks/chunk-W634OFUG.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-PUKYAALC.js";import{SDK_KEY_PATTERN,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,quoteArg}from"./chunks/chunk-CKTLP5GX.js";import"./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{fetch,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{AGENT_REASON,AGENT_STATUS,getExitCodeForReason}from"./chunks/chunk-CFYTFXX6.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_raw_body=__toESM(require_raw_body(),1);var FeedbackTelemetryClient=class extends TelemetryClient{trackCliArgumentNote(note){note!==void 0&&this.trackCliArgument({arg:"note",value:this.redactedValue})}trackCliOptionField(fields){fields?.length&&this.trackCliOption({option:"field",value:this.redactedValue})}};var FEEDBACK_URL="https://vercel.com/api/feedback/cli",MAX_FEEDBACK_BYTES=1024*1024,FETCH_TIMEOUT_MS=1e4;async function feedback(client){let fail=(reason,message,code)=>(recordCliError({code:reason}),output_manager_default.error(message),code),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(feedbackCommand.options))}catch{return fail(AGENT_REASON.INVALID_ARGUMENTS,"Invalid feedback arguments. Run vercel feedback --help for usage.",2)}let notes=parsed.args.slice(1),fields=parsed.flags["--field"]??[];if(notes.length===0&&fields.length===0)return client.stdout.write(help(feedbackCommand,{stream:client.stdout,columns:client.stdout.columns??client.stderr.columns})),0;if(notes.length>1)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Pass one note. Quote notes containing spaces, or use vercel feedback - to read stdin.",2);let telemetry=new FeedbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliArgumentNote(notes[0]),telemetry.trackCliOptionField(fields);let data=Object.create(null);for(let field of fields){let separator=field.indexOf("="),key=field.slice(0,separator).trim();if(separator<1||key==="")return fail(AGENT_REASON.INVALID_ARGUMENTS,"Each --field needs a non-empty key followed by =value. Example: vercel feedback --field topic=deploy.",2);data[key]=field.slice(separator+1)}if(notes.length&&Object.hasOwn(data,"note"))return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide the note once: use a positional note or --field note=..., rather than both.",2);if(notes[0]==="-"){if(client.stdin.isTTY)return fail(AGENT_REASON.INVALID_ARGUMENTS,"No input was piped to stdin. Pipe a note with: cat notes.md | vercel feedback -",2);try{data.note=await readStdinText(client.stdin,MAX_FEEDBACK_BYTES)}catch(error){return error.type==="entity.too.large"?fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2):fail(AGENT_REASON.STDIN_ERROR,"Could not read the feedback note from stdin. Check the input pipe and try again.",1)}}else notes[0]!==void 0&&(data.note=notes[0]);for(let key of Object.keys(data))data[key].trim()||delete data[key];if(!Object.keys(data).length)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide a note or at least one named field. Run vercel feedback --help for examples.",2);let canSendTelemetry=client.telemetryEventStore?.enabled??!1,body=JSON.stringify({metadata:canSendTelemetry?{agent:client.isAgent,agent_name:client.isAgent?client.agentName:void 0,cli_version:pkg_default.version,operating_system:process.platform,team_id:client.config.currentTeam??null,user_id:client.authConfig.userId??null,invocation_id:client.telemetryEventStore?.currentInvocationId??null,session_id:client.telemetryEventStore?.currentSessionId??null}:null,data});if(Buffer.byteLength(body)>MAX_FEEDBACK_BYTES)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2);let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let response=await fetch(FEEDBACK_URL,{method:"POST",headers:{"content-type":"application/json","user-agent":ua_default},body,redirect:"manual",signal:controller.signal});if(!response.ok)return await response.body?.cancel(),fail(response.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,`Feedback could not be submitted (HTTP ${response.status}). Try again later.`,1);let responseBody=toNodeReadable(response.body);return JSON.parse(await(0,import_raw_body.default)(responseBody,{limit:64*1024,encoding:"utf8"}).finally(()=>responseBody.destroy()))?.success!==!0?fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. It may have been submitted; no automatic retry was made.",1):(client.stdout.write(`Feedback sent
|
|
8
8
|
`),0)}catch{return fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. Check your connection. It may have been submitted; no automatic retry was made.",1)}finally{clearTimeout(timeout)}}var import_chalk6=__toESM(require_source(),1);var import_chalk2=__toESM(require_source(),1);var import_chalk=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk.default.blue,deny:import_chalk.default.red,challenge:import_chalk.default.yellow,log:import_chalk.default.magenta,rate_limit:import_chalk.default.cyan,"rate-limit":import_chalk.default.cyan,bypass:import_chalk.default.green};function labelForAction(action){return action==="rate_limit"||action==="rate-limit"?"Rate Limited":action.split(/[-_]/).filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}var MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function formatCount(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}k`:String(Math.round(n))}function pad2(n){return String(n).padStart(2,"0")}function formatUtcTime(ms9,withDate){let d=new Date(ms9),hm=`${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`;return withDate?`${MONTHS[d.getUTCMonth()]} ${d.getUTCDate()} ${hm}`:hm}function relativeTime(ts){let diff2=Date.now()-ts;return diff2<6e4?"just now":diff2<36e5?`${Math.floor(diff2/6e4)}m ago`:diff2<864e5?`${Math.floor(diff2/36e5)}h ago`:`${Math.floor(diff2/864e5)}d ago`}function formatUtcDateTime(ms9){return`${formatUtcTime(ms9,!0)} UTC (${relativeTime(ms9)})`}function colorizeDetail(detail){return detail.split(" \xB7 ").map(part=>{let color=ACTION_COLORS[part.toLowerCase().replace(/ /g,"_")];return color?color(part):part}).join(" \xB7 ")}function windowNeedsDate(startMs,endMs){return endMs-startMs>25*36e5}function granularityLabel(granularity){return"minutes"in granularity?`${granularity.minutes}m`:"hours"in granularity?`${granularity.hours}h`:`${granularity.days}d`}function formatActionTrendTable(series){let allTs=new Set;for(let s of series)for(let p of s.timeseries)allTs.add(p.timestamp);let axis=[...allTs].sort(),hasAnyTraffic=series.some(s=>s.total>0||s.timeseries.some(p=>p.value>0));if(series.length===0||axis.length===0||!hasAnyTraffic)return import_chalk.default.dim(" No request data for this period.");let startMs=new Date(axis[0]).getTime(),endMs=new Date(axis[axis.length-1]).getTime(),needsDate=windowNeedsDate(startMs,endMs),rows=[["Action","Trend","Total","Peak","Peak at"].map(h=>import_chalk.default.bold(import_chalk.default.cyan(h)))];for(let s of series){let byTs=new Map(s.timeseries.map(p=>[p.timestamp,p.value])),values=axis.map(t=>byTs.get(t)??0),peak=0,peakTs="";for(let i=0;i<axis.length;i++)values[i]>peak&&(peak=values[i],peakTs=axis[i]);let plain=x=>x,color=s.total>0?ACTION_COLORS[s.action]??plain:import_chalk.default.dim,trend=s.total>0?plain:import_chalk.default.dim;rows.push([color(labelForAction(s.action)),trend(generateSparkline(values)),formatCount(s.total),peak>0?formatCount(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return table(rows,{align:["l","l","r","r","r"],hsep:3}).split(`
|
|
9
9
|
`).map(line2=>` ${line2}`.trimEnd()).join(`
|
|
10
10
|
`)}var NO_SERVER_MESSAGE="Response Error";function apiServerMessage(error){let message=isAPIError(error)?error.serverMessage:void 0;return message&&message!==NO_SERVER_MESSAGE?message:void 0}var FIREWALL_O11Y_ALERT_TYPES=["botId_anomaly","firewallSystemRule_anomaly","firewallCustomRule_anomaly"],FIREWALL_ANOMALY_TYPE="firewall_anomaly",SYS_DOS_MITIGATION_RULE_ID="sys_dos_mitigation",SYSTEM_RULE_ANOMALY_TYPE="firewallSystemRule_anomaly",FIREWALL_ACTIVITY_PLAN_MESSAGE="Traffic and alerts need Observability Plus.",FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE="Couldn't load every alert source.";function reduceAttackAnomaly(anomaly){return Object.keys(anomaly.affectedHostMap).reduce((acc,host)=>{acc.hosts.push(host);let challenged=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return acc.challenged+=challenged,acc.denied+=denied,acc.count+=challenged+denied,acc},{hosts:[],challenged:0,denied:0,count:0})}function hostsFromAnomaly(anomaly){return Object.entries(anomaly.affectedHostMap).map(([host,data])=>{let challenged=data.ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=data.ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return{name:host,count:challenged+denied}}).filter(row=>row.count>0).sort((a,b)=>b.count-a.count)}function mapAttackAnomaly(anomaly){let reduced=reduceAttackAnomaly(anomaly),parts=["System rule"];return reduced.denied>0&&parts.push(labelForAction("deny")),reduced.challenged>0&&parts.push(labelForAction("challenge")),{id:`${anomaly.ownerId}-${anomaly.projectId}-${anomaly.startTime}`,title:"DDoS Mitigation",type:FIREWALL_ANOMALY_TYPE,startedAt:anomaly.startTime,resolvedAt:anomaly.endTime||void 0,count:reduced.count,detail:parts.join(" \xB7 "),action:reduced.denied>=reduced.challenged?"deny":"challenge",ruleId:SYS_DOS_MITIGATION_RULE_ID,host:reduced.hosts[0]}}function mapO11yAlert(alert){if(!alert.startedAt)return null;let action=alert.data?.action,ruleId=alert.data?.ruleId,detailParts=[alert.type,action?labelForAction(action):void 0,ruleId].filter(Boolean);return{id:alert.id||`${alert.type}-${alert.startedAt}`,title:alert.title||alert.type||"Firewall alert",type:alert.type||"unknown",startedAt:alert.startedAt,resolvedAt:alert.resolvedAt,count:alert.data?.count,detail:detailParts.filter(p=>p!==alert.title).join(" \xB7 ")||void 0,action,ruleId,path:alert.data?.path}}var ATTACK_STATUS_MAX_DAYS=7;async function getAttackStatus(client,opts){let query=new URLSearchParams;if(query.set("projectId",opts.projectId),query.set("teamId",opts.teamId),opts.sinceDays!==void 0){let sinceDays=Math.min(ATTACK_STATUS_MAX_DAYS,Math.max(1,Math.ceil(opts.sinceDays)));query.set("since",String(sinceDays))}return client.fetch(`/v1/security/firewall/attack-status?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})}var O11Y_ALERTS_LIMIT=200;async function getFirewallO11yAlerts(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId),query.set("from",opts.from.toISOString()),query.set("to",opts.to.toISOString()),query.set("limit",String(O11Y_ALERTS_LIMIT));for(let type of FIREWALL_O11Y_ALERT_TYPES)query.append("types",type);return(await client.fetch(`/alerts/v3/groups?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})).flatMap(g=>g.alerts??[]).map(mapO11yAlert).filter(a=>a!==null)}var ALERTS_TIMEOUT_MS=2e4;function sourceFailureReason(err){return isAPIError(err)&&err.status===408||err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?"timed out":isAPIError(err)&&err.status===402?"needs Observability Plus":isAPIError(err)&&typeof err.status=="number"?`HTTP ${err.status}`:err instanceof Error&&err.message?err.message:"unknown error"}function resolveAlertsWindow(opts){let now=Date.now(),to=opts.to??new Date(now),from=opts.from??new Date(to.getTime()-864e5*(opts.sinceDays??1)),sinceDays=opts.sinceDays??Math.max(1,Math.ceil((now-from.getTime())/864e5));return{from,to,sinceDays}}function classifyAlertSourceError(err){if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return isAPIError(err)&&err.status===402?{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}:{reason:"error",message:apiServerMessage(err)||!isAPIError(err)&&err instanceof Error&&err.message||FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}}async function getFirewallAlertsDetailed(client,opts){let{from,to,sinceDays}=resolveAlertsWindow(opts),timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,signal=AbortSignal.timeout(timeoutMs),[o11yResult,attackResult]=await Promise.allSettled([getFirewallO11yAlerts(client,{...opts,from,to,signal}),getAttackStatus(client,{...opts,sinceDays,signal})]),errors=[],o11yAlerts=[],o11y;o11yResult.status==="fulfilled"?o11yAlerts=o11yResult.value:(o11y=classifyAlertSourceError(o11yResult.reason),errors.push({source:"alerts",message:sourceFailureReason(o11yResult.reason)}));let mappedAttacks=[],attackStatus;attackResult.status==="fulfilled"?mappedAttacks=(attackResult.value.anomalies||[]).map(mapAttackAnomaly):(attackStatus=classifyAlertSourceError(attackResult.reason),errors.push({source:"attackStatus",message:sourceFailureReason(attackResult.reason)}));let resolvedCutoff=from.getTime();return{alerts:mappedAttacks.concat(o11yAlerts.filter(a=>!a.resolvedAt||a.resolvedAt>resolvedCutoff)).sort((a,b)=>!a.resolvedAt&&b.resolvedAt?-1:a.resolvedAt&&!b.resolvedAt?1:b.startedAt-a.startedAt),o11y,attackStatus,errors}}function alertsIncompleteMessage(errors){return`Attack count and alerts may be incomplete: ${errors.map(e=>`${e.source==="alerts"?"alerts":"attack history"} ${e.message}`).join("; ")}.`}function countAttacksMitigated(alerts,windowStartMs,windowEndMs){return alerts.filter(alert=>isAttackAlert(alert)&&alertOverlapsWindow(alert,windowStartMs,windowEndMs)).length}function alertOverlapsWindow(alert,windowStartMs,windowEndMs){return alert.startedAt<=windowEndMs&&(alert.resolvedAt??Number.POSITIVE_INFINITY)>=windowStartMs}function isAttackAlert(alert){return alert.type===FIREWALL_ANOMALY_TYPE?!0:alert.type===SYSTEM_RULE_ANOMALY_TYPE&&alert.ruleId===SYS_DOS_MITIGATION_RULE_ID}var O11Y_ALERT_ID_PREFIX="al_",INSPECT_FALLBACK_DAYS=7;function isO11yAlertId(id){return id.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id){let match=id.match(/-(\d{13})$/);return match?Number(match[1]):void 0}function daysCovering(startMs,endMs){return Math.max(1,Math.ceil((endMs-startMs)/864e5))}function mapGroupAsAlert(group,alertId){let nested=(group.alerts??[]).map(mapO11yAlert).filter(a=>a!==null),hit=nested.find(a=>a.id===alertId)??nested[0];if(hit)return hit;let startedAt=group.recordedStartedAt;return startedAt?mapO11yAlert({id:alertId,title:group.title,type:group.type,startedAt,resolvedAt:group.recordedResolvedAt,data:group.alerts?.[0]?.data}):null}async function getO11yAlertById(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId);try{let group=await client.fetch(`/alerts/v3/groups/${encodeURIComponent(opts.alertId)}?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal});return mapGroupAsAlert(group,opts.alertId)}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function findFirewallAlert(client,opts){let timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,budget=()=>AbortSignal.timeout(timeoutMs),now=Date.now();if(isO11yAlertId(opts.alertId)){let fromGroup2=await getO11yAlertById(client,{...opts,signal:budget()});if(fromGroup2)return{alert:fromGroup2};let from=new Date(now-864e5*INSPECT_FALLBACK_DAYS),hit=(await getFirewallO11yAlerts(client,{projectId:opts.projectId,teamId:opts.teamId,from,to:new Date(now),signal:budget()})).find(a=>a.id===opts.alertId);return hit?{alert:hit}:null}let startTime=parseLegacyAlertStartTime(opts.alertId),sinceDays=startTime?daysCovering(startTime,now)+1:INSPECT_FALLBACK_DAYS,anomaly=((await getAttackStatus(client,{projectId:opts.projectId,teamId:opts.teamId,sinceDays,signal:budget()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return{anomalies:[]}})).anomalies||[]).find(a=>`${a.ownerId}-${a.projectId}-${a.startTime}`===opts.alertId);if(anomaly)return{alert:mapAttackAnomaly(anomaly),hosts:hostsFromAnomaly(anomaly)};let fromGroup=await getO11yAlertById(client,{...opts,signal:budget()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return null});return fromGroup?{alert:fromGroup}:null}var AI_BOTS_CATEGORY_ACTIONS=["allow","log","deny"];function getAiBotsCategories(ruleset,catalogGroups){return[...new Set([...Object.keys(catalogGroups??{}),...Object.keys(ruleset?.ruleGroups??{})])].sort().map(ruleGroupId=>({id:ruleGroupId.replace(/_/g,"-"),ruleGroupId,name:catalogGroups?.[ruleGroupId]?.name??formatCategoryName(ruleGroupId)}))}function formatCategoryName(ruleGroupId){return ruleGroupId.split("_").map(word=>word==="ai"?"AI":word[0].toUpperCase()+word.slice(1)).join(" ")}function getAiBotsCategoryAction(ruleset,ruleGroupId){if(!ruleset?.active)return"allow";let group=ruleset.ruleGroups?.[ruleGroupId];return group?.active===!1?"allow":group?.action??ruleset.action??"log"}function getAiBotsCategoryActionAfterEdit(ruleset,ruleGroupId){if(!ruleset)return"log";if(ruleset.active)return getAiBotsCategoryAction(ruleset,ruleGroupId);let group=ruleset.ruleGroups?.[ruleGroupId];return group?.active?group.action??"log":"allow"}function hasAiBotsCategories(ruleset){return Object.keys(ruleset?.ruleGroups??{}).length>0}function getAiBotsCategoryDetails(ruleset){if(hasAiBotsCategories(ruleset))return getAiBotsCategories(ruleset).map(category=>({...category,action:getAiBotsCategoryAction(ruleset,category.ruleGroupId)}))}function aiBotsJsonStatus(ruleset){let categories=getAiBotsCategoryDetails(ruleset);return{enabled:ruleset?.active??!1,action:categories?null:ruleset?.action??null,...categories?{categories}:{}}}var MANAGED_BOT_RULE_IDS=["bot-protection","ai-bots","bot-id"],ALIASES={"bot-protection":"bot-protection","bot protection":"bot-protection",bot_protection:"bot-protection",bot_filter:"bot-protection",managed_bot_protection:"bot-protection",managed_bot_filter:"bot-protection","ai-bots":"ai-bots","ai bots":"ai-bots",ai_bots:"ai-bots",managed_ai_bots:"ai-bots","bot-id":"bot-id",botid:"bot-id",bot_id:"bot-id"},ACTIONS={"bot-protection":["off","log","challenge"],"ai-bots":["allow","log","challenge","deny"],"bot-id":["basic","deep-analysis"]},NAMES={"bot-protection":"Bot Protection","ai-bots":"AI Bots","bot-id":"BotID"},WAF_RULE_IDS={"bot-protection":"managed_bot_protection","ai-bots":"managed_ai_bots"};function resolveManagedBotRuleId(identifier){if(identifier)return ALIASES[identifier.trim().toLowerCase()]}function managedBotActions(id,category){return category?AI_BOTS_CATEGORY_ACTIONS:ACTIONS[id]}function formatManagedBotAction(action){return action==="deep-analysis"?"Deep Analysis":action.charAt(0).toUpperCase()+action.slice(1)}function botProtectionConfig(managedRules){return managedRules?.bot_filter??managedRules?.bot_protection}function currentBotProtectionAction(config){let ruleset=botProtectionConfig(config?.managedRules);return ruleset?.active?ruleset.action==="log"?"log":"challenge":"off"}function currentAiBotsAction(config){let ruleset=config?.managedRules?.ai_bots;return ruleset?.active?ruleset.action==="challenge"?"challenge":ruleset.action==="deny"?"deny":"log":"allow"}function currentBotIdAction(config){return config?.botIdEnabled?"deep-analysis":"basic"}function getManagedBotRule(config,id){let categories=id==="ai-bots"?getAiBotsCategoryDetails(config?.managedRules?.ai_bots):void 0,action=categories?null:id==="bot-protection"?currentBotProtectionAction(config):id==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id,name:NAMES[id],action,wafRuleId:WAF_RULE_IDS[id],...categories?{categories}:{}}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id=>getManagedBotRule(config,id))}function parseManagedBotAction(id,raw,category){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=managedBotActions(id,category);return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${category?.name??NAMES[id]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id,action,category){if(category)return{action:"managedRuleGroup.update",id:"ai_bots",value:{[category.ruleGroupId]:action==="allow"?{active:!1}:{active:!0,action}}};if(id==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id==="bot-protection"?"bot_protection":"ai_bots";return action==="off"||action==="allow"?{action:"managedRules.update",id:patchId,value:{active:!1}}:{action:"managedRules.update",id:patchId,value:{active:!0,action}}}function suggestedManagedBotAction(rule){return rule.id==="bot-protection"?rule.action==="challenge"?"log":"challenge":rule.id==="ai-bots"?rule.action==="deny"?"allow":"deny":rule.action==="deep-analysis"?"basic":"deep-analysis"}function managedBotTrafficWarning(id,from,to,category){if(id==="ai-bots"&&to==="deny")return category?`Deny blocks known ${category.name} traffic when published.`:"AI Bots deny blocks known AI crawlers from this project.";if(id==="bot-protection"&&from==="off"&&to==="challenge")return"Bot Protection challenge will present a verification page to non-browser traffic."}function managedBotJson(rule){return{id:rule.id,name:rule.name,action:rule.action,wafRuleId:rule.wafRuleId??null,...rule.categories?{categories:rule.categories}:{}}}function suggestedManagedBotEditCommand(rule){let category=rule.categories?.[0];if(rule.id==="ai-bots"&&!category)return"firewall rules update ai-bots";let action=suggestedManagedBotAction(category?{...rule,action:category.action}:rule);return`firewall rules update ${rule.id}${category?` --category ${category.id}`:""} --action ${action}`}function projectScope(project,teamId,teamSlug){return{type:"project",projectId:project.id,teamId,...teamSlug?{teamSlug}:{},displayName:project.name}}function firewallConfigUrl(scope,path=""){let query=new URLSearchParams;return scope.type==="project"?(query.set("projectId",scope.projectId),scope.teamId&&query.set("teamId",scope.teamId),`/v1/security/firewall/config${path}?${query.toString()}`):(query.set("teamId",scope.teamId),`/v1/security/firewall/team-config${path}?${query.toString()}`)}async function listFirewallConfigs(client,scope){return client.fetch(firewallConfigUrl(scope))}async function activateFirewallConfig(client,scope,configVersion){return client.fetch(firewallConfigUrl(scope,`/${configVersion}/activate`),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})}var PRIORITY_PROJECT_ENABLE_COMMAND="project priority enable",BUY_PRO_COMMAND="buy pro";function withGlobalFlags(client,commandTemplate,scope,options={}){let template=scope?.type==="team"?`${commandTemplate} --team-level`:commandTemplate;return buildCommandWithGlobalFlags(client.argv,template,void 0,{globalFlags:"all",preserveProject:options.preserveProject??!0,excludeFlags:options.excludeFlags})}async function resolveFirewallScope(client,flags){if(flags["--team-level"]&&flags["--project"]){let message="Cannot specify both --team-level and --project. Use one or the other.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),2):(output_manager_default.error(message),2)}if(flags["--team-level"]){let{team}=await getScope(client);if(!team){let message="Team-level firewall requires a team scope. Personal accounts are not supported. Run `vercel switch` to select a team or pass --scope <team>.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message},1),1):(output_manager_default.error(message),1)}return{type:"team",teamId:team.id,displayName:team.slug}}let link=await requireProjectContext(client,"firewall",flags["--project"]);if(typeof link=="number")return link;let{project,org}=link;return{type:"project",projectId:project.id,teamId:org.type==="team"?org.id:void 0,teamSlug:org.type==="team"?org.slug:void 0,displayName:project.name}}function mentionsPriorityProject(message){return/priority\s+project/i.test(message)||/priority\s+tier/i.test(message)}function teamPlan(scope){return scope.teamId?teamCache.get(scope.teamId)?.billing?.plan:void 0}function priorityTeam(scope){let cached=scope.teamId?teamCache.get(scope.teamId):void 0;if(scope.type==="team")return{id:scope.teamId,slug:scope.displayName,name:cached?.name??null,scopeArg:scope.displayName};if(!scope.teamId)return null;let slug=scope.teamSlug??cached?.slug??null;return{id:scope.teamId,slug,name:cached?.name??null,scopeArg:slug??scope.teamId}}function teamLabel(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function styledCommand(command,plain){return plain?getCommandNamePlain(command):getCommandName(command)}function priorityProjectFix(scope){let excludeFlags=["--non-interactive","--project","--yes","--scope","--team"],project=scope.type==="project"?{id:scope.projectId,name:scope.displayName}:null,team=priorityTeam(scope),plan=teamPlan(scope)??null,data={project,team:team&&{id:team.id,slug:team.slug,name:team.name},plan},projectToken=project?quoteArg(project.name):"<project>",scopeFlag=team?` --scope ${quoteArg(team.scopeArg)}`:"",enable4=`${PRIORITY_PROJECT_ENABLE_COMMAND} ${projectToken}${scopeFlag}`;if(!team){let hint="Priority projects are only available on team accounts. Use --scope to specify one.";return{command:"",hint,plainHint:hint,when:hint,excludeFlags,preserveProject:!1,reason:AGENT_REASON.MISSING_SCOPE,data}}if(plan==="hobby"||plan==="oss"){let upgrade=`${BUY_PRO_COMMAND}${scopeFlag}`,hint=plain2=>`Priority Projects are only available on Pro or Enterprise team plans. Upgrade with ${styledCommand(upgrade,plain2)}, then run ${styledCommand(enable4,plain2)}.`;return{command:upgrade,hint:hint(!1),plainHint:hint(!0),when:"a person has approved upgrading the plan",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}let shown=styledCommand(enable4,!1),plain=styledCommand(enable4,!0),placeholder="Replace <project> with a project on this team.";return{command:enable4,hint:project?shown:`${shown} ${placeholder}`,plainHint:project?plain:`${plain} ${placeholder}`,when:project?"user runs this command in an interactive terminal":"Replace <project> with a project on this team.",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}function mapFirewallApiError(e,scope,fallback){let err=e;return scope.type==="team"&&err.status===403?err.code==="plan_not_supported"?`Team-level firewall requires an Enterprise plan (current team: "${scope.displayName}"). Pass --scope <team> or run \`vercel switch\` to target a different team.`:`You need to be a team owner to manage the team-level firewall for "${scope.displayName}".${err.message?` (${err.message})`:""}`:err.message||fallback}function priorityProjectMessage(scope,fix){let team=fix.data.team,label=team?.slug!=null?teamLabel({slug:team.slug,name:team.name}):void 0;return scope.type==="project"?label?`This rule requires a Priority project for ${scope.displayName} on team ${label}.`:`This rule requires a Priority project. ${fix.hint}`:label?`This rule requires a Priority project on team ${label}.`:"This rule requires a Priority project."}function failPriorityProjectGate(client,error,scope,opts){let serverMessage=apiServerMessage(error);if(!serverMessage||!mentionsPriorityProject(serverMessage))return null;let fix=priorityProjectFix(scope),message=priorityProjectMessage(scope,fix),payload={status:AGENT_STATUS.ERROR,reason:fix.reason,message,userActionRequired:!0,hint:fix.plainHint,retryable:!1,...fix.scope?{scope:fix.scope}:{},data:fix.data,...fix.command?{next:[{command:buildCommandWithGlobalFlags(client.argv,fix.command,packageName,{globalFlags:"all",preserveProject:!1,excludeFlags:fix.excludeFlags}),when:fix.when}]}:{}};return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,1),opts?.json?(output_manager_default.stopSpinner(),writeAgentError(client,payload),1):(output_manager_default.error(message),fix.command&&output_manager_default.log(fix.hint),1)}function getRulePayload(flags){let legacy=flags["--json"];return legacy!==void 0&&flags["--data"]!==void 0?(output_manager_default.error("Can't use --data with --json."),2):(legacy!==void 0&&output_manager_default.warning("--json is deprecated for rule payloads. Use --data."),flags["--data"]??legacy)}async function parseSubcommandArgs(argv,command,client,commandPath){let parsedArgs,fullPath=commandPath||command.name;try{parsedArgs=parseSubcommandArguments(argv,command)}catch(err){if(client?.nonInteractive){let rawMessage=err instanceof Error?err.message:String(err),flags=getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0});return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:rawMessage,next:[{command:getCommandNamePlain(`firewall ${fullPath} ${flags.join(" ")}`.trim()),when:"fix options and retry"}]},2),2}return printError(err),2}return parsedArgs}async function confirmAction(client,skipConfirmation,message,details){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`${message} Re-run with --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"re-run with --yes to confirm"}]}),process.exit(1),!1):(details&&output_manager_default.print(` ${details}
|
|
@@ -232,11 +232,10 @@ Feature flag ${import_chalk47.default.bold(flag.slug)} for ${projectSlugLink}
|
|
|
232
232
|
`);for(let[index,variant]of flag.variants.entries())output_manager_default.print(` ${formatVariantListSummary(variant)}
|
|
233
233
|
`),output_manager_default.print(` ${import_chalk47.default.dim(`id: ${variant.id}`)}
|
|
234
234
|
`),index<flag.variants.length-1&&output_manager_default.print(`
|
|
235
|
-
`);printFlagEnvironmentDetails(flag,settings)}function printFlagEnvironmentDetails(flag,settings,environments){let sortedEnvs=getSortedEnvironmentEntries(flag,environments);output_manager_default.print(`
|
|
235
|
+
`);printFlagEnvironmentDetails(flag,settings)}function formatFlagEnvironmentSummary(flag,envConfig){if(envConfig.reuse?.active)return`reuses ${import_chalk47.default.cyan(envConfig.reuse.environment)} environment`;if(envConfig.active)return hasCustomConfigurationEnabled(envConfig)?"custom":formatFlagOutcome(envConfig.fallthrough,flag.variants);let pausedVariant=flag.variants.find(v=>v.id===envConfig.pausedOutcome?.variantId);return formatFlagVariantSummary(pausedVariant,envConfig.pausedOutcome?.variantId||"paused")}function printFlagEnvironmentDetails(flag,settings,environments){let sortedEnvs=getSortedEnvironmentEntries(flag,environments);output_manager_default.print(`
|
|
236
236
|
${import_chalk47.default.dim("Environments:")}
|
|
237
|
-
`);for(let[envName,envConfig]of sortedEnvs)
|
|
238
|
-
`)
|
|
239
|
-
`),envConfig.targets&&Object.keys(envConfig.targets).length>0){output_manager_default.print(` ${import_chalk47.default.dim("Targeting:")}
|
|
237
|
+
`);for(let[envName,envConfig]of sortedEnvs)if(output_manager_default.print(` ${import_chalk47.default.bold(envName)}: ${formatFlagEnvironmentSummary(flag,envConfig)}
|
|
238
|
+
`),!envConfig.reuse?.active&&envConfig.active){let hasCustomConfiguration=hasCustomConfigurationEnabled(envConfig);if(envConfig.targets&&Object.keys(envConfig.targets).length>0){output_manager_default.print(` ${import_chalk47.default.dim("Targeting:")}
|
|
240
239
|
`);for(let[variantId,entityKinds]of Object.entries(envConfig.targets)){let variant=flag.variants.find(v=>v.id===variantId),variantSummary=formatFlagVariantSummary(variant,variantId);for(let[entityKind,attributes]of Object.entries(entityKinds))for(let[attribute,values]of Object.entries(attributes)){let valueList=values.map(v=>{let label=resolveTargetingLabel(settings,entityKind,attribute,v.value);return label?`${v.value} ${import_chalk47.default.gray(label)}`:v.value}).join(", ");output_manager_default.print(` ${import_chalk47.default.dim(`${entityKind}.${attribute}:`)} ${valueList} ${import_chalk47.default.dim("\u2192")} ${variantSummary}
|
|
241
240
|
`)}}}if(envConfig.rules&&envConfig.rules.length>0){output_manager_default.print(` ${import_chalk47.default.dim("Rules:")}
|
|
242
241
|
`);for(let rule of envConfig.rules){let outcome=formatFlagOutcome(rule.outcome,flag.variants);output_manager_default.print(` ${import_chalk47.default.dim("\u2192")} ${outcome}
|
|
@@ -246,7 +245,6 @@ Feature flag ${import_chalk47.default.bold(flag.slug)} for ${projectSlugLink}
|
|
|
246
245
|
`)}else if(fallthrough.type==="split"){let weights=formatFlagSplitWeights(fallthrough.weights,flag.variants);output_manager_default.print(` ${import_chalk47.default.dim("Default split:")} ${weights}
|
|
247
246
|
`)}else fallthrough.type==="rollout"?output_manager_default.print(` ${import_chalk47.default.dim("Rollout:")} ${formatFlagOutcome(fallthrough,flag.variants)}
|
|
248
247
|
`):fallthrough.type==="experiment"&&output_manager_default.print(` ${import_chalk47.default.dim("Default:")} ${formatFlagOutcome(fallthrough,flag.variants)}
|
|
249
|
-
`)}}else{let pausedVariant=flag.variants.find(v=>v.id===envConfig.pausedOutcome?.variantId),pausedSummary=formatFlagVariantSummary(pausedVariant,envConfig.pausedOutcome?.variantId||"paused");output_manager_default.print(` ${import_chalk47.default.bold(envName)}: ${pausedSummary}
|
|
250
248
|
`)}}output_manager_default.print(`
|
|
251
249
|
`)}function getSortedEnvironmentEntries(flag,environments){let envOrder=["production","preview","development"],selectedEnvironments=environments?new Set(environments):void 0;return Object.entries(flag.environments).filter(([envName])=>selectedEnvironments?selectedEnvironments.has(envName):!0).sort(([a],[b])=>{let aIndex=envOrder.indexOf(a),bIndex=envOrder.indexOf(b);return aIndex===-1&&bIndex===-1?a.localeCompare(b):aIndex===-1?1:bIndex===-1?-1:aIndex-bIndex})}function hasCustomConfigurationEnabled(envConfig){return!!(envConfig.targets&&Object.keys(envConfig.targets).length>0)||envConfig.rules.length>0||envConfig.fallthrough.type==="split"||envConfig.fallthrough.type==="rollout"||envConfig.fallthrough.type==="experiment"}async function inspect5(client,argv){let telemetryClient=new FlagsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error(`Missing required argument: flag. Usage: ${getCommandName("flags inspect <flag>")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagJson(json);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);try{if(json){let flag2=await getFlag(client,project.id,flagArg);return client.stdout.write(`${JSON.stringify({flag:flag2},null,2)}
|
|
252
250
|
`),0}let[flag,settings]=await Promise.all([getFlag(client,project.id,flagArg),getFlagSettings(client,project.id)]);printFlagDetails({flag,settings,projectSlugLink,orgSlug:org.slug,projectName:project.name})}catch(err){return printError(err),1}return 0}var import_chalk49=__toESM(require_source(),1),import_pluralize3=__toESM(require_pluralize(),1);var FlagsVersionsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandDiff(actual){this.trackCliSubcommand({subcommand:"diff",value:actual})}trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(cursor){cursor&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionRevision(revision){revision!==void 0&&this.trackCliOption({option:"revision",value:String(revision)})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_chalk48=__toESM(require_source(),1),import_fast_deep_equal2=__toESM(require_fast_deep_equal(),1);var ENVIRONMENT_ORDER=["production","preview","development"];function normalizeVersionDataForDiff(data){return{...data,permanent:data.permanent??!1,environments:Object.fromEntries(Object.entries(data.environments).map(([environment,config])=>{let diffConfig={...config};return delete diffConfig.revision,[environment,diffConfig]}))}}function diffVersionData(before,after){return diffValues(normalizeVersionDataForDiff(before),normalizeVersionDataForDiff(after))}function formatVersionDataDiff(before,after){let beforeData=normalizeVersionDataForDiff(before),afterData=normalizeVersionDataForDiff(after),lines=[];return appendGeneralChanges(lines,beforeData,afterData),appendEnvironmentChanges(lines,beforeData,afterData),appendUnknownChanges(lines,beforeData,afterData),lines.join(`
|
|
@@ -271,7 +269,7 @@ ${formattedDiff}
|
|
|
271
269
|
${detailLines.join(`
|
|
272
270
|
`)}`)}function assertUniqueVariantValues(variants){for(let index=0;index<variants.length;index++){let variant=variants[index],duplicateVariant=variants.slice(0,index).find(candidate=>(0,import_fast_deep_equal3.default)(candidate.value,variant.value));if(duplicateVariant)throw new Error(`Variant value ${formatVariantValue(variant.value)} would be duplicated by ${formatVariantForLog(duplicateVariant)} and ${formatVariantForLog(variant)}.`)}}async function confirmVariantRemoval(client,flag,removedVariants,skipConfirmation){if(skipConfirmation)return!0;if(!client.stdin.isTTY)throw new Error("Missing required option --yes. Use --yes to skip the removal confirmation prompt in non-interactive mode.");let promptLines=removedVariants.map(variant=>` - ${formatVariantForLog(variant)}`).join(`
|
|
273
271
|
`);return client.input.confirm(`Remove ${removedVariants.length} variant${removedVariants.length===1?"":"s"} from ${import_chalk51.default.bold(flag.slug)}?
|
|
274
|
-
${promptLines}`,!1)}function formatVariantForLog(variant){return`${formatVariantForDisplay(variant)} ${import_chalk51.default.dim(`[id: ${variant.id}]`)}`}async function collectVariantUpdate(client,flag,input){let selectedVariant=await resolveSelectedVariant(client,flag,input.selector),nextValueInput=input.valueInput,nextLabel=input.label;return flag.kind!=="boolean"&&nextValueInput===void 0&&client.stdin.isTTY&&(nextValueInput=await promptForVariantValueUpdate(client,flag,selectedVariant)),nextLabel===void 0&&client.stdin.isTTY&&(nextLabel=await promptForVariantLabelUpdate(client,selectedVariant)),client.stdin.isTTY||ensureVariantUpdateInput(nextValueInput,nextLabel),{selector:selectedVariant.id,valueInput:nextValueInput,label:nextLabel}}function ensureVariantUpdateInput(valueInput,label){if(!valueInput&&!label)throw new Error("At least one of --value or --label must be provided. Use --value <VALUE>, --label <LABEL>, or run interactively in a terminal.")}async function resolveSelectedVariant(client,flag,selector){if(selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}if(!client.stdin.isTTY)throw new Error("Missing required option --variant. Use --variant <VARIANT>, or run interactively in a terminal.");let selectedVariantId=await client.input.select({message:"Select a variant to update:",choices:flag.variants.map(variant=>({name:formatVariantForLog(variant),value:variant.id}))}),selectedVariant=flag.variants.find(v=>v.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}async function promptForVariantValueUpdate(client,flag,selectedVariant){let valueResponse=await client.input.text({message:`Enter a new value for ${formatVariantForDisplay(selectedVariant)} (press Enter to keep ${formatVariantValue(selectedVariant.value)}):`,validate:value=>{if(!value.trim())return!0;let result=validateVariantValue(value,flag.kind);return result===null?!0:result}});return normalizeOptionalInput(valueResponse)}async function promptForVariantLabelUpdate(client,selectedVariant){let currentLabel=selectedVariant.label,labelResponse=await client.input.text({message:currentLabel?`Enter a new label for ${formatVariantForDisplay(selectedVariant)} (press Enter to keep ${JSON.stringify(currentLabel)}):`:`Enter an optional label for ${formatVariantForDisplay(selectedVariant)} (press Enter to skip):`});return normalizeOptionalInput(labelResponse)}function applyVariantUpdates(flag,updates){let variants=flag.variants.map(variant=>({...variant})),changedVariantIds=new Set;for(let update2 of updates){let result=resolveVariant(update2.selector,variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${update2.selector}" not found`);let nextValue=update2.valueInput!==void 0?parseUpdatedVariantValue(update2.valueInput,flag.kind,result.variant):result.variant.value,nextLabel=update2.label??result.variant.label,variantIndex=variants.findIndex(v=>v.id===result.variant.id),existingVariant=variants[variantIndex],hasChanged=!(0,import_fast_deep_equal3.default)(existingVariant.value,nextValue)||existingVariant.label!==nextLabel;variants[variantIndex]={...existingVariant,value:nextValue,label:nextLabel},hasChanged&&changedVariantIds.add(existingVariant.id)}return{variants,changedVariants:variants.filter(variant=>changedVariantIds.has(variant.id))}}function parseUpdatedVariantValue(valueInput,kind,existingVariant){let validationError=validateVariantValue(valueInput,kind);if(validationError)throw new Error(validationError);if(kind==="boolean"){let nextValue=valueInput.toLowerCase()==="true";if(nextValue!==existingVariant.value)throw new Error("Boolean variant values cannot be changed. You can update the label only.");return nextValue}return kind==="number"?Number(valueInput):kind==="json"?JSON.parse(valueInput):valueInput}var import_chalk53=__toESM(require_source(),1);var import_chalk52=__toESM(require_source(),1);async function resolveFlagEnvironment(client,flag,environment,promptMessage,options={}){let nextEnvironment=environment;if(!nextEnvironment){if(!canPrompt(client))throw new Error("Missing required option --environment. Use --environment <ENV>, or run interactively in a terminal.");let availableEnvironments=STANDARD_ENVIRONMENTS.filter(env=>Object.prototype.hasOwnProperty.call(flag.environments,env));if(availableEnvironments.length===0)throw new Error("No valid environments found for this flag");options.showEnvironmentDetails&&printFlagEnvironmentDetails(flag,void 0,availableEnvironments),nextEnvironment=await client.input.select({message:promptMessage,choices:availableEnvironments.map(env=>({name:options.decorateChoices===!1?env:formatEnvironmentChoiceLabel(env,flag.environments[env]),value:env}))})}if(!STANDARD_ENVIRONMENTS.includes(nextEnvironment))throw new Error(`Invalid environment: ${nextEnvironment}. Must be one of: ${STANDARD_ENVIRONMENTS.join(", ")}`);if(!flag.environments[nextEnvironment])throw new Error(`Environment ${nextEnvironment} not found for this flag`);return nextEnvironment}function formatEnvironmentChoiceLabel(envName,envConfig){let status2=envConfig?.active?import_chalk52.default.green("active"):import_chalk52.default.yellow("paused");return`${envName} (${status2})`}function isPausingEnvironmentToVariant(envConfig,variantId){return!envConfig.active&&envConfig.pausedOutcome?.variantId===variantId}function buildTargetingVariantEnvironmentConfig(envConfig,variantId){return buildOutcomeEnvConfig(envConfig,{outcome:{type:"variant",variantId},defaultVariantId:variantId})}function buildResumeTargetingEnvironmentConfig(flag,environment){let envConfig=flag.environments[environment],fallthrough=resolveEffectiveFallthrough(flag,environment),defaultVariantId=getFallthroughDefaultVariantId(fallthrough);return buildOutcomeEnvConfig(envConfig,{outcome:fallthrough,defaultVariantId})}function resolveEffectiveFallthrough(flag,environment){let envConfig=flag.environments[environment],inheritedFrom=envConfig.reuse?.active?envConfig.reuse.environment:void 0;if(inheritedFrom){let inheritedConfig=flag.environments[inheritedFrom];if(inheritedConfig)return structuredClone(inheritedConfig.fallthrough)}return structuredClone(envConfig.fallthrough)}function isUsableFallthrough(fallthrough,variants){let variantIds=new Set(variants.map(variant=>variant.id));return fallthrough.type==="variant"?variantIds.has(fallthrough.variantId):fallthrough.type==="split"?variantIds.has(fallthrough.defaultVariantId):fallthrough.type==="experiment"?!1:variantIds.has(fallthrough.defaultVariantId)&&variantIds.has(fallthrough.rollFromVariantId)&&variantIds.has(fallthrough.rollToVariantId)}function getFallthroughDefaultVariantId(fallthrough){if(fallthrough.type==="variant")return fallthrough.variantId;if(fallthrough.type==="experiment")throw new Error("Experiment outcomes do not have a default variant");return fallthrough.defaultVariantId}function buildPausedEnvironmentConfig(envConfig,variantId){return{...envConfig,active:!1,pausedOutcome:{type:"variant",variantId}}}function buildOutcomeEnvConfig(envConfig,options){let{reuse,...restConfig}=envConfig,nextConfig={...restConfig,active:!0,pausedOutcome:envConfig.pausedOutcome??{type:"variant",variantId:options.defaultVariantId},fallthrough:options.outcome};return reuse&&(nextConfig.reuse={...reuse,active:!1}),nextConfig}function getBooleanVariant(flag,value){let variant=flag.variants.find(candidate=>candidate.value===value);if(!variant)throw new Error(`Flag ${import_chalk52.default.bold(flag.slug)} is missing the standard boolean variants`);return variant}async function resolveFlagUpdateMessage(client,message,defaultMessage){if(message!==void 0)return message;if(!canPrompt(client))return defaultMessage;let response=await client.input.text({message:"Enter a message for this update:",default:defaultMessage});return normalizeOptionalInput(response)||defaultMessage}var FlagsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionVariant(variant){variant&&this.trackCliOption({option:"variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function set(client,argv){let telemetryClient=new FlagsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],variantSelector=normalizeOptionalInput(flags["--variant"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to set"),output_manager_default.log(`Example: ${getCommandName("flags set my-feature --environment production --variant true")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionVariant(variantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to set the variant in:",{showEnvironmentDetails:!0,decorateChoices:!1}),selectedVariant=await resolveVariantToSet(client,flag,variantSelector),envConfig=flag.environments[selectedEnvironment];if(isPausingEnvironmentToVariant(envConfig,selectedVariant.id))return output_manager_default.warning(`Flag ${import_chalk53.default.bold(flag.slug)} is already ${flag.state==="archived"?"configured with":"serving"} ${formatVariantForDisplay(selectedVariant)} in ${selectedEnvironment}`),0;let presentation=getSetPresentation(flag,selectedVariant),updateMessage=await resolveFlagUpdateMessage(client,message,presentation.defaultMessage(selectedEnvironment));output_manager_default.spinner(presentation.spinner(selectedEnvironment)),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:buildPausedEnvironmentConfig(envConfig,selectedVariant.id)},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(flag.state==="archived"?`Archived flag ${import_chalk53.default.bold(flag.slug)} configuration has been updated in ${import_chalk53.default.bold(selectedEnvironment)}`:presentation.success(flag.slug,selectedEnvironment)),output_manager_default.log(` ${import_chalk53.default.dim(flag.state==="archived"?"Configured variant:":"Serving variant:")} ${formatVariantForDisplay(selectedVariant)}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveVariantToSet(client,flag,selector){if(selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}if(!client.stdin.isTTY)throw new Error("Missing required option --variant. Use --variant <VARIANT>, or run interactively in a terminal.");let selectedVariantId=await client.input.select({message:"Select a variant to serve:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id}))}),selectedVariant=flag.variants.find(variant=>variant.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}function getSetPresentation(flag,variant){return flag.kind==="boolean"&&variant.value===!0?{spinner:environment=>`Enabling flag in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been enabled in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Enabled for ${environment} via CLI`}:flag.kind==="boolean"&&variant.value===!1?{spinner:environment=>`Disabling flag in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been disabled in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Disabled for ${environment} via CLI`}:{spinner:environment=>`Setting variant in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been set in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Set variant for ${environment} via CLI`}}var import_chalk54=__toESM(require_source(),1),import_fast_deep_equal4=__toESM(require_fast_deep_equal(),1);var FlagsUseTargetingTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}};async function useTargeting(client,argv){let telemetryClient=new FlagsUseTargetingTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(useTargetingSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to use targeting for"),output_manager_default.log(`Example: ${getCommandName("flags targeting enable my-feature --environment production")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to use targeting in:",{showEnvironmentDetails:!0,decorateChoices:!1}),envConfig=flag.environments[selectedEnvironment],nextEnvConfig=await resolveNextTargetingEnvironmentConfig(client,flag,selectedEnvironment,defaultVariantSelector);if((0,import_fast_deep_equal4.default)(envConfig,nextEnvConfig))return output_manager_default.warn(flag.state==="archived"?`Archived flag ${import_chalk54.default.bold(flag.slug)} is already configured to use targeting in ${import_chalk54.default.bold(selectedEnvironment)}`:formatAlreadyUsingTargetingWarning(flag,selectedEnvironment,nextEnvConfig)),0;let updateMessage=await resolveFlagUpdateMessage(client,message,`Activated targeting for ${selectedEnvironment} via CLI`);output_manager_default.spinner(`Activating targeting in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk54.default.bold(flag.slug)} ${flag.state==="archived"?"is configured to use targeting":"now uses targeting"} in ${import_chalk54.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk54.default.dim("Fallthrough:")} ${formatFlagOutcome(nextEnvConfig.fallthrough,flag.variants)}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveNextTargetingEnvironmentConfig(client,flag,environment,defaultVariantSelector){if(defaultVariantSelector){let variant=resolveDefaultVariantOrThrow(flag,defaultVariantSelector);return buildTargetingVariantEnvironmentConfig(flag.environments[environment],variant.id)}let fallthrough=resolveEffectiveFallthrough(flag,environment);if(isUsableFallthrough(fallthrough,flag.variants))return buildResumeTargetingEnvironmentConfig(flag,environment);let selectedVariant=await resolveReplacementDefaultVariant(client,flag,fallthrough);return buildTargetingVariantEnvironmentConfig(flag.environments[environment],selectedVariant.id)}function resolveDefaultVariantOrThrow(flag,selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}async function resolveReplacementDefaultVariant(client,flag,fallthrough){if(!canPrompt(client))throw new Error(`Couldn't resume targeting because the current fallthrough references a missing variant. Pass --default-variant <VARIANT>${describeUnusableFallthrough(fallthrough)}.`);output_manager_default.warn(`Current fallthrough references a missing variant${describeUnusableFallthrough(fallthrough)}. Choose a new default variant.`);let selectedVariantId=await client.input.select({message:"Select a default variant when no rules match:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id}))}),selectedVariant=flag.variants.find(variant=>variant.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}function describeUnusableFallthrough(fallthrough){return fallthrough.type==="variant"?` (${fallthrough.variantId})`:fallthrough.type==="experiment"?" (experiment assignment)":` (${fallthrough.type} default ${fallthrough.defaultVariantId})`}function formatAlreadyUsingTargetingWarning(flag,environment,envConfig){let{fallthrough}=envConfig;if(fallthrough.type==="variant"){let variant=flag.variants.find(candidate=>candidate.id===fallthrough.variantId),label=variant?formatVariantForDisplay(variant):fallthrough.variantId;return`Flag ${import_chalk54.default.bold(flag.slug)} already uses targeting with default ${label} in ${environment}`}return`Flag ${import_chalk54.default.bold(flag.slug)} already uses targeting in ${environment}`}var import_chalk57=__toESM(require_source(),1),import_fast_deep_equal5=__toESM(require_fast_deep_equal(),1);var import_chalk56=__toESM(require_source(),1);var import_chalk55=__toESM(require_source(),1);function resolveFlagBucketingBase(settings,selector){let separatorIndex=selector.indexOf(".");if(separatorIndex<=0||separatorIndex===selector.length-1)throw new Error("Invalid value for --by. Use the format <entity.attribute>, for example --by user.userId.");let kind=selector.slice(0,separatorIndex),attribute=selector.slice(separatorIndex+1),entity=settings.entities.find(candidate=>candidate.kind===kind);if(!entity){let availableKinds=settings.entities.map(candidate=>candidate.kind);throw new Error(`Unknown entity ${import_chalk55.default.bold(kind)}. Available entities: ${availableKinds.join(", ")}`)}let matchingAttribute=entity.attributes.find(candidate=>candidate.key===attribute);if(!matchingAttribute){let availableAttributes=entity.attributes.map(candidate=>candidate.key);throw new Error(`Unknown attribute ${import_chalk55.default.bold(selector)}. Available attributes for ${kind}: ${availableAttributes.join(", ")}`)}if(!isBucketingAttribute(matchingAttribute))throw new Error(`Attribute ${import_chalk55.default.bold(selector)} is a Timestamp and cannot be used for bucketing. Choose a string or number attribute.`);return{type:"entity",kind,attribute}}function formatFlagBucketingBaseSelector(base){if(base)return`${base.kind}.${base.attribute}`}function resolveFlagSplit(flag,settings,options){let currentSplit=options.currentOutcome?.type==="split"?options.currentOutcome:void 0,baseSelector=options.baseSelector||formatFlagBucketingBaseSelector(currentSplit?.base);if(!baseSelector)throw new Error("Missing required option --by. Use --by <entity.attribute> to choose how users are bucketed.");let base=resolveFlagBucketingBase(settings,baseSelector),weights=resolveSplitWeights(flag,options.weightInputs,currentSplit),defaultVariant=resolveDefaultVariant(flag,options.defaultVariantSelector,currentSplit);return{outcome:{type:"split",base,weights,defaultVariantId:defaultVariant.id},defaultVariant,baseLabel:`${base.kind}.${base.attribute}`,summary:formatSplitSummary(flag.variants,weights)}}function resolveSplitWeights(flag,weightInputs,currentSplit){if(weightInputs.length===0&¤tSplit)return validateAndNormalizeWeights(flag,currentSplit.weights);if(weightInputs.length===0)throw new Error("At least one --weight is required. Use --weight <VARIANT=WEIGHT> for each variant, or run interactively in a terminal.");let weights={},seen=new Set;for(let input of weightInputs){let{variantSelector,weight}=parseWeightInput(input),variant=resolveVariantOrThrow(variantSelector,flag.variants,"--weight");if(seen.has(variant.id))throw new Error(`Duplicate weight for variant ${import_chalk56.default.bold(formatVariantForDisplay(variant))}.`);seen.add(variant.id),weights[variant.id]=weight}let missingVariants=flag.variants.filter(variant=>!seen.has(variant.id));if(missingVariants.length>0)throw new Error(`Missing weights for variants: ${missingVariants.map(variant=>formatVariantForDisplay(variant)).join(", ")}. Use --weight <VARIANT=WEIGHT> for each variant, including 0 for variants that should receive no traffic.`);return validateAndNormalizeWeights(flag,weights)}function parseWeightInput(input){let separatorIndex=input.lastIndexOf("=");if(separatorIndex<=0||separatorIndex===input.length-1)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Use --weight <VARIANT=WEIGHT>, for example --weight true=5.`);let variantSelector=input.slice(0,separatorIndex).trim(),rawWeight=input.slice(separatorIndex+1).trim();if(!variantSelector)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Variant cannot be empty.`);if(!rawWeight)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Weight cannot be empty.`);let weight=Number(rawWeight);if(!Number.isFinite(weight)||weight<0)throw new Error(`Invalid weight "${rawWeight}". Use a number greater than or equal to 0.`);return{variantSelector,weight}}function validateAndNormalizeWeights(flag,weights){let normalizedWeights=Object.fromEntries(flag.variants.map(variant=>[variant.id,weights[variant.id]??0]));if(Object.values(normalizedWeights).reduce((sum,weight)=>sum+weight,0)<=0)throw new Error("At least one weight must be greater than 0.");return normalizedWeights}function resolveDefaultVariant(flag,selector,currentSplit){if(selector)return resolveVariantOrThrow(selector,flag.variants,"--default-variant");if(currentSplit)return resolveVariantByIdOrThrow(currentSplit.defaultVariantId,flag.variants,"--default-variant");if(flag.kind==="boolean")return getBooleanVariant(flag,!1);throw new Error("Missing required option --default-variant. Use --default-variant <VARIANT> for non-boolean splits.")}function formatSplitSummary(variants,weights){let total=Object.values(weights).reduce((sum,weight)=>sum+weight,0);return variants.map(variant=>{let weight=weights[variant.id]??0,percentage=total>0?weight/total*100:0;return`${formatPlainVariant(variant)}: ${formatPercentage(percentage)}`}).join(", ")}function formatPlainVariant(variant){let value=formatVariantValue(variant.value);return variant.label?`${variant.label} (${value})`:value}function formatPercentage(percentage){return Number.isInteger(percentage)?`${percentage}%`:`${Number(percentage.toFixed(2))}%`}var FlagsSplitTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionBy(base){base&&this.trackCliOption({option:"by",value:this.redactedValue})}trackCliOptionWeight(weights){weights?.length&&this.trackCliOption({option:"weight",value:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function split(client,argv){let telemetryClient=new FlagsSplitTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(splitSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],baseSelector=normalizeOptionalInput(flags["--by"]),defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),weightInputs=flags["--weight"]||[],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to split"),output_manager_default.log(`Example: ${getCommandName("flags split my-feature --environment production --by user.userId --weight false=95 --weight true=5")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionBy(baseSelector),telemetryClient.trackCliOptionWeight(weightInputs.length>0?[weightInputs[0]]:void 0),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let[flag,settings]=await Promise.all([getFlag(client,project.id,flagArg),getFlagSettings(client,project.id)]);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to split traffic in:",{showEnvironmentDetails:!0,decorateChoices:!1}),envConfig=flag.environments[selectedEnvironment],currentSplit=envConfig.fallthrough.type==="split"?envConfig.fallthrough:void 0,shouldPromptCurrentSplit=canPrompt(client)&¤tSplit!==void 0&&!baseSelector&&weightInputs.length===0&&!defaultVariantSelector&&!message,resolvedBaseSelector=await resolveBaseSelector(client,settings,baseSelector,currentSplit,shouldPromptCurrentSplit),resolvedWeightInputs=await resolveWeightInputs(client,flag,weightInputs,currentSplit,shouldPromptCurrentSplit),resolvedDefaultVariantSelector=await resolveDefaultVariantSelector(client,flag,defaultVariantSelector,currentSplit,shouldPromptCurrentSplit),splitConfig=resolveFlagSplit(flag,settings,{baseSelector:resolvedBaseSelector,weightInputs:resolvedWeightInputs,defaultVariantSelector:resolvedDefaultVariantSelector,currentOutcome:envConfig.fallthrough.type==="experiment"?void 0:envConfig.fallthrough}),nextEnvironmentConfig=buildOutcomeEnvConfig(envConfig,{outcome:splitConfig.outcome,defaultVariantId:splitConfig.defaultVariant.id});if(!message&&envConfig.active&&(0,import_fast_deep_equal5.default)(envConfig.fallthrough,splitConfig.outcome)&&(0,import_fast_deep_equal5.default)(envConfig,nextEnvironmentConfig))return output_manager_default.warn(`Flag ${import_chalk57.default.bold(flag.slug)} is already configured with this split in ${selectedEnvironment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultSplitMessage(selectedEnvironment,splitConfig));output_manager_default.spinner(`Updating split in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvironmentConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk57.default.bold(flag.slug)} split has been updated in ${import_chalk57.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk57.default.dim("Based on:")} ${splitConfig.baseLabel}`),output_manager_default.log(` ${import_chalk57.default.dim("Fallback:")} ${formatVariantForDisplay(splitConfig.defaultVariant)}`),output_manager_default.log(` ${import_chalk57.default.dim("Weights:")} ${splitConfig.summary}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function getDefaultSplitMessage(environment,splitConfig){return`Configure split for ${environment}: ${splitConfig.summary}`}async function resolveBaseSelector(client,settings,baseSelector,currentSplit,shouldPromptCurrentSplit){if(baseSelector||currentSplit&&!shouldPromptCurrentSplit)return baseSelector;if(!canPrompt(client))return;let choices=settings.entities.flatMap(entity=>entity.attributes.filter(isBucketingAttribute).map(attribute=>({name:`${entity.label} \u203A ${attribute.key}`,value:`${entity.kind}.${attribute.key}`}))),currentBaseSelector=formatFlagBucketingBaseSelector(currentSplit?.base),defaultChoice=choices.find(choice=>choice.value===currentBaseSelector)?.value;if(choices.length===0)throw new Error("No entities are configured for weighted splits.");return client.input.select({message:"Select an attribute to split by:",choices,default:defaultChoice})}async function resolveWeightInputs(client,flag,weightInputs,currentSplit,shouldPromptCurrentSplit){if(weightInputs.length>0||currentSplit&&!shouldPromptCurrentSplit||!canPrompt(client))return weightInputs;output_manager_default.log("Enter weights for each variant. Weights are ratios; use 0 for variants that should receive no traffic.");let promptedWeights=[];for(let variant of flag.variants){let defaultWeight=currentSplit?.weights[variant.id]!==void 0?String(currentSplit.weights[variant.id]):currentSplit?"0":"1",weight=await client.input.text({message:`Weight for ${formatVariantForDisplay(variant)}:`,default:defaultWeight,validate:value=>{let trimmed=value.trim();if(!trimmed)return"Enter a weight";let parsed=Number(trimmed);return!Number.isFinite(parsed)||parsed<0?"Enter a number greater than or equal to 0":!0}});promptedWeights.push(`${variant.id}=${weight.trim()}`)}return promptedWeights}async function resolveDefaultVariantSelector(client,flag,defaultVariantSelector,currentSplit,shouldPromptCurrentSplit){if(defaultVariantSelector||currentSplit&&!shouldPromptCurrentSplit||flag.kind==="boolean"&&!canPrompt(client))return defaultVariantSelector;if(canPrompt(client))return client.input.select({message:"Select a fallback variant:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id})),default:flag.variants.find(variant=>variant.id===currentSplit?.defaultVariantId)?.id||getBooleanFallbackVariantId(flag)})}function getBooleanFallbackVariantId(flag){if(flag.kind==="boolean")return flag.variants.find(variant=>variant.value===!1)?.id}var import_chalk59=__toESM(require_source(),1),import_fast_deep_equal6=__toESM(require_fast_deep_equal(),1);var import_chalk58=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);function resolveFlagRollout(flag,settings,options){let currentRollout=options.currentOutcome?.type==="rollout"?options.currentOutcome:void 0,baseSelector=options.baseSelector||formatFlagBucketingBaseSelector(currentRollout?.base);if(!baseSelector)throw new Error("Missing required option --by. Use --by <entity.attribute> to choose how users are bucketed.");let base=resolveFlagBucketingBase(settings,baseSelector),rollFromVariant=resolveRollFromVariant(flag,options.rollFromVariantSelector,currentRollout),rollToVariant=resolveRollToVariant(flag,options.rollToVariantSelector,currentRollout);if(rollFromVariant.id===rollToVariant.id)throw new Error("`--from-variant` and `--to-variant` must resolve to different variants.");let defaultVariant=resolveDefaultVariant2(flag,options.defaultVariantSelector,currentRollout,rollFromVariant),slots=options.stageInputs.length>0?parseStageInputs(options.stageInputs):currentRollout?.slots;if(!slots||slots.length===0)throw new Error("At least one --stage is required. Use --stage <PERCENTAGE,DURATION>, for example --stage 5,6h.");let finalPromille=options.finalPercentage===void 0?currentRollout?.finalPromille:parseFinalPercentage(options.finalPercentage),startTimestamp=resolveRolloutStartTimestamp(options.start,currentRollout?.startTimestamp);return{outcome:{type:"rollout",base,startTimestamp,rollFromVariantId:rollFromVariant.id,rollToVariantId:rollToVariant.id,defaultVariantId:defaultVariant.id,slots,...finalPromille!==void 0&&{finalPromille}},defaultVariant,rollFromVariant,rollToVariant,baseLabel:`${base.kind}.${base.attribute}`,summary:formatRolloutStages(slots,finalPromille),startLabel:formatStartLabel(options.start,currentRollout?.startTimestamp)}}function resolveRollFromVariant(flag,selector,currentRollout){return selector?resolveVariantOrThrow(selector,flag.variants,"--from-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.rollFromVariantId,flag.variants,"--from-variant"):inferBooleanVariant(flag,!1,"--from-variant")}function resolveRollToVariant(flag,selector,currentRollout){return selector?resolveVariantOrThrow(selector,flag.variants,"--to-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.rollToVariantId,flag.variants,"--to-variant"):inferBooleanVariant(flag,!0,"--to-variant")}function resolveDefaultVariant2(flag,selector,currentRollout,rollFromVariant){return selector?resolveVariantOrThrow(selector,flag.variants,"--default-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.defaultVariantId,flag.variants,"--default-variant"):rollFromVariant}function inferBooleanVariant(flag,value,optionName){if(flag.kind!=="boolean")throw new Error(`Missing required option ${optionName}. Use ${optionName} <VARIANT> for non-boolean rollouts.`);let variant=flag.variants.find(candidate=>candidate.value===value);if(!variant)throw new Error(`Flag ${import_chalk58.default.bold(flag.slug)} is missing the standard boolean variants`);return variant}function parseStageInputs(stageInputs){let slots=stageInputs.map(parseStageInput);for(let index=1;index<slots.length;index++)if(slots[index].promille<=slots[index-1].promille)throw new Error("Stage percentages must be in ascending order.");return slots}function parseStageInput(input){let parts=input.split(",").map(part=>part.trim());if(parts.length!==2)throw new Error(`Invalid stage ${import_chalk58.default.bold(input)}. Use --stage <PERCENTAGE,DURATION>, for example --stage 5,6h.`);let percentage=Number(parts[0]);if(!Number.isFinite(percentage)||percentage<=0||percentage>=100||!Number.isInteger(percentage*1e3))throw new Error(`Invalid stage percentage "${parts[0]}". Use a number greater than 0 and less than 100 with up to 3 decimal places.`);let durationMs=parseStageDuration(parts[1]);if(durationMs===void 0)throw new Error(`Invalid duration "${parts[1]}". Use minutes (e.g. "30m"), hours (e.g. "6h"), or days (e.g. "1d"). Seconds are not supported.`);return{durationMs,promille:Math.round(percentage*1e3)}}function parseStageDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let durationMs=(0,import_ms3.default)(/^\d+$/.test(value)?`${value}m`:value);if(durationMs===void 0||durationMs<=0)return;let roundedMinutes=Math.round(durationMs/6e4);if(!(roundedMinutes<=0))return roundedMinutes*6e4}function resolveRolloutStartTimestamp(start,currentStartTimestamp){if(start===void 0)return currentStartTimestamp??Date.now();if(start==="now")return Date.now();let relativeDurationMs=(0,import_ms3.default)(start);if(relativeDurationMs!==void 0){if(relativeDurationMs<=0)throw new Error(`Invalid start time "${start}". Use "now", a future relative duration such as "1h", or an ISO 8601 datetime.`);return Date.now()+relativeDurationMs}let absoluteTime=new Date(start).getTime();if(Number.isNaN(absoluteTime))throw new Error(`Invalid start time "${start}". Use "now", a future relative duration such as "1h", or an ISO 8601 datetime.`);return absoluteTime}function parseFinalPercentage(input){let percentage=Number(input);if(input.trim()===""||!Number.isFinite(percentage)||percentage<0||percentage>100||Math.round(percentage*1e3)/1e3!==percentage)throw new Error(`Invalid final percentage "${input}". Use --final-percentage with a number between 0 and 100 with up to 3 decimal places.`);return Math.round(percentage*1e3)}function formatRolloutStages(slots,finalPromille=1e5){return`${slots.map(slot=>`${formatPromille(slot.promille)} for ${(0,import_ms3.default)(slot.durationMs,{long:!0})}`).join(", ")}, then ${formatPromille(finalPromille)} indefinitely`}function formatPromille(promille){let percentage=promille/1e3;return Number.isInteger(percentage)?`${percentage}%`:`${Number(percentage.toFixed(3))}%`}function formatStartLabel(start,currentStartTimestamp){return start===void 0?currentStartTimestamp?"preserve current start time":"immediately":start==="now"?"immediately":`start at ${start}`}var FlagsRolloutTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionFromVariant(variant){variant&&this.trackCliOption({option:"from-variant",value:this.redactedValue})}trackCliOptionToVariant(variant){variant&&this.trackCliOption({option:"to-variant",value:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionBy(base){base&&this.trackCliOption({option:"by",value:this.redactedValue})}trackCliOptionStage(stages){stages?.length&&this.trackCliOption({option:"stage",value:this.redactedValue})}trackCliOptionFinalPercentage(percentage){percentage!==void 0&&this.trackCliOption({option:"final-percentage",value:this.redactedValue})}trackCliOptionStart(start){start&&this.trackCliOption({option:"start",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function rollout(client,argv){let telemetryClient=new FlagsRolloutTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rolloutSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],rollFromVariantSelector=normalizeOptionalInput(flags["--from-variant"]),rollToVariantSelector=normalizeOptionalInput(flags["--to-variant"]),defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),baseSelector=normalizeOptionalInput(flags["--by"]),stageInputs=(flags["--stage"]||[]).map(input=>input.trim()),finalPercentage=flags["--final-percentage"],start=normalizeOptionalInput(flags["--start"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to roll out"),output_manager_default.log(`Example: ${getCommandName("flags rollout my-feature --environment production --by user.userId --stage 5,6h --stage 25,1d")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionFromVariant(rollFromVariantSelector),telemetryClient.trackCliOptionToVariant(rollToVariantSelector),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionBy(baseSelector),telemetryClient.trackCliOptionStage(stageInputs.length>0?[stageInputs[0]]:void 0),telemetryClient.trackCliOptionFinalPercentage(finalPercentage),telemetryClient.trackCliOptionStart(start),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let[flag,settings]=await Promise.all([getFlag(client,project.id,flagArg),getFlagSettings(client,project.id)]);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to roll out in:",{showEnvironmentDetails:!0,decorateChoices:!1}),currentOutcome=flag.environments[selectedEnvironment].fallthrough,rolloutConfig=resolveFlagRollout(flag,settings,{stageInputs,finalPercentage,baseSelector,rollFromVariantSelector,rollToVariantSelector,defaultVariantSelector,start,currentOutcome:currentOutcome.type==="experiment"?void 0:currentOutcome}),nextEnvironmentConfig=buildOutcomeEnvConfig(flag.environments[selectedEnvironment],{outcome:rolloutConfig.outcome,defaultVariantId:rolloutConfig.defaultVariant.id});if(flag.environments[selectedEnvironment].active&&(0,import_fast_deep_equal6.default)(flag.environments[selectedEnvironment].fallthrough,rolloutConfig.outcome)&&(0,import_fast_deep_equal6.default)(flag.environments[selectedEnvironment],nextEnvironmentConfig))return output_manager_default.warn(`Flag ${import_chalk59.default.bold(flag.slug)} is already configured with this rollout in ${selectedEnvironment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultRolloutMessage(selectedEnvironment,rolloutConfig));output_manager_default.spinner(`Updating rollout in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvironmentConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk59.default.bold(flag.slug)} rollout has been updated in ${import_chalk59.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk59.default.dim("Based on:")} ${rolloutConfig.baseLabel}`),output_manager_default.log(` ${import_chalk59.default.dim("Roll from:")} ${formatVariantLabel(rolloutConfig.rollFromVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Roll to:")} ${formatVariantLabel(rolloutConfig.rollToVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Fallback:")} ${formatVariantLabel(rolloutConfig.defaultVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Start:")} ${rolloutConfig.startLabel}`),output_manager_default.log(` ${import_chalk59.default.dim("Stages:")} ${rolloutConfig.summary}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function getDefaultRolloutMessage(environment,rolloutConfig){return`Configure rollout for ${environment}: ${rolloutConfig.summary}`}function formatVariantLabel(variant){return variant.label||variant.id}var import_chalk60=__toESM(require_source(),1);async function deleteFlag(client,projectId,flagIdOrSlug){output_manager_default.debug(`Deleting feature flag ${flagIdOrSlug} for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}`;await client.fetch(url,{method:"DELETE"})}var FlagsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let telemetryClient=new FlagsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to delete"),output_manager_default.log(`Example: ${getCommandName("flags delete my-feature")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),flag.state!=="archived")return output_manager_default.error(`Flag ${import_chalk60.default.bold(flag.slug)} must be archived before it can be deleted. Run ${getCommandName(`flags archive ${flag.slug}`)} first.`),1;if(!skipConfirmation){if(!client.stdin.isTTY)return output_manager_default.error("Missing required option --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),2;if(!await client.input.confirm(`Are you sure you want to delete ${import_chalk60.default.bold(flag.slug)}? This action cannot be undone.`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Deleting flag..."),await deleteFlag(client,project.id,flagArg),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk60.default.bold(flag.slug)} has been deleted`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk61=__toESM(require_source(),1);var FlagsArchiveTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};var EVALUATION_WINDOW_DAYS=3;async function archive(client,argv){let telemetryClient=new FlagsArchiveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(archiveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,skipConfirmation=flags["--yes"],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to archive"),output_manager_default.log(`Example: ${getCommandName("flags archive my-feature")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),flag.state==="archived")return output_manager_default.warn(`Flag ${import_chalk61.default.bold(flag.slug)} is already archived`),0;if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Missing required option --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),2;output_manager_default.spinner("Checking recent evaluations...");let endTime=new Date,startTime=new Date(endTime.getTime()-EVALUATION_WINDOW_DAYS*24*60*60*1e3),evaluations2=await countFlagEvaluations(client,{ownerId:org.id,projectId:project.id,flagSlug:flag.slug,startTime,endTime});output_manager_default.stopSpinner();let window=`the last ${EVALUATION_WINDOW_DAYS} days`;if(evaluations2===null){let evaluationsCommand=["flags","evaluations",flag.slug,"--since",`${EVALUATION_WINDOW_DAYS}d`,...getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0})].map(quoteArg).join(" ");output_manager_default.log(`Could not check recent evaluations for ${import_chalk61.default.bold(flag.slug)}. Run ${getCommandName(evaluationsCommand)} to verify the flag is no longer evaluated.`)}else evaluations2>0?output_manager_default.warn(`${import_chalk61.default.bold(flag.slug)} reported ${evaluations2.toLocaleString()} ${evaluations2===1?"evaluation":"evaluations"} in ${window}. Archived flags evaluate to the default value in code. Remove the flag from your code and deploy before archiving.`):output_manager_default.log(`No evaluations reported for ${import_chalk61.default.bold(flag.slug)} in ${window}.`);if(!skipConfirmation&&!await client.input.confirm(evaluations2!==null&&evaluations2>0?`Archive ${import_chalk61.default.bold(flag.slug)} anyway?`:`Are you sure you want to archive ${import_chalk61.default.bold(flag.slug)}?`,!1))return output_manager_default.log("Aborted"),0;output_manager_default.spinner("Archiving flag..."),await updateFlag(client,project.id,flagArg,{state:"archived",message:message??"Archived via CLI"}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk61.default.bold(flag.slug)} has been archived`),output_manager_default.log(`
|
|
272
|
+
${promptLines}`,!1)}function formatVariantForLog(variant){return`${formatVariantForDisplay(variant)} ${import_chalk51.default.dim(`[id: ${variant.id}]`)}`}async function collectVariantUpdate(client,flag,input){let selectedVariant=await resolveSelectedVariant(client,flag,input.selector),nextValueInput=input.valueInput,nextLabel=input.label;return flag.kind!=="boolean"&&nextValueInput===void 0&&client.stdin.isTTY&&(nextValueInput=await promptForVariantValueUpdate(client,flag,selectedVariant)),nextLabel===void 0&&client.stdin.isTTY&&(nextLabel=await promptForVariantLabelUpdate(client,selectedVariant)),client.stdin.isTTY||ensureVariantUpdateInput(nextValueInput,nextLabel),{selector:selectedVariant.id,valueInput:nextValueInput,label:nextLabel}}function ensureVariantUpdateInput(valueInput,label){if(!valueInput&&!label)throw new Error("At least one of --value or --label must be provided. Use --value <VALUE>, --label <LABEL>, or run interactively in a terminal.")}async function resolveSelectedVariant(client,flag,selector){if(selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}if(!client.stdin.isTTY)throw new Error("Missing required option --variant. Use --variant <VARIANT>, or run interactively in a terminal.");let selectedVariantId=await client.input.select({message:"Select a variant to update:",choices:flag.variants.map(variant=>({name:formatVariantForLog(variant),value:variant.id}))}),selectedVariant=flag.variants.find(v=>v.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}async function promptForVariantValueUpdate(client,flag,selectedVariant){let valueResponse=await client.input.text({message:`Enter a new value for ${formatVariantForDisplay(selectedVariant)} (press Enter to keep ${formatVariantValue(selectedVariant.value)}):`,validate:value=>{if(!value.trim())return!0;let result=validateVariantValue(value,flag.kind);return result===null?!0:result}});return normalizeOptionalInput(valueResponse)}async function promptForVariantLabelUpdate(client,selectedVariant){let currentLabel=selectedVariant.label,labelResponse=await client.input.text({message:currentLabel?`Enter a new label for ${formatVariantForDisplay(selectedVariant)} (press Enter to keep ${JSON.stringify(currentLabel)}):`:`Enter an optional label for ${formatVariantForDisplay(selectedVariant)} (press Enter to skip):`});return normalizeOptionalInput(labelResponse)}function applyVariantUpdates(flag,updates){let variants=flag.variants.map(variant=>({...variant})),changedVariantIds=new Set;for(let update2 of updates){let result=resolveVariant(update2.selector,variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${update2.selector}" not found`);let nextValue=update2.valueInput!==void 0?parseUpdatedVariantValue(update2.valueInput,flag.kind,result.variant):result.variant.value,nextLabel=update2.label??result.variant.label,variantIndex=variants.findIndex(v=>v.id===result.variant.id),existingVariant=variants[variantIndex],hasChanged=!(0,import_fast_deep_equal3.default)(existingVariant.value,nextValue)||existingVariant.label!==nextLabel;variants[variantIndex]={...existingVariant,value:nextValue,label:nextLabel},hasChanged&&changedVariantIds.add(existingVariant.id)}return{variants,changedVariants:variants.filter(variant=>changedVariantIds.has(variant.id))}}function parseUpdatedVariantValue(valueInput,kind,existingVariant){let validationError=validateVariantValue(valueInput,kind);if(validationError)throw new Error(validationError);if(kind==="boolean"){let nextValue=valueInput.toLowerCase()==="true";if(nextValue!==existingVariant.value)throw new Error("Boolean variant values cannot be changed. You can update the label only.");return nextValue}return kind==="number"?Number(valueInput):kind==="json"?JSON.parse(valueInput):valueInput}var import_chalk53=__toESM(require_source(),1);var import_chalk52=__toESM(require_source(),1);async function resolveFlagEnvironment(client,flag,environment,promptMessage,options={}){let nextEnvironment=environment;if(!nextEnvironment){if(!canPrompt(client))throw new Error("Missing required option --environment. Use --environment <ENV>, or run interactively in a terminal.");let availableEnvironments=STANDARD_ENVIRONMENTS.filter(env=>Object.prototype.hasOwnProperty.call(flag.environments,env));if(availableEnvironments.length===0)throw new Error("No valid environments found for this flag");options.showEnvironmentDetails&&printFlagEnvironmentDetails(flag,void 0,availableEnvironments),nextEnvironment=await client.input.select({message:promptMessage,choices:availableEnvironments.map(env=>({name:options.decorateChoices===!1?env:`${env} (${formatFlagEnvironmentSummary(flag,flag.environments[env])})`,value:env}))})}if(!STANDARD_ENVIRONMENTS.includes(nextEnvironment))throw new Error(`Invalid environment: ${nextEnvironment}. Must be one of: ${STANDARD_ENVIRONMENTS.join(", ")}`);if(!flag.environments[nextEnvironment])throw new Error(`Environment ${nextEnvironment} not found for this flag`);return nextEnvironment}function isPausingEnvironmentToVariant(envConfig,variantId){return!envConfig.active&&envConfig.pausedOutcome?.variantId===variantId}function buildTargetingVariantEnvironmentConfig(envConfig,variantId){return buildOutcomeEnvConfig(envConfig,{outcome:{type:"variant",variantId},defaultVariantId:variantId})}function buildResumeTargetingEnvironmentConfig(flag,environment){let envConfig=flag.environments[environment],fallthrough=resolveEffectiveFallthrough(flag,environment),defaultVariantId=getFallthroughDefaultVariantId(fallthrough);return buildOutcomeEnvConfig(envConfig,{outcome:fallthrough,defaultVariantId})}function resolveEffectiveFallthrough(flag,environment){let envConfig=flag.environments[environment],inheritedFrom=envConfig.reuse?.active?envConfig.reuse.environment:void 0;if(inheritedFrom){let inheritedConfig=flag.environments[inheritedFrom];if(inheritedConfig)return structuredClone(inheritedConfig.fallthrough)}return structuredClone(envConfig.fallthrough)}function isUsableFallthrough(fallthrough,variants){let variantIds=new Set(variants.map(variant=>variant.id));return fallthrough.type==="variant"?variantIds.has(fallthrough.variantId):fallthrough.type==="split"?variantIds.has(fallthrough.defaultVariantId):fallthrough.type==="experiment"?!1:variantIds.has(fallthrough.defaultVariantId)&&variantIds.has(fallthrough.rollFromVariantId)&&variantIds.has(fallthrough.rollToVariantId)}function getFallthroughDefaultVariantId(fallthrough){if(fallthrough.type==="variant")return fallthrough.variantId;if(fallthrough.type==="experiment")throw new Error("Experiment outcomes do not have a default variant");return fallthrough.defaultVariantId}function buildPausedEnvironmentConfig(envConfig,variantId){return{...envConfig,active:!1,pausedOutcome:{type:"variant",variantId}}}function buildOutcomeEnvConfig(envConfig,options){let{reuse,...restConfig}=envConfig,nextConfig={...restConfig,active:!0,pausedOutcome:envConfig.pausedOutcome??{type:"variant",variantId:options.defaultVariantId},fallthrough:options.outcome};return reuse&&(nextConfig.reuse={...reuse,active:!1}),nextConfig}function getBooleanVariant(flag,value){let variant=flag.variants.find(candidate=>candidate.value===value);if(!variant)throw new Error(`Flag ${import_chalk52.default.bold(flag.slug)} is missing the standard boolean variants`);return variant}async function resolveFlagUpdateMessage(client,message,defaultMessage){if(message!==void 0)return message;if(!canPrompt(client))return defaultMessage;let response=await client.input.text({message:"Enter a message for this update:",default:defaultMessage});return normalizeOptionalInput(response)||defaultMessage}var FlagsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionVariant(variant){variant&&this.trackCliOption({option:"variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function set(client,argv){let telemetryClient=new FlagsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],variantSelector=normalizeOptionalInput(flags["--variant"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to set"),output_manager_default.log(`Example: ${getCommandName("flags set my-feature --environment production --variant true")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionVariant(variantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to set the variant in:",{showEnvironmentDetails:!0,decorateChoices:!1}),selectedVariant=await resolveVariantToSet(client,flag,variantSelector),envConfig=flag.environments[selectedEnvironment];if(isPausingEnvironmentToVariant(envConfig,selectedVariant.id))return output_manager_default.warning(`Flag ${import_chalk53.default.bold(flag.slug)} is already ${flag.state==="archived"?"configured with":"serving"} ${formatVariantForDisplay(selectedVariant)} in ${selectedEnvironment}`),0;let presentation=getSetPresentation(flag,selectedVariant),updateMessage=await resolveFlagUpdateMessage(client,message,presentation.defaultMessage(selectedEnvironment));output_manager_default.spinner(presentation.spinner(selectedEnvironment)),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:buildPausedEnvironmentConfig(envConfig,selectedVariant.id)},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(flag.state==="archived"?`Archived flag ${import_chalk53.default.bold(flag.slug)} configuration has been updated in ${import_chalk53.default.bold(selectedEnvironment)}`:presentation.success(flag.slug,selectedEnvironment)),output_manager_default.log(` ${import_chalk53.default.dim(flag.state==="archived"?"Configured variant:":"Serving variant:")} ${formatVariantForDisplay(selectedVariant)}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveVariantToSet(client,flag,selector){if(selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}if(!client.stdin.isTTY)throw new Error("Missing required option --variant. Use --variant <VARIANT>, or run interactively in a terminal.");let selectedVariantId=await client.input.select({message:"Select a variant to serve:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id}))}),selectedVariant=flag.variants.find(variant=>variant.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}function getSetPresentation(flag,variant){return flag.kind==="boolean"&&variant.value===!0?{spinner:environment=>`Enabling flag in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been enabled in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Enabled for ${environment} via CLI`}:flag.kind==="boolean"&&variant.value===!1?{spinner:environment=>`Disabling flag in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been disabled in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Disabled for ${environment} via CLI`}:{spinner:environment=>`Setting variant in ${environment}...`,success:(slug,environment)=>`Feature flag ${import_chalk53.default.bold(slug)} has been set in ${import_chalk53.default.bold(environment)}`,defaultMessage:environment=>`Set variant for ${environment} via CLI`}}var import_chalk54=__toESM(require_source(),1),import_fast_deep_equal4=__toESM(require_fast_deep_equal(),1);var FlagsUseTargetingTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}};async function useTargeting(client,argv){let telemetryClient=new FlagsUseTargetingTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(useTargetingSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to use targeting for"),output_manager_default.log(`Example: ${getCommandName("flags targeting enable my-feature --environment production")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to use targeting in:",{showEnvironmentDetails:!0,decorateChoices:!1}),envConfig=flag.environments[selectedEnvironment],nextEnvConfig=await resolveNextTargetingEnvironmentConfig(client,flag,selectedEnvironment,defaultVariantSelector);if((0,import_fast_deep_equal4.default)(envConfig,nextEnvConfig))return output_manager_default.warn(flag.state==="archived"?`Archived flag ${import_chalk54.default.bold(flag.slug)} is already configured to use targeting in ${import_chalk54.default.bold(selectedEnvironment)}`:formatAlreadyUsingTargetingWarning(flag,selectedEnvironment,nextEnvConfig)),0;let updateMessage=await resolveFlagUpdateMessage(client,message,`Activated targeting for ${selectedEnvironment} via CLI`);output_manager_default.spinner(`Activating targeting in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk54.default.bold(flag.slug)} ${flag.state==="archived"?"is configured to use targeting":"now uses targeting"} in ${import_chalk54.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk54.default.dim("Fallthrough:")} ${formatFlagOutcome(nextEnvConfig.fallthrough,flag.variants)}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveNextTargetingEnvironmentConfig(client,flag,environment,defaultVariantSelector){if(defaultVariantSelector){let variant=resolveDefaultVariantOrThrow(flag,defaultVariantSelector);return buildTargetingVariantEnvironmentConfig(flag.environments[environment],variant.id)}let fallthrough=resolveEffectiveFallthrough(flag,environment);if(isUsableFallthrough(fallthrough,flag.variants))return buildResumeTargetingEnvironmentConfig(flag,environment);let selectedVariant=await resolveReplacementDefaultVariant(client,flag,fallthrough);return buildTargetingVariantEnvironmentConfig(flag.environments[environment],selectedVariant.id)}function resolveDefaultVariantOrThrow(flag,selector){let result=resolveVariant(selector,flag.variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);return result.variant}async function resolveReplacementDefaultVariant(client,flag,fallthrough){if(!canPrompt(client))throw new Error(`Couldn't resume targeting because the current fallthrough references a missing variant. Pass --default-variant <VARIANT>${describeUnusableFallthrough(fallthrough)}.`);output_manager_default.warn(`Current fallthrough references a missing variant${describeUnusableFallthrough(fallthrough)}. Choose a new default variant.`);let selectedVariantId=await client.input.select({message:"Select a default variant when no rules match:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id}))}),selectedVariant=flag.variants.find(variant=>variant.id===selectedVariantId);if(!selectedVariant)throw new Error("No variant selected");return selectedVariant}function describeUnusableFallthrough(fallthrough){return fallthrough.type==="variant"?` (${fallthrough.variantId})`:fallthrough.type==="experiment"?" (experiment assignment)":` (${fallthrough.type} default ${fallthrough.defaultVariantId})`}function formatAlreadyUsingTargetingWarning(flag,environment,envConfig){let{fallthrough}=envConfig;if(fallthrough.type==="variant"){let variant=flag.variants.find(candidate=>candidate.id===fallthrough.variantId),label=variant?formatVariantForDisplay(variant):fallthrough.variantId;return`Flag ${import_chalk54.default.bold(flag.slug)} already uses targeting with default ${label} in ${environment}`}return`Flag ${import_chalk54.default.bold(flag.slug)} already uses targeting in ${environment}`}var import_chalk57=__toESM(require_source(),1),import_fast_deep_equal5=__toESM(require_fast_deep_equal(),1);var import_chalk56=__toESM(require_source(),1);var import_chalk55=__toESM(require_source(),1);function resolveFlagBucketingBase(settings,selector){let separatorIndex=selector.indexOf(".");if(separatorIndex<=0||separatorIndex===selector.length-1)throw new Error("Invalid value for --by. Use the format <entity.attribute>, for example --by user.userId.");let kind=selector.slice(0,separatorIndex),attribute=selector.slice(separatorIndex+1),entity=settings.entities.find(candidate=>candidate.kind===kind);if(!entity){let availableKinds=settings.entities.map(candidate=>candidate.kind);throw new Error(`Unknown entity ${import_chalk55.default.bold(kind)}. Available entities: ${availableKinds.join(", ")}`)}let matchingAttribute=entity.attributes.find(candidate=>candidate.key===attribute);if(!matchingAttribute){let availableAttributes=entity.attributes.map(candidate=>candidate.key);throw new Error(`Unknown attribute ${import_chalk55.default.bold(selector)}. Available attributes for ${kind}: ${availableAttributes.join(", ")}`)}if(!isBucketingAttribute(matchingAttribute))throw new Error(`Attribute ${import_chalk55.default.bold(selector)} is a Timestamp and cannot be used for bucketing. Choose a string or number attribute.`);return{type:"entity",kind,attribute}}function formatFlagBucketingBaseSelector(base){if(base)return`${base.kind}.${base.attribute}`}function resolveFlagSplit(flag,settings,options){let currentSplit=options.currentOutcome?.type==="split"?options.currentOutcome:void 0,baseSelector=options.baseSelector||formatFlagBucketingBaseSelector(currentSplit?.base);if(!baseSelector)throw new Error("Missing required option --by. Use --by <entity.attribute> to choose how users are bucketed.");let base=resolveFlagBucketingBase(settings,baseSelector),weights=resolveSplitWeights(flag,options.weightInputs,currentSplit),defaultVariant=resolveDefaultVariant(flag,options.defaultVariantSelector,currentSplit);return{outcome:{type:"split",base,weights,defaultVariantId:defaultVariant.id},defaultVariant,baseLabel:`${base.kind}.${base.attribute}`,summary:formatSplitSummary(flag.variants,weights)}}function resolveSplitWeights(flag,weightInputs,currentSplit){if(weightInputs.length===0&¤tSplit)return validateAndNormalizeWeights(flag,currentSplit.weights);if(weightInputs.length===0)throw new Error("At least one --weight is required. Use --weight <VARIANT=WEIGHT> for each variant, or run interactively in a terminal.");let weights={},seen=new Set;for(let input of weightInputs){let{variantSelector,weight}=parseWeightInput(input),variant=resolveVariantOrThrow(variantSelector,flag.variants,"--weight");if(seen.has(variant.id))throw new Error(`Duplicate weight for variant ${import_chalk56.default.bold(formatVariantForDisplay(variant))}.`);seen.add(variant.id),weights[variant.id]=weight}let missingVariants=flag.variants.filter(variant=>!seen.has(variant.id));if(missingVariants.length>0)throw new Error(`Missing weights for variants: ${missingVariants.map(variant=>formatVariantForDisplay(variant)).join(", ")}. Use --weight <VARIANT=WEIGHT> for each variant, including 0 for variants that should receive no traffic.`);return validateAndNormalizeWeights(flag,weights)}function parseWeightInput(input){let separatorIndex=input.lastIndexOf("=");if(separatorIndex<=0||separatorIndex===input.length-1)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Use --weight <VARIANT=WEIGHT>, for example --weight true=5.`);let variantSelector=input.slice(0,separatorIndex).trim(),rawWeight=input.slice(separatorIndex+1).trim();if(!variantSelector)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Variant cannot be empty.`);if(!rawWeight)throw new Error(`Invalid weight ${import_chalk56.default.bold(input)}. Weight cannot be empty.`);let weight=Number(rawWeight);if(!Number.isFinite(weight)||weight<0)throw new Error(`Invalid weight "${rawWeight}". Use a number greater than or equal to 0.`);return{variantSelector,weight}}function validateAndNormalizeWeights(flag,weights){let normalizedWeights=Object.fromEntries(flag.variants.map(variant=>[variant.id,weights[variant.id]??0]));if(Object.values(normalizedWeights).reduce((sum,weight)=>sum+weight,0)<=0)throw new Error("At least one weight must be greater than 0.");return normalizedWeights}function resolveDefaultVariant(flag,selector,currentSplit){if(selector)return resolveVariantOrThrow(selector,flag.variants,"--default-variant");if(currentSplit)return resolveVariantByIdOrThrow(currentSplit.defaultVariantId,flag.variants,"--default-variant");if(flag.kind==="boolean")return getBooleanVariant(flag,!1);throw new Error("Missing required option --default-variant. Use --default-variant <VARIANT> for non-boolean splits.")}function formatSplitSummary(variants,weights){let total=Object.values(weights).reduce((sum,weight)=>sum+weight,0);return variants.map(variant=>{let weight=weights[variant.id]??0,percentage=total>0?weight/total*100:0;return`${formatPlainVariant(variant)}: ${formatPercentage(percentage)}`}).join(", ")}function formatPlainVariant(variant){let value=formatVariantValue(variant.value);return variant.label?`${variant.label} (${value})`:value}function formatPercentage(percentage){return Number.isInteger(percentage)?`${percentage}%`:`${Number(percentage.toFixed(2))}%`}var FlagsSplitTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionBy(base){base&&this.trackCliOption({option:"by",value:this.redactedValue})}trackCliOptionWeight(weights){weights?.length&&this.trackCliOption({option:"weight",value:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function split(client,argv){let telemetryClient=new FlagsSplitTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(splitSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],baseSelector=normalizeOptionalInput(flags["--by"]),defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),weightInputs=flags["--weight"]||[],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to split"),output_manager_default.log(`Example: ${getCommandName("flags split my-feature --environment production --by user.userId --weight false=95 --weight true=5")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionBy(baseSelector),telemetryClient.trackCliOptionWeight(weightInputs.length>0?[weightInputs[0]]:void 0),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let[flag,settings]=await Promise.all([getFlag(client,project.id,flagArg),getFlagSettings(client,project.id)]);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to split traffic in:",{showEnvironmentDetails:!0,decorateChoices:!1}),envConfig=flag.environments[selectedEnvironment],currentSplit=envConfig.fallthrough.type==="split"?envConfig.fallthrough:void 0,shouldPromptCurrentSplit=canPrompt(client)&¤tSplit!==void 0&&!baseSelector&&weightInputs.length===0&&!defaultVariantSelector&&!message,resolvedBaseSelector=await resolveBaseSelector(client,settings,baseSelector,currentSplit,shouldPromptCurrentSplit),resolvedWeightInputs=await resolveWeightInputs(client,flag,weightInputs,currentSplit,shouldPromptCurrentSplit),resolvedDefaultVariantSelector=await resolveDefaultVariantSelector(client,flag,defaultVariantSelector,currentSplit,shouldPromptCurrentSplit),splitConfig=resolveFlagSplit(flag,settings,{baseSelector:resolvedBaseSelector,weightInputs:resolvedWeightInputs,defaultVariantSelector:resolvedDefaultVariantSelector,currentOutcome:envConfig.fallthrough.type==="experiment"?void 0:envConfig.fallthrough}),nextEnvironmentConfig=buildOutcomeEnvConfig(envConfig,{outcome:splitConfig.outcome,defaultVariantId:splitConfig.defaultVariant.id});if(!message&&envConfig.active&&(0,import_fast_deep_equal5.default)(envConfig.fallthrough,splitConfig.outcome)&&(0,import_fast_deep_equal5.default)(envConfig,nextEnvironmentConfig))return output_manager_default.warn(`Flag ${import_chalk57.default.bold(flag.slug)} is already configured with this split in ${selectedEnvironment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultSplitMessage(selectedEnvironment,splitConfig));output_manager_default.spinner(`Updating split in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvironmentConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk57.default.bold(flag.slug)} split has been updated in ${import_chalk57.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk57.default.dim("Based on:")} ${splitConfig.baseLabel}`),output_manager_default.log(` ${import_chalk57.default.dim("Fallback:")} ${formatVariantForDisplay(splitConfig.defaultVariant)}`),output_manager_default.log(` ${import_chalk57.default.dim("Weights:")} ${splitConfig.summary}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function getDefaultSplitMessage(environment,splitConfig){return`Configure split for ${environment}: ${splitConfig.summary}`}async function resolveBaseSelector(client,settings,baseSelector,currentSplit,shouldPromptCurrentSplit){if(baseSelector||currentSplit&&!shouldPromptCurrentSplit)return baseSelector;if(!canPrompt(client))return;let choices=settings.entities.flatMap(entity=>entity.attributes.filter(isBucketingAttribute).map(attribute=>({name:`${entity.label} \u203A ${attribute.key}`,value:`${entity.kind}.${attribute.key}`}))),currentBaseSelector=formatFlagBucketingBaseSelector(currentSplit?.base),defaultChoice=choices.find(choice=>choice.value===currentBaseSelector)?.value;if(choices.length===0)throw new Error("No entities are configured for weighted splits.");return client.input.select({message:"Select an attribute to split by:",choices,default:defaultChoice})}async function resolveWeightInputs(client,flag,weightInputs,currentSplit,shouldPromptCurrentSplit){if(weightInputs.length>0||currentSplit&&!shouldPromptCurrentSplit||!canPrompt(client))return weightInputs;output_manager_default.log("Enter weights for each variant. Weights are ratios; use 0 for variants that should receive no traffic.");let promptedWeights=[];for(let variant of flag.variants){let defaultWeight=currentSplit?.weights[variant.id]!==void 0?String(currentSplit.weights[variant.id]):currentSplit?"0":"1",weight=await client.input.text({message:`Weight for ${formatVariantForDisplay(variant)}:`,default:defaultWeight,validate:value=>{let trimmed=value.trim();if(!trimmed)return"Enter a weight";let parsed=Number(trimmed);return!Number.isFinite(parsed)||parsed<0?"Enter a number greater than or equal to 0":!0}});promptedWeights.push(`${variant.id}=${weight.trim()}`)}return promptedWeights}async function resolveDefaultVariantSelector(client,flag,defaultVariantSelector,currentSplit,shouldPromptCurrentSplit){if(defaultVariantSelector||currentSplit&&!shouldPromptCurrentSplit||flag.kind==="boolean"&&!canPrompt(client))return defaultVariantSelector;if(canPrompt(client))return client.input.select({message:"Select a fallback variant:",choices:flag.variants.map(variant=>({name:formatVariantForDisplay(variant),value:variant.id})),default:flag.variants.find(variant=>variant.id===currentSplit?.defaultVariantId)?.id||getBooleanFallbackVariantId(flag)})}function getBooleanFallbackVariantId(flag){if(flag.kind==="boolean")return flag.variants.find(variant=>variant.value===!1)?.id}var import_chalk59=__toESM(require_source(),1),import_fast_deep_equal6=__toESM(require_fast_deep_equal(),1);var import_chalk58=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);function resolveFlagRollout(flag,settings,options){let currentRollout=options.currentOutcome?.type==="rollout"?options.currentOutcome:void 0,baseSelector=options.baseSelector||formatFlagBucketingBaseSelector(currentRollout?.base);if(!baseSelector)throw new Error("Missing required option --by. Use --by <entity.attribute> to choose how users are bucketed.");let base=resolveFlagBucketingBase(settings,baseSelector),rollFromVariant=resolveRollFromVariant(flag,options.rollFromVariantSelector,currentRollout),rollToVariant=resolveRollToVariant(flag,options.rollToVariantSelector,currentRollout);if(rollFromVariant.id===rollToVariant.id)throw new Error("`--from-variant` and `--to-variant` must resolve to different variants.");let defaultVariant=resolveDefaultVariant2(flag,options.defaultVariantSelector,currentRollout,rollFromVariant),slots=options.stageInputs.length>0?parseStageInputs(options.stageInputs):currentRollout?.slots;if(!slots||slots.length===0)throw new Error("At least one --stage is required. Use --stage <PERCENTAGE,DURATION>, for example --stage 5,6h.");let finalPromille=options.finalPercentage===void 0?currentRollout?.finalPromille:parseFinalPercentage(options.finalPercentage),startTimestamp=resolveRolloutStartTimestamp(options.start,currentRollout?.startTimestamp);return{outcome:{type:"rollout",base,startTimestamp,rollFromVariantId:rollFromVariant.id,rollToVariantId:rollToVariant.id,defaultVariantId:defaultVariant.id,slots,...finalPromille!==void 0&&{finalPromille}},defaultVariant,rollFromVariant,rollToVariant,baseLabel:`${base.kind}.${base.attribute}`,summary:formatRolloutStages(slots,finalPromille),startLabel:formatStartLabel(options.start,currentRollout?.startTimestamp)}}function resolveRollFromVariant(flag,selector,currentRollout){return selector?resolveVariantOrThrow(selector,flag.variants,"--from-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.rollFromVariantId,flag.variants,"--from-variant"):inferBooleanVariant(flag,!1,"--from-variant")}function resolveRollToVariant(flag,selector,currentRollout){return selector?resolveVariantOrThrow(selector,flag.variants,"--to-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.rollToVariantId,flag.variants,"--to-variant"):inferBooleanVariant(flag,!0,"--to-variant")}function resolveDefaultVariant2(flag,selector,currentRollout,rollFromVariant){return selector?resolveVariantOrThrow(selector,flag.variants,"--default-variant"):currentRollout?resolveVariantByIdOrThrow(currentRollout.defaultVariantId,flag.variants,"--default-variant"):rollFromVariant}function inferBooleanVariant(flag,value,optionName){if(flag.kind!=="boolean")throw new Error(`Missing required option ${optionName}. Use ${optionName} <VARIANT> for non-boolean rollouts.`);let variant=flag.variants.find(candidate=>candidate.value===value);if(!variant)throw new Error(`Flag ${import_chalk58.default.bold(flag.slug)} is missing the standard boolean variants`);return variant}function parseStageInputs(stageInputs){let slots=stageInputs.map(parseStageInput);for(let index=1;index<slots.length;index++)if(slots[index].promille<=slots[index-1].promille)throw new Error("Stage percentages must be in ascending order.");return slots}function parseStageInput(input){let parts=input.split(",").map(part=>part.trim());if(parts.length!==2)throw new Error(`Invalid stage ${import_chalk58.default.bold(input)}. Use --stage <PERCENTAGE,DURATION>, for example --stage 5,6h.`);let percentage=Number(parts[0]);if(!Number.isFinite(percentage)||percentage<=0||percentage>=100||!Number.isInteger(percentage*1e3))throw new Error(`Invalid stage percentage "${parts[0]}". Use a number greater than 0 and less than 100 with up to 3 decimal places.`);let durationMs=parseStageDuration(parts[1]);if(durationMs===void 0)throw new Error(`Invalid duration "${parts[1]}". Use minutes (e.g. "30m"), hours (e.g. "6h"), or days (e.g. "1d"). Seconds are not supported.`);return{durationMs,promille:Math.round(percentage*1e3)}}function parseStageDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let durationMs=(0,import_ms3.default)(/^\d+$/.test(value)?`${value}m`:value);if(durationMs===void 0||durationMs<=0)return;let roundedMinutes=Math.round(durationMs/6e4);if(!(roundedMinutes<=0))return roundedMinutes*6e4}function resolveRolloutStartTimestamp(start,currentStartTimestamp){if(start===void 0)return currentStartTimestamp??Date.now();if(start==="now")return Date.now();let relativeDurationMs=(0,import_ms3.default)(start);if(relativeDurationMs!==void 0){if(relativeDurationMs<=0)throw new Error(`Invalid start time "${start}". Use "now", a future relative duration such as "1h", or an ISO 8601 datetime.`);return Date.now()+relativeDurationMs}let absoluteTime=new Date(start).getTime();if(Number.isNaN(absoluteTime))throw new Error(`Invalid start time "${start}". Use "now", a future relative duration such as "1h", or an ISO 8601 datetime.`);return absoluteTime}function parseFinalPercentage(input){let percentage=Number(input);if(input.trim()===""||!Number.isFinite(percentage)||percentage<0||percentage>100||Math.round(percentage*1e3)/1e3!==percentage)throw new Error(`Invalid final percentage "${input}". Use --final-percentage with a number between 0 and 100 with up to 3 decimal places.`);return Math.round(percentage*1e3)}function formatRolloutStages(slots,finalPromille=1e5){return`${slots.map(slot=>`${formatPromille(slot.promille)} for ${(0,import_ms3.default)(slot.durationMs,{long:!0})}`).join(", ")}, then ${formatPromille(finalPromille)} indefinitely`}function formatPromille(promille){let percentage=promille/1e3;return Number.isInteger(percentage)?`${percentage}%`:`${Number(percentage.toFixed(3))}%`}function formatStartLabel(start,currentStartTimestamp){return start===void 0?currentStartTimestamp?"preserve current start time":"immediately":start==="now"?"immediately":`start at ${start}`}var FlagsRolloutTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionFromVariant(variant){variant&&this.trackCliOption({option:"from-variant",value:this.redactedValue})}trackCliOptionToVariant(variant){variant&&this.trackCliOption({option:"to-variant",value:this.redactedValue})}trackCliOptionDefaultVariant(variant){variant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionBy(base){base&&this.trackCliOption({option:"by",value:this.redactedValue})}trackCliOptionStage(stages){stages?.length&&this.trackCliOption({option:"stage",value:this.redactedValue})}trackCliOptionFinalPercentage(percentage){percentage!==void 0&&this.trackCliOption({option:"final-percentage",value:this.redactedValue})}trackCliOptionStart(start){start&&this.trackCliOption({option:"start",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function rollout(client,argv){let telemetryClient=new FlagsRolloutTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rolloutSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],rollFromVariantSelector=normalizeOptionalInput(flags["--from-variant"]),rollToVariantSelector=normalizeOptionalInput(flags["--to-variant"]),defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),baseSelector=normalizeOptionalInput(flags["--by"]),stageInputs=(flags["--stage"]||[]).map(input=>input.trim()),finalPercentage=flags["--final-percentage"],start=normalizeOptionalInput(flags["--start"]),message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to roll out"),output_manager_default.log(`Example: ${getCommandName("flags rollout my-feature --environment production --by user.userId --stage 5,6h --stage 25,1d")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionFromVariant(rollFromVariantSelector),telemetryClient.trackCliOptionToVariant(rollToVariantSelector),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionBy(baseSelector),telemetryClient.trackCliOptionStage(stageInputs.length>0?[stageInputs[0]]:void 0),telemetryClient.trackCliOptionFinalPercentage(finalPercentage),telemetryClient.trackCliOptionStart(start),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let[flag,settings]=await Promise.all([getFlag(client,project.id,flagArg),getFlagSettings(client,project.id)]);output_manager_default.stopSpinner(),logArchivedFlagNotice(flag);let selectedEnvironment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to roll out in:",{showEnvironmentDetails:!0,decorateChoices:!1}),currentOutcome=flag.environments[selectedEnvironment].fallthrough,rolloutConfig=resolveFlagRollout(flag,settings,{stageInputs,finalPercentage,baseSelector,rollFromVariantSelector,rollToVariantSelector,defaultVariantSelector,start,currentOutcome:currentOutcome.type==="experiment"?void 0:currentOutcome}),nextEnvironmentConfig=buildOutcomeEnvConfig(flag.environments[selectedEnvironment],{outcome:rolloutConfig.outcome,defaultVariantId:rolloutConfig.defaultVariant.id});if(flag.environments[selectedEnvironment].active&&(0,import_fast_deep_equal6.default)(flag.environments[selectedEnvironment].fallthrough,rolloutConfig.outcome)&&(0,import_fast_deep_equal6.default)(flag.environments[selectedEnvironment],nextEnvironmentConfig))return output_manager_default.warn(`Flag ${import_chalk59.default.bold(flag.slug)} is already configured with this rollout in ${selectedEnvironment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultRolloutMessage(selectedEnvironment,rolloutConfig));output_manager_default.spinner(`Updating rollout in ${selectedEnvironment}...`),await updateFlag(client,project.id,flagArg,{environments:{[selectedEnvironment]:nextEnvironmentConfig},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk59.default.bold(flag.slug)} rollout has been updated in ${import_chalk59.default.bold(selectedEnvironment)}`),output_manager_default.log(` ${import_chalk59.default.dim("Based on:")} ${rolloutConfig.baseLabel}`),output_manager_default.log(` ${import_chalk59.default.dim("Roll from:")} ${formatVariantLabel(rolloutConfig.rollFromVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Roll to:")} ${formatVariantLabel(rolloutConfig.rollToVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Fallback:")} ${formatVariantLabel(rolloutConfig.defaultVariant)}`),output_manager_default.log(` ${import_chalk59.default.dim("Start:")} ${rolloutConfig.startLabel}`),output_manager_default.log(` ${import_chalk59.default.dim("Stages:")} ${rolloutConfig.summary}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function getDefaultRolloutMessage(environment,rolloutConfig){return`Configure rollout for ${environment}: ${rolloutConfig.summary}`}function formatVariantLabel(variant){return variant.label||variant.id}var import_chalk60=__toESM(require_source(),1);async function deleteFlag(client,projectId,flagIdOrSlug){output_manager_default.debug(`Deleting feature flag ${flagIdOrSlug} for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}`;await client.fetch(url,{method:"DELETE"})}var FlagsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let telemetryClient=new FlagsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to delete"),output_manager_default.log(`Example: ${getCommandName("flags delete my-feature")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),flag.state!=="archived")return output_manager_default.error(`Flag ${import_chalk60.default.bold(flag.slug)} must be archived before it can be deleted. Run ${getCommandName(`flags archive ${flag.slug}`)} first.`),1;if(!skipConfirmation){if(!client.stdin.isTTY)return output_manager_default.error("Missing required option --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),2;if(!await client.input.confirm(`Are you sure you want to delete ${import_chalk60.default.bold(flag.slug)}? This action cannot be undone.`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Deleting flag..."),await deleteFlag(client,project.id,flagArg),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk60.default.bold(flag.slug)} has been deleted`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk61=__toESM(require_source(),1);var FlagsArchiveTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};var EVALUATION_WINDOW_DAYS=3;async function archive(client,argv){let telemetryClient=new FlagsArchiveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(archiveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,skipConfirmation=flags["--yes"],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to archive"),output_manager_default.log(`Example: ${getCommandName("flags archive my-feature")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),flag.state==="archived")return output_manager_default.warn(`Flag ${import_chalk61.default.bold(flag.slug)} is already archived`),0;if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Missing required option --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),2;output_manager_default.spinner("Checking recent evaluations...");let endTime=new Date,startTime=new Date(endTime.getTime()-EVALUATION_WINDOW_DAYS*24*60*60*1e3),evaluations2=await countFlagEvaluations(client,{ownerId:org.id,projectId:project.id,flagSlug:flag.slug,startTime,endTime});output_manager_default.stopSpinner();let window=`the last ${EVALUATION_WINDOW_DAYS} days`;if(evaluations2===null){let evaluationsCommand=["flags","evaluations",flag.slug,"--since",`${EVALUATION_WINDOW_DAYS}d`,...getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0})].map(quoteArg).join(" ");output_manager_default.log(`Could not check recent evaluations for ${import_chalk61.default.bold(flag.slug)}. Run ${getCommandName(evaluationsCommand)} to verify the flag is no longer evaluated.`)}else evaluations2>0?output_manager_default.warn(`${import_chalk61.default.bold(flag.slug)} reported ${evaluations2.toLocaleString()} ${evaluations2===1?"evaluation":"evaluations"} in ${window}. Archived flags evaluate to the default value in code. Remove the flag from your code and deploy before archiving.`):output_manager_default.log(`No evaluations reported for ${import_chalk61.default.bold(flag.slug)} in ${window}.`);if(!skipConfirmation&&!await client.input.confirm(evaluations2!==null&&evaluations2>0?`Archive ${import_chalk61.default.bold(flag.slug)} anyway?`:`Are you sure you want to archive ${import_chalk61.default.bold(flag.slug)}?`,!1))return output_manager_default.log("Aborted"),0;output_manager_default.spinner("Archiving flag..."),await updateFlag(client,project.id,flagArg,{state:"archived",message:message??"Archived via CLI"}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk61.default.bold(flag.slug)} has been archived`),output_manager_default.log(`
|
|
275
273
|
To unarchive this flag, run ${getCommandName(`flags unarchive ${flag.slug}`)}`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk62=__toESM(require_source(),1);var FlagsUnarchiveTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function unarchive(client,argv){let telemetryClient=new FlagsUnarchiveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(unarchiveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to unarchive"),output_manager_default.log(`Example: ${getCommandName("flags unarchive my-feature")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),flag.state==="active")return output_manager_default.warn(`Flag ${import_chalk62.default.bold(flag.slug)} is already active`),0;if(!skipConfirmation){if(!client.stdin.isTTY)return output_manager_default.error("Missing required option --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),2;if(!await client.input.confirm(`Are you sure you want to unarchive ${import_chalk62.default.bold(flag.slug)}?`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Unarchiving flag..."),await updateFlag(client,project.id,flagArg,{state:"active",message:"Unarchive"}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk62.default.bold(flag.slug)} has been unarchived`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk64=__toESM(require_source(),1);var import_chalk63=__toESM(require_source(),1);function logNonBooleanFlagGuidance(flag,{attemptedSubcommand,environment,isInteractive,teamSlug,projectName}){let dashboardUrl=getFlagDashboardUrl(teamSlug,projectName,flag.slug),suggestedEnvironment=environment&&environment in flag.environments?environment:void 0;if(output_manager_default.warn(`The ${getCommandName(`flags ${attemptedSubcommand}`)} command only works with boolean flags.`),output_manager_default.log(`Flag ${import_chalk63.default.bold(flag.slug)} is a ${import_chalk63.default.cyan(flag.kind)} flag. Set a specific variant instead:`),output_manager_default.log(` ${getCommandName(getSuggestedSetCommand(flag.slug,suggestedEnvironment,isInteractive))}`),flag.variants.length>0){output_manager_default.log("Available variants:");for(let variant of flag.variants)output_manager_default.log(` - ${formatVariantForDisplay(variant)}`)}output_manager_default.log(`See full flag details with ${getCommandName(`flags inspect ${flag.slug}`)}`),output_manager_default.log(`Open in the dashboard: ${import_chalk63.default.cyan(dashboardUrl)}`)}function getSuggestedSetCommand(slug,environment,isInteractive){let parts=[`flags set ${slug}`];return environment?parts.push(`--environment ${environment}`):isInteractive||parts.push("--environment <ENV>"),isInteractive||parts.push("--variant <VARIANT>"),parts.join(" ")}var FlagsDisableTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionVariant(variant){variant&&this.trackCliOption({option:"variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function disable3(client,argv){let telemetryClient=new FlagsDisableTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(disableSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],variantId=flags["--variant"],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg){if(client.nonInteractive){let envPart=environment?`--environment ${environment}`:"--environment <production|preview|development>";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide a flag slug or ID to disable.",next:[{command:buildCommandWithGlobalFlags(client.argv,`flags disable <flag> ${envPart}`),when:"disable a feature flag by slug or ID"}]},2),2}return output_manager_default.error("Please provide a flag slug or ID to disable"),output_manager_default.log(`Example: ${getCommandName("flags disable my-feature --environment production")}`),2}telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionVariant(variantId),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. Run link first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),logArchivedFlagNotice(flag),flag.kind!=="boolean")return logNonBooleanFlagGuidance(flag,{attemptedSubcommand:"disable",environment,isInteractive:!!client.stdin.isTTY,teamSlug:link.org.slug,projectName:project.name}),0;if(!environment&&client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide --environment (production, preview, or development) to disable the flag in.",next:[{command:buildCommandWithGlobalFlags(client.argv,`flags disable ${flagArg} --environment <production|preview|development>`),when:"disable the flag in a specific environment"}]},2),2;environment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to disable the flag in:");let envConfig=flag.environments[environment],selectedVariant=getBooleanVariant(flag,!1);if(variantId){let result=resolveVariant(variantId,flag.variants);if(result.error)return output_manager_default.error(result.error),1;selectedVariant=result.variant}if(isPausingEnvironmentToVariant(envConfig,selectedVariant.id))return output_manager_default.warn(`Flag ${import_chalk64.default.bold(flag.slug)} is already disabled in ${environment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultDisableMessage(environment));output_manager_default.spinner(`Disabling flag in ${environment}...`),await updateFlag(client,project.id,flagArg,{environments:{[environment]:buildPausedEnvironmentConfig(envConfig,selectedVariant.id)},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk64.default.bold(flag.slug)} ${flag.state==="archived"?"configuration has been updated":"has been disabled"} in ${import_chalk64.default.bold(environment)}`),output_manager_default.log(` ${import_chalk64.default.dim(flag.state==="archived"?"Configured variant:":"Serving variant:")} ${formatVariantForDisplay(selectedVariant)}`)}catch(err){output_manager_default.stopSpinner();let message2=err instanceof Error?err.message:String(err);return client.nonInteractive&&message2.startsWith("Invalid environment:")?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:message2,next:[{command:buildCommandWithGlobalFlags(client.argv,`flags disable ${flagArg} --environment <production|preview|development>`),when:"use a valid environment (production, preview, or development)"}]},2),2):(printError(err),2)}return 0}function getDefaultDisableMessage(environment){return`Disabled for ${environment} via CLI`}var import_chalk65=__toESM(require_source(),1);var FlagsEnableTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:STANDARD_ENVIRONMENTS.includes(environment)?environment:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}};async function enable3(client,argv){let telemetryClient=new FlagsEnableTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(enableSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,environment=flags["--environment"],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to enable"),output_manager_default.log(`Example: ${getCommandName("flags enable my-feature --environment production")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionEnvironment(environment),telemetryClient.trackCliOptionMessage(message);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);if(output_manager_default.stopSpinner(),logArchivedFlagNotice(flag),flag.kind!=="boolean")return logNonBooleanFlagGuidance(flag,{attemptedSubcommand:"enable",environment,isInteractive:!!client.stdin.isTTY,teamSlug:link.org.slug,projectName:project.name}),0;if(!environment&&client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide --environment (production, preview, or development) to enable the flag in.",next:[{command:buildCommandWithGlobalFlags(client.argv,`flags enable ${flagArg} --environment <production|preview|development>`),when:"enable the flag in a specific environment"}]},2),2;environment=await resolveFlagEnvironment(client,flag,environment,"Select an environment to enable the flag in:");let envConfig=flag.environments[environment],onVariant=getBooleanVariant(flag,!0);if(isPausingEnvironmentToVariant(envConfig,onVariant.id))return output_manager_default.warn(`Flag ${import_chalk65.default.bold(flag.slug)} is already enabled in ${environment}`),0;let updateMessage=await resolveFlagUpdateMessage(client,message,getDefaultEnableMessage(environment));output_manager_default.spinner(`Enabling flag in ${environment}...`),await updateFlag(client,project.id,flagArg,{environments:{[environment]:buildPausedEnvironmentConfig(envConfig,onVariant.id)},message:updateMessage}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk65.default.bold(flag.slug)} ${flag.state==="archived"?"configuration has been updated":"has been enabled"} in ${import_chalk65.default.bold(environment)}`),output_manager_default.log(` ${import_chalk65.default.dim(flag.state==="archived"?"Configured variant:":"Serving variant:")} ${formatVariantForDisplay(onVariant)}`)}catch(err){output_manager_default.stopSpinner();let message2=err instanceof Error?err.message:String(err);return client.nonInteractive&&message2.startsWith("Invalid environment:")?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:message2,next:[{command:buildCommandWithGlobalFlags(client.argv,`flags enable ${flagArg} --environment <production|preview|development>`),when:"use a valid environment (production, preview, or development)"}]},2),2):(printError(err),2)}return 0}function getDefaultEnableMessage(environment){return`Enabled for ${environment} via CLI`}var FlagsSdkKeysTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandRevoke(actual){this.trackCliSubcommand({subcommand:"revoke",value:actual})}},FlagsSdkKeysLsTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}},FlagsSdkKeysAddTelemetryClient=class extends TelemetryClient{trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:environment})}trackCliOptionLabel(label){label&&this.trackCliOption({option:"label",value:this.redactedValue})}},FlagsSdkKeysRmTelemetryClient=class extends TelemetryClient{trackCliArgumentKey(key){key&&this.trackCliArgument({arg:"key",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var import_chalk66=__toESM(require_source(),1),import_ms4=__toESM(require_ms(),1);async function sdkKeysLs(client,argv){let telemetryClient=new FlagsSdkKeysLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(sdkKeysListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs,json=flags["--json"],projectName=getProjectNameFromFlags(flags);telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagJson(json);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);try{output_manager_default.spinner("Fetching SDK keys...");let keys=await getSdkKeys(client,project.id);output_manager_default.stopSpinner();let sortedKeys=keys.sort((a,b)=>b.createdAt-a.createdAt);json?outputSdkKeysJson(client,sortedKeys):keys.length===0?(output_manager_default.log(`No SDK keys found for ${projectSlugLink}`),output_manager_default.log(`
|
|
276
274
|
Create one with: ${getCommandName("flags sdk-keys create --type server --environment production")}`)):(output_manager_default.log(`${import_chalk66.default.bold(keys.length)} SDK key${keys.length===1?"":"s"} found for ${projectSlugLink}`),printSdkKeysTable(sortedKeys))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function outputSdkKeysJson(client,keys){let jsonOutput={sdkKeys:keys.map(key=>({hashKey:key.hashKey,type:key.type,environment:key.environment,label:key.label??null,partialKeyValue:key.partialKeyValue??null,createdAt:key.createdAt,updatedAt:key.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
277
275
|
`)}function printSdkKeysTable(keys){let headers=["Hash Key","Type","Environment","Label","Partial Key Value","Created"],now=Date.now(),rows=keys.map(key=>[import_chalk66.default.dim(key.hashKey.slice(0,12)+"..."),getTypeLabel(key.type),key.environment,key.label||import_chalk66.default.dim("-"),key.partialKeyValue||import_chalk66.default.dim("-"),(0,import_ms4.default)(now-key.createdAt)+" ago"]),table2=formatTable(headers,["l","l","l","l","l","l"],[{name:"",rows}]);output_manager_default.print(`
|
|
@@ -286,7 +284,7 @@ ${table2}
|
|
|
286
284
|
${import_chalk67.default.cyan(key.keyValue)}
|
|
287
285
|
`)),key.connectionString&&(output_manager_default.print(`
|
|
288
286
|
`),output_manager_default.log(`${import_chalk67.default.dim("Connection string:")}`),output_manager_default.print(` ${import_chalk67.default.cyan(key.connectionString)}
|
|
289
|
-
`))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk68=__toESM(require_source(),1);async function sdkKeysRm(client,argv){let telemetryClient=new FlagsSdkKeysRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(sdkKeysRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[hashKey]=args,skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);telemetryClient.trackCliArgumentKey(hashKey),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. A user must run `vercel link` in a terminal to continue (this will prompt for login if needed).",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"run in a terminal to log in if needed and link this codebase to a Vercel project, then retry this command"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{if(!hashKey){if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide the SDK key hash to delete. Run `vercel flags sdk-keys ls` to list keys.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags sdk-keys revoke <hashKey>"),when:"delete an SDK key by hash"},{command:buildCommandWithGlobalFlags(client.argv,"flags sdk-keys ls"),when:"list SDK keys to find the hash"}]},2),2;output_manager_default.spinner("Fetching SDK keys...");let keys=await getSdkKeys(client,project.id);if(output_manager_default.stopSpinner(),keys.length===0)return output_manager_default.log("No SDK keys found"),0;hashKey=await client.input.select({message:"Select an SDK key to delete:",choices:keys.map(key=>({name:`${key.hashKey.slice(0,12)}... (${key.type}, ${key.environment}${key.label?`, ${key.label}`:""})`,value:key.hashKey}))})}if(!skipConfirmation){if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Confirm revoking SDK key ${hashKey.slice(0,12)}... by adding --yes.`,next:[{command:buildCommandWithGlobalFlags(client.argv,`flags sdk-keys revoke ${hashKey} --yes`),when:"confirm and revoke the SDK key"}]},1),1;if(!await client.input.confirm(`Are you sure you want to revoke SDK key ${import_chalk68.default.bold(hashKey.slice(0,12)+"...")}?`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Revoking SDK key..."),await deleteSdkKey(client,project.id,hashKey),output_manager_default.stopSpinner(),output_manager_default.success(`SDK key ${import_chalk68.default.bold(hashKey.slice(0,12)+"...")} has been revoked`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var COMMAND_CONFIG11={ls:getCommandAliases(sdkKeysListSubcommand),add:getCommandAliases(sdkKeysAddSubcommand),revoke:getCommandAliases(sdkKeysRemoveSubcommand)};async function sdkKeys(client){let telemetry=new FlagsSdkKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(sdkKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(4),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(0),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("flags sdk-keys",subcommand),output_manager_default.print(help(sdkKeysSubcommand,{stream:client.stderr,parent:flagsCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:sdkKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),sdkKeysLs(client,args));case"add":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysAddSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"flags sdk-keys add","flags sdk-keys create"),sdkKeysAdd(client,args));case"revoke":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysRemoveSubcommand),0):(telemetry.trackCliSubcommandRevoke(subcommandOriginal),subcommandOriginal!=="revoke"&&warnDeprecatedSubcommand(client,`flags sdk-keys ${subcommandOriginal}`,"flags sdk-keys revoke"),sdkKeysRm(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG11)),output_manager_default.print(help(sdkKeysSubcommand,{stream:client.stderr,parent:flagsCommand,columns:client.stderr.columns})),2}}var import_chalk69=__toESM(require_source(),1),import_ms5=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);var FLAG_SLUG_PATTERN=/^[A-Za-z0-9_.-]+$/,AFTER_PULL_REQUEST="After the pull request is merged and deployed to production";function hasPendingPullRequest(cleanup2){return!!(cleanup2.run?.result?.pullRequestUrl&&cleanup2.recommendations.some(recommendation=>recommendation.action==="review"&&!recommendation.checkId))}function getCleanupCommand(recommendation,{slug,state,checks,pendingPullRequest=!1}){let flag=FLAG_SLUG_PATTERN.test(slug)?slug:"<FLAG>",evaluationsArgs=["flags","evaluations",flag,"--since","3d","--group-by","variant"];switch(recommendation.action){case"remove_from_code":return{};case"start_agent_cleanup":return{args:["flags","cleanup",flag,"--vercel-agent"],...recommendation.requiresConfirmation?{when:"Only after a human confirms cleanup despite the checks that did not pass"}:{}};case"archive":return{args:["flags","archive",flag],...pendingPullRequest?{when:AFTER_PULL_REQUEST}:{}};case"delete":return{args:["flags","delete",flag],when:pendingPullRequest?`${AFTER_PULL_REQUEST}, and only after a human approves: deletion is permanent`:"Only after a human approves: deletion is permanent"};case"wait":return{args:["flags","cleanup",flag],...recommendation.after!==void 0?{when:`After ${new Date(recommendation.after).toISOString()}`}:{}};case"review":break}switch(recommendation.checkId){case"intent":return{args:["flags","inspect",flag]};case"configuration":return{args:["flags","set",flag,"--environment","production","--variant","<VARIANT>"],when:"Only after a human chooses the value production keeps. Replace <VARIANT> with that variant"};case"evaluations":return{args:evaluationsArgs};case"deployment":return checks.find(check=>check.id==="deployment")?.status==="unavailable"?{args:["flags","cleanup",flag]}:{args:state==="archived"?["flags","inspect",flag]:evaluationsArgs.concat("--group-by","client")};default:return{}}}function flagCleanupPath(projectId,flagId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagId)}/cleanup`}async function getFlagCleanup(client,projectId,flagId){return client.fetch(flagCleanupPath(projectId,flagId))}async function getFlagCleanupRun(client,projectId,flagId){let{run}=await client.fetch(`${flagCleanupPath(projectId,flagId)}/run`);return run}async function startFlagCleanup(client,projectId,flagId,{force=!1}={}){let{run}=await client.fetch(`${flagCleanupPath(projectId,flagId)}${force?"?force=true":""}`,{method:"POST",body:{},retry:{retries:0}});return run}var FlagsCleanupTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVercelAgent(vercelAgent){vercelAgent&&this.trackCliFlag("vercel-agent")}trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliFlagWait(wait){wait&&this.trackCliFlag("wait")}trackCliOptionTimeout(timeout){timeout&&this.trackCliOption({option:"timeout",value:this.redactedValue})}};var DEFAULT_WAIT_TIMEOUT="15m",WAIT_POLL_INTERVAL_MS=5e3;async function cleanup(client,argv){let telemetryClient=new FlagsCleanupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(cleanupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,json=flags["--json"],useVercelAgent=flags["--vercel-agent"],force=flags["--force"],wait=flags["--wait"],timeoutArg=flags["--timeout"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Missing required argument: flag.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags cleanup <FLAG>"),when:"Replace <FLAG> with a flag slug or ID from `flags list`"}]}),output_manager_default.error(`Missing required argument: flag. Usage: ${getCommandName("flags cleanup <flag>")}`),2;if(telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagJson(json),telemetryClient.trackCliFlagVercelAgent(useVercelAgent),telemetryClient.trackCliFlagForce(force),telemetryClient.trackCliFlagWait(wait),telemetryClient.trackCliOptionTimeout(timeoutArg),timeoutArg!==void 0&&!wait)return output_manager_default.error("--timeout requires --wait."),2;let timeout=(0,import_ms5.default)(timeoutArg??DEFAULT_WAIT_TIMEOUT);if(typeof timeout!="number"||timeout<=0)return output_manager_default.error(`Invalid timeout "${timeoutArg}". Pass a duration such as 10m or 1h.`),2;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase isn't linked to a project on Vercel. Pass --project, or link it first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,checkStamp=stamp_default(),flag;try{flag=await getFlag(client,project.id,flagArg)}catch(err){return printError(err),1}json||output_manager_default.spinner(`Checking ${flag.slug} for cleanup`);let cleanup2;try{cleanup2=await getFlagCleanup(client,project.id,flag.id)}catch(err){return isAPIError(err)&&err.status===404?(output_manager_default.error("Flag cleanup isn't available for this team yet."),1):(printError(err),1)}finally{output_manager_default.stopSpinner()}let startedRun=null,existingRun=useVercelAgent&&!force&&cleanup2.run?.result?.pullRequestUrl?cleanup2.run:null;if(useVercelAgent&&!existingRun){let run=await startVercelAgentCleanup(client,project.id,flag,cleanup2.run,json);if(typeof run=="number")return run;startedRun=run,cleanup2=withStartedRun(cleanup2,run)}let exitCode=0;if(wait){let waited=await waitForRun(client,project.id,flag,cleanup2,{timeout,json});cleanup2=waited.cleanup,exitCode=waited.exitCode}if(json){let recommendations2=formatRecommendations(client,flag,cleanup2);return existingRun&&recommendations2.push(getRetryRecommendation(client,flag.slug)),client.stdout.write(`${JSON.stringify({flag:{id:flag.id,slug:flag.slug,kind:flag.kind,state:flag.state,permanent:flag.permanent??!1},project:{id:project.id,name:project.name},ready:cleanup2.ready,checks:cleanup2.checks,replacement:cleanup2.replacement,run:cleanup2.run,...startedRun?{outcome:"started"}:existingRun?{outcome:"unchanged"}:{},recommendations:recommendations2,next:recommendations2.flatMap(({command,when})=>command?[when?{command,when}:{command}]:[])},null,2)}
|
|
287
|
+
`))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk68=__toESM(require_source(),1);async function sdkKeysRm(client,argv){let telemetryClient=new FlagsSdkKeysRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(sdkKeysRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[hashKey]=args,skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);telemetryClient.trackCliArgumentKey(hashKey),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. A user must run `vercel link` in a terminal to continue (this will prompt for login if needed).",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"run in a terminal to log in if needed and link this codebase to a Vercel project, then retry this command"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{if(!hashKey){if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide the SDK key hash to delete. Run `vercel flags sdk-keys ls` to list keys.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags sdk-keys revoke <hashKey>"),when:"delete an SDK key by hash"},{command:buildCommandWithGlobalFlags(client.argv,"flags sdk-keys ls"),when:"list SDK keys to find the hash"}]},2),2;output_manager_default.spinner("Fetching SDK keys...");let keys=await getSdkKeys(client,project.id);if(output_manager_default.stopSpinner(),keys.length===0)return output_manager_default.log("No SDK keys found"),0;hashKey=await client.input.select({message:"Select an SDK key to delete:",choices:keys.map(key=>({name:`${key.hashKey.slice(0,12)}... (${key.type}, ${key.environment}${key.label?`, ${key.label}`:""})`,value:key.hashKey}))})}if(!skipConfirmation){if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Confirm revoking SDK key ${hashKey.slice(0,12)}... by adding --yes.`,next:[{command:buildCommandWithGlobalFlags(client.argv,`flags sdk-keys revoke ${hashKey} --yes`),when:"confirm and revoke the SDK key"}]},1),1;if(!await client.input.confirm(`Are you sure you want to revoke SDK key ${import_chalk68.default.bold(hashKey.slice(0,12)+"...")}?`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Revoking SDK key..."),await deleteSdkKey(client,project.id,hashKey),output_manager_default.stopSpinner(),output_manager_default.success(`SDK key ${import_chalk68.default.bold(hashKey.slice(0,12)+"...")} has been revoked`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var COMMAND_CONFIG11={ls:getCommandAliases(sdkKeysListSubcommand),add:getCommandAliases(sdkKeysAddSubcommand),revoke:getCommandAliases(sdkKeysRemoveSubcommand)};async function sdkKeys(client){let telemetry=new FlagsSdkKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(sdkKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(4),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(0),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("flags sdk-keys",subcommand),output_manager_default.print(help(sdkKeysSubcommand,{stream:client.stderr,parent:flagsCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:sdkKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),sdkKeysLs(client,args));case"add":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysAddSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"flags sdk-keys add","flags sdk-keys create"),sdkKeysAdd(client,args));case"revoke":return needHelp?(telemetry.trackCliFlagHelp("flags sdk-keys",subcommandOriginal),printHelp(sdkKeysRemoveSubcommand),0):(telemetry.trackCliSubcommandRevoke(subcommandOriginal),subcommandOriginal!=="revoke"&&warnDeprecatedSubcommand(client,`flags sdk-keys ${subcommandOriginal}`,"flags sdk-keys revoke"),sdkKeysRm(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG11)),output_manager_default.print(help(sdkKeysSubcommand,{stream:client.stderr,parent:flagsCommand,columns:client.stderr.columns})),2}}var import_chalk69=__toESM(require_source(),1),import_ms5=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);var FLAG_SLUG_PATTERN=/^[A-Za-z0-9_.-]+$/,AFTER_PULL_REQUEST="After the pull request is merged and deployed to production";function hasPendingPullRequest(cleanup2){return!!(cleanup2.run?.result?.pullRequestUrl&&cleanup2.recommendations.some(recommendation=>recommendation.action==="review"&&!recommendation.checkId))}function getCleanupCommand(recommendation,{slug,state,checks,pendingPullRequest=!1}){let flag=FLAG_SLUG_PATTERN.test(slug)?slug:"<FLAG>",evaluationsArgs=["flags","evaluations",flag,"--since","3d","--group-by","variant"];switch(recommendation.action){case"remove_from_code":return{};case"start_agent_cleanup":return{args:["flags","cleanup",flag,"--vercel-agent"],...recommendation.requiresConfirmation?{when:"Only after a human confirms cleanup despite the checks that did not pass"}:{}};case"archive":return{args:["flags","archive",flag],...pendingPullRequest?{when:AFTER_PULL_REQUEST}:{}};case"delete":return{args:["flags","delete",flag],when:pendingPullRequest?`${AFTER_PULL_REQUEST}, and only after a human approves: deletion is permanent`:"Only after a human approves: deletion is permanent"};case"wait":return{args:["flags","cleanup",flag],...recommendation.after!==void 0?{when:`After ${new Date(recommendation.after).toISOString()}`}:{}};case"review":break}switch(recommendation.checkId){case"intent":return{args:["flags","inspect",flag]};case"configuration":return{args:["flags","set",flag,"--environment","production","--variant","<VARIANT>"],when:"Only after a human chooses the value production keeps. Replace <VARIANT> with that variant"};case"evaluations":return{args:evaluationsArgs};case"deployment":return checks.find(check=>check.id==="deployment")?.status==="unavailable"?{args:["flags","cleanup",flag]}:{args:state==="archived"?["flags","inspect",flag]:evaluationsArgs.concat("--group-by","client")};default:return{}}}function flagCleanupPath(projectId,flagId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagId)}/cleanup`}async function getFlagCleanup(client,projectId,flagId){return client.fetch(flagCleanupPath(projectId,flagId))}async function getFlagCleanupRun(client,projectId,flagId){let{run}=await client.fetch(`${flagCleanupPath(projectId,flagId)}/run`);return run}async function startFlagCleanup(client,projectId,flagId,{force=!1}={}){let{run}=await client.fetch(`${flagCleanupPath(projectId,flagId)}${force?"?force=true":""}`,{method:"POST",body:{},retry:{retries:0}});return run}var FlagsCleanupTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVercelAgent(vercelAgent){vercelAgent&&this.trackCliFlag("vercel-agent")}trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliFlagWait(wait){wait&&this.trackCliFlag("wait")}trackCliOptionTimeout(timeout){timeout&&this.trackCliOption({option:"timeout",value:this.redactedValue})}};var DEFAULT_WAIT_TIMEOUT="15m",WAIT_POLL_INTERVAL_MS=5e3;async function cleanup(client,argv){let telemetryClient=new FlagsCleanupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(cleanupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,json=flags["--json"],useVercelAgent=flags["--vercel-agent"],force=flags["--force"],wait=flags["--wait"],timeoutArg=flags["--timeout"],projectName=getProjectNameFromFlags(flags);if(!flagArg)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Missing required argument: flag.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags cleanup <FLAG>"),when:"Replace <FLAG> with a flag slug or ID from `flags list`"}]}),output_manager_default.error(`Missing required argument: flag. Usage: ${getCommandName("flags cleanup <flag>")}`),2;if(telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagJson(json),telemetryClient.trackCliFlagVercelAgent(useVercelAgent),telemetryClient.trackCliFlagForce(force),telemetryClient.trackCliFlagWait(wait),telemetryClient.trackCliOptionTimeout(timeoutArg),timeoutArg!==void 0&&!wait)return output_manager_default.error("--timeout requires --wait."),2;let timeout=(0,import_ms5.default)(timeoutArg??DEFAULT_WAIT_TIMEOUT);if(typeof timeout!="number"||timeout<=0)return output_manager_default.error(`Invalid timeout "${timeoutArg}". Pass a duration such as 10m or 1h.`),2;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase isn't linked to a project on Vercel. Pass --project, or link it first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,checkStamp=stamp_default(),flag;try{flag=await getFlag(client,project.id,flagArg)}catch(err){return printError(err),1}json||output_manager_default.spinner(`Checking ${flag.slug} for cleanup`);let cleanup2;try{cleanup2=await getFlagCleanup(client,project.id,flag.id)}catch(err){return isAPIError(err)&&err.status===404?(output_manager_default.error("Flag cleanup isn't available for this team yet."),1):(printError(err),1)}finally{output_manager_default.stopSpinner()}let startedRun=null,existingRun=useVercelAgent&&!force&&cleanup2.run?.result?.pullRequestUrl?cleanup2.run:null;if(useVercelAgent&&!existingRun){let run=await startVercelAgentCleanup(client,project.id,flag,cleanup2.run,json);if(typeof run=="number")return run;startedRun=run,cleanup2=withStartedRun(cleanup2,run)}let exitCode=0;if(wait){let waited=await waitForRun(client,project.id,flag,cleanup2,{timeout,json});cleanup2=waited.cleanup,exitCode=waited.exitCode}if(json){let recommendations2=formatRecommendations(client,flag,cleanup2);return existingRun&&recommendations2.push(getRetryRecommendation(client,flag.slug)),client.stdout.write(`${JSON.stringify({flag:{id:flag.id,slug:flag.slug,kind:flag.kind,state:flag.state,permanent:flag.permanent??!1,description:flag.description??null,url:getFlagDashboardUrl(org.slug,project.name,flag.slug)},project:{id:project.id,name:project.name,repository:formatRepository(project.link)},ready:cleanup2.ready,checks:cleanup2.checks,replacement:cleanup2.replacement,run:cleanup2.run,...startedRun?{outcome:"started"}:existingRun?{outcome:"unchanged"}:{},recommendations:recommendations2,next:recommendations2.flatMap(({command,when})=>command?[when?{command,when}:{command}]:[])},null,2)}
|
|
290
288
|
`),exitCode}output_manager_default.log(`Cleanup checks for ${import_chalk69.default.bold(flag.slug)} in ${formatProject(org.slug,project.name)} ${import_chalk69.default.gray(checkStamp())}`),client.stdout.write(`
|
|
291
289
|
${formatChecksTable(cleanup2.checks)}
|
|
292
290
|
`),printSummary(cleanup2),startedRun!==null&&cleanup2.run?.status==="running"||printVercelAgent(cleanup2.run,!1);let choice=null;if(existingRun&&canPromptOnTerminal(client)){output_manager_default.print(`
|
|
@@ -294,7 +292,7 @@ ${formatChecksTable(cleanup2.checks)}
|
|
|
294
292
|
`),0;throw err}}else if(!useVercelAgent&&canPromptOnTerminal(client)&&cleanup2.recommendations.some(recommendation=>recommendation.action==="start_agent_cleanup")){output_manager_default.print(`
|
|
295
293
|
`);try{choice=await promptCleanupChoice(client,flag.slug,cleanup2.ready)}catch(err){if(isPromptCanceledError(err))return output_manager_default.print(` Canceled.
|
|
296
294
|
`),0;throw err}}if(choice==="agent"){let run=await startVercelAgentCleanup(client,project.id,flag,cleanup2.run,json);if(typeof run=="number")return run;if(startedRun=run,cleanup2=withStartedRun(cleanup2,run),wait){let waited=await waitForRun(client,project.id,flag,cleanup2,{timeout,json});cleanup2=waited.cleanup,exitCode=waited.exitCode,cleanup2.run?.status!=="running"&&printVercelAgent(cleanup2.run,!1)}}let recommendations=formatRecommendations(client,flag,cleanup2).filter(recommendation=>choice!=="manual"||recommendation.action!=="start_agent_cleanup");return existingRun&&!startedRun&&recommendations.push(getRetryRecommendation(client,flag.slug)),startedRun&&cleanup2.run?.status==="running"&&printVercelAgent(cleanup2.run,!0),printRecommendations(recommendations),startedRun&&(!client.stdout.isTTY||client.nonInteractive)&&client.stdout.write(`${startedRun.id}
|
|
297
|
-
`),exitCode}async function promptCleanupChoice(client,slug,ready){return client.withEscapePromptCancellation(()=>client.input.select({message:`How do you want to clean up ${slug}?`,choices:[{name:"Manually",value:"manual",description:ready?"Show the steps to remove the flag from code":"Show what to review before removing the flag"},{name:"With Vercel Agent",value:"agent",description:ready?"Vercel Agent removes the flag from code and opens a draft pull request":"Vercel Agent verifies the safe value, removes the flag from code, and opens a draft pull request"}]}))}async function startVercelAgentCleanup(client,projectId,flag,latestRun,json){if(latestRun?.status==="running")return output_manager_default.error(`A Vercel Agent cleanup is already running for this flag. Run ${getCommandName(`flags cleanup ${quoteArg(flag.slug)}`)} to check on it.`),1;try{return json||output_manager_default.spinner(`Starting Vercel Agent cleanup for ${flag.slug}`),await startFlagCleanup(client,projectId,flag.id,{force:latestRun?.status==="completed"})}catch(err){return printError(err),1}finally{output_manager_default.stopSpinner()}}function withStartedRun(cleanup2,run){return{...cleanup2,run,recommendations:[{action:"wait",message:"Vercel Agent cleanup is running. Check again later for its pull request."}]}}async function waitForRun(client,projectId,flag,cleanup2,{timeout,json}){let run=cleanup2.run;if(run?.status!=="running")return{cleanup:cleanup2,exitCode:run?.status==="failed"?1:0};let until=Date.now()+timeout;json||output_manager_default.spinner("Waiting for Vercel Agent cleanup to finish");try{for(;run?.status==="running";){if(Date.now()>=until)return output_manager_default.stopSpinner(),output_manager_default.warning(`Stopped waiting after ${(0,import_ms5.default)(timeout,{long:!0})}. Vercel Agent cleanup is still running. Run ${getCommandName(`flags cleanup ${quoteArg(flag.slug)} --wait`)} to keep waiting.`),{cleanup:{...cleanup2,run},exitCode:1};await sleep(WAIT_POLL_INTERVAL_MS),run=await getFlagCleanupRun(client,projectId,flag.id)}}catch(err){return output_manager_default.stopSpinner(),printError(err),{cleanup:{...cleanup2,run},exitCode:1}}finally{output_manager_default.stopSpinner()}let finished={...cleanup2,run};try{finished=await getFlagCleanup(client,projectId,flag.id)}catch(err){output_manager_default.debug(`Could not reload the flag cleanup: ${err instanceof Error?err.message:String(err)}`)}return{cleanup:finished,exitCode:run?.status==="failed"?1:0}}function getRetryRecommendation(client,slug){return{action:"start_agent_cleanup",message:"Start a new Vercel Agent cleanup instead.",command:buildCommandWithGlobalFlags(client.argv,`flags cleanup ${quoteArg(slug)} --vercel-agent --force`,packageName,{preserveProject:!0}),when:"Only if the existing pull request should be replaced"}}function formatRecommendations(client,flag,cleanup2){let pendingPullRequest=hasPendingPullRequest(cleanup2);return cleanup2.recommendations.map(recommendation=>{let{args:commandArgs,when}=getCleanupCommand(recommendation,{slug:flag.slug,state:flag.state,checks:cleanup2.checks,pendingPullRequest});return{...recommendation,command:commandArgs?buildCommandWithGlobalFlags(client.argv,commandArgs.map(quoteArg).join(" "),packageName,{preserveProject:!0}):null,when:when??null}})}function formatChecksTable(checks){return formatTable(["Check","Status","Result"],["l","l","l"],[{rows:checks.map(check=>[import_chalk69.default.bold(formatCheckName(check.id)),formatCheckStatus(check.status),check.message])}])}function printSummary(result){if(output_manager_default.print(`
|
|
295
|
+
`),exitCode}async function promptCleanupChoice(client,slug,ready){return client.withEscapePromptCancellation(()=>client.input.select({message:`How do you want to clean up ${slug}?`,choices:[{name:"Manually",value:"manual",description:ready?"Show the steps to remove the flag from code":"Show what to review before removing the flag"},{name:"With Vercel Agent",value:"agent",description:ready?"Vercel Agent removes the flag from code and opens a draft pull request":"Vercel Agent verifies the safe value, removes the flag from code, and opens a draft pull request"}]}))}async function startVercelAgentCleanup(client,projectId,flag,latestRun,json){if(latestRun?.status==="running")return output_manager_default.error(`A Vercel Agent cleanup is already running for this flag. Run ${getCommandName(`flags cleanup ${quoteArg(flag.slug)}`)} to check on it.`),1;try{return json||output_manager_default.spinner(`Starting Vercel Agent cleanup for ${flag.slug}`),await startFlagCleanup(client,projectId,flag.id,{force:latestRun?.status==="completed"})}catch(err){return printError(err),1}finally{output_manager_default.stopSpinner()}}function withStartedRun(cleanup2,run){return{...cleanup2,run,recommendations:[{action:"wait",message:"Vercel Agent cleanup is running. Check again later for its pull request."}]}}async function waitForRun(client,projectId,flag,cleanup2,{timeout,json}){let run=cleanup2.run;if(run?.status!=="running")return{cleanup:cleanup2,exitCode:run?.status==="failed"?1:0};let until=Date.now()+timeout;json||output_manager_default.spinner("Waiting for Vercel Agent cleanup to finish");try{for(;run?.status==="running";){if(Date.now()>=until)return output_manager_default.stopSpinner(),output_manager_default.warning(`Stopped waiting after ${(0,import_ms5.default)(timeout,{long:!0})}. Vercel Agent cleanup is still running. Run ${getCommandName(`flags cleanup ${quoteArg(flag.slug)} --wait`)} to keep waiting.`),{cleanup:{...cleanup2,run},exitCode:1};await sleep(WAIT_POLL_INTERVAL_MS),run=await getFlagCleanupRun(client,projectId,flag.id)}}catch(err){return output_manager_default.stopSpinner(),printError(err),{cleanup:{...cleanup2,run},exitCode:1}}finally{output_manager_default.stopSpinner()}let finished={...cleanup2,run};try{finished=await getFlagCleanup(client,projectId,flag.id)}catch(err){output_manager_default.debug(`Could not reload the flag cleanup: ${err instanceof Error?err.message:String(err)}`)}return{cleanup:finished,exitCode:run?.status==="failed"?1:0}}function getRetryRecommendation(client,slug){return{action:"start_agent_cleanup",message:"Start a new Vercel Agent cleanup instead.",command:buildCommandWithGlobalFlags(client.argv,`flags cleanup ${quoteArg(slug)} --vercel-agent --force`,packageName,{preserveProject:!0}),when:"Only if the existing pull request should be replaced"}}function formatRecommendations(client,flag,cleanup2){let pendingPullRequest=hasPendingPullRequest(cleanup2);return cleanup2.recommendations.map(recommendation=>{let{args:commandArgs,when}=getCleanupCommand(recommendation,{slug:flag.slug,state:flag.state,checks:cleanup2.checks,pendingPullRequest});return{...recommendation,command:commandArgs?buildCommandWithGlobalFlags(client.argv,commandArgs.map(quoteArg).join(" "),packageName,{preserveProject:!0}):null,when:when??null}})}function formatRepository(link){return link?{provider:link.type,name:getRepositoryName(link),productionBranch:link.productionBranch??null}:null}function getRepositoryName(link){if(link.type==="gitlab"&&link.projectUrl)try{return new URL(link.projectUrl).pathname.replace(/^\/|\/$/g,"")||null}catch{return null}return link.type==="bitbucket"&&link.owner&&link.slug?`${link.owner}/${link.slug}`:link.org&&link.repo?`${link.org}/${link.repo}`:link.repo??null}function formatChecksTable(checks){return formatTable(["Check","Status","Result"],["l","l","l"],[{rows:checks.map(check=>[import_chalk69.default.bold(formatCheckName(check.id)),formatCheckStatus(check.status),check.message])}])}function printSummary(result){if(output_manager_default.print(`
|
|
298
296
|
`),result.ready){output_manager_default.print(` Ready for cleanup.${result.replacement?` Replace the flag with ${formatReplacement(result.replacement)}.`:""}
|
|
299
297
|
`);return}let pending=result.checks.filter(check=>check.status!=="passed");output_manager_default.warning(`Not ready for cleanup: ${(0,import_pluralize4.default)("check",pending.length,!0)} did not pass.`),result.replacement&&output_manager_default.print(` ${result.replacement.source==="production"?"Production serves":"Code defaults to"} ${formatReplacement(result.replacement)}.
|
|
300
298
|
`)}function printVercelAgent(run,started){if(!run)return;if(output_manager_default.print(`
|