vercel 63.1.0 → 63.1.1
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-FNCCXJZO.js → add-LFJBSEHE.js} +1 -1
- package/dist/chunks/{add-CCFBYKZH.js → add-WX7XBOMM.js} +1 -1
- package/dist/chunks/{add-LU5TSLJU.js → add-YAWFEGID.js} +1 -1
- package/dist/chunks/{build-PUIFBQKZ.js → build-FIPVJJWA.js} +1 -1
- package/dist/chunks/{chunk-VLSSMFTF.js → chunk-26KRNEYD.js} +1 -1
- package/dist/chunks/{chunk-IMC63GXI.js → chunk-2GTCIOCB.js} +1 -1
- package/dist/chunks/{chunk-SZRSBECO.js → chunk-46XQIXL7.js} +1 -1
- package/dist/chunks/chunk-5DXCVG5U.js +10 -0
- package/dist/chunks/{chunk-HWYHRPWP.js → chunk-67N2NJCF.js} +1 -1
- package/dist/chunks/{chunk-OB5XGIDM.js → chunk-6LZ72MNE.js} +1 -1
- package/dist/chunks/{chunk-SKTP7MSL.js → chunk-7I57HOA6.js} +1 -1
- package/dist/chunks/{chunk-36EFWYTN.js → chunk-7Z4JCYS6.js} +1 -1
- package/dist/chunks/{chunk-6TEFVB2U.js → chunk-ACGKBCXE.js} +1 -1
- package/dist/chunks/{chunk-WJ4VNTE3.js → chunk-AVRYIQRF.js} +1 -1
- package/dist/chunks/{chunk-7SGM233C.js → chunk-BW64GZ3E.js} +1 -1
- package/dist/chunks/{chunk-RV77ZW7T.js → chunk-DJDT2SUM.js} +1 -1
- package/dist/chunks/{chunk-D7KEDMBF.js → chunk-DO4GPDKO.js} +1 -1
- package/dist/chunks/{chunk-EDVP7QUI.js → chunk-EGZIRI5B.js} +1 -1
- package/dist/chunks/{chunk-IFNTXDX2.js → chunk-G2JKENQU.js} +1 -1
- package/dist/chunks/{chunk-MT4MO7DT.js → chunk-G64N3I5W.js} +1 -1
- package/dist/chunks/{chunk-YAPHSZJ7.js → chunk-GNY6U33Z.js} +2 -2
- package/dist/chunks/{chunk-X5GP2FBT.js → chunk-HVNIW32A.js} +1 -1
- package/dist/chunks/{chunk-Y35RMGOU.js → chunk-I4NK2P2D.js} +1 -1
- package/dist/chunks/{chunk-MZ6DNAVL.js → chunk-IADIPNJO.js} +1 -1
- package/dist/chunks/{chunk-SWJYZETA.js → chunk-IOJYYPUF.js} +3 -3
- package/dist/chunks/{chunk-XKDY4OFQ.js → chunk-IVUYULMP.js} +1 -1
- package/dist/chunks/{chunk-JYFYL3ON.js → chunk-JV4URBEA.js} +1 -1
- package/dist/chunks/{chunk-BIFAR2CO.js → chunk-L3S26YTM.js} +1 -1
- package/dist/chunks/{chunk-ZH4DW3T3.js → chunk-LZAGJ3QI.js} +1 -1
- package/dist/chunks/{chunk-TUJ3WXOZ.js → chunk-ME6DBVQG.js} +1 -1
- package/dist/chunks/{chunk-PLG4UIV4.js → chunk-ME75ZZW7.js} +1 -1
- package/dist/chunks/{chunk-JORUFFOD.js → chunk-MHQ2MW2B.js} +3 -3
- package/dist/chunks/{chunk-FU7KGU6V.js → chunk-MJR564B4.js} +1 -1
- package/dist/chunks/{chunk-RIPCUZO6.js → chunk-MS576PZ7.js} +1 -1
- package/dist/chunks/{chunk-6OUBLFZ2.js → chunk-MYY36NBW.js} +1 -1
- package/dist/chunks/{chunk-GAG42XNF.js → chunk-NUPLQVP3.js} +1 -1
- package/dist/chunks/{chunk-OPVNMCAF.js → chunk-OBRNACWW.js} +1 -1
- package/dist/chunks/{chunk-6BE4D57F.js → chunk-OKS442LQ.js} +1 -1
- package/dist/chunks/{chunk-7V2F5IUY.js → chunk-Q3SWLXLO.js} +1 -1
- package/dist/chunks/{chunk-PR7SYJVT.js → chunk-Q7ZF7MBI.js} +1 -1
- package/dist/chunks/{chunk-KCQERNQX.js → chunk-QCG6Q33G.js} +1 -1
- package/dist/chunks/{chunk-NUITF4GR.js → chunk-R4TMZGV5.js} +1 -1
- package/dist/chunks/{chunk-A6RRKSD3.js → chunk-RZTGPQFR.js} +1 -1
- package/dist/chunks/{chunk-AHSMFZWH.js → chunk-TAAV7L3T.js} +1 -1
- package/dist/chunks/{chunk-3TJDVDDJ.js → chunk-TEHMKMPG.js} +1 -1
- package/dist/chunks/{chunk-R6OWQQMZ.js → chunk-UPXIQO57.js} +1 -1
- package/dist/chunks/{chunk-KG3OGJ3U.js → chunk-VUILLFZ6.js} +1 -1
- package/dist/chunks/{chunk-T6GXMIXO.js → chunk-WDJFZM7U.js} +1 -1
- package/dist/chunks/{chunk-K5GYV5CW.js → chunk-WJEAGH4K.js} +1 -1
- package/dist/chunks/{chunk-3YQVBYQD.js → chunk-WKTIAVGU.js} +1 -1
- package/dist/chunks/{chunk-T3PAZMDW.js → chunk-WXWBB7LP.js} +1 -1
- package/dist/chunks/{chunk-I7FGFRN3.js → chunk-YCV465P5.js} +1 -1
- package/dist/chunks/{chunk-ZQBMRI57.js → chunk-YDRNDY2V.js} +2 -2
- package/dist/chunks/{clear-E6TSPA67.js → clear-ZEWRQLJR.js} +1 -1
- package/dist/chunks/{compile-vercel-config-2HBWORW5.js → compile-vercel-config-66TMMPL5.js} +1 -1
- package/dist/chunks/{config-MTH57FUD.js → config-LDTDOVVC.js} +1 -1
- package/dist/chunks/{config-NWNQSZNZ.js → config-V7SAJGMS.js} +1 -1
- package/dist/chunks/{delete-NIPKCWUT.js → delete-5WC3BAXY.js} +1 -1
- package/dist/chunks/{delete-MZ4LAS3L.js → delete-QVG74P23.js} +1 -1
- package/dist/chunks/{detect-projects-3CQ6ANGU.js → detect-projects-FTGWHOTA.js} +1 -1
- package/dist/chunks/{detect-services-5CVG24CL.js → detect-services-QPBLJZGR.js} +1 -1
- package/dist/chunks/{disable-YZATFLNR.js → disable-MJP72BUH.js} +1 -1
- package/dist/chunks/{discard-B5IFVCDR.js → discard-GHJO6HJ7.js} +1 -1
- package/dist/chunks/{edit-EDTBD7PX.js → edit-ELV6KOAC.js} +1 -1
- package/dist/chunks/{edit-3PKYF5FY.js → edit-MCMKL3PG.js} +1 -1
- package/dist/chunks/{enable-AKGADEKU.js → enable-NJV7TP3E.js} +1 -1
- package/dist/chunks/{export-NKCN63SF.js → export-OFXKWFKJ.js} +1 -1
- package/dist/chunks/{future-AQR2QP74.js → future-TTQX6P2J.js} +1 -1
- package/dist/chunks/{generate-cert-for-deploy-UNRGDROB.js → generate-cert-for-deploy-H5CIDNMW.js} +1 -1
- package/dist/chunks/{image-IQJVHHAW.js → image-2V2VJOSJ.js} +1 -1
- package/dist/chunks/{import-builders-4K4WE66I.js → import-builders-K3AX56WJ.js} +1 -1
- package/dist/chunks/{inspect-4DASZGPR.js → inspect-3YVNC464.js} +1 -1
- package/dist/chunks/{inspect-2UUTLI4H.js → inspect-7YQ3GVZK.js} +1 -1
- package/dist/chunks/{inspect-FVB5P54P.js → inspect-SEHUG246.js} +1 -1
- package/dist/chunks/{inspect-IU2VMHWZ.js → inspect-SLCLHRCE.js} +1 -1
- package/dist/chunks/{inspect-GKZFZINR.js → inspect-ZNSHEHOX.js} +1 -1
- package/dist/chunks/{list-TL7VBVR5.js → list-AKLXWJVE.js} +1 -1
- package/dist/chunks/{list-OYT6T3TA.js → list-QWTJ5GEV.js} +1 -1
- package/dist/chunks/{list-5LMFTD7U.js → list-TFJSUTGX.js} +1 -1
- package/dist/chunks/{login-PFAKA6JO.js → login-2RXKHHR7.js} +1 -1
- package/dist/chunks/{login-UWL7N6ZS.js → login-DTYYE77N.js} +1 -1
- package/dist/chunks/{logs-4FOJKWAW.js → logs-RI5TPLZS.js} +1 -1
- package/dist/chunks/{ls-VNOGQ64O.js → ls-62IGNDVX.js} +1 -1
- package/dist/chunks/{ls-H7YO6MS5.js → ls-KPDMEX3M.js} +1 -1
- package/dist/chunks/{ls-VFV23YCF.js → ls-O6RYA4QE.js} +1 -1
- package/dist/chunks/{ls-B3D7XA2S.js → ls-PDGT4IYT.js} +1 -1
- package/dist/chunks/{ls-SJDE4U7I.js → ls-RT2GW7GQ.js} +1 -1
- package/dist/chunks/{ls-SXE2THDP.js → ls-SWSNZDIB.js} +1 -1
- package/dist/chunks/{ls-6TRT3UFZ.js → ls-XBWZZIZW.js} +1 -1
- package/dist/chunks/{mutate-IGC37SCR.js → mutate-4QF5LX5H.js} +1 -1
- package/dist/chunks/{notifications-47EDEA5C.js → notifications-EZWNVZIY.js} +1 -1
- package/dist/chunks/{open-NP444BUR.js → open-ZOCLC6EL.js} +1 -1
- package/dist/chunks/{openapi-LW24FRTC.js → openapi-WDPDBK6G.js} +1 -1
- package/dist/chunks/{permissions-CP57O3II.js → permissions-WZ74DZVX.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-C3OIQONK.js → prompt-missing-credentials-EU3KK3J4.js} +1 -1
- package/dist/chunks/{publish-5TK3IVYM.js → publish-M6VGADUV.js} +1 -1
- package/dist/chunks/{pull-FCQKXYBD.js → pull-HE4HZUJO.js} +1 -1
- package/dist/chunks/{purchase-domain-if-available-QBDRKJZ5.js → purchase-domain-if-available-YK7ZK4OQ.js} +1 -1
- package/dist/chunks/{push-SIR5XTJN.js → push-AXG4E43Q.js} +1 -1
- package/dist/chunks/{query-IEBWCCMJ.js → query-LSTTTOQM.js} +1 -1
- package/dist/chunks/{reauthenticate-XSNRCXPC.js → reauthenticate-S6DCF7RS.js} +1 -1
- package/dist/chunks/{reorder-TPLZXSRB.js → reorder-4G2JILHR.js} +1 -1
- package/dist/chunks/{reply-BCDQQ6I2.js → reply-MDSF5FRG.js} +1 -1
- package/dist/chunks/{resolve-VKJAE7KO.js → resolve-JFM5IA7H.js} +1 -1
- package/dist/chunks/{restore-TZAXCNLL.js → restore-DGXZYLLN.js} +1 -1
- package/dist/chunks/{rm-TTZBAVUG.js → rm-3CXFYPYT.js} +1 -1
- package/dist/chunks/{rm-A2NTZ4EJ.js → rm-56YVF7VJ.js} +1 -1
- package/dist/chunks/{rm-DPVWWH4Q.js → rm-72VFNBSP.js} +1 -1
- package/dist/chunks/{rm-V4M46PRZ.js → rm-OAN2XZOH.js} +1 -1
- package/dist/chunks/{rm-53HZ5XOQ.js → rm-WFK724PU.js} +1 -1
- package/dist/chunks/{rule-inspect-5QXLEJZA.js → rule-inspect-C6FZRTXY.js} +1 -1
- package/dist/chunks/{rules-2SBYOL6R.js → rules-5EKUX5OX.js} +1 -1
- package/dist/chunks/{schema-OGGOD3HX.js → schema-6LPADSVE.js} +1 -1
- package/dist/chunks/{schema-PGGJZ2AT.js → schema-LM6XGKQS.js} +1 -1
- package/dist/chunks/{select-org-VBP5DCYP.js → select-org-MARKOFHY.js} +1 -1
- package/dist/chunks/{set-6BCSH3I3.js → set-MTKMZ2YS.js} +1 -1
- package/dist/chunks/{setup-and-link-FPGTZUH6.js → setup-and-link-KMD3ZLHN.js} +1 -1
- package/dist/chunks/{tags-77REB4BF.js → tags-SXRDMEPO.js} +1 -1
- package/dist/chunks/{types-4C5N66YA.js → types-K73TDN7C.js} +1 -1
- package/dist/chunks/{update-7BNVIJWB.js → update-QSNT3MDG.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +4 -4
- 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-bulk.js +28 -28
- package/dist/index.js +2 -2
- package/dist/internal-build.js +1 -1
- package/dist/root-help-commands.mjs +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +55 -55
- package/dist/chunks/chunk-5YQP44VL.js +0 -10
package/dist/commands-bulk.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{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-6OUBLFZ2.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-6BE4D57F.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,parseSubcommandArguments,requireProjectContext,validateRequiredArguments,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-IFNTXDX2.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-36EFWYTN.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-MT4MO7DT.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-Z6HYEIYV.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-WH3SHWVK.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs,require_split2}from"./chunks/chunk-OPVNMCAF.js";import{require_format}from"./chunks/chunk-PFD7LETF.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-JYFYL3ON.js";import{CONTACT_FIELDS,billingFieldsUsed,collectContactInformation,getBillingContact,getDomainPrice,getDomainStatus,getOrderOutcome,mergeContact,missingContactFields,pollForOrder,purchaseDomain,readContactFlags}from"./chunks/chunk-TUJ3WXOZ.js";import{api,tryOpenApiFallback}from"./chunks/chunk-SKTP7MSL.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-D7KEDMBF.js";import{main}from"./chunks/chunk-XKDY4OFQ.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-EDVP7QUI.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-GAG42XNF.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-B3K6GM2W.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-3TJDVDDJ.js";import{readJSONFile}from"./chunks/chunk-VLSSMFTF.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-ZQBMRI57.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-X5GP2FBT.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-SYEKOJHT.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-FU7KGU6V.js";import{require_dist as require_dist3}from"./chunks/chunk-YAPHSZJ7.js";import{require_dist2}from"./chunks/chunk-WJ4VNTE3.js";import"./chunks/chunk-SZRSBECO.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-JORUFFOD.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-ZH4DW3T3.js";import{resolveProjectContext}from"./chunks/chunk-K5GYV5CW.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-7SGM233C.js";import"./chunks/chunk-3YQVBYQD.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-I7FGFRN3.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{CI_LOG_LEVELS,CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand5,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand7,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-OB5XGIDM.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-OH2RT2GN.js";import{tracesConfigCommand}from"./chunks/chunk-UFXKCETS.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-RZGWCQP7.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-AG5QQNJ3.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-AU42HSQ3.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-L5FUUGYX.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QC47UKDR.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-QJKJBD2M.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand6,listSubcommand as listSubcommand8,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-MYCQIZU6.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-CNU4T7FO.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-LU5O3NH7.js";import{logsCommand}from"./chunks/chunk-AMDHTZDV.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-2JBVMF2Y.js";import"./chunks/chunk-JLXG2XWW.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-I3D36ZLJ.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-S7XZC23O.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-6LXX5P3A.js";import{getTeams}from"./chunks/chunk-MSH7V3FL.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-J2LAZELI.js";import{mapCertError}from"./chunks/chunk-E6UKNYFF.js";import"./chunks/chunk-GRTIWUV2.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5O2CW3SX.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-T6GXMIXO.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,targetRecovery,withGlobalFlags,writeAgentError}from"./chunks/chunk-5YQP44VL.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,scopeFlagPassed,writeToConfigFile}from"./chunks/chunk-HWYHRPWP.js";import{getGlobalPathConfig}from"./chunks/chunk-HMS3UIQ2.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunks/chunk-TNZMCRAP.js";import"./chunks/chunk-VKXEOL4K.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-YYPNUQDI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-R4VVQRLX.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-5IPBCD7K.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-SWJYZETA.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-WPQN5UKR.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPriceChanged,DomainPurchasePending,DomainPurchaseRefundFailed,DomainPurchaseRefunded,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-YIIPBH2D.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji,require_build_utils}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
7
|
+
import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-MYY36NBW.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-OKS442LQ.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,parseSubcommandArguments,requireProjectContext,validateRequiredArguments,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-G2JKENQU.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-7Z4JCYS6.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-G64N3I5W.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-Z6HYEIYV.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-WH3SHWVK.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs,require_split2}from"./chunks/chunk-OBRNACWW.js";import{require_format}from"./chunks/chunk-PFD7LETF.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-JV4URBEA.js";import{CONTACT_FIELDS,billingFieldsUsed,collectContactInformation,getBillingContact,getDomainPrice,getDomainStatus,getOrderOutcome,mergeContact,missingContactFields,pollForOrder,purchaseDomain,readContactFlags}from"./chunks/chunk-ME6DBVQG.js";import{api,tryOpenApiFallback}from"./chunks/chunk-7I57HOA6.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-DO4GPDKO.js";import{main}from"./chunks/chunk-IVUYULMP.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-EGZIRI5B.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-NUPLQVP3.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-B3K6GM2W.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-TEHMKMPG.js";import{readJSONFile}from"./chunks/chunk-26KRNEYD.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-YDRNDY2V.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-HVNIW32A.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-SYEKOJHT.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-MJR564B4.js";import{require_dist as require_dist3}from"./chunks/chunk-GNY6U33Z.js";import{require_dist2}from"./chunks/chunk-AVRYIQRF.js";import"./chunks/chunk-46XQIXL7.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-MHQ2MW2B.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-LZAGJ3QI.js";import{resolveProjectContext}from"./chunks/chunk-WJEAGH4K.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-BW64GZ3E.js";import"./chunks/chunk-WKTIAVGU.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-YCV465P5.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{CI_LOG_LEVELS,CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand5,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand7,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-6LZ72MNE.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-OH2RT2GN.js";import{tracesConfigCommand}from"./chunks/chunk-UFXKCETS.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-RZGWCQP7.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-AG5QQNJ3.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-AU42HSQ3.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-L5FUUGYX.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QC47UKDR.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-QJKJBD2M.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand6,listSubcommand as listSubcommand8,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-MYCQIZU6.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-CNU4T7FO.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-LU5O3NH7.js";import{logsCommand}from"./chunks/chunk-AMDHTZDV.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-2JBVMF2Y.js";import"./chunks/chunk-JLXG2XWW.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-I3D36ZLJ.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-S7XZC23O.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-6LXX5P3A.js";import{getTeams}from"./chunks/chunk-MSH7V3FL.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-J2LAZELI.js";import{mapCertError}from"./chunks/chunk-E6UKNYFF.js";import"./chunks/chunk-GRTIWUV2.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5O2CW3SX.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-WDJFZM7U.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,targetRecovery,withGlobalFlags,writeAgentError}from"./chunks/chunk-5DXCVG5U.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,scopeFlagPassed,writeToConfigFile}from"./chunks/chunk-67N2NJCF.js";import{getGlobalPathConfig}from"./chunks/chunk-HMS3UIQ2.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunks/chunk-TNZMCRAP.js";import"./chunks/chunk-VKXEOL4K.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-YYPNUQDI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-R4VVQRLX.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-5IPBCD7K.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-IOJYYPUF.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-WPQN5UKR.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPriceChanged,DomainPurchasePending,DomainPurchaseRefundFailed,DomainPurchaseRefunded,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-YIIPBH2D.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji,require_build_utils}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
8
8
|
|
|
9
9
|
These defaults are optimized for AI coding agents (and humans) working on apps that deploy to Vercel.
|
|
10
10
|
|
|
@@ -55,7 +55,7 @@ ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
|
|
|
55
55
|
`),0;let projectList=asArray(data.projects??data.items);if(projectList.length===0)return output_manager_default.log("No projects with Agent Runs activity found."),0;output_manager_default.log(`Projects with Agent Runs under ${import_chalk5.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Project","Runs","Avg Duration"].map(header=>import_chalk5.default.bold(import_chalk5.default.cyan(header))),...projectList.map(project=>[import_chalk5.default.bold(readString(project,"projectName","name","project","projectId","id")??"-"),formatCount(readNumber(project,"runs","runCount","totalRuns")),import_chalk5.default.gray(formatDurationMs(readNumber(project,"avgDurationMs","averageDurationMs","avgDuration")))])];return client.stdout.write(`
|
|
56
56
|
${table(rows,{hsep:3}).replace(/^/gm," ")}
|
|
57
57
|
|
|
58
|
-
`),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-4C5N66YA.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-OYT6T3TA.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_LENGTH=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_LENGTH?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
58
|
+
`),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-K73TDN7C.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-QWTJ5GEV.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_LENGTH=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_LENGTH?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
59
59
|
`),output_manager_default.success(`API key ${import_chalk6.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget2!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);async function ensureTeam(client){if(client.config.currentTeam)return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&¬FoundMessage?notFoundMessage:err.message),1;throw err}return output_manager_default.stopSpinner(),json?(client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
|
|
60
60
|
`),0):isEmpty(data)?(output_manager_default.log(emptyMessage),0):(output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0)}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&¶ms.set("projectId",opts.projectId),opts.userId&¶ms.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}async function list3(client,argv){let telemetry2=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:()=>listApiKeysPage(client,{limit,next}),toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more API keys.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault),next:page=>page.next})}function printApiKeysTable(apiKeys2,keyDefault){return`${table([["id","name","key","budget","spend","refresh","created"].map(header=>import_chalk7.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk7.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk7.default.gray("(default)")}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk7.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk7.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk7.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
61
61
|
|
|
@@ -96,7 +96,7 @@ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"
|
|
|
96
96
|
|
|
97
97
|
`}var import_chalk19=__toESM(require_source(),1);var AiGatewayVirtualModelsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect4(client,argv){let telemetry2=new AiGatewayVirtualModelsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry2.trackCliArgumentSlug(slug),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);return formatResult.valid?slug?await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching virtual model ${slug}`,fetch:()=>getVirtualModel(client,slug),toJSON:virtualModel=>virtualModel,isEmpty:()=>!1,emptyMessage:"",header:virtualModel=>`Virtual model ${import_chalk19.default.bold(virtualModel.virtualModelSlug)}`,renderTable:printVirtualModelDetails,notFoundMessage:`Virtual model "${slug}" not found.`}):1:(output_manager_default.error(`${getCommandName("ai-gateway virtual-models inspect <slug>")} expects a virtual model slug.`),2):(output_manager_default.error(formatResult.error),2)}function dim2(value){return import_chalk19.default.gray(value)}function printVirtualModelDetails(vm){let rows=[["slug",vm.virtualModelSlug],["kind",vm.kind??"alias"],["model",vm.modelSlug],["display name",vm.displayName],["description",vm.description],["status",vm.status??"active"],["visibility",vm.visibility],["base url",vm.baseUrl],["fallback models",vm.models?.join(", ")],["provider order",vm.providerOrder?.join(", ")],["provider only",vm.providerOnly?.join(", ")],["observability tags",vm.observabilityTags?.join(", ")],["inference region",formatRegion(vm.inferenceRegion)],["sort",vm.sort],["has",vm.has?.join(", ")],["caching",vm.caching],["service tier",vm.serviceTier],["provider timeouts",formatTimeouts(vm.providerTimeouts)],["speed",vm.speed],["allow fallback from fast",yesNo2(vm.allowFallbackFromFast)],["zero data retention",yesNo2(vm.zeroDataRetention)],["disallow prompt training",yesNo2(vm.disallowPromptTraining)],["created",new Date(vm.createdAt).toLocaleString()],["updated",new Date(vm.updatedAt).toLocaleString()]];return`${table(rows.filter(([,value])=>value!==void 0&&value!=="").map(([label,value])=>[dim2(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
|
|
98
98
|
|
|
99
|
-
`}function yesNo2(value){return value===void 0?void 0:value?"yes":"no"}function formatRegion(region){if(!region)return;let base=[region.scope,region.geoRegion,region.providerRegion].filter(Boolean).join(" / "),providers2=region.providers?Object.entries(region.providers).map(([name,value])=>value===null?`${name}: none`:`${name}: ${[value.scope,value.geoRegion,value.providerRegion].filter(Boolean).join(" / ")}`).join(", "):void 0;return[base,providers2].filter(Boolean).join(" | ")||void 0}function formatTimeouts(timeouts){if(timeouts?.byok)return Object.entries(timeouts.byok).map(([provider,
|
|
99
|
+
`}function yesNo2(value){return value===void 0?void 0:value?"yes":"no"}function formatRegion(region){if(!region)return;let base=[region.scope,region.geoRegion,region.providerRegion].filter(Boolean).join(" / "),providers2=region.providers?Object.entries(region.providers).map(([name,value])=>value===null?`${name}: none`:`${name}: ${[value.scope,value.geoRegion,value.providerRegion].filter(Boolean).join(" / ")}`).join(", "):void 0;return[base,providers2].filter(Boolean).join(" | ")||void 0}function formatTimeouts(timeouts){if(timeouts?.byok)return Object.entries(timeouts.byok).map(([provider,ms47])=>`${provider}: ${ms47}ms`).join(", ")}var import_chalk20=__toESM(require_source(),1);var AiGatewayVirtualModelsEditTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit2(client,argv){let telemetry2=new AiGatewayVirtualModelsEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"],void 0,UPDATEABLE_FIELDS);if(!config.ok)return output_manager_default.error(config.error),1;let[slug]=args;telemetry2.trackCliArgumentSlug(slug),telemetry2.trackCliOptionModel(opts["--model"]),telemetry2.trackCliOptionDisplayName(opts["--display-name"]),telemetry2.trackCliOptionDescription(opts["--description"]),telemetry2.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry2.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry2.trackCliOptionConfig(opts["--config"]),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models edit <slug>")} expects a virtual model slug.`),2;let updates={...config.value,...definedOnly2({modelSlug:opts["--model"],displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})};if(delete updates.virtualModelSlug,Object.keys(updates).length===0)return output_manager_default.error("Provide at least one field to change, with a flag or --config."),2;if(!await ensureTeam(client))return 1;let updateStamp=stamp_default();output_manager_default.spinner(`Updating virtual model ${slug}`);try{let virtualModel=await updateVirtualModel(client,{...updates,virtualModelSlug:slug});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
|
|
100
100
|
`):output_manager_default.success(`Virtual model ${import_chalk20.default.bold(virtualModel.virtualModelSlug)} updated ${updateStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly2(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk21=__toESM(require_source(),1);var AiGatewayVirtualModelsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove5(client,argv){let telemetry2=new AiGatewayVirtualModelsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry2.trackCliArgumentSlug(slug),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models rm <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let removeStamp=stamp_default();output_manager_default.spinner("Removing virtual model");try{return await deleteVirtualModel(client,slug),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({virtualModelSlug:slug,removed:!0},null,2)}
|
|
101
101
|
`):output_manager_default.success(`Virtual model ${import_chalk21.default.bold(slug)} removed ${removeStamp()}. Restore it with ${getCommandName(`ai-gateway virtual-models restore ${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk22=__toESM(require_source(),1);var AiGatewayVirtualModelsRestoreTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function restore(client,argv){let telemetry2=new AiGatewayVirtualModelsRestoreTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRestoreSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry2.trackCliArgumentSlug(slug),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models restore <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let restoreStamp=stamp_default();output_manager_default.spinner("Restoring virtual model");try{let virtualModel=await restoreVirtualModel(client,slug);return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
|
|
102
102
|
`):output_manager_default.success(`Virtual model ${import_chalk22.default.bold(slug)} restored ${restoreStamp()}. Call it as ${import_chalk22.default.bold(`vmc/${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayVirtualModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG7={create:getCommandAliases(virtualModelsCreateSubcommand),list:getCommandAliases(virtualModelsListSubcommand),inspect:getCommandAliases(virtualModelsInspectSubcommand),edit:getCommandAliases(virtualModelsEditSubcommand),remove:getCommandAliases(virtualModelsRemoveSubcommand),restore:getCommandAliases(virtualModelsRestoreSubcommand)};async function virtualModels(client){let telemetry2=new AiGatewayVirtualModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(virtualModelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:virtualModelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsCreateSubcommand),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list7(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),edit2(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove5(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk28=__toESM(require_source(),1);import{homedir}from"node:os";import{existsSync as existsSync2}from"node:fs";import{dirname as dirname6,resolve as resolve2}from"node:path";var import_chalk23=__toESM(require_source(),1);import{dirname,join as join2,resolve}from"node:path";var METADATA_FILE=".aider.model.metadata.json",SETTINGS_FILE=".aider.model.settings.yml";function aiderModelId(gatewayModelId){return`openai/${gatewayModelId}`}function chatModels(ctx){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&m.context_window)}function costPerToken(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelMetadata(models3){let entries={};for(let model of models3){let input=costPerToken(model.pricing?.input),output=costPerToken(model.pricing?.output);entries[aiderModelId(model.id)]={max_input_tokens:model.context_window,...model.max_tokens?{max_output_tokens:model.max_tokens,max_tokens:model.max_tokens}:{},...input===void 0?{}:{input_cost_per_token:input},...output===void 0?{}:{output_cost_per_token:output},litellm_provider:"openai",mode:"chat"}}return entries}function modelSettings(models3){return models3.map(model=>({name:aiderModelId(model.id),settings:{edit_format:"diff",use_repo_map:!0}}))}function asObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertNamedYamlList(current,entries){let loaded=current?.trim()?load(current):[];if(loaded!=null&&!Array.isArray(loaded))throw new Error("existing file is not a YAML list");let list30=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list30.forEach((item,i)=>{let name=asObject(item).name;name!==void 0&&!indexByName.has(name)&&indexByName.set(name,i)});for(let{name,settings}of entries){let index=indexByName.get(name);index===void 0?(indexByName.set(name,list30.length),list30.push({name,...settings})):list30[index]={name,...asObject(list30[index]),...settings}}return dump(list30,{lineWidth:120})}var aider={id:"aider",displayName:"Aider",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return await pathExists(join2(home,".aider"))||pathExists(join2(home,".aider.conf.yml"))},configPath(ctx){return ctx.overrides?.aider??join2(ctx.home,".aider.conf.yml")},buildPlan(ctx){let model=aiderModelId(ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL),path3=this.configPath(ctx),dir=dirname(path3),metadataPath=join2(dir,METADATA_FILE),settingsPath=join2(dir,SETTINGS_FILE),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=chatModels(ctx),needsExplicitPaths=models3.length>0&&resolve(dir)!==resolve(ctx.home);return{fileChanges:[{path:path3,label:"Aider config",format:"yaml",transform:current=>{let config=asObject(load(current??"")??{});return config["openai-api-base"]=base,config.model=model,needsExplicitPaths&&(config["model-metadata-file"]=metadataPath,config["model-settings-file"]=settingsPath),dump(config,{lineWidth:120})}},...models3.length?[{path:metadataPath,label:"Aider model metadata",format:"json",transform:current=>mergeJson(current,modelMetadata(models3))},{path:settingsPath,label:"Aider model settings",format:"yaml",transform:current=>upsertNamedYamlList(current,modelSettings(models3))}]:[]],envExports:[{name:"AIDER_OPENAI_API_KEY",value:ctx.apiKey}],notes:[`Aider will use the gateway with ${model}; switch with \`aider --model openai/<gateway-model-id>\` or /model in a session.`,...models3.length?[`${models3.length} gateway models are registered in ${METADATA_FILE}; re-run setup to pick up models added since.`]:[],"Open a new terminal first so AIDER_OPENAI_API_KEY is loaded."]}}};import{join as join3}from"node:path";var cline={id:"cline",displayName:"Cline",needsTopModels:!0,async detect(home){return pathExists(join3(home,".cline"))},configPath(ctx){return ctx.overrides?.cline??join3(ctx.home,".cline","data","settings","providers.json")},buildPlan(ctx){let path3=this.configPath(ctx),defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,keepUpdatedAt=current=>{try{let providers2=JSON.parse(current)?.providers?.["vercel-ai-gateway"],settings=providers2?.settings;if((ctx.apiKey===KEY_PLACEHOLDER||settings?.apiKey===ctx.apiKey)&&settings?.provider==="vercel-ai-gateway"&&settings?.model===defaultModel&&providers2?.tokenSource==="manual"&&typeof providers2?.updatedAt=="string")return providers2.updatedAt}catch{}};return{fileChanges:[{path:path3,label:"Cline providers",format:"json",mode:384,transform:current=>{let isNew=!current||!current.trim(),updatedAt=(current&&keepUpdatedAt(current))??new Date().toISOString();return mergeJson(current,{...isNew?{version:1}:{},lastUsedProvider:"vercel-ai-gateway",providers:{"vercel-ai-gateway":{settings:{provider:"vercel-ai-gateway",apiKey:ctx.apiKey,model:defaultModel},updatedAt,tokenSource:"manual"}}})}}],envExports:[],notes:[`Cline will use its native Vercel AI Gateway provider with ${defaultModel}; switch models in-session or with \`cline auth -p vercel-ai-gateway -m <gateway-model-id>\`.`,"In the VS Code extension, pick the Vercel AI Gateway provider under Settings \u2192 API Provider."]}}};import{join as join5}from"node:path";import{createHash,randomUUID}from"node:crypto";import{v5 as uuidv5,validate as uuidValidate}from"uuid";import{createReadStream,createWriteStream}from"node:fs";import*as fs from"node:fs/promises";import{basename,dirname as dirname2,join as join4}from"node:path";import{pipeline}from"node:stream/promises";var ROLLOUT_PATTERN=/^rollout-.*\.jsonl(?:\.zst)?$/,MAX_METADATA_BYTES=1024*1024;function hasCode(error,code2){return error.code===code2}async function readMeta(path3,gateway=!1){let handle=await fs.open(path3,"r"),buffer=new Uint8Array(MAX_METADATA_BYTES+1),length=0,newline=-1;try{for(;length<buffer.length&&newline<0;){let start=length,read=await handle.read(buffer,start,buffer.length-start,start);if(read.bytesRead===0)break;length+=read.bytesRead,newline=buffer.indexOf(10,start)}}finally{await handle.close()}if(newline<0&&length>MAX_METADATA_BYTES)throw new Error(`${basename(path3)} metadata exceeds 1 MiB`);let lineEnd=newline<0?length:newline,carriageReturn=buffer[lineEnd-1]===13,record;try{record=JSON.parse(new TextDecoder().decode(buffer.subarray(0,carriageReturn?lineEnd-1:lineEnd)))}catch{return null}let payload=record.payload,id2=typeof payload?.id=="string"?payload.id:typeof payload?.session_id=="string"?payload.session_id:"";return record.type!=="session_meta"||!payload||!uuidValidate(id2)||typeof payload.session_id=="string"&&payload.session_id!==id2||payload.originator!=="Codex Desktop"&&!(payload.originator==null&&payload.source==="vscode")||(gateway?payload.model_provider!=="vercel":payload.model_provider==="vercel")?null:{record,payload,id:id2,delimiter:newline<0?"":carriageReturn?`\r
|
|
@@ -154,7 +154,7 @@ ${sections.join(`
|
|
|
154
154
|
`),{exitCode:0,outcome:"agent_prompt"}):(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"keychain_error",message:"The `--apply prompt` mode needs the key in the macOS Keychain, but storing it failed, so no prompt was produced.",skipped,warnings:args.warnings},null,2)}
|
|
155
155
|
`),{exitCode:1,outcome:"failed"});let results=await applyPlan(finalPlan,{backup});return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"coding_agents_configured",message:`Configured ${results.length} ${results.length===1?"file":"files"} across ${selected.length} ${selected.length===1?"agent":"agents"} to use the AI Gateway.`,apiKey:key,configured:results.map(r=>({agent:r.owners.join(", "),file:r.path,action:r.action,backup:r.backupPath})),migrated:migrated.results,skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line2=>`${n.displayName}: ${line2}`))},null,2)}
|
|
156
156
|
`),{exitCode:0,outcome:"configured"}}function migrationSkips(errors){return errors.map(error=>({target:error.agentId,reason:"session_migration_failed",message:error.message}))}function writeJson(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
157
|
-
`)}var DEFAULT_LEADERBOARD_BASE="https://vercel.com";var LEADERBOARD_MODALITIES=["all","text","image","video"],LEADERBOARD_METRICS=["requests","tokens","spend","imageCount","videoCount"];function leaderboardBase(){return process.env.VERCEL_LEADERBOARD_URL??DEFAULT_LEADERBOARD_BASE}function buildUrl(query,format3){let params=new URLSearchParams;return params.set("dataset",query.dataset),query.modality&¶ms.set("modality",query.modality),params.set("format",format3),`${leaderboardBase()}/api/ai/leaderboard-export?${params.toString()}`}async function fetchLeaderboard(client,query,opts={}){return client.fetch(buildUrl(query,"json"),{method:"GET",...opts})}async function fetchLeaderboardCsv(client,query){return(await client.fetch(buildUrl(query,"csv"),{method:"GET",json:!1})).text()}function latestDate(rows){let max;for(let row of rows)(max===void 0||row.date>max)&&(max=row.date);return max}function availableDates(rows){return Array.from(new Set(rows.map(r=>r.date))).sort((a,b)=>a<b?1:a>b?-1:0)}function filterTimeseries(rows,options){let day=options.date??latestDate(rows);return rows.filter(row=>row.metric===options.metric&&row.date===day).sort((a,b)=>b.share_percent-a.share_percent)}var TOP_MODELS_LIMIT=10,TOP_MODELS_METRIC="spend",TOP_MODELS_MODALITY="text",MIN_USABLE_MODELS=3,DEFAULT_TIMEOUT_MS=2e3,OTHER_ROW_NAME="other";function normalizeName(name){return name.trim().toLowerCase()}function resolveTopModels(rows,catalog,limit=TOP_MODELS_LIMIT){let idByName=new Map;for(let model of catalog){if(!model.name||!model.id)continue;let key=normalizeName(model.name);idByName.has(key)?idByName.get(key)!==model.id&&idByName.set(key,null):idByName.set(key,model.id)}let nameById=new Map(catalog.map(model=>[model.id,model.name])),ranked=filterTimeseries(rows,{metric:TOP_MODELS_METRIC}),resolved=[],seen=new Set;for(let row of ranked){if(resolved.length>=limit)break;if(normalizeName(row.name)===OTHER_ROW_NAME)continue;let id2=row.slug??idByName.get(normalizeName(row.name))??void 0;!id2||seen.has(id2)||(seen.add(id2),resolved.push({id:id2,name:nameById.get(id2)??row.name}))}return resolved}function withTimeout(run3,ms45){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms45}ms`))},ms45);timer.unref?.(),run3(controller.signal).then(resolvePromise,reject).finally(()=>clearTimeout(timer))})}async function fetchTopModels(client,opts={}){let{limit=TOP_MODELS_LIMIT,timeoutMs=DEFAULT_TIMEOUT_MS}=opts;try{let fetchOpts={retry:{retries:0},bailOn429:!0},[leaderboard2,catalog]=await withTimeout(signal=>Promise.all([fetchLeaderboard(client,{dataset:"models",modality:TOP_MODELS_MODALITY},{signal,...fetchOpts}),listModels(client,{signal,...fetchOpts})]),timeoutMs),models3=resolveTopModels(leaderboard2.rows??[],catalog,limit);return models3.length<MIN_USABLE_MODELS?(output_manager_default.debug(`Leaderboard returned only ${models3.length} usable models; using the built-in list.`),null):models3}catch(err){return output_manager_default.debug(`Could not fetch the model leaderboard, using the built-in list: ${err.message}`),null}}var AiGatewayCodingAgentsSetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){if(agents&&agents.length)for(let agent2 of agents)this.trackCliOption({option:"agent",value:agent2})}trackCliFlagAll(all){all&&this.trackCliFlag("all")}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliFlagReconfigure(reconfigure){reconfigure&&this.trackCliFlag("reconfigure")}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagNoBackup(noBackup){noBackup&&this.trackCliFlag("no-backup")}trackCliFlagNoSessionMigration(noSessionMigration){noSessionMigration&&this.trackCliFlag("no-session-migration")}trackCliFlagNoKeychain(noKeychain){noKeychain&&this.trackCliFlag("no-keychain")}trackCliOptionAgentConfig(agentConfig){agentConfig&&agentConfig.length&&this.trackCliOption({option:"agent-config",value:this.redactedValue})}trackCliOptionShellRc(shellRc){shellRc&&this.trackCliOption({option:"shell-rc",value:this.redactedValue})}trackCliOptionApply(apply){apply&&this.trackCliOption({option:"apply",value:apply})}trackCliOptionBaseUrl(baseUrl){baseUrl&&this.trackCliOption({option:"base-url",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function codingAgentsSetup(client,argv){return(await setupCodingAgents(client,argv)).exitCode}async function setupCodingAgents(client,argv){let telemetry2=new AiGatewayCodingAgentsSetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),{exitCode:2,outcome:"failed"}}let{flags:opts}=parsedArgs,agentFlags=opts["--agent"],all=opts["--all"],providedKey=opts["--key"],budget2=opts["--budget"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],expiration=opts["--expiration"],name=opts["--name"],reconfigure=opts["--reconfigure"],dryRun=opts["--dry-run"],noBackup=opts["--no-backup"],noSessionMigration=opts["--no-session-migration"],noKeychain=opts["--no-keychain"],agentConfig=opts["--agent-config"],shellRcOverride=opts["--shell-rc"],applyMode=opts["--apply"],baseUrl=opts["--base-url"],yes=opts["--yes"];telemetry2.trackCliOptionAgent(agentFlags),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionKey(providedKey),telemetry2.trackCliOptionBudget(budget2),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliOptionName(name),telemetry2.trackCliFlagReconfigure(reconfigure),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagNoBackup(noBackup),telemetry2.trackCliFlagNoSessionMigration(noSessionMigration),telemetry2.trackCliFlagNoKeychain(noKeychain),telemetry2.trackCliOptionAgentConfig(agentConfig),telemetry2.trackCliOptionShellRc(shellRcOverride),telemetry2.trackCliOptionApply(applyMode),telemetry2.trackCliOptionBaseUrl(baseUrl),telemetry2.trackCliFlagYes(yes);let machine=shouldEmitNonInteractiveCommandError(client),canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir(),wantKeychain=!noKeychain&&isKeychainAvailable();if(budget2!==void 0&&(!Number.isFinite(budget2)||budget2<1))return failValidation(client,machine,AGENT_REASON.INVALID_BUDGET,"Budget must be a positive number in dollars (minimum 1).");if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod))return failValidation(client,machine,AGENT_REASON.INVALID_REFRESH_PERIOD,`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`);if(expiration&&!isValidExpiry(expiration))return failValidation(client,machine,AGENT_REASON.INVALID_EXPIRATION,`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`);if(applyMode!==void 0&&applyMode!=="edit"&&applyMode!=="prompt")return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --apply "${applyMode}". Must be "edit" or "prompt".`);if(baseUrl!==void 0&&!isValidBaseUrl(baseUrl))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --base-url "${baseUrl}". Must be an http(s) URL.`);let flagExpiresAt=expiration&&expiration!=="none"?presetToExpiresAt(expiration):void 0,overrides={};for(let pair of agentConfig??[]){let eq=pair.indexOf("="),id2=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id2||!path3)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --agent-config "${pair}". Use <agent>=<path>, e.g. claude-code=/path/settings.json.`);if(!getAgentById(id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id2}" in --agent-config.`);overrides[id2]=resolve2(path3)}dryRun&&!machine&&printStatus(`${import_chalk28.default.bold("Dry run")}: previewing changes only. No files will be written and no API key will be created.`);let topModelsPromise=(agentFlags?.length?agentFlags.some(id2=>getAgentById(id2.toLowerCase())?.needsTopModels):!0)?fetchTopModels(client):Promise.resolve(null),selection=await resolveAgents({client,agentFlags,all,canPrompt:canPrompt2,yes:!!yes,home});if("error"in selection)return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:selection.reason,message:selection.error}),output_manager_default.error(selection.error),{exitCode:1,outcome:"failed"};let{selected,guidance:guidance2,unsupported}=selection;for(let note of guidance2)printWarning(note);for(let id2 of Object.keys(overrides))if(!selected.some(a=>a.id===id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id2}", which isn't selected. Add --agent ${id2} (or --all).`);let agents=selected,gatewayModels;if(selected.some(a=>a.needsModelCatalogue))try{gatewayModels=await listModels(client)}catch(err){output_manager_default.debug(`Could not fetch the gateway model catalogue: ${err.message}`)}let agentWarnings=await collectAgentWarnings(selected,{home,overrides}),machineWarnings=agentWarnings.map(e2=>({agent:e2.agent.id,code:e2.warning.code,message:formatWarningMessage(e2.warning)})),consentSkipped=[],previewKey=providedKey??KEY_PLACEHOLDER;if(agentWarnings.length>0){let explicit=!!(agentFlags&&agentFlags.length>0||all);if(canPrompt2&&!yes&&!dryRun){let declined=await promptAgentConsent(client,agentWarnings);if(declined.size>0){agents=agents.filter(a=>!declined.has(a.id));for(let agent2 of selected)declined.has(agent2.id)&&printStatus(`Skipped ${agent2.displayName} \u2014 its configuration was left untouched.`);if(agents.length===0)return printStatus("Nothing to configure. No files were changed."),{exitCode:0,outcome:"canceled"}}}else if(explicit||canPrompt2&&!yes&&dryRun){for(let{warning:warning2}of agentWarnings)printAgentWarning(warning2);output_manager_default.print(`
|
|
157
|
+
`)}var DEFAULT_LEADERBOARD_BASE="https://vercel.com";var LEADERBOARD_MODALITIES=["all","text","image","video"],LEADERBOARD_METRICS=["requests","tokens","spend","imageCount","videoCount"];function leaderboardBase(){return process.env.VERCEL_LEADERBOARD_URL??DEFAULT_LEADERBOARD_BASE}function buildUrl(query,format3){let params=new URLSearchParams;return params.set("dataset",query.dataset),query.modality&¶ms.set("modality",query.modality),params.set("format",format3),`${leaderboardBase()}/api/ai/leaderboard-export?${params.toString()}`}async function fetchLeaderboard(client,query,opts={}){return client.fetch(buildUrl(query,"json"),{method:"GET",...opts})}async function fetchLeaderboardCsv(client,query){return(await client.fetch(buildUrl(query,"csv"),{method:"GET",json:!1})).text()}function latestDate(rows){let max;for(let row of rows)(max===void 0||row.date>max)&&(max=row.date);return max}function availableDates(rows){return Array.from(new Set(rows.map(r=>r.date))).sort((a,b)=>a<b?1:a>b?-1:0)}function filterTimeseries(rows,options){let day=options.date??latestDate(rows);return rows.filter(row=>row.metric===options.metric&&row.date===day).sort((a,b)=>b.share_percent-a.share_percent)}var TOP_MODELS_LIMIT=10,TOP_MODELS_METRIC="spend",TOP_MODELS_MODALITY="text",MIN_USABLE_MODELS=3,DEFAULT_TIMEOUT_MS=2e3,OTHER_ROW_NAME="other";function normalizeName(name){return name.trim().toLowerCase()}function resolveTopModels(rows,catalog,limit=TOP_MODELS_LIMIT){let idByName=new Map;for(let model of catalog){if(!model.name||!model.id)continue;let key=normalizeName(model.name);idByName.has(key)?idByName.get(key)!==model.id&&idByName.set(key,null):idByName.set(key,model.id)}let nameById=new Map(catalog.map(model=>[model.id,model.name])),ranked=filterTimeseries(rows,{metric:TOP_MODELS_METRIC}),resolved=[],seen=new Set;for(let row of ranked){if(resolved.length>=limit)break;if(normalizeName(row.name)===OTHER_ROW_NAME)continue;let id2=row.slug??idByName.get(normalizeName(row.name))??void 0;!id2||seen.has(id2)||(seen.add(id2),resolved.push({id:id2,name:nameById.get(id2)??row.name}))}return resolved}function withTimeout(run3,ms47){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms47}ms`))},ms47);timer.unref?.(),run3(controller.signal).then(resolvePromise,reject).finally(()=>clearTimeout(timer))})}async function fetchTopModels(client,opts={}){let{limit=TOP_MODELS_LIMIT,timeoutMs=DEFAULT_TIMEOUT_MS}=opts;try{let fetchOpts={retry:{retries:0},bailOn429:!0},[leaderboard2,catalog]=await withTimeout(signal=>Promise.all([fetchLeaderboard(client,{dataset:"models",modality:TOP_MODELS_MODALITY},{signal,...fetchOpts}),listModels(client,{signal,...fetchOpts})]),timeoutMs),models3=resolveTopModels(leaderboard2.rows??[],catalog,limit);return models3.length<MIN_USABLE_MODELS?(output_manager_default.debug(`Leaderboard returned only ${models3.length} usable models; using the built-in list.`),null):models3}catch(err){return output_manager_default.debug(`Could not fetch the model leaderboard, using the built-in list: ${err.message}`),null}}var AiGatewayCodingAgentsSetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){if(agents&&agents.length)for(let agent2 of agents)this.trackCliOption({option:"agent",value:agent2})}trackCliFlagAll(all){all&&this.trackCliFlag("all")}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliFlagReconfigure(reconfigure){reconfigure&&this.trackCliFlag("reconfigure")}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagNoBackup(noBackup){noBackup&&this.trackCliFlag("no-backup")}trackCliFlagNoSessionMigration(noSessionMigration){noSessionMigration&&this.trackCliFlag("no-session-migration")}trackCliFlagNoKeychain(noKeychain){noKeychain&&this.trackCliFlag("no-keychain")}trackCliOptionAgentConfig(agentConfig){agentConfig&&agentConfig.length&&this.trackCliOption({option:"agent-config",value:this.redactedValue})}trackCliOptionShellRc(shellRc){shellRc&&this.trackCliOption({option:"shell-rc",value:this.redactedValue})}trackCliOptionApply(apply){apply&&this.trackCliOption({option:"apply",value:apply})}trackCliOptionBaseUrl(baseUrl){baseUrl&&this.trackCliOption({option:"base-url",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function codingAgentsSetup(client,argv){return(await setupCodingAgents(client,argv)).exitCode}async function setupCodingAgents(client,argv){let telemetry2=new AiGatewayCodingAgentsSetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),{exitCode:2,outcome:"failed"}}let{flags:opts}=parsedArgs,agentFlags=opts["--agent"],all=opts["--all"],providedKey=opts["--key"],budget2=opts["--budget"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],expiration=opts["--expiration"],name=opts["--name"],reconfigure=opts["--reconfigure"],dryRun=opts["--dry-run"],noBackup=opts["--no-backup"],noSessionMigration=opts["--no-session-migration"],noKeychain=opts["--no-keychain"],agentConfig=opts["--agent-config"],shellRcOverride=opts["--shell-rc"],applyMode=opts["--apply"],baseUrl=opts["--base-url"],yes=opts["--yes"];telemetry2.trackCliOptionAgent(agentFlags),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionKey(providedKey),telemetry2.trackCliOptionBudget(budget2),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliOptionName(name),telemetry2.trackCliFlagReconfigure(reconfigure),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagNoBackup(noBackup),telemetry2.trackCliFlagNoSessionMigration(noSessionMigration),telemetry2.trackCliFlagNoKeychain(noKeychain),telemetry2.trackCliOptionAgentConfig(agentConfig),telemetry2.trackCliOptionShellRc(shellRcOverride),telemetry2.trackCliOptionApply(applyMode),telemetry2.trackCliOptionBaseUrl(baseUrl),telemetry2.trackCliFlagYes(yes);let machine=shouldEmitNonInteractiveCommandError(client),canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir(),wantKeychain=!noKeychain&&isKeychainAvailable();if(budget2!==void 0&&(!Number.isFinite(budget2)||budget2<1))return failValidation(client,machine,AGENT_REASON.INVALID_BUDGET,"Budget must be a positive number in dollars (minimum 1).");if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod))return failValidation(client,machine,AGENT_REASON.INVALID_REFRESH_PERIOD,`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`);if(expiration&&!isValidExpiry(expiration))return failValidation(client,machine,AGENT_REASON.INVALID_EXPIRATION,`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`);if(applyMode!==void 0&&applyMode!=="edit"&&applyMode!=="prompt")return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --apply "${applyMode}". Must be "edit" or "prompt".`);if(baseUrl!==void 0&&!isValidBaseUrl(baseUrl))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --base-url "${baseUrl}". Must be an http(s) URL.`);let flagExpiresAt=expiration&&expiration!=="none"?presetToExpiresAt(expiration):void 0,overrides={};for(let pair of agentConfig??[]){let eq=pair.indexOf("="),id2=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id2||!path3)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --agent-config "${pair}". Use <agent>=<path>, e.g. claude-code=/path/settings.json.`);if(!getAgentById(id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id2}" in --agent-config.`);overrides[id2]=resolve2(path3)}dryRun&&!machine&&printStatus(`${import_chalk28.default.bold("Dry run")}: previewing changes only. No files will be written and no API key will be created.`);let topModelsPromise=(agentFlags?.length?agentFlags.some(id2=>getAgentById(id2.toLowerCase())?.needsTopModels):!0)?fetchTopModels(client):Promise.resolve(null),selection=await resolveAgents({client,agentFlags,all,canPrompt:canPrompt2,yes:!!yes,home});if("error"in selection)return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:selection.reason,message:selection.error}),output_manager_default.error(selection.error),{exitCode:1,outcome:"failed"};let{selected,guidance:guidance2,unsupported}=selection;for(let note of guidance2)printWarning(note);for(let id2 of Object.keys(overrides))if(!selected.some(a=>a.id===id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id2}", which isn't selected. Add --agent ${id2} (or --all).`);let agents=selected,gatewayModels;if(selected.some(a=>a.needsModelCatalogue))try{gatewayModels=await listModels(client)}catch(err){output_manager_default.debug(`Could not fetch the gateway model catalogue: ${err.message}`)}let agentWarnings=await collectAgentWarnings(selected,{home,overrides}),machineWarnings=agentWarnings.map(e2=>({agent:e2.agent.id,code:e2.warning.code,message:formatWarningMessage(e2.warning)})),consentSkipped=[],previewKey=providedKey??KEY_PLACEHOLDER;if(agentWarnings.length>0){let explicit=!!(agentFlags&&agentFlags.length>0||all);if(canPrompt2&&!yes&&!dryRun){let declined=await promptAgentConsent(client,agentWarnings);if(declined.size>0){agents=agents.filter(a=>!declined.has(a.id));for(let agent2 of selected)declined.has(agent2.id)&&printStatus(`Skipped ${agent2.displayName} \u2014 its configuration was left untouched.`);if(agents.length===0)return printStatus("Nothing to configure. No files were changed."),{exitCode:0,outcome:"canceled"}}}else if(explicit||canPrompt2&&!yes&&dryRun){for(let{warning:warning2}of agentWarnings)printAgentWarning(warning2);output_manager_default.print(`
|
|
158
158
|
`)}else{for(let[agent2,warnings]of groupWarningsByAgent(agentWarnings)){let message=`${warnings.map(formatWarningMessage).join(" ")} Pass --agent ${agent2.id} to configure it anyway.`;consentSkipped.push({target:agent2.id,reason:AGENT_REASON.REQUIRES_CONSENT,message}),printWarning(message)}if(agents=agents.filter(a=>!consentSkipped.some(s=>s.target===a.id)),agents.length===0&&!dryRun)return failConsent(client,machine,machineWarnings,consentSkipped)}}let sessionMigrations=[];if(!noSessionMigration){try{sessionMigrations=await planSessionMigrations(agents,{home})}catch(error){return failValidation(client,machine,"session_migration_failed",`${error instanceof Error?error.message:String(error)}. No configuration was changed. Pass --no-session-migration to leave existing sessions untouched and continue.`)}if(sessionMigrations.length>0&&canPrompt2&&!yes&&!dryRun){let count2=sessionMigrations.reduce((total,migration)=>total+migration.itemCount,0),agentNames=[...new Set(sessionMigrations.map(migration=>migration.agent))].join(" and ");await client.input.confirm(count2===1?`Copy your existing ${agentNames} Desktop session so it stays visible after switching to the AI Gateway? The original will be left unchanged.`:`Copy your ${count2} existing ${agentNames} Desktop sessions so they stay visible after switching to the AI Gateway? The originals will be left unchanged.`,!0)||(sessionMigrations=[],printStatus(`Skipped ${agentNames} Desktop session migration. Your existing sessions were left unchanged.`))}}let willCreate=!providedKey,unrecoverableKey=!1,existingKey=providedKey,keyName=name,keyBudget=budget2,keyRefresh=refreshPeriod,keyExpiresAt=flagExpiresAt,topModels=await topModelsPromise??void 0,preflightPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain:wantKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations),preflightSessionOnly=!providedKey&&!reconfigure&&preflightPlan.changes.every(change2=>change2.status==="unchanged")&&preflightPlan.migrations.length>0;if(applyMode==="prompt"&&!wantKeychain&&!preflightSessionOnly)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");if(willCreate&&!preflightSessionOnly&&agents.length>0&&(!dryRun||canPrompt2)){let promptCreate=canPrompt2&&!yes,wired=await configsPointAtGateway(agents,{apiKey:KEY_PLACEHOLDER,home,overrides,shellRcOverride,baseUrlOverride:baseUrl});if(promptCreate){let pasted=await promptExistingKey(client,wired?"existing":"create");pasted&&(existingKey=pasted,previewKey=pasted,willCreate=!1)}else if(wired&&!reconfigure){let stored=await recoverStoredKey({home,shellRcOverride});stored?(existingKey=stored,previewKey=stored,willCreate=!1):machine||(unrecoverableKey=!0)}if(willCreate&&!unrecoverableKey){if(await ensureTeam2(client,{machine,canPrompt:canPrompt2,yes:!!yes}))return{exitCode:1,outcome:"failed"};if(promptCreate&&keyName===void 0&&(keyName=await promptKeyName(client)),promptCreate){if(keyBudget===void 0&&keyRefresh===void 0){let quota=await promptQuota(client);keyBudget=quota.budget,keyRefresh=quota.refreshPeriod}keyExpiresAt===void 0&&!expiration&&(keyExpiresAt=await promptExpiry(client))}}}let useKeychain=wantKeychain;if(!preflightSessionOnly&&wantKeychain&&canPrompt2&&!yes&&(useKeychain=await promptKeychain(client)),canPrompt2&&!yes){let missing=agents.filter(a=>!overrides[a.id]&&!existsSync2(dirname6(a.configPath({apiKey:"",home}))));if(missing.length>0&&await client.input.confirm("Some agents weren't found at their default locations. Set custom config paths?",!1))for(let agent2 of missing){let resolved=agent2.configPath({apiKey:"",home}),picked=(await client.input.text({message:`${agent2.displayName} config path?`,default:resolved})).trim();picked&&resolve2(picked)!==resolved&&(overrides[agent2.id]=resolve2(picked))}}let previewPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(baseUrl&&!machine){let target=baseUrl.trim();previewPlan.changes.some(c=>c.next?.includes(target))||previewPlan.envExports.some(e2=>e2.value.includes(target))||previewPlan.notes.some(n=>n.notes.some(l=>l.includes(target)))||printWarning("--base-url has no effect for the selected agents.")}let changed=previewPlan.changes.filter(c=>c.status==="create"||c.status==="update"),errored=previewPlan.changes.filter(c=>c.status==="error"),noConfigChanges=changed.length===0&&errored.length===0,alreadyConfigured=noConfigChanges&&previewPlan.migrations.length===0,sessionOnly=!existingKey&&!reconfigure&&noConfigChanges&&previewPlan.migrations.length>0;if(machine)return runMachine({client,selected:agents,unsupported,warnings:machineWarnings,consentSkipped,previewPlan,dryRun:!!dryRun,backup:!noBackup,keySource:existingKey?{key:existingKey,created:!1}:null,createKey:()=>createKey(client,{name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt}),useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,home,alreadyConfigured,gatewayModels,reconfigure:!!reconfigure&&agents.length>0,promptMode:applyMode==="prompt"});if(unrecoverableKey&&changed.length>0)return printStatus("The selected agents already use the AI Gateway and the stored key could not be read, so nothing was written. Re-run with `--key <key>` to refresh them, or `--reconfigure` to create a new key."),{exitCode:0,outcome:"skipped"};if(alreadyConfigured){let skippedSome=agents.length<selected.length;if(dryRun&&agents.length===0&&consentSkipped.length>0)return printStatus(`All selected agents need explicit consent (see the warnings above) \u2014 a real run would fail. Pass ${consentSkipped.map(s=>`--agent ${s.target}`).join(" ")} (or --all) to consent. No files would be changed.`),{exitCode:0,outcome:"dry_run"};if(!dryRun&&useKeychain&&existingKey)return applyMode!=="prompt"&&await enforcePlanModes(previewPlan),storeKeyInKeychain(existingKey)?(printStatus(agents.length===0?"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key.":`${skippedSome?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`),printKey(existingKey,{keychain:!0}),{exitCode:0,outcome:"configured"}):(output_manager_default.error("Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead."),{exitCode:1,outcome:"failed"});let doReconfigure=!!reconfigure&&agents.length>0;if(!doReconfigure&&agents.length>0&&canPrompt2&&!yes&&!dryRun&&(doReconfigure=await client.input.confirm("These agents are already configured for the AI Gateway. Reconfigure them?",!1)),!doReconfigure)return!dryRun&&applyMode!=="prompt"&&await enforcePlanModes(previewPlan),printStatus(agents.length===0?"Every selected agent needs explicit consent (see the warnings above); the existing configuration already uses the AI Gateway.":`${skippedSome?"The remaining":"All selected"} agents are already configured for the AI Gateway.`),existingKey&&printKey(existingKey),{exitCode:0,outcome:"already_configured"}}if(printResolvedState({selected:agents,willCreate,name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,expiresAt:keyExpiresAt,keychain:wantKeychain?useKeychain:void 0,preserveKey:sessionOnly}),printPlan(previewPlan,previewKey,{backup:!noBackup}),dryRun)return printStatus(`Dry run: no files written. Re-run without ${import_chalk28.default.bold("--dry-run")} to apply.`),{exitCode:0,outcome:"dry_run"};let agentConfigChanged=changed.filter(c=>c.format!=="shell");if(agentConfigChanged.length===0&&errored.length>0&&previewPlan.migrations.length===0)return output_manager_default.error("Couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let applyAction=applyMode==="prompt"?"copy":"apply";if(applyMode===void 0&&(changed.length>0||previewPlan.migrations.length>0)&&canPrompt2&&!yes){if(useKeychain){let choice=await client.input.select({message:"Apply these changes?",choices:[{name:"Yes, write the files now",value:"apply"},{name:"Copy a prompt for my agent",value:"copy"},{name:"Cancel",value:"cancel"}],default:"apply"});if(choice==="cancel")return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"};applyAction=choice}else if(!await client.input.confirm("Apply these changes?",!0))return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"}}if(sessionOnly){if(applyAction==="copy"&&previewPlan.migrations.length>0){let promptText=buildAgentPrompt(previewPlan,KEY_PLACEHOLDER);return emitAgentPrompt(client,promptText,applyMode==="prompt","migration"),{exitCode:0,outcome:"agent_prompt"}}dryRun||await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return printSessionMigrationReceipt(migrated2,!0),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}if(applyAction==="copy"&&!useKeychain)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");let migrated=applyAction==="apply"?await applySessionMigrations(previewPlan):{results:[],errors:[]};if(migrated.errors.length>0)return printSessionMigrationReceipt(migrated),output_manager_default.error("Session migration did not complete, so no agent configuration was changed. Rerun the command to retry, or pass --no-session-migration to set up without copying sessions."),{exitCode:1,outcome:"failed"};if(migrated.results.length>0&&printSessionMigrationReceipt(migrated,!0),applyAction==="apply"&&agentConfigChanged.length===0&&errored.length>0)return output_manager_default.error("Copied the eligible sessions, but couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let keySource;try{keySource=existingKey?{key:existingKey,created:!1}:{key:await createKey(client,{name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt}),created:!0}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1,outcome:"failed"};throw err}if(useKeychain&&!storeKeyInKeychain(keySource.key)){if(applyAction==="copy")return output_manager_default.error("Failed to store the key in the macOS Keychain, so a prompt would expose your plaintext key. Re-run and choose Apply, or pass --no-keychain to write the key to the config files."),{exitCode:1,outcome:"failed"};printWarning("Failed to store the key in the macOS Keychain; writing it to the config files instead."),useKeychain=!1}let applyPlanResult=await buildSetupPlan(agents,{apiKey:keySource.key,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(applyAction==="copy"){let promptText=buildAgentPrompt(applyPlanResult,keySource.key);return emitAgentPrompt(client,promptText,applyMode==="prompt","setup"),printKey(keySource.key,{keychain:!0,created:keySource.created}),{exitCode:0,outcome:"agent_prompt"}}let results=await applyPlan(applyPlanResult,{backup:!noBackup});if(results.length===0&&keySource.created&&(output_manager_default.print(`
|
|
159
159
|
`),printAlignedLabel("Rotated","AI Gateway API key"),printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created}),output_manager_default.print(import_chalk28.default.dim(` No config files changed.
|
|
160
160
|
`))),results.length>0){let failed=new Set(errored.flatMap(c=>c.owners)),connected=selected.map(a=>a.displayName).filter(name2=>!failed.has(name2));output_manager_default.print(`
|
|
@@ -171,7 +171,7 @@ ${sections.join(`
|
|
|
171
171
|
`;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderTimeseriesTable(client,data,{metric:resolvedMetric,modality:resolvedModality,date:flags["--date"],entityLabel:config.entityLabel,label:config.label})}function renderTimeseriesTable(client,data,options){let rows=data.rows??[];if(options.date!==void 0&&!rows.some(r=>r.date===options.date)){let dates=availableDates(rows);return output_manager_default.error(`No data for ${options.date}.${dates.length?` Available dates: ${dates.slice(0,5).join(", ")}${dates.length>5?", \u2026":""}`:""}`),1}let filtered=filterTimeseries(rows,{metric:options.metric,date:options.date});if(filtered.length===0)return output_manager_default.log(`No ${options.label} data for ${options.metric}.`),0;let day=options.date??latestDate(rows);return output_manager_default.log(`${options.label} \xB7 ${import_chalk31.default.bold(options.metric)} \xB7 ${options.modality} \xB7 ${day}`),client.stdout.write(`${table([["#",options.entityLabel,"share"].map(header=>import_chalk31.default.gray(header)),...filtered.map((row,index)=>[String(index+1),row.name,`${row.share_percent.toFixed(2)}%`])],{align:["r","l","r"],hsep:3}).replace(/^/gm," ")}
|
|
172
172
|
`),printLicense(),0}async function runRankedLeaderboard(client,flags,telemetry2,config){telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format:format3}=formatResult;if(format3==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format3==="json"){let content=`${JSON.stringify(data,null,2)}
|
|
173
173
|
`;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderRankedTable(client,data,config.label)}function renderRankedTable(client,data,label){let rows=data.rows??[];if(rows.length===0)return output_manager_default.log(`No ${label} data.`),0;let lsStamp=stamp_default(),rankedBy=rows[0]?.ranked_by;return output_manager_default.log(`${label}${rankedBy?` \xB7 ${import_chalk31.default.bold(rankedBy)}`:""} ${lsStamp()}`),client.stdout.write(`${table([["#","name","description"].map(header=>import_chalk31.default.gray(header)),...rows.map(row=>[String(row.rank),row.name,row.description?row.description:dash2()])],{align:["r","l","l"],hsep:3}).replace(/^/gm," ")}
|
|
174
|
-
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-FVB5P54P.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-2SBYOL6R.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-TL7VBVR5.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
174
|
+
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-SEHUG246.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-5EKUX5OX.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-AKLXWJVE.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
175
175
|
`)}else if(output_manager_default.log(`aliases found under ${import_chalk32.default.bold(contextName)} ${lsStamp()}`),client.stdout.write(printAliasTable(aliases2)),pagination.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page run ${getCommandName(`alias ls${flags} --next ${pagination.next}`)}`)}return 0}function printAliasTable(aliases2){return`${table([["source","url","age"].map(header=>import_chalk32.default.gray(header)),...aliases2.map(a=>[a.deployment?.url?a.deployment.url:import_chalk32.default.gray("\u2013"),a.alias,(0,import_ms2.default)(Date.now()-a.createdAt)])],{align:["l","l","r"],hsep:4}).replace(/^/gm," ")}
|
|
176
176
|
|
|
177
177
|
`}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id2){return client.fetch(`/now/aliases/${id2}`,{method:"DELETE"})}async function findAliasByAliasOrId(client,aliasOrId){return client.fetch(`/now/aliases/${encodeURIComponent(getSafeAlias(aliasOrId))}`)}function getSafeAlias(alias2){return alias2.replace(/^https:\/\//i,"").replace(/^\.+/,"").replace(/\.+$/,"").toLowerCase()}var AliasRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentAlias(alias2){alias2&&this.trackCliArgument({arg:"alias",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,contextName=await getContextName(client),telemetryClient=new AliasRemoveTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagYes(opts["--yes"]);let[aliasOrId]=args;if(telemetryClient.trackCliArgumentAlias(aliasOrId),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("alias rm <alias>")}`)}`),2;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),2;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),2;let alias2=await findAliasByAliasOrId(client,aliasOrId);if(!alias2)return output_manager_default.error(`Alias not found by "${aliasOrId}" under ${import_chalk33.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("alias ls")} to see your aliases.`),1;let removeStamp=stamp_default();return!opts["--yes"]&&!await confirmAliasRemove(client,alias2)?(output_manager_default.log("Canceled"),0):(await removeAliasById(client,alias2.uid),output_manager_default.success(`Alias ${import_chalk33.default.bold(alias2.alias)} removed ${removeStamp()}`),0)}async function confirmAliasRemove(client,alias2){let srcUrl=alias2.deployment?import_chalk33.default.underline(alias2.deployment.url):null,tbl=table([[...srcUrl?[srcUrl]:[],import_chalk33.default.underline(alias2.alias),import_chalk33.default.gray(`${(0,import_ms3.default)(Date.now()-alias2.createdAt)} ago`)]],{hsep:4});return output_manager_default.log("The following alias will be removed permanently"),output_manager_default.print(` ${tbl}
|
|
@@ -301,7 +301,7 @@ ${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(hea
|
|
|
301
301
|
`),0}let scope=describeScope2(git.repository,branch,commitSha);if(runs.length===0){let filtered=!!(status6||commitSha||flags["--next"]);return output_manager_default.log(filtered?"No Vercel CI runs match the current filters.":`No Vercel CI runs found for ${scope}.`),0}return output_manager_default.log(`${(0,import_pluralize6.default)("Vercel CI run",runs.length,!0)} for ${scope} ${import_chalk57.default.gray(lsStamp())}`),output_manager_default.print(`
|
|
302
302
|
${formatRunsTable(invocations)}
|
|
303
303
|
|
|
304
|
-
`),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand7)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand5)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand8),inspect:getCommandAliases(inspectSubcommand6),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand6)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-IU2VMHWZ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-NP444BUR.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-BCDQQ6I2.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-VKJAE7KO.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-VKJAE7KO.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-EDTBD7PX.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-NIPKCWUT.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand8):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-5LMFTD7U.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk58=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets2){return targets2.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk58.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk58.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk58.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk58.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk58.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk58.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
|
|
304
|
+
`),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand7)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand5)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand8),inspect:getCommandAliases(inspectSubcommand6),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand6)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-SLCLHRCE.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-ZOCLC6EL.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-MDSF5FRG.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-JFM5IA7H.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-JFM5IA7H.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-ELV6KOAC.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-5WC3BAXY.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand8):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-TFJSUTGX.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk58=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets2){return targets2.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk58.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk58.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk58.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk58.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk58.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk58.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
|
|
305
305
|
|
|
306
306
|
Expected --data schema for connection method "${method.connectionMethod}":
|
|
307
307
|
${JSON.stringify(schema,null,2)}`:"";throw new ConnexMethodError(`Connection method "${method.connectionMethod}" needs credentials passed with --data. Pass --data @<path> to read from a file.${hint}`)}return data}async function promptCredential(client,method,opts){let validate=opts.required?value=>value.trim().length>0||`${opts.key} is required.`:void 0;return(isSecretInputKey(method,opts.key)?await client.input.password({message:opts.message,mask:!0,validate}):await client.input.text({message:opts.message,validate})).trim()}function missingCredentialsError(method){let fields=describeCredentialFields(method),withFields=fields?` with: ${fields}`:"";return new ConnexMethodError(`Missing credentials. Provide --data${withFields}. Pass --data @<path> to read from a file.`)}async function resolveConnexConnectionMethod(client,opts){let{methods,targets:targets2,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets2,opts.service):void 0;if(connectionMethodFlag){let method2=methods.find(candidate=>candidate.connectionMethod===connectionMethodFlag);if(!method2)throw new ConnexMethodError(`Unknown connection method "${connectionMethodFlag}" for "${opts.service}". Available: ${formatMethodOptions(methods)}.`);if(explicitTarget&&!servesTarget(method2,explicitTarget))throw new ConnexMethodError(`Connection method "${method2.connectionMethod}" doesn't connect to target "${explicitTarget}".`);return{method:method2,target:explicitTarget??soleTargetOf(method2)}}if(opts.resolvedConnectionMethod){let method2=methods.find(candidate=>candidate.connectionMethod===opts.resolvedConnectionMethod);if(method2&&(!explicitTarget||servesTarget(method2,explicitTarget)))return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method2),{method:method2,target:explicitTarget??soleTargetOf(method2)}}let width=choiceWidth(client),chosenTarget=explicitTarget;!chosenTarget&&targets2&&targets2.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets2.map(target2=>({label:target2.label,description:target2.description,docsUrl:target2.docsUrl})),width),chosenTarget=await client.input.select({message:"What do you want to connect to?",choices:targets2.map(target2=>({name:choiceLabel(target2.label,width),value:target2.target}))}));let candidates=chosenTarget?methods.filter(method2=>servesTarget(method2,chosenTarget)):methods;if(candidates.length===0)throw new ConnexMethodError(`No connection method for "${opts.service}" connects to target "${chosenTarget}".`);if(candidates.length>1){if(!opts.interactive)throw new ConnexMethodError(`Missing --connection-method. "${opts.service}" supports: ${formatMethodOptions(candidates)}. Re-run with --connection-method <value>.`);printOptionCatalog(`Connection methods for ${opts.serviceName}:`,candidates.map(method3=>({label:method3.label,badge:createPathBadge(method3),description:method3.description,docsUrl:method3.docUrl})),width);let slug=await client.input.select({message:`How do you want to connect to ${opts.serviceName}?`,choices:candidates.map(method3=>({name:choiceLabel(method3.label,width),value:method3.connectionMethod}))}),method2=candidates.find(candidate=>candidate.connectionMethod===slug);if(!method2)throw new ConnexMethodError(`Unknown connection method "${slug}".`);return{method:method2,target:chosenTarget??soleTargetOf(method2)}}let method=candidates[0],target=chosenTarget??soleTargetOf(method);return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method),{method,target}}async function confirmMethodSelection(client,serviceName,method){let badge=createPathBadge(method),suffix=badge?` (${badge})`:"";if(!await client.input.confirm(`Connect to ${serviceName} with ${method.label}${suffix}?`,!0))throw new ConnexMethodError("Canceled.")}async function collectTemplateParams(client,method,suppliedParams,interactive){let fields=method.templateFields??[];if(fields.length===0){if(Object.keys(suppliedParams).length>0)throw new ConnexMethodError(`Connection method "${method.connectionMethod}" takes no --param values.`);return{}}let known=new Set(fields.map(field=>field.key));for(let key of Object.keys(suppliedParams))if(!known.has(key))throw new ConnexMethodError(`Unknown --param "${key}" for connection method "${method.connectionMethod}". Valid keys: ${fields.map(field=>field.key).join(", ")}.`);let params={};for(let field of fields){let supplied=(suppliedParams[field.key]??"").trim();if(supplied){let problem=templateValueProblem(field,supplied);if(problem)throw new ConnexMethodError(`Invalid --param ${field.key}="${supplied}". ${problem}`);params[field.key]=supplied;continue}if(interactive){let answer=await client.input.text({message:promptMessage(field),default:field.default,validate:value=>{let trimmed=value.trim();return trimmed?templateValueProblem(field,trimmed)??!0:`${field.label} is required.`}});params[field.key]=answer.trim();continue}if(field.default!==void 0){params[field.key]=field.default;continue}throw new ConnexMethodError(`Missing --param ${field.key}=<value> (${describeField(field)}) for connection method "${method.connectionMethod}".`)}return params}function promptMessage(field){let hints=[];return field.placeholder&&hints.push(`e.g. ${field.placeholder}`),field.help&&hints.push(field.help),hints.length>0?`${field.label} ${import_chalk58.default.dim(hints.join(" \xB7 "))}`:field.label}function describeField(field){return field.placeholder?`"${field.label}", e.g. ${field.placeholder}`:`"${field.label}"`}var HOSTNAME_RE=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;function templateValueProblem(field,value){let sample=field.default??field.placeholder;if(!(!sample||!HOSTNAME_RE.test(sample)||HOSTNAME_RE.test(value)))return`Enter a hostname like ${sample}, without the https:// prefix.`}function printOptionCatalog(heading,entries,width){if(entries.some(entry2=>entry2.description||entry2.docsUrl)){output_manager_default.print(`
|
|
@@ -475,15 +475,15 @@ ${import_chalk107.default.yellow("!")} No exposures or metric events in this win
|
|
|
475
475
|
`),output_manager_default.print(`${diagnosedEventRow(event)}
|
|
476
476
|
`),printed+=1}}function diagnosedEventRow(event){return diagnosedRow({time:diagnosedEventCells.time(event),kind:diagnosedEventCells.kind(event),what:diagnosedEventCells.what(event),variant:diagnosedEventCells.variant(event),unit:diagnosedEventCells.unit(event),note:diagnosedEventCells.note(event)})}function diagnosedHeader(){return import_chalk107.default.dim(diagnosedRow({time:"Time",kind:"Kind",what:"What",variant:"Variant",unit:"Unit",note:"Note"}))}function diagnosedRow(cells){return[padCell(cells.time,DIAGNOSED_COLUMN_WIDTHS.time),padCell(cells.kind,DIAGNOSED_COLUMN_WIDTHS.kind),padCell(cells.what,DIAGNOSED_COLUMN_WIDTHS.what),padCell(cells.variant,DIAGNOSED_COLUMN_WIDTHS.variant),padCell(cells.unit,DIAGNOSED_COLUMN_WIDTHS.unit),cells.note].join(" ").trimEnd()}var diagnosedEventCells={time:event=>import_chalk107.default.gray(event.timestamp),kind:event=>event.kind==="exposure"?import_chalk107.default.cyan(event.kind):import_chalk107.default.magenta(event.kind),what:event=>diagnosedEventName(event),variant:event=>event.variantId?import_chalk107.default.bold(event.variantId):import_chalk107.default.dim("\u2014"),unit:event=>event.unit??import_chalk107.default.dim("\u2014"),note:event=>event.assignmentReason?import_chalk107.default.yellow(event.assignmentReason):""};function padCell(value,width){return value+" ".repeat(Math.max(0,width-strlen(value)))}function diagnosedEventName(event){return event.name??(event.kind==="exposure"?"assigned":"\u2014")}import{readFile as readFile7}from"node:fs/promises";import{resolve as resolve10}from"node:path";function getProjectNameFromFlags(flags){return flags["--project"]}function getLinkedFlagsProject(client,projectName,options){return resolveProjectContext({client,projectNameOrId:projectName,projectNotFoundHandling:options?.projectNotFoundHandling})}function isJson(flags){return flags["--format"]==="json"}function validateFormat(flags){let format3=flags["--format"];return format3===void 0||format3==="json"?!0:(output_manager_default.error("The --format option only accepts `json`."),!1)}async function resolveProject2(client,flags){let projectName=getProjectNameFromFlags(flags),link=await getLinkedFlagsProject(client,projectName);return link.status==="error"?link.exitCode:link.status==="not_linked"?(output_manager_default.error(`Your codebase isn't linked to a project. Pass --project <name-or-id>, or run ${getCommandName("link")}.`),1):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,link)}function parseSubcommand(argv,command2){try{let parsed=parseArguments(argv,getFlagsSpecification(command2.options));return validateFormat(parsed.flags)?parsed:void 0}catch(error){printError(error);return}}function requireExperimentArgument(args,usage2){let[experiment,extra]=args;if(!experiment){output_manager_default.error(`Missing required argument: experiment. Usage: ${getCommandName(usage2)}`);return}if(extra){output_manager_default.error(`Too many arguments. Usage: ${getCommandName(usage2)}`);return}return experiment}function writeJson2(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
477
477
|
`)}var EXPERIMENTS_NOT_ENABLED_MESSAGE="Experiments are not enabled for this team.",EXPERIMENTS_LIMITED_PREVIEW_MESSAGE="This command is currently in limited preview and isn\u2019t enabled for your team.";function printExperimentError(client,error,json=!1){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){json||client.nonInteractive?writeJson2(client,{status:"error",reason:"experiments_not_enabled",message:EXPERIMENTS_LIMITED_PREVIEW_MESSAGE,userActionRequired:!0}):output_manager_default.error(EXPERIMENTS_LIMITED_PREVIEW_MESSAGE);return}printError(error)}function jsonResult(experiment,next,extra={}){return{status:"success",experiment,...extra,next}}function printMutationPreview(link,experiment,transition,effect){let experimentIdentifier=getExperimentIdentifier(experiment);printAlignedLabel("Project",formatProject(link.org.slug,link.project.name)),printAlignedLabel("Experiment",experimentIdentifier),printAlignedLabel("State",transition),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Effect",effect),output_manager_default.print(`
|
|
478
|
-
`)}async function confirmMutation({client,flags,link,experiment,transition,effect,prompt}){let json=isJson(flags),yes=flags["--yes"]===!0;if(json||printMutationPreview(link,experiment,transition,effect),!yes){if(json||client.nonInteractive||!client.stdin.isTTY){let nextCommand=buildCommandWithYes(client.argv);return json||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Re-run with --yes to apply this production change.",userActionRequired:!0,next:[{command:nextCommand}]}):output_manager_default.error(`Missing required flag --yes. Re-run \`${nextCommand}\`.`),2}return await client.input.confirm(prompt,!1)?void 0:outputCanceled()}}function outputCanceled(){return output_manager_default.log("Canceled"),0}async function readAllStdin(client){if(client.stdin.isTTY)return"";let chunks=[];client.stdin.setEncoding("utf8");for await(let chunk of client.stdin)chunks.push(String(chunk));return chunks.join("")}async function readJsonObject(client,file){if(typeof file!="string"){output_manager_default.error("Missing required option --file <file>.");return}try{let source=file==="-"?await readAllStdin(client):await readFile7(resolve10(client.cwd,file),"utf8");if(!source.trim()){output_manager_default.error(file==="-"?"No JSON received on stdin for --file -.":`The file ${file} is empty.`);return}let value=JSON.parse(source);if(typeof value!="object"||value===null||Array.isArray(value)){output_manager_default.error("The JSON request body must be an object.");return}return value}catch(error){output_manager_default.error(`Failed to read experiment JSON: ${error instanceof Error?error.message:String(error)}`);return}}async function fetchExperimentContext(client,parsed,usage2){let id2=requireExperimentArgument(parsed.args,usage2);if(!id2)return 2;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiment\u2026");let experiment=await getExperiment(client,link.project.id,id2);return output_manager_default.stopSpinner(),{link,experiment}}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function mutateExperiment(client,flags,context,spinner,mutation,resultLabel){try{output_manager_default.spinner(spinner);let experiment=await mutation();output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel(resultLabel,experiment.name,{gutter:"\u2713"}),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),experiment.rampPercentage!==void 0&&printAlignedLabel("Ramp",`${experiment.rampPercentage}%`),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(flags)),1}}async function confirmAndMutateExperiment({client,flags,context,transition,effect,prompt,spinner,mutation,resultLabel}){let confirmation=await confirmMutation({client,flags,link:context.link,experiment:context.experiment,transition,effect,prompt});return confirmation!==void 0?confirmation:mutateExperiment(client,flags,context,spinner,mutation,resultLabel)}function parseRamp(flags){let ramp=flags["--ramp"];if(typeof ramp!="number"||!Number.isFinite(ramp)||ramp<0||ramp>100){output_manager_default.error("Provide --ramp as a percentage from 0 to 100.");return}return ramp}function requireExperimentState(experiment,expected,action){let states=Array.isArray(expected)?expected:[expected];return states.includes(experiment.state)?!0:(output_manager_default.error(`Cannot ${action} while the experiment is ${experiment.state}. Expected state: ${states.join(" or ")}.`),!1)}function unitKeyFromBase(experiment){let{kind,attribute}=experiment.base;return attribute==="id"&&(kind==="device"||kind==="user"||kind==="group")?`${kind}_id`:`event_data.${attribute==="id"?`${kind.replace(/[^A-Za-z0-9_]/g,"_")}Id`:attribute.replace(/[^A-Za-z0-9_]/g,"_")}`}async function runAnalyze(client,argv){let parsed=parseSubcommand(argv,analyzeSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments analyze <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,metrics2=experiment.metrics??{};if(Object.keys(metrics2).length===0)return output_manager_default.error("This experiment has no metrics to analyze."),1;let primaryMetric=typeof parsed.flags["--metric"]=="string"?parsed.flags["--metric"]:experiment.primaryMetric;if(primaryMetric&&!(primaryMetric in metrics2))return output_manager_default.error(`Metric ${primaryMetric} isn't configured. Choose one of: ${Object.keys(metrics2).join(", ")}.`),1;let epoch=experiment.rampId?experiment.epochs.find(item=>item.rampId===experiment.rampId):experiment.epochs.at(-1);if(!epoch)return output_manager_default.error("This experiment has no analysis epoch. Start it before requesting results."),1;let body={metrics:metrics2,...primaryMetric?{primaryMetric}:{},controlVariantId:experiment.controlVariantId,expectedVariantWeights:experiment.weights,excludeContaminated:parsed.flags["--exclude-contaminated"]===!0,unitKey:unitKeyFromBase(experiment),rampId:epoch.rampId,from:new Date(epoch.startedAt).toISOString(),...epoch.endedAt?{to:new Date(epoch.endedAt).toISOString()}:{}};try{output_manager_default.spinner("Analyzing experiment\u2026");let analysis=await getExperimentAnalysis(client,context.link.project.id,experiment.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment),assessment=assessExperimentAnalysis(experiment,analysis);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next,{analysis,assessment})):(printExperimentAnalysis(experiment,analysis,assessment),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runCreate(client,argv){let parsed=parseSubcommand(argv,createSubcommand4);if(!parsed)return 2;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Creating experiment\u2026");let experiment=await createExperiment(client,link.project.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel("Created",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Experiment",experiment.id),experiment.slug&&printAlignedLabel("Slug",experiment.slug),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("State",experiment.state),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runDecide(client,argv){let parsed=parseSubcommand(argv,decideSubcommand);if(!parsed)return 2;let winner=parsed.flags["--winner"],abandon=parsed.flags["--abandon"]===!0,rationale=parsed.flags["--rationale"];if(typeof winner=="string"===abandon)return output_manager_default.error("Use exactly one of --winner <variant-id> or --abandon."),2;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),2;let context=await fetchExperimentContext(client,parsed,"experiments decide <experiment> (--winner <variant-id>|--abandon) --rationale <text>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","make a decision"))return 1;if(typeof winner=="string"&&!context.experiment.variants.some(variant=>variant.id===winner))return output_manager_default.error(`Variant ${winner} isn't part of this experiment. Choose one of: ${context.experiment.variants.map(variant=>variant.id).join(", ")}.`),1;let effect=abandon?"Stop the experiment and serve control":`Stop the experiment and serve variant ${winner}`;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 completed`,effect,prompt:"Record this experiment decision?",spinner:"Recording experiment decision\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"complete",outcome:abandon?"abandon":"winner",...typeof winner=="string"?{winnerVariantId:winner}:{},rationale}),resultLabel:abandon?"Abandoned":"Completed"})}async function runDelete(client,argv){let parsed=parseSubcommand(argv,deleteSubcommand2);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments delete <experiment> --confirm <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,experimentIdentifier=getExperimentIdentifier(experiment),proof=parsed.flags["--confirm"],proofMatches=proof===experiment.id||proof===experiment.slug||proof===parsed.args[0];if(isJson(parsed.flags)||printMutationPreview(context.link,experiment,`${experiment.state} \u2192 deleted`,`Delete experiment data and release feature flag ${experiment.flagSlug}`),!proofMatches){if(isJson(parsed.flags)||client.nonInteractive||!client.stdin.isTTY){let command2=buildCommandWithGlobalFlags(client.argv,`experiments delete ${experimentIdentifier} --confirm ${experimentIdentifier}`,void 0,{preserveProject:!0});return isJson(parsed.flags)||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Deleting an experiment permanently removes its history and releases its feature flag.",userActionRequired:!0,next:[{command:command2}]}):output_manager_default.error(`Provide --confirm ${experimentIdentifier} to delete this experiment non-interactively.`),1}if(await client.input.text({message:`Type ${experimentIdentifier} to confirm deletion:`})!==experimentIdentifier)return outputCanceled()}try{output_manager_default.spinner("Deleting experiment\u2026"),await deleteExperiment(client,context.link.project.id,experiment.id),output_manager_default.stopSpinner();let next=buildDeletedNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,{status:"success",deletedExperiment:{id:experiment.id,slug:experiment.slug,name:experiment.name},releasedFlag:{id:experiment.flagId,slug:experiment.flagSlug},next}):(printAlignedLabel("Deleted",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Released Flag",experiment.flagSlug),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_chalk108=__toESM(require_source(),1);var MAX_DIAGNOSE_EVENTS=200,DEFAULT_DIAGNOSE_EVENTS=50,DIAGNOSE_LOOKBACK_MS=30*24*60*60*1e3,FOLLOW_TIMEOUT_MS=5*60*1e3,FOLLOW_POLL_INTERVAL_MS=5e3,FOLLOW_PAGE_LIMIT=200;async function followExperimentEvents({client,experiment,ownerId,projectId,filter,unitField,from,seen,json,printedSoFar=0,intervalMs=FOLLOW_POLL_INTERVAL_MS,timeoutMs=FOLLOW_TIMEOUT_MS}){let printEvent=createDiagnosedEventPrinter(printedSoFar),abortController=new AbortController,deadline=setTimeout(()=>{abortController.abort()},timeoutMs),onSigint=()=>{abortController.abort()};process.on("SIGINT",onSigint);let watermark=from,watermarkSeen=seen;try{for(;!abortController.signal.aborted&&(await sleepUnlessAborted(intervalMs,abortController.signal),!abortController.signal.aborted);){let end=new Date;if(end.getTime()<=watermark.getTime())continue;let rows;try{rows=(await queryAnalyticsEvents(client,ownerId,projectId,{filter,select:["type","eventName","eventData"],start:toWholeSecondIso(watermark),end:toWholeSecondIso(end),limit:FOLLOW_PAGE_LIMIT,order:"asc"})).events??[]}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,json),1}let events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),fresh=withoutSeen(events,watermarkSeen);if(fresh.length>0){output_manager_default.stopSpinner();for(let event of fresh)json?writeJson2(client,event):printEvent(event)}let latest=events.at(-1)?.timestamp;if(latest){let latestDate2=new Date(latest);latestDate2.getTime()>watermark.getTime()?(watermark=latestDate2,watermarkSeen=countByKey(events.filter(event=>event.timestamp===latest))):watermarkSeen=countByKey(events)}abortController.signal.aborted||output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`)}}finally{clearTimeout(deadline),process.removeListener("SIGINT",onSigint),output_manager_default.stopSpinner()}return 0}async function runDiagnose(client,argv){let parsed=parseSubcommand(argv,diagnoseSubcommand);if(!parsed)return 2;let jsonOutput=isJson(parsed.flags),fail2=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail2({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk108.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk108.default.bold("--until")}.`});let limit=validateIntegerRangeWithDefault(parsed.flags["--limit"],{flag:"--limit",min:1,max:MAX_DIAGNOSE_EVENTS,defaultValue:DEFAULT_DIAGNOSE_EVENTS});if(!limit.valid)return fail2(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail2(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail2(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail2(order);let context=await fetchExperimentContext(client,parsed,"experiments diagnose <experiment>");if(typeof context=="number")return context;let{experiment,link}=context,names=metricEventNames(experiment),requestedEvents=normalizeRepeatableStringFilters(parsed.flags["--event"]),unknownEvents=requestedEvents.filter(name=>!names.includes(name));if(unknownEvents.length>0)return fail2({valid:!1,code:"UNKNOWN_METRIC_EVENT",message:`This experiment has no metric event named ${unknownEvents.map(name=>`"${name}"`).join(", ")}. Choose from: ${names.join(", ")||"(none configured)"}.`,allowedValues:names});let wantsExposures=!!parsed.flags["--exposures"]||requestedEvents.length===0,eventNames=requestedEvents.length>0?requestedEvents:parsed.flags["--exposures"]?[]:names,limitValue=limit.value,end=until.value??new Date,window={start:toWholeSecondIso(since.value??defaultRangeStart(experiment,end)),end:toWholeSecondIso(end)},unitValue=typeof parsed.flags["--unit"]=="string"?parsed.flags["--unit"]:"",unitClause=unitValue?` AND eventData:*${unitValue.replaceAll("*","")}*`:"",branches=[wantsExposures?`type:exposure AND eventName:${quoteFilterValue(experiment.id)}${unitClause}`:void 0,eventNames.length>0?`type:event AND eventName:(${eventNames.map(quoteFilterValue).join(" OR ")})${unitClause}`:void 0].filter(branch=>branch!==void 0);if(branches.length===0)return output_manager_default.error("Nothing selected. Drop --exposures, or name a metric event with --event."),1;let followFilter=branches.length===1?branches[0]:branches.map(branch=>`(${branch})`).join(" OR "),diagnosis;try{output_manager_default.spinner("Reading experiment events\u2026");let projectId=await resolveAnalyticsProjectId(client,link.org.id,link.project.id),rows=(await queryAnalyticsEvents(client,link.org.id,projectId,{filter:followFilter,select:["type","eventName","eventData"],...window,limit:limitValue})).events??[],declaredUnitKey=rows.map(row=>parseEventData(row.eventData).unitKey).find(key=>typeof key=="string"),unitField=unitFieldFromKey(declaredUnitKey??unitKeyFromBase(experiment)),events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),exposures=events.filter(event=>event.kind==="exposure"),enrolled=exposures.filter(event=>event.assignmentReason===void 0);diagnosis={events,projectId,exposureCount:exposures.length,metricEventCount:events.length-exposures.length,enrolledUnits:new Set(enrolled.map(event=>event.unit).filter(Boolean)).size,notEnrolledExposures:exposures.length-enrolled.length,metricEventNames:names,unitField,truncated:rows.length>=limitValue,staleRampExposures:experiment.rampId?exposures.filter(event=>event.rampId!==void 0&&event.rampId!==experiment.rampId).length:0,window},output_manager_default.stopSpinner()}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,jsonOutput),1}if(jsonOutput?writeJson2(client,{status:"success",experiment:{id:experiment.id,slug:experiment.slug,state:experiment.state,rampId:experiment.rampId},diagnosis}):printExperimentDiagnosis(experiment,diagnosis,{follow:!!parsed.flags["--follow"]}),parsed.flags["--follow"]){let newest=diagnosis.events[0]?.timestamp,from=newest?new Date(newest):new Date(diagnosis.window.end),seen=newest?countByKey(diagnosis.events.filter(event=>event.timestamp===newest)):new Map;return output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`),followExperimentEvents({client,experiment,ownerId:link.org.id,projectId:diagnosis.projectId,filter:followFilter,unitField:diagnosis.unitField,from,seen,json:jsonOutput,printedSoFar:diagnosis.events.length})}return 0}function sleepUnlessAborted(ms45,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms45);signal.addEventListener("abort",settle,{once:!0})})}function printDiagnoseError(client,error,json){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){printExperimentError(client,error,json);return}if(isAPIError(error)&&error.status===402){output_manager_default.error("Reading custom events and experiment exposures requires a Pro or Enterprise plan.");return}if(isAPIError(error)&&error.status===403){output_manager_default.error("Cannot read experiment exposures. Web Analytics must be enabled for the project, and exposures are behind the `web-analytics-exposure-events` flag.");return}printExperimentError(client,error,json)}function countByKey(events){let counts=new Map;for(let event of events){let key=diagnosedEventKey(event);counts.set(key,(counts.get(key)??0)+1)}return counts}function diagnosedEventKey(event){return[event.timestamp,event.kind,event.name??"",event.unit??"",event.variantId??""].join("\0")}function withoutSeen(events,seen){let remaining=new Map(seen),fresh=[];for(let event of events){let key=diagnosedEventKey(event),outstanding=remaining.get(key)??0;if(outstanding>0){remaining.set(key,outstanding-1);continue}fresh.push(event)}return fresh}function toWholeSecondIso(date){let truncated=new Date(date);return truncated.setUTCMilliseconds(0),truncated.toISOString()}function toDiagnosedEvent(row,kind,unitField){let payload=parseEventData(row.eventData),pick=key=>typeof payload[key]=="string"?payload[key]:void 0,unit=pick(kind==="exposure"?"unitValue":unitField),variantId=pick("variantId"),rampId=pick("rampId"),assignmentReason=pick("assignmentReason");return{timestamp:row.timestamp,kind,...kind==="event"&&row.eventName?{name:row.eventName}:{},...unit?{unit}:{},...variantId?{variantId}:{},...rampId?{rampId}:{},...assignmentReason&&assignmentReason!=="experiment"?{assignmentReason}:{},...Object.keys(payload).length>0?{payload}:{}}}function parseEventData(raw){if(!raw)return{};try{let parsed=JSON.parse(raw);return parsed!==null&&typeof parsed=="object"?parsed:{}}catch{return{}}}function unitFieldFromKey(unitKey){return unitKey.startsWith("event_data.")?unitKey.slice(11):unitKey}function metricEventNames(experiment){let names=new Set,add16=value=>{typeof value=="string"&&value.length>0&&names.add(value)};for(let metric of Object.values(experiment.metrics??{}))add16(metric.eventName),add16(metric.initialEvent),add16(metric.goalEvent),add16(metric.numeratorEvent),add16(metric.denominatorEvent),Array.isArray(metric.eventNames)&&metric.eventNames.forEach(add16);return[...names]}function quoteFilterValue(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function defaultRangeStart(experiment,end){let launchedAt=experiment.launchedAt??experiment.createdAt;return new Date(Math.max(launchedAt,end.getTime()-DIAGNOSE_LOOKBACK_MS))}async function runInspect(client,argv){let parsed=parseSubcommand(argv,inspectSubcommand8);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments inspect <experiment>");if(typeof context=="number")return context;let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next)):(printExperimentDetails(context.experiment),printNextCommands(next)),0}async function runList(client,argv){let parsed=parseSubcommand(argv,listSubcommand13);if(!parsed)return 2;let state=parsed.flags["--state"];if(state!==void 0&&state!=="draft"&&state!=="running"&&state!=="completed")return output_manager_default.error("The --state option must be draft, running, or completed."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiments\u2026");let all=await listExperiments(client,link.project.id);output_manager_default.stopSpinner();let experiments2=state?all.filter(experiment=>experiment.state===state):all,next=buildListNextCommands(client);return isJson(parsed.flags)?(writeJson2(client,{status:"success",experiments:experiments2,next}),0):(experiments2.length===0?output_manager_default.log(state?`No experiments match state ${state}.`:"No experiments found."):printExperimentsTable(experiments2),printNextCommands(next),0)}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_open7=__toESM(require_open(),1);async function runOpen(client,argv){let parsed=parseSubcommand(argv,openSubcommand3);if(!parsed)return 2;let[id2,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),2;let tab=parsed.flags["--tab"]??"configuration";if(tab!=="configuration"&&tab!=="analysis")return output_manager_default.error("The --tab option must be configuration or analysis."),1;if(!id2&&parsed.flags["--tab"]!==void 0)return output_manager_default.error("The --tab option requires an experiment argument."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;let experiment;try{id2?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id2),output_manager_default.stopSpinner()):(output_manager_default.spinner("Checking experiment access\u2026"),await listExperiments(client,link.project.id),output_manager_default.stopSpinner());let base=`https://vercel.com/${encodeURIComponent(link.org.slug)}/${encodeURIComponent(link.project.name)}/flags`,url=experiment?`${base}/experiment/${encodeURIComponent(experiment.id)}/${tab}`:base;return client.stdout.isTTY?(output_manager_default.log(`Opening ${experiment?`experiment ${getExperimentIdentifier(experiment)}`:"experiments"} in your browser\u2026`),output_manager_default.log(`Visit this URL if the browser doesn't open: ${url}`),(0,import_open7.default)(url).catch(()=>{}),printNextCommands(experiment?buildExperimentNextCommands(client,experiment):buildListNextCommands(client))):client.stdout.write(`${url}
|
|
479
|
-
`),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error),1}}async function runReseedEnrollment(client,argv){let parsed=parseSubcommand(argv,reseedEnrollmentSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments reseed-enrollment <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="completed")return output_manager_default.error("Cannot reseed a completed experiment. Return it to draft first."),1;let running=context.experiment.state==="running";return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:running?"Reassign enrollment and start a new analysis epoch":"Reassign enrollment for the next run",prompt:"Reseed enrollment for this experiment?",spinner:"Reseeding enrollment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"reseed-enrollment"}),resultLabel:"Reseeded"})}async function runRestartAnalysis(client,argv){let parsed=parseSubcommand(argv,restartAnalysisSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments restart-analysis <experiment>");return typeof context=="number"?context:requireExperimentState(context.experiment,"running","restart its analysis")?confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:"Start a new analysis epoch without changing enrollment",prompt:"Restart analysis for this experiment?",spinner:"Restarting analysis\u2026",mutation:()=>updateExperiment(client,context.link.project.id,context.experiment.id,{restartAnalysis:!0}),resultLabel:"Restarted"}):1}async function runReturnToDraft(client,argv){let parsed=parseSubcommand(argv,returnToDraftSubcommand);if(!parsed)return 2;let cause=parsed.flags["--cause"];if(cause!==void 0&&cause!=="manual"&&cause!=="guardrail"&&cause!=="srm")return output_manager_default.error("The --cause option must be manual, guardrail, or srm."),1;let reason=parsed.flags["--reason"];if(typeof reason=="string"&&reason.trim().length===0)return output_manager_default.error("The --reason option cannot be empty."),1;let context=await fetchExperimentContext(client,parsed,"experiments return-to-draft <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="draft"){let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next,{changed:!1})):(output_manager_default.log("Experiment is already in draft."),printNextCommands(next)),0}let action={action:"return-to-draft",...cause?{cause}:{},...typeof reason=="string"?{reason}:{}};return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 draft`,effect:"Serve control and stop the active measurement window",prompt:"Return this experiment to draft?",spinner:"Returning experiment to draft\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,action),resultLabel:"Returned"})}async function runSetRamp(client,argv){let parsed=parseSubcommand(argv,setRampSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments set-ramp <experiment> --ramp <percentage>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","change its ramp"))return 1;let current=context.experiment.rampPercentage;if(ramp>context.experiment.targetPercentage)return output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1;if(ramp===current)return output_manager_default.error(`The experiment ramp is already ${ramp}%.`),1;let decreasing=current!==void 0&&ramp<current;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:`${current??"\u2014"}% \u2192 ${ramp}%${decreasing?"; start a new analysis epoch":"; keep the analysis epoch"}`,prompt:"Change this experiment ramp?",spinner:"Changing experiment ramp\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"set-ramp",rampPercentage:ramp}),resultLabel:"Changed Ramp"})}async function runStart(client,argv){let parsed=parseSubcommand(argv,startSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments start <experiment> --ramp <percentage>");return typeof context=="number"?context:requireExperimentState(context.experiment,"draft","start it")?ramp>context.experiment.targetPercentage?(output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1):confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 running`,effect:`Enroll ${ramp}% of eligible units`,prompt:"Start this experiment?",spinner:"Starting experiment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"start",rampPercentage:ramp}),resultLabel:"Started"}):1}async function runUpdate(client,argv){let parsed=parseSubcommand(argv,updateSubcommand3);if(!parsed)return 2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let context=await fetchExperimentContext(client,parsed,"experiments update <experiment> --file <file>");if(typeof context=="number")return context;let restart=parsed.flags["--restart-analysis"]===!0,keep=parsed.flags["--keep-analysis"]===!0;if(restart&&keep)return output_manager_default.error("Use either --restart-analysis or --keep-analysis, not both."),2;if("restartAnalysis"in body&&(restart||keep))return output_manager_default.error("Set restartAnalysis in the JSON file or use a command option, not both."),1;if(context.experiment.state==="running"){if(!("restartAnalysis"in body)&&!restart&&!keep)return output_manager_default.error("Updating a running experiment requires --restart-analysis or --keep-analysis."),2;"restartAnalysis"in body||(body.restartAnalysis=restart)}else if("restartAnalysis"in body||restart||keep)return output_manager_default.error("Analysis restart options only apply to a running experiment."),1;if(context.experiment.state!=="draft"){let confirmation=await confirmMutation({client,flags:parsed.flags,link:context.link,experiment:context.experiment,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:body.restartAnalysis===!0?"Update serving settings and start a new analysis epoch":context.experiment.state==="running"?"Update serving settings and keep the current analysis epoch":"Update the completed experiment configuration",prompt:"Update this experiment?"});if(confirmation!==void 0)return confirmation}return mutateExperiment(client,parsed.flags,context,"Updating experiment\u2026",()=>updateExperiment(client,context.link.project.id,context.experiment.id,body),"Updated")}var COMMAND_CONFIG29={list:getCommandAliases(listSubcommand13),inspect:getCommandAliases(inspectSubcommand8),create:getCommandAliases(createSubcommand4),update:getCommandAliases(updateSubcommand3),start:getCommandAliases(startSubcommand),"set-ramp":getCommandAliases(setRampSubcommand),"restart-analysis":getCommandAliases(restartAnalysisSubcommand),"reseed-enrollment":getCommandAliases(reseedEnrollmentSubcommand),"return-to-draft":getCommandAliases(returnToDraftSubcommand),decide:getCommandAliases(decideSubcommand),analyze:getCommandAliases(analyzeSubcommand),diagnose:getCommandAliases(diagnoseSubcommand),open:getCommandAliases(openSubcommand3),delete:getCommandAliases(deleteSubcommand2)};async function experiments(client){let telemetry2=new ExperimentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(experimentsCommand.options),{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsed.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG29),needHelp=parsed.flags["--help"];if(!subcommand)return telemetry2.trackCliFlagHelp("experiments",subcommand),output_manager_default.print(help(experimentsCommand,{columns:client.stderr.columns})),needHelp?0:2;let commands2={list:{command:listSubcommand13,run:runList},inspect:{command:inspectSubcommand8,run:runInspect},create:{command:createSubcommand4,run:runCreate},update:{command:updateSubcommand3,run:runUpdate},start:{command:startSubcommand,run:runStart},"set-ramp":{command:setRampSubcommand,run:runSetRamp},"restart-analysis":{command:restartAnalysisSubcommand,run:runRestartAnalysis},"reseed-enrollment":{command:reseedEnrollmentSubcommand,run:runReseedEnrollment},"return-to-draft":{command:returnToDraftSubcommand,run:runReturnToDraft},decide:{command:decideSubcommand,run:runDecide},analyze:{command:analyzeSubcommand,run:runAnalyze},diagnose:{command:diagnoseSubcommand,run:runDiagnose},open:{command:openSubcommand3,run:runOpen},delete:{command:deleteSubcommand2,run:runDelete}},selectedName=subcommand,selected=commands2[selectedName];return needHelp?(telemetry2.trackCliFlagHelp("experiments",subcommandOriginal),output_manager_default.print(help(selected.command,{parent:experimentsCommand,columns:client.stderr.columns})),0):(telemetry2.trackSubcommand(selectedName,Array.isArray(subcommandOriginal)?subcommandOriginal[0]??selectedName:subcommandOriginal),selected.run(client,args))}var import_chalk114=__toESM(require_source(),1);var import_chalk110=__toESM(require_source(),1);var import_chalk109=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk109.default.blue,deny:import_chalk109.default.red,challenge:import_chalk109.default.yellow,log:import_chalk109.default.magenta,rate_limit:import_chalk109.default.cyan,"rate-limit":import_chalk109.default.cyan,bypass:import_chalk109.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 formatCount3(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(ms45,withDate){let d=new Date(ms45),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(ms45){return`${formatUtcTime(ms45,!0)} UTC (${relativeTime(ms45)})`}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_chalk109.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_chalk109.default.bold(import_chalk109.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_chalk109.default.dim,trend=s.total>0?plain:import_chalk109.default.dim;rows.push([color(labelForAction(s.action)),trend(generateSparkline(values)),formatCount3(s.total),peak>0?formatCount3(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return table(rows,{align:["l","l","r","r","r"],hsep:3}).split(`
|
|
478
|
+
`)}async function confirmMutation({client,flags,link,experiment,transition,effect,prompt}){let json=isJson(flags),yes=flags["--yes"]===!0;if(json||printMutationPreview(link,experiment,transition,effect),!yes){if(json||client.nonInteractive||!client.stdin.isTTY){let nextCommand=buildCommandWithYes(client.argv);return json||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Re-run with --yes to apply this production change.",userActionRequired:!0,next:[{command:nextCommand}]}):output_manager_default.error(`Missing required flag --yes. Re-run \`${nextCommand}\`.`),2}return await client.input.confirm(prompt,!1)?void 0:outputCanceled()}}function outputCanceled(){return output_manager_default.log("Canceled"),0}async function readAllStdin(client){if(client.stdin.isTTY)return"";let chunks=[];client.stdin.setEncoding("utf8");for await(let chunk of client.stdin)chunks.push(String(chunk));return chunks.join("")}async function readJsonObject(client,file){if(typeof file!="string"){output_manager_default.error("Missing required option --file <file>.");return}try{let source=file==="-"?await readAllStdin(client):await readFile7(resolve10(client.cwd,file),"utf8");if(!source.trim()){output_manager_default.error(file==="-"?"No JSON received on stdin for --file -.":`The file ${file} is empty.`);return}let value=JSON.parse(source);if(typeof value!="object"||value===null||Array.isArray(value)){output_manager_default.error("The JSON request body must be an object.");return}return value}catch(error){output_manager_default.error(`Failed to read experiment JSON: ${error instanceof Error?error.message:String(error)}`);return}}async function fetchExperimentContext(client,parsed,usage2){let id2=requireExperimentArgument(parsed.args,usage2);if(!id2)return 2;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiment\u2026");let experiment=await getExperiment(client,link.project.id,id2);return output_manager_default.stopSpinner(),{link,experiment}}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function mutateExperiment(client,flags,context,spinner,mutation,resultLabel){try{output_manager_default.spinner(spinner);let experiment=await mutation();output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel(resultLabel,experiment.name,{gutter:"\u2713"}),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),experiment.rampPercentage!==void 0&&printAlignedLabel("Ramp",`${experiment.rampPercentage}%`),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(flags)),1}}async function confirmAndMutateExperiment({client,flags,context,transition,effect,prompt,spinner,mutation,resultLabel}){let confirmation=await confirmMutation({client,flags,link:context.link,experiment:context.experiment,transition,effect,prompt});return confirmation!==void 0?confirmation:mutateExperiment(client,flags,context,spinner,mutation,resultLabel)}function parseRamp(flags){let ramp=flags["--ramp"];if(typeof ramp!="number"||!Number.isFinite(ramp)||ramp<0||ramp>100){output_manager_default.error("Provide --ramp as a percentage from 0 to 100.");return}return ramp}function requireExperimentState(experiment,expected,action){let states=Array.isArray(expected)?expected:[expected];return states.includes(experiment.state)?!0:(output_manager_default.error(`Cannot ${action} while the experiment is ${experiment.state}. Expected state: ${states.join(" or ")}.`),!1)}function unitKeyFromBase(experiment){let{kind,attribute}=experiment.base;return attribute==="id"&&(kind==="device"||kind==="user"||kind==="group")?`${kind}_id`:`event_data.${attribute==="id"?`${kind.replace(/[^A-Za-z0-9_]/g,"_")}Id`:attribute.replace(/[^A-Za-z0-9_]/g,"_")}`}async function runAnalyze(client,argv){let parsed=parseSubcommand(argv,analyzeSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments analyze <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,metrics2=experiment.metrics??{};if(Object.keys(metrics2).length===0)return output_manager_default.error("This experiment has no metrics to analyze."),1;let primaryMetric=typeof parsed.flags["--metric"]=="string"?parsed.flags["--metric"]:experiment.primaryMetric;if(primaryMetric&&!(primaryMetric in metrics2))return output_manager_default.error(`Metric ${primaryMetric} isn't configured. Choose one of: ${Object.keys(metrics2).join(", ")}.`),1;let epoch=experiment.rampId?experiment.epochs.find(item=>item.rampId===experiment.rampId):experiment.epochs.at(-1);if(!epoch)return output_manager_default.error("This experiment has no analysis epoch. Start it before requesting results."),1;let body={metrics:metrics2,...primaryMetric?{primaryMetric}:{},controlVariantId:experiment.controlVariantId,expectedVariantWeights:experiment.weights,excludeContaminated:parsed.flags["--exclude-contaminated"]===!0,unitKey:unitKeyFromBase(experiment),rampId:epoch.rampId,from:new Date(epoch.startedAt).toISOString(),...epoch.endedAt?{to:new Date(epoch.endedAt).toISOString()}:{}};try{output_manager_default.spinner("Analyzing experiment\u2026");let analysis=await getExperimentAnalysis(client,context.link.project.id,experiment.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment),assessment=assessExperimentAnalysis(experiment,analysis);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next,{analysis,assessment})):(printExperimentAnalysis(experiment,analysis,assessment),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runCreate(client,argv){let parsed=parseSubcommand(argv,createSubcommand4);if(!parsed)return 2;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Creating experiment\u2026");let experiment=await createExperiment(client,link.project.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel("Created",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Experiment",experiment.id),experiment.slug&&printAlignedLabel("Slug",experiment.slug),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("State",experiment.state),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runDecide(client,argv){let parsed=parseSubcommand(argv,decideSubcommand);if(!parsed)return 2;let winner=parsed.flags["--winner"],abandon=parsed.flags["--abandon"]===!0,rationale=parsed.flags["--rationale"];if(typeof winner=="string"===abandon)return output_manager_default.error("Use exactly one of --winner <variant-id> or --abandon."),2;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),2;let context=await fetchExperimentContext(client,parsed,"experiments decide <experiment> (--winner <variant-id>|--abandon) --rationale <text>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","make a decision"))return 1;if(typeof winner=="string"&&!context.experiment.variants.some(variant=>variant.id===winner))return output_manager_default.error(`Variant ${winner} isn't part of this experiment. Choose one of: ${context.experiment.variants.map(variant=>variant.id).join(", ")}.`),1;let effect=abandon?"Stop the experiment and serve control":`Stop the experiment and serve variant ${winner}`;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 completed`,effect,prompt:"Record this experiment decision?",spinner:"Recording experiment decision\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"complete",outcome:abandon?"abandon":"winner",...typeof winner=="string"?{winnerVariantId:winner}:{},rationale}),resultLabel:abandon?"Abandoned":"Completed"})}async function runDelete(client,argv){let parsed=parseSubcommand(argv,deleteSubcommand2);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments delete <experiment> --confirm <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,experimentIdentifier=getExperimentIdentifier(experiment),proof=parsed.flags["--confirm"],proofMatches=proof===experiment.id||proof===experiment.slug||proof===parsed.args[0];if(isJson(parsed.flags)||printMutationPreview(context.link,experiment,`${experiment.state} \u2192 deleted`,`Delete experiment data and release feature flag ${experiment.flagSlug}`),!proofMatches){if(isJson(parsed.flags)||client.nonInteractive||!client.stdin.isTTY){let command2=buildCommandWithGlobalFlags(client.argv,`experiments delete ${experimentIdentifier} --confirm ${experimentIdentifier}`,void 0,{preserveProject:!0});return isJson(parsed.flags)||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Deleting an experiment permanently removes its history and releases its feature flag.",userActionRequired:!0,next:[{command:command2}]}):output_manager_default.error(`Provide --confirm ${experimentIdentifier} to delete this experiment non-interactively.`),1}if(await client.input.text({message:`Type ${experimentIdentifier} to confirm deletion:`})!==experimentIdentifier)return outputCanceled()}try{output_manager_default.spinner("Deleting experiment\u2026"),await deleteExperiment(client,context.link.project.id,experiment.id),output_manager_default.stopSpinner();let next=buildDeletedNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,{status:"success",deletedExperiment:{id:experiment.id,slug:experiment.slug,name:experiment.name},releasedFlag:{id:experiment.flagId,slug:experiment.flagSlug},next}):(printAlignedLabel("Deleted",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Released Flag",experiment.flagSlug),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_chalk108=__toESM(require_source(),1);var MAX_DIAGNOSE_EVENTS=200,DEFAULT_DIAGNOSE_EVENTS=50,DIAGNOSE_LOOKBACK_MS=30*24*60*60*1e3,FOLLOW_TIMEOUT_MS=5*60*1e3,FOLLOW_POLL_INTERVAL_MS=5e3,FOLLOW_PAGE_LIMIT=200;async function followExperimentEvents({client,experiment,ownerId,projectId,filter,unitField,from,seen,json,printedSoFar=0,intervalMs=FOLLOW_POLL_INTERVAL_MS,timeoutMs=FOLLOW_TIMEOUT_MS}){let printEvent=createDiagnosedEventPrinter(printedSoFar),abortController=new AbortController,deadline=setTimeout(()=>{abortController.abort()},timeoutMs),onSigint=()=>{abortController.abort()};process.on("SIGINT",onSigint);let watermark=from,watermarkSeen=seen;try{for(;!abortController.signal.aborted&&(await sleepUnlessAborted(intervalMs,abortController.signal),!abortController.signal.aborted);){let end=new Date;if(end.getTime()<=watermark.getTime())continue;let rows;try{rows=(await queryAnalyticsEvents(client,ownerId,projectId,{filter,select:["type","eventName","eventData"],start:toWholeSecondIso(watermark),end:toWholeSecondIso(end),limit:FOLLOW_PAGE_LIMIT,order:"asc"})).events??[]}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,json),1}let events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),fresh=withoutSeen(events,watermarkSeen);if(fresh.length>0){output_manager_default.stopSpinner();for(let event of fresh)json?writeJson2(client,event):printEvent(event)}let latest=events.at(-1)?.timestamp;if(latest){let latestDate2=new Date(latest);latestDate2.getTime()>watermark.getTime()?(watermark=latestDate2,watermarkSeen=countByKey(events.filter(event=>event.timestamp===latest))):watermarkSeen=countByKey(events)}abortController.signal.aborted||output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`)}}finally{clearTimeout(deadline),process.removeListener("SIGINT",onSigint),output_manager_default.stopSpinner()}return 0}async function runDiagnose(client,argv){let parsed=parseSubcommand(argv,diagnoseSubcommand);if(!parsed)return 2;let jsonOutput=isJson(parsed.flags),fail2=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail2({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk108.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk108.default.bold("--until")}.`});let limit=validateIntegerRangeWithDefault(parsed.flags["--limit"],{flag:"--limit",min:1,max:MAX_DIAGNOSE_EVENTS,defaultValue:DEFAULT_DIAGNOSE_EVENTS});if(!limit.valid)return fail2(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail2(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail2(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail2(order);let context=await fetchExperimentContext(client,parsed,"experiments diagnose <experiment>");if(typeof context=="number")return context;let{experiment,link}=context,names=metricEventNames(experiment),requestedEvents=normalizeRepeatableStringFilters(parsed.flags["--event"]),unknownEvents=requestedEvents.filter(name=>!names.includes(name));if(unknownEvents.length>0)return fail2({valid:!1,code:"UNKNOWN_METRIC_EVENT",message:`This experiment has no metric event named ${unknownEvents.map(name=>`"${name}"`).join(", ")}. Choose from: ${names.join(", ")||"(none configured)"}.`,allowedValues:names});let wantsExposures=!!parsed.flags["--exposures"]||requestedEvents.length===0,eventNames=requestedEvents.length>0?requestedEvents:parsed.flags["--exposures"]?[]:names,limitValue=limit.value,end=until.value??new Date,window={start:toWholeSecondIso(since.value??defaultRangeStart(experiment,end)),end:toWholeSecondIso(end)},unitValue=typeof parsed.flags["--unit"]=="string"?parsed.flags["--unit"]:"",unitClause=unitValue?` AND eventData:*${unitValue.replaceAll("*","")}*`:"",branches=[wantsExposures?`type:exposure AND eventName:${quoteFilterValue(experiment.id)}${unitClause}`:void 0,eventNames.length>0?`type:event AND eventName:(${eventNames.map(quoteFilterValue).join(" OR ")})${unitClause}`:void 0].filter(branch=>branch!==void 0);if(branches.length===0)return output_manager_default.error("Nothing selected. Drop --exposures, or name a metric event with --event."),1;let followFilter=branches.length===1?branches[0]:branches.map(branch=>`(${branch})`).join(" OR "),diagnosis;try{output_manager_default.spinner("Reading experiment events\u2026");let projectId=await resolveAnalyticsProjectId(client,link.org.id,link.project.id),rows=(await queryAnalyticsEvents(client,link.org.id,projectId,{filter:followFilter,select:["type","eventName","eventData"],...window,limit:limitValue})).events??[],declaredUnitKey=rows.map(row=>parseEventData(row.eventData).unitKey).find(key=>typeof key=="string"),unitField=unitFieldFromKey(declaredUnitKey??unitKeyFromBase(experiment)),events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),exposures=events.filter(event=>event.kind==="exposure"),enrolled=exposures.filter(event=>event.assignmentReason===void 0);diagnosis={events,projectId,exposureCount:exposures.length,metricEventCount:events.length-exposures.length,enrolledUnits:new Set(enrolled.map(event=>event.unit).filter(Boolean)).size,notEnrolledExposures:exposures.length-enrolled.length,metricEventNames:names,unitField,truncated:rows.length>=limitValue,staleRampExposures:experiment.rampId?exposures.filter(event=>event.rampId!==void 0&&event.rampId!==experiment.rampId).length:0,window},output_manager_default.stopSpinner()}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,jsonOutput),1}if(jsonOutput?writeJson2(client,{status:"success",experiment:{id:experiment.id,slug:experiment.slug,state:experiment.state,rampId:experiment.rampId},diagnosis}):printExperimentDiagnosis(experiment,diagnosis,{follow:!!parsed.flags["--follow"]}),parsed.flags["--follow"]){let newest=diagnosis.events[0]?.timestamp,from=newest?new Date(newest):new Date(diagnosis.window.end),seen=newest?countByKey(diagnosis.events.filter(event=>event.timestamp===newest)):new Map;return output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`),followExperimentEvents({client,experiment,ownerId:link.org.id,projectId:diagnosis.projectId,filter:followFilter,unitField:diagnosis.unitField,from,seen,json:jsonOutput,printedSoFar:diagnosis.events.length})}return 0}function sleepUnlessAborted(ms47,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms47);signal.addEventListener("abort",settle,{once:!0})})}function printDiagnoseError(client,error,json){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){printExperimentError(client,error,json);return}if(isAPIError(error)&&error.status===402){output_manager_default.error("Reading custom events and experiment exposures requires a Pro or Enterprise plan.");return}if(isAPIError(error)&&error.status===403){output_manager_default.error("Cannot read experiment exposures. Web Analytics must be enabled for the project, and exposures are behind the `web-analytics-exposure-events` flag.");return}printExperimentError(client,error,json)}function countByKey(events){let counts=new Map;for(let event of events){let key=diagnosedEventKey(event);counts.set(key,(counts.get(key)??0)+1)}return counts}function diagnosedEventKey(event){return[event.timestamp,event.kind,event.name??"",event.unit??"",event.variantId??""].join("\0")}function withoutSeen(events,seen){let remaining=new Map(seen),fresh=[];for(let event of events){let key=diagnosedEventKey(event),outstanding=remaining.get(key)??0;if(outstanding>0){remaining.set(key,outstanding-1);continue}fresh.push(event)}return fresh}function toWholeSecondIso(date){let truncated=new Date(date);return truncated.setUTCMilliseconds(0),truncated.toISOString()}function toDiagnosedEvent(row,kind,unitField){let payload=parseEventData(row.eventData),pick=key=>typeof payload[key]=="string"?payload[key]:void 0,unit=pick(kind==="exposure"?"unitValue":unitField),variantId=pick("variantId"),rampId=pick("rampId"),assignmentReason=pick("assignmentReason");return{timestamp:row.timestamp,kind,...kind==="event"&&row.eventName?{name:row.eventName}:{},...unit?{unit}:{},...variantId?{variantId}:{},...rampId?{rampId}:{},...assignmentReason&&assignmentReason!=="experiment"?{assignmentReason}:{},...Object.keys(payload).length>0?{payload}:{}}}function parseEventData(raw){if(!raw)return{};try{let parsed=JSON.parse(raw);return parsed!==null&&typeof parsed=="object"?parsed:{}}catch{return{}}}function unitFieldFromKey(unitKey){return unitKey.startsWith("event_data.")?unitKey.slice(11):unitKey}function metricEventNames(experiment){let names=new Set,add16=value=>{typeof value=="string"&&value.length>0&&names.add(value)};for(let metric of Object.values(experiment.metrics??{}))add16(metric.eventName),add16(metric.initialEvent),add16(metric.goalEvent),add16(metric.numeratorEvent),add16(metric.denominatorEvent),Array.isArray(metric.eventNames)&&metric.eventNames.forEach(add16);return[...names]}function quoteFilterValue(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function defaultRangeStart(experiment,end){let launchedAt=experiment.launchedAt??experiment.createdAt;return new Date(Math.max(launchedAt,end.getTime()-DIAGNOSE_LOOKBACK_MS))}async function runInspect(client,argv){let parsed=parseSubcommand(argv,inspectSubcommand8);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments inspect <experiment>");if(typeof context=="number")return context;let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next)):(printExperimentDetails(context.experiment),printNextCommands(next)),0}async function runList(client,argv){let parsed=parseSubcommand(argv,listSubcommand13);if(!parsed)return 2;let state=parsed.flags["--state"];if(state!==void 0&&state!=="draft"&&state!=="running"&&state!=="completed")return output_manager_default.error("The --state option must be draft, running, or completed."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiments\u2026");let all=await listExperiments(client,link.project.id);output_manager_default.stopSpinner();let experiments2=state?all.filter(experiment=>experiment.state===state):all,next=buildListNextCommands(client);return isJson(parsed.flags)?(writeJson2(client,{status:"success",experiments:experiments2,next}),0):(experiments2.length===0?output_manager_default.log(state?`No experiments match state ${state}.`:"No experiments found."):printExperimentsTable(experiments2),printNextCommands(next),0)}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_open7=__toESM(require_open(),1);async function runOpen(client,argv){let parsed=parseSubcommand(argv,openSubcommand3);if(!parsed)return 2;let[id2,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),2;let tab=parsed.flags["--tab"]??"configuration";if(tab!=="configuration"&&tab!=="analysis")return output_manager_default.error("The --tab option must be configuration or analysis."),1;if(!id2&&parsed.flags["--tab"]!==void 0)return output_manager_default.error("The --tab option requires an experiment argument."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;let experiment;try{id2?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id2),output_manager_default.stopSpinner()):(output_manager_default.spinner("Checking experiment access\u2026"),await listExperiments(client,link.project.id),output_manager_default.stopSpinner());let base=`https://vercel.com/${encodeURIComponent(link.org.slug)}/${encodeURIComponent(link.project.name)}/flags`,url=experiment?`${base}/experiment/${encodeURIComponent(experiment.id)}/${tab}`:base;return client.stdout.isTTY?(output_manager_default.log(`Opening ${experiment?`experiment ${getExperimentIdentifier(experiment)}`:"experiments"} in your browser\u2026`),output_manager_default.log(`Visit this URL if the browser doesn't open: ${url}`),(0,import_open7.default)(url).catch(()=>{}),printNextCommands(experiment?buildExperimentNextCommands(client,experiment):buildListNextCommands(client))):client.stdout.write(`${url}
|
|
479
|
+
`),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error),1}}async function runReseedEnrollment(client,argv){let parsed=parseSubcommand(argv,reseedEnrollmentSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments reseed-enrollment <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="completed")return output_manager_default.error("Cannot reseed a completed experiment. Return it to draft first."),1;let running=context.experiment.state==="running";return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:running?"Reassign enrollment and start a new analysis epoch":"Reassign enrollment for the next run",prompt:"Reseed enrollment for this experiment?",spinner:"Reseeding enrollment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"reseed-enrollment"}),resultLabel:"Reseeded"})}async function runRestartAnalysis(client,argv){let parsed=parseSubcommand(argv,restartAnalysisSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments restart-analysis <experiment>");return typeof context=="number"?context:requireExperimentState(context.experiment,"running","restart its analysis")?confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:"Start a new analysis epoch without changing enrollment",prompt:"Restart analysis for this experiment?",spinner:"Restarting analysis\u2026",mutation:()=>updateExperiment(client,context.link.project.id,context.experiment.id,{restartAnalysis:!0}),resultLabel:"Restarted"}):1}async function runReturnToDraft(client,argv){let parsed=parseSubcommand(argv,returnToDraftSubcommand);if(!parsed)return 2;let cause=parsed.flags["--cause"];if(cause!==void 0&&cause!=="manual"&&cause!=="guardrail"&&cause!=="srm")return output_manager_default.error("The --cause option must be manual, guardrail, or srm."),1;let reason=parsed.flags["--reason"];if(typeof reason=="string"&&reason.trim().length===0)return output_manager_default.error("The --reason option cannot be empty."),1;let context=await fetchExperimentContext(client,parsed,"experiments return-to-draft <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="draft"){let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next,{changed:!1})):(output_manager_default.log("Experiment is already in draft."),printNextCommands(next)),0}let action={action:"return-to-draft",...cause?{cause}:{},...typeof reason=="string"?{reason}:{}};return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 draft`,effect:"Serve control and stop the active measurement window",prompt:"Return this experiment to draft?",spinner:"Returning experiment to draft\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,action),resultLabel:"Returned"})}async function runSetRamp(client,argv){let parsed=parseSubcommand(argv,setRampSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments set-ramp <experiment> --ramp <percentage>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","change its ramp"))return 1;let current=context.experiment.rampPercentage;if(ramp>context.experiment.targetPercentage)return output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1;if(ramp===current)return output_manager_default.error(`The experiment ramp is already ${ramp}%.`),1;let decreasing=current!==void 0&&ramp<current;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:`${current??"\u2014"}% \u2192 ${ramp}%${decreasing?"; start a new analysis epoch":"; keep the analysis epoch"}`,prompt:"Change this experiment ramp?",spinner:"Changing experiment ramp\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"set-ramp",rampPercentage:ramp}),resultLabel:"Changed Ramp"})}async function runStart(client,argv){let parsed=parseSubcommand(argv,startSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments start <experiment> --ramp <percentage>");return typeof context=="number"?context:requireExperimentState(context.experiment,"draft","start it")?ramp>context.experiment.targetPercentage?(output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1):confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 running`,effect:`Enroll ${ramp}% of eligible units`,prompt:"Start this experiment?",spinner:"Starting experiment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"start",rampPercentage:ramp}),resultLabel:"Started"}):1}async function runUpdate(client,argv){let parsed=parseSubcommand(argv,updateSubcommand3);if(!parsed)return 2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let context=await fetchExperimentContext(client,parsed,"experiments update <experiment> --file <file>");if(typeof context=="number")return context;let restart=parsed.flags["--restart-analysis"]===!0,keep=parsed.flags["--keep-analysis"]===!0;if(restart&&keep)return output_manager_default.error("Use either --restart-analysis or --keep-analysis, not both."),2;if("restartAnalysis"in body&&(restart||keep))return output_manager_default.error("Set restartAnalysis in the JSON file or use a command option, not both."),1;if(context.experiment.state==="running"){if(!("restartAnalysis"in body)&&!restart&&!keep)return output_manager_default.error("Updating a running experiment requires --restart-analysis or --keep-analysis."),2;"restartAnalysis"in body||(body.restartAnalysis=restart)}else if("restartAnalysis"in body||restart||keep)return output_manager_default.error("Analysis restart options only apply to a running experiment."),1;if(context.experiment.state!=="draft"){let confirmation=await confirmMutation({client,flags:parsed.flags,link:context.link,experiment:context.experiment,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:body.restartAnalysis===!0?"Update serving settings and start a new analysis epoch":context.experiment.state==="running"?"Update serving settings and keep the current analysis epoch":"Update the completed experiment configuration",prompt:"Update this experiment?"});if(confirmation!==void 0)return confirmation}return mutateExperiment(client,parsed.flags,context,"Updating experiment\u2026",()=>updateExperiment(client,context.link.project.id,context.experiment.id,body),"Updated")}var COMMAND_CONFIG29={list:getCommandAliases(listSubcommand13),inspect:getCommandAliases(inspectSubcommand8),create:getCommandAliases(createSubcommand4),update:getCommandAliases(updateSubcommand3),start:getCommandAliases(startSubcommand),"set-ramp":getCommandAliases(setRampSubcommand),"restart-analysis":getCommandAliases(restartAnalysisSubcommand),"reseed-enrollment":getCommandAliases(reseedEnrollmentSubcommand),"return-to-draft":getCommandAliases(returnToDraftSubcommand),decide:getCommandAliases(decideSubcommand),analyze:getCommandAliases(analyzeSubcommand),diagnose:getCommandAliases(diagnoseSubcommand),open:getCommandAliases(openSubcommand3),delete:getCommandAliases(deleteSubcommand2)};async function experiments(client){let telemetry2=new ExperimentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(experimentsCommand.options),{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsed.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG29),needHelp=parsed.flags["--help"];if(!subcommand)return telemetry2.trackCliFlagHelp("experiments",subcommand),output_manager_default.print(help(experimentsCommand,{columns:client.stderr.columns})),needHelp?0:2;let commands2={list:{command:listSubcommand13,run:runList},inspect:{command:inspectSubcommand8,run:runInspect},create:{command:createSubcommand4,run:runCreate},update:{command:updateSubcommand3,run:runUpdate},start:{command:startSubcommand,run:runStart},"set-ramp":{command:setRampSubcommand,run:runSetRamp},"restart-analysis":{command:restartAnalysisSubcommand,run:runRestartAnalysis},"reseed-enrollment":{command:reseedEnrollmentSubcommand,run:runReseedEnrollment},"return-to-draft":{command:returnToDraftSubcommand,run:runReturnToDraft},decide:{command:decideSubcommand,run:runDecide},analyze:{command:analyzeSubcommand,run:runAnalyze},diagnose:{command:diagnoseSubcommand,run:runDiagnose},open:{command:openSubcommand3,run:runOpen},delete:{command:deleteSubcommand2,run:runDelete}},selectedName=subcommand,selected=commands2[selectedName];return needHelp?(telemetry2.trackCliFlagHelp("experiments",subcommandOriginal),output_manager_default.print(help(selected.command,{parent:experimentsCommand,columns:client.stderr.columns})),0):(telemetry2.trackSubcommand(selectedName,Array.isArray(subcommandOriginal)?subcommandOriginal[0]??selectedName:subcommandOriginal),selected.run(client,args))}var import_chalk114=__toESM(require_source(),1);var import_chalk110=__toESM(require_source(),1);var import_chalk109=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk109.default.blue,deny:import_chalk109.default.red,challenge:import_chalk109.default.yellow,log:import_chalk109.default.magenta,rate_limit:import_chalk109.default.cyan,"rate-limit":import_chalk109.default.cyan,bypass:import_chalk109.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 formatCount3(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(ms47,withDate){let d=new Date(ms47),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(ms47){return`${formatUtcTime(ms47,!0)} UTC (${relativeTime(ms47)})`}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_chalk109.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_chalk109.default.bold(import_chalk109.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_chalk109.default.dim,trend=s.total>0?plain:import_chalk109.default.dim;rows.push([color(labelForAction(s.action)),trend(generateSparkline(values)),formatCount3(s.total),peak>0?formatCount3(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return table(rows,{align:["l","l","r","r","r"],hsep:3}).split(`
|
|
480
480
|
`).map(line2=>` ${line2}`.trimEnd()).join(`
|
|
481
481
|
`)}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(e2=>`${e2.source==="alerts"?"alerts":"attack history"} ${e2.message}`).join("; ")}.`}function countAttacksMitigated(alerts2,windowStartMs,windowEndMs){return alerts2.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(id2){return id2.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id2){let match=id2.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,budget2=()=>AbortSignal.timeout(timeoutMs),now=Date.now();if(isO11yAlertId(opts.alertId)){let fromGroup2=await getO11yAlertById(client,{...opts,signal:budget2()});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:budget2()})).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:budget2()}).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:budget2()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return null});return fromGroup?{alert:fromGroup}:null}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(id2){return ACTIONS[id2]}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,id2){let action=id2==="bot-protection"?currentBotProtectionAction(config):id2==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id:id2,name:NAMES[id2],action,wafRuleId:WAF_RULE_IDS[id2]}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id2=>getManagedBotRule(config,id2))}function parseManagedBotAction(id2,raw){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=ACTIONS[id2];return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${NAMES[id2]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id2,action){if(id2==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id2==="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(id2,from,to){if(id2==="ai-bots"&&to==="deny")return"AI Bots deny blocks known AI crawlers from this project.";if(id2==="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}}function projectScope(project,teamId,teamSlug){return{type:"project",projectId:project.id,teamId,...teamSlug?{teamSlug}:{},displayName:project.name}}function firewallConfigUrl(scope,path3=""){let query=new URLSearchParams;return scope.type==="project"?(query.set("projectId",scope.projectId),scope.teamId&&query.set("teamId",scope.teamId),`/v1/security/firewall/config${path3}?${query.toString()}`):(query.set("teamId",scope.teamId),`/v1/security/firewall/team-config${path3}?${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_COMMAND2="project priority enable",BUY_PRO_COMMAND2="buy pro";function withGlobalFlags3(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(command2,plain){return plain?getCommandNamePlain(command2):getCommandName(command2)}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)}`:"",enable6=`${PRIORITY_PROJECT_ENABLE_COMMAND2} ${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 upgrade2=`${BUY_PRO_COMMAND2}${scopeFlag}`,hint=plain2=>`Priority Projects are only available on Pro or Enterprise team plans. Upgrade with ${styledCommand(upgrade2,plain2)}, then run ${styledCommand(enable6,plain2)}.`;return{command:upgrade2,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(enable6,!1),plain=styledCommand(enable6,!0),placeholder="Replace <project> with a project on this team.";return{command:enable6,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(e2,scope,fallback){let err=e2;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)}async function parseSubcommandArgs2(argv,command2,client,commandPath){let parsedArgs,fullPath=commandPath||command2.name;try{parsedArgs=parseSubcommandArguments(argv,command2)}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 flags 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}
|
|
482
482
|
`),await client.input.confirm(message,!1))}function firewallPermissionMessage(action,projectName){return`You don't have permission to ${action} for ${projectName}. Ask a team owner to grant access.`}function failFirewall(client,opts){let reason=opts.reason??AGENT_REASON.INVALID_ARGUMENTS,exitCode2=getExitCodeForReason(reason);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:opts.message,...opts.fix?.hint?{hint:opts.fix.hint}:{},next:[...opts.fix?.command?[{command:withGlobalFlags3(client,opts.fix.command,void 0,{excludeFlags:opts.fix.excludeFlags,preserveProject:opts.fix.preserveProject}),...opts.fix.when?{when:opts.fix.when}:{}}]:[],...opts.nextCommand?[{command:withGlobalFlags3(client,opts.nextCommand)}]:[]]},exitCode2),exitCode2):(output_manager_default.error(opts.message),opts.fix&&output_manager_default.log(opts.fix.hint),exitCode2)}function failFirewallObservabilityPlan(client,error,projectName){let message=apiServerMessage(error)??FIREWALL_ACTIVITY_PLAN_MESSAGE,fix=clientObservabilityPlanRecovery(client,error,message,projectName);return failFirewall(client,{message,fix,reason:AGENT_REASON.API_ERROR})}function refuseManagedBotMutation(client,scope,identifier,verb){if(scope.type!=="project")return null;let id2=resolveManagedBotRuleId(identifier);if(!id2)return null;let command2=`firewall rules edit ${id2} --action <action>`;return failFirewall(client,{message:`Can't ${verb} "${identifier}". That's a managed bot rule.`,reason:AGENT_REASON.INVALID_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk110.default.cyan(withGlobalFlags3(client,command2,scope))} to change it.`,when:"change the managed bot rule instead"}})}function isRetryableApiError(error){return isAPIError(error)&&(error.status>=500||error.status===429)}function failFirewallApi(client,e2,opts){if(isAPIError(e2)&&(e2.status===401||e2.status===403))return failFirewall(client,{message:firewallPermissionMessage(opts.permissionAction,opts.projectName),reason:AGENT_REASON.PERMISSION_DENIED});if(e2 instanceof Error&&(e2.name==="TimeoutError"||e2.name==="AbortError")){let job=opts.timeoutJob??"firewall data";return failFirewall(client,{message:`Timed out waiting for ${job}. Re-run the command \u2014 the next try is usually faster.`,nextCommand:opts.nextCommand,reason:AGENT_REASON.API_ERROR})}let msg=e2 instanceof Error&&e2.message?e2.message:opts.fallback;return failFirewall(client,{message:msg,nextCommand:isRetryableApiError(e2)?opts.nextCommand:void 0,reason:AGENT_REASON.API_ERROR})}function outputJson2(client,data){output_manager_default.stopSpinner(),client.stdout.write(JSON.stringify(data,null,2)+`
|
|
483
483
|
`)}async function detectExistingDraft(client,scope){let{draft}=await listFirewallConfigs(client,scope);return draft!==null&&draft.changes.length>0}async function offerAutoPublish(client,scope,hadExistingDraft,opts){if(output_manager_default.print(`
|
|
484
484
|
${import_chalk110.default.gray(`This change is staged. Run ${import_chalk110.default.cyan(withGlobalFlags3(client,"firewall publish",scope))} to make it live, or ${import_chalk110.default.cyan(withGlobalFlags3(client,"firewall discard",scope))} to undo.`)}
|
|
485
485
|
`),!hadExistingDraft&&!opts.skipPrompts&&client.stdin.isTTY&&!client.nonInteractive){if(output_manager_default.print(`
|
|
486
|
-
`),await client.input.confirm("This is the only draft change. Publish to production now?",!1)){let publishStamp=stamp_default();output_manager_default.spinner("Publishing to production");try{await activateFirewallConfig(client,scope,"draft"),output_manager_default.log(`${import_chalk110.default.cyan("Published")} to production ${import_chalk110.default.gray(publishStamp())}`)}catch(e2){output_manager_default.error(`Failed to publish to production: ${mapFirewallApiError(e2,scope,"Unknown error")}`)}}}else hadExistingDraft&&output_manager_default.warn(`There are other draft changes. Review with ${import_chalk110.default.cyan(withGlobalFlags3(client,"firewall diff",scope))} before publishing.`)}function resolveIpRule(ips,identifier){if(!identifier)return[];let byId=ips.find(r=>r.id===identifier);if(byId)return[byId];let query=identifier.toLowerCase(),byIp=ips.filter(r=>r.ip.toLowerCase()===query);return byIp.length>0?byIp:ips.filter(r=>r.id.toLowerCase().includes(query))}function resolveRule(rules3,identifier){if(!identifier)return[];let byId=rules3.find(r=>r.id===identifier);if(byId)return[byId];let query=identifier.toLowerCase(),byName=rules3.filter(r=>r.name.toLowerCase()===query);if(byName.length>0)return byName;let byPartialName=rules3.filter(r=>r.name.toLowerCase().includes(query));return byPartialName.length>0?byPartialName:rules3.filter(r=>r.id.toLowerCase().includes(query))}function printActionImpactWarning(action){let actionType=action.mitigate?.action;if(actionType)switch(actionType){case"deny":output_manager_default.warn("This rule will deny matching requests. Legitimate traffic may be blocked if conditions are too broad.");break;case"challenge":output_manager_default.warn("This rule will challenge matching requests with a verification page. Some legitimate users or automated clients may be unable to complete the challenge.");break;case"rate_limit":output_manager_default.warn("This rule will rate limit matching requests. Legitimate traffic may be throttled if the limit is too low or keys are too broad.");break;default:break}}async function getBypass(client,projectId,options={}){let{teamId}=options,query=new URLSearchParams;query.set("projectId",projectId),teamId&&query.set("teamId",teamId);let url=`/v1/security/firewall/bypass?${query.toString()}`;return client.fetch(url)}import{isIP}from"node:net";var STRING_OPS=["eq","inc"],STRING_MATCH_OPS=["sub","pre","suf","re"],KEY_EXISTS_OPS=["ex"],STRING_ONLY=[...STRING_OPS],STRING_AND_MATCH=[...STRING_OPS,...STRING_MATCH_OPS],STRING_MATCH_AND_EXISTS=[...STRING_OPS,...STRING_MATCH_OPS,...KEY_EXISTS_OPS],CONDITION_TYPES=[{type:"path",displayName:"Request Path",description:"URL path of the request",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"route",displayName:"Route",description:"Route pattern (e.g., /blog/[slug])",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"raw_path",displayName:"Raw Path",description:"Pre-rewrite URL path",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"server_action",displayName:"Server Action Name",description:"Next.js Server Action name",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"method",displayName:"Method",description:"HTTP method (GET, POST, DELETE, etc.)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"GET",value:"GET"},{label:"HEAD",value:"HEAD"},{label:"POST",value:"POST"},{label:"DELETE",value:"DELETE"},{label:"PATCH",value:"PATCH"},{label:"PUT",value:"PUT"},{label:"CONNECT",value:"CONNECT"},{label:"OPTIONS",value:"OPTIONS"},{label:"TRACE",value:"TRACE"},{label:"DEBUG",value:"DEBUG"},{label:"QUERY",value:"QUERY"}]},{type:"host",displayName:"Hostname",description:"Request hostname",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"protocol",displayName:"Protocol",description:"HTTP protocol version (HTTP/1.1, HTTP/2.0)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"HTTP/1.1",value:"HTTP/1.1"},{label:"HTTP/2.0",value:"HTTP/2.0"}]},{type:"environment",displayName:"Environment",description:"Deployment environment (preview, production)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"Preview",value:"preview"},{label:"Production",value:"production"}]},{type:"region",displayName:"Vercel Region",description:"Edge region serving the request",category:"request",requiresKey:!1,operators:STRING_ONLY},{type:"target_path",displayName:"Target Path",description:"Post-rewrite destination path",category:"request",requiresKey:!1,operators:STRING_AND_MATCH,valueValidation:"path"},{type:"scheme",displayName:"Scheme",description:"Request scheme (http, https)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"http",value:"http"},{label:"https",value:"https"}]},{type:"rate_limit_api_id",displayName:"Rate Limit API ID",description:"Identifier for rate-limit API grouping",category:"request",requiresKey:!1,operators:STRING_ONLY},{type:"ip_address",displayName:"IP Address",description:"Client IP address or CIDR range",category:"client",requiresKey:!1,operators:STRING_ONLY},{type:"user_agent",displayName:"User Agent",description:"Client User-Agent string",category:"client",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_country",displayName:"Country",description:"Country code (ISO 3166-1 alpha-2)",category:"geo",requiresKey:!1,operators:STRING_ONLY},{type:"geo_continent",displayName:"Continent",description:"Continent code (AF, AN, AS, EU, NA, OC, SA)",category:"geo",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"Africa (AF)",value:"AF"},{label:"Antarctica (AN)",value:"AN"},{label:"Asia (AS)",value:"AS"},{label:"Europe (EU)",value:"EU"},{label:"North America (NA)",value:"NA"},{label:"Oceania (OC)",value:"OC"},{label:"South America (SA)",value:"SA"}]},{type:"geo_city",displayName:"City",description:"City name",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_country_region",displayName:"State / Region",description:"State or region code",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_as_number",displayName:"AS Number",description:"Autonomous System Number",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH,valueValidation:"digits"},{type:"header",displayName:"Request Header",description:"HTTP request header (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"query",displayName:"Query Parameter",description:"URL query parameter (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"cookie",displayName:"Cookie",description:"HTTP cookie (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"ja4_digest",displayName:"JA4 Digest",description:"JA4 TLS fingerprint",category:"security",requiresKey:!1,operators:STRING_AND_MATCH},{type:"ja3_digest",displayName:"JA3 Digest",description:"JA3 TLS fingerprint",category:"security",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"enterprise"},{type:"bot_name",displayName:"Bot Name",description:"Verified bot name",category:"bot",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"security-plus"},{type:"bot_category",displayName:"Bot Category",description:"Verified bot category",category:"bot",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"security-plus"}],CONDITION_TYPE_MAP=Object.fromEntries(CONDITION_TYPES.map(ct=>[ct.type,ct])),ALL_OPERATORS=["eq","neq","inc","ninc","sub","pre","suf","re","ex","nex","gt","gte","lt","lte"],CATEGORY_LABELS={request:"Request",client:"Client",geo:"Geo / Location","key-value":"Key-Value (Header / Query / Cookie)",security:"Security / TLS",bot:"Bot Detection"},VALID_ACTIONS=["deny","challenge","log","bypass","rate_limit","redirect"],VALID_DURATIONS=["1m","5m","15m","30m","1h"],VALID_ALGORITHMS=["fixed_window","token_bucket"];async function fetchPlanInfo(client){try{let{team}=await getScope(client);if(team)return{isEnterprise:team.billing.plan==="enterprise",hasSecurityPlus:team.securityPlus?.enabled===!0,known:!0}}catch{}return{isEnterprise:!1,hasSecurityPlus:!1,known:!1}}function getAvailableConditionTypes(planInfo){return CONDITION_TYPES.filter(ct=>!(ct.deprecated||ct.planRequirement==="enterprise"&&!planInfo?.isEnterprise||ct.planRequirement==="security-plus"&&!planInfo?.hasSecurityPlus))}function getActionLabel(action){return{deny:"Deny \u2014 Block traffic (403)",challenge:"Challenge \u2014 Verify at security checkpoint",log:"Log \u2014 Monitor without blocking",bypass:"Bypass \u2014 Skip other custom rules",rate_limit:"Rate Limit \u2014 Enforce request limits",redirect:"Redirect \u2014 Send to a different URL"}[action]||action}function getOperatorDisplayName(op,neg){let pair={eq:["equals","does not equal"],inc:["is any of","is not any of"],sub:["contains","does not contain"],pre:["starts with","does not start with"],suf:["ends with","does not end with"],re:["matches regex","does not match regex"],ex:["exists","does not exist"]}[op];return pair?neg?pair[1]:pair[0]:neg?`NOT ${op}`:op}function validateConditionValue(val,meta){if(!meta?.valueValidation)return!0;switch(meta.valueValidation){case"path":return val.startsWith("/")?!0:"Path must start with /";case"ip":{if(isIP(val))return!0;let slashIdx=val.lastIndexOf("/");if(slashIdx!==-1){let ip=val.slice(0,slashIdx),prefix=Number.parseInt(val.slice(slashIdx+1),10);if(isIP(ip)&&!Number.isNaN(prefix)&&prefix>=0)return!0}return"Please enter a valid IP address or CIDR range."}case"hostname":return/^[A-Za-z0-9-]{1,63}(?:\.[A-Za-z0-9-]{1,63})*$/.test(val)?!0:"Please enter a valid hostname.";case"digits":return/^\d+$/.test(val)?!0:"Please enter digits only.";default:return!0}}var FIREWALL_ACTION_METRIC="vercel.firewall_action.count";var VALUE_ALIAS="value",DEFAULT_TIMEOUT_MS2=45e3,ActivityTimeoutError=class extends Error{constructor(message){super(message),this.name="ActivityTimeoutError"}};function isRateLimited(error){return isAPIError(error)&&error.status===429}function rateLimitRetrySeconds(error){if(!isRateLimited(error))return;let ms45=error.retryAfterMs;if(!(typeof ms45!="number"||ms45<=0))return Math.ceil(ms45/1e3)}function isActivityTimeout(error){return isAPIError(error)&&error.status===408||error instanceof Error&&error.name==="ActivityTimeoutError"}function toBucketSeconds(granularity){return"minutes"in granularity?granularity.minutes*60:"hours"in granularity?granularity.hours*60*60:granularity.days*24*60*60}function alignQueryWindow(startTime,endTime,granularity){let stepMs=granularity?toBucketSeconds(granularity)*1e3:1e3;return{startTime:new Date(Math.floor(startTime.getTime()/stepMs)*stepMs),endTime:new Date(Math.ceil(endTime.getTime()/stepMs)*stepMs)}}async function queryFirewallObservability(client,opts){let groupBy=opts.groupBy??[],window=alignQueryWindow(opts.startTime,opts.endTime,opts.granularity),bucketed=opts.granularity!==void 0,ranked=groupBy.length>0&&opts.limit!==void 0,body={scope:{ownerId:opts.ownerId,projectIds:[opts.projectId]},timeRange:{start:window.startTime.toISOString(),end:window.endTime.toISOString()},metrics:{[VALUE_ALIAS]:{metric:opts.metric??FIREWALL_ACTION_METRIC,aggregation:"count"}},outputs:[VALUE_ALIAS],...opts.granularity?{bucketSeconds:toBucketSeconds(opts.granularity)}:{},...groupBy.length>0?{groupBy}:{},...opts.filter?{filter:opts.filter}:{},...ranked&&bucketed?{seriesSelection:{limit:opts.limit,mode:opts.approximateSelection?"approximate":"exact",rankBy:[{metric:VALUE_ALIAS,direction:"desc"}]}}:{},...ranked&&!bucketed?{rowLimit:opts.limit,orderBy:[{metric:VALUE_ALIAS,direction:"desc"}]}:{}},timeoutMs=opts.timeoutMs??DEFAULT_TIMEOUT_MS2,response;try{response=await client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:opts.ownerId,signal:AbortSignal.timeout(timeoutMs),bailOn429:!0})}catch(err){throw err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?new ActivityTimeoutError(`Timed out after ${Math.round(timeoutMs/1e3)}s waiting for ${opts.timeoutSubject??"firewall traffic data"}.`):err}return{summary:response.summary??[],series:response.series??[],startTime:window.startTime,endTime:window.endTime}}function rowValue(row){let raw=row.values?.[VALUE_ALIAS],n=typeof raw=="number"?raw:Number(raw);return Number.isFinite(n)?n:0}function rowDimension(row,field){return String(row.dimensions?.[field]??"")}function isUnsupportedDimension(error){if(!isAPIError(error)||error.status!==400)return!1;let pattern=/does not support|is not supported|not publicly queryable/i,issues=error.issues;return Array.isArray(issues)?issues.some(issue2=>typeof issue2?.message=="string"&&pattern.test(issue2.message)):pattern.test(error.serverMessage||error.message||"")}var ACTION_DIMENSION="wafAction";function actionFromRow(row){return rowDimension(row,ACTION_DIMENSION)||"unknown"}async function getFirewallMetrics(client,opts){let granularity=opts.granularity??{hours:1},result=await queryFirewallObservability(client,{ownerId:opts.ownerId,projectId:opts.projectId,startTime:opts.startTime,endTime:opts.endTime,granularity,groupBy:[ACTION_DIMENSION],filter:opts.filter,limit:100,timeoutMs:opts.timeoutMs,timeoutSubject:"firewall metrics"}),byAction=new Map,totalFromSummary=new Set;for(let row of result.summary){let action=actionFromRow(row);totalFromSummary.add(action),byAction.set(action,{action,total:rowValue(row),timeseries:[]})}for(let row of result.series){let action=actionFromRow(row),value=rowValue(row),series2=byAction.get(action);series2||(series2={action,total:0,timeseries:[]},byAction.set(action,series2)),series2.timeseries.push({timestamp:row.timestamp,value}),totalFromSummary.has(action)||(series2.total+=value)}let order=["allow","deny","challenge","log","rate_limit","bypass"],series=[...byAction.values()].sort((a,b)=>{let ai=order.indexOf(a.action),bi=order.indexOf(b.action);return ai===-1&&bi===-1?a.action.localeCompare(b.action):ai===-1?1:bi===-1?-1:ai-bi});for(let s of series)s.timeseries.sort((a,b)=>a.timestamp.localeCompare(b.timestamp));let totals={};for(let s of series)totals[s.action]=s.total;return{startTime:result.startTime.toISOString(),endTime:result.endTime.toISOString(),granularity,series,totals}}function quoteKqlValue(value){return`"${value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function eqFilter(field,value){return`${field}:${quoteKqlValue(value)}`}function neFilter(field,value){return`${field}!=${quoteKqlValue(value)}`}function nonEmptyFilter(field){return neFilter(field,"")}var TRAFFIC_DIMENSIONS=[{alias:"ip",field:"clientIp",label:"IP Address",widgetTitle:"Top IPs",excludeFilter:neFilter("clientIp","127.0.0.1"),headerDetailFields:["asnName","asnId","clientIpCountry"],defaultGroupBy:"path"},{alias:"ja4",field:"clientJa4Digest",label:"JA4 Digest",widgetTitle:"Top JA4 Digests",excludeFilter:nonEmptyFilter("clientJa4Digest"),headerDetailFields:["clientUserAgent"],defaultGroupBy:"path"},{alias:"asn",field:"asnName",label:"AS Name",widgetTitle:"Top AS Names",excludeFilter:`(${nonEmptyFilter("asnId")}) AND (${nonEmptyFilter("asnName")})`,groupBy:["asnName","asnId"],labelFields:["asnId"],headerDetailFields:["asnId"],defaultGroupBy:"ip"},{alias:"user-agent",field:"clientUserAgent",label:"User Agent",widgetTitle:"Top User Agents",excludeFilter:nonEmptyFilter("clientUserAgent"),defaultGroupBy:"path"},{alias:"path",field:"requestPath",label:"Request Path",widgetTitle:"Top Request Paths",excludeFilter:nonEmptyFilter("requestPath"),defaultGroupBy:"ip"},{alias:"rule",field:"wafRuleId",label:"Firewall Rule",widgetTitle:"Rules",excludeFilter:`(${nonEmptyFilter("wafRuleId")}) AND (${nonEmptyFilter("wafAction")})`,defaultGroupBy:"ip"},{alias:"host",field:"requestHostname",label:"Hostname",widgetTitle:"Top Hosts",defaultGroupBy:"path"},{alias:"bot",field:"botName",label:"Bot",widgetTitle:"Verified Bots",excludeFilter:nonEmptyFilter("botName"),defaultGroupBy:"path"},{alias:"unknown-bot",field:"botCategory",label:"Unknown Bot Category",widgetTitle:"Unknown Bot Traffic",excludeFilter:nonEmptyFilter("botCategory"),metric:"vercel.request.count",extraFilter:neFilter("botVerified","pass"),defaultGroupBy:"path"},{alias:"country",field:"clientIpCountry",label:"Country",widgetTitle:"Top Countries",excludeFilter:nonEmptyFilter("clientIpCountry"),defaultGroupBy:"ip"},{alias:"action",field:"wafAction",label:"Firewall Action",widgetTitle:"Actions",excludeFilter:nonEmptyFilter("wafAction"),defaultGroupBy:"rule"}];function getDimension(alias2){return TRAFFIC_DIMENSIONS.find(d=>d.alias===alias2)}function dimensionAliases(){return TRAFFIC_DIMENSIONS.map(d=>d.alias)}function andFilters(...parts){let nonEmpty=parts.filter(p=>!!(p&&p.length>0));if(nonEmpty.length!==0)return nonEmpty.length===1?nonEmpty[0]:nonEmpty.map(p=>`(${p})`).join(" AND ")}var RULE_ID_DIMENSION="wafRuleId",RULE_TRAFFIC_FILTER=`(${nonEmptyFilter(RULE_ID_DIMENSION)}) AND (${nonEmptyFilter("wafAction")})`,GRANULARITY_LADDER=[[6e4,{minutes:1}],[5*6e4,{minutes:5}],[15*6e4,{minutes:15}],[30*6e4,{minutes:30}],[36e5,{hours:1}],[2*36e5,{hours:2}],[4*36e5,{hours:4}],[12*36e5,{hours:12}],[24*36e5,{hours:24}]],DEFAULT_MAX_BUCKETS=24;function pickGranularity(spanMs,maxBuckets=DEFAULT_MAX_BUCKETS){for(let[stepMs,granularity]of GRANULARITY_LADDER)if(spanMs/stepMs<=maxBuckets)return granularity;return{hours:24}}async function getTopList(client,opts){let{summary}=await queryFirewallObservability(client,{...opts,granularity:void 0,limit:Math.min(opts.top,500)}),rows=summary.map(row=>({values:Object.fromEntries(opts.groupBy.map(field=>[field,rowDimension(row,field)])),total:rowValue(row)}));return rows.sort((a,b)=>b.total-a.total),rows.slice(0,opts.top)}async function getGroupedTimeseries(client,opts){let spanMs=opts.endTime.getTime()-opts.startTime.getTime(),granularity=opts.granularity??pickGranularity(spanMs),groupBy=opts.groupBy??[],result=await queryFirewallObservability(client,{...opts,granularity,groupBy}),keyOf=row=>groupBy.map(f=>rowDimension(row,f)).join(" \xB7 "),groups=new Map,pointsByGroup=new Map,axisSet=new Set,hasSummary=result.summary.length>0,getOrCreate=row=>{let key=keyOf(row),group=groups.get(key);return group||(group={values:Object.fromEntries(groupBy.map(field=>[field,rowDimension(row,field)])),key,total:0,series:[]},groups.set(key,group)),group};for(let row of result.summary)getOrCreate(row).total=rowValue(row);for(let row of result.series){let timestamp2=row.timestamp;if(!timestamp2)continue;axisSet.add(timestamp2);let group=getOrCreate(row),points=pointsByGroup.get(group.key);points||(points=new Map,pointsByGroup.set(group.key,points));let value=rowValue(row);points.set(timestamp2,(points.get(timestamp2)??0)+value),hasSummary||(group.total+=value)}let axis=[...axisSet].sort();for(let group of groups.values()){let points=pointsByGroup.get(group.key);group.series=axis.map(t=>points?.get(t)??0)}return{startTime:result.startTime.toISOString(),endTime:result.endTime.toISOString(),granularity,axis,groups:[...groups.values()].sort((a,b)=>b.total-a.total)}}var WELL_KNOWN_RULE_NAMES={sys_dos_mitigation:"DDoS Mitigation",ip_blocking:"IP Blocking",challenge_mode:"Attack Mode",default_web_traffic:"Allowed Requests",managed_bot_protection:"Bot Protection",managed_bot_filter:"Bot Protection",owasp_anomaly_detection:"OWASP Anomaly Detection",owasp_xss_detection:"OWASP XSS Detection",owasp_sqli_detection:"OWASP SQL Injection Detection",owasp_rfi_detection:"OWASP RFI Detection",owasp_lfi_detection:"OWASP LFI Detection",owasp_rce_detection:"OWASP RCE Detection",owasp_php_detection:"OWASP PHP Injection Detection",owasp_session_fixation_detection:"OWASP Session Fixation Detection",deployment_rules:"Deployment Rules",deployment_defined_rules:"Deployment Defined Rules"};function titleCaseManagedSuffix(ruleId){return ruleId.slice(8).split("_").filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}function ipBlockName(ip){return!ip.hostname||ip.hostname==="*"?`IP Block ${ip.ip}`:`IP Block ${ip.hostname} ${ip.ip}`}function resolveRuleDisplayName(ruleId,config){if(!ruleId)return ruleId;let custom=config?.rules.find(r=>r.id===ruleId);if(custom?.name)return custom.name;let ip=config?.ips.find(r=>r.id===ruleId);if(ip)return ipBlockName(ip);let known=WELL_KNOWN_RULE_NAMES[ruleId];return known||(ruleId.startsWith("managed_")?titleCaseManagedSuffix(ruleId):ruleId)}var import_chalk111=__toESM(require_source(),1);var MAX_VALUE_WIDTH=60,MAX_TREND_LABEL_WIDTH=40,NOT_SET="(not set)",FIELD_LABELS={asnId:"AS Number",asnName:"AS Name",clientIp:"IP Address",clientIpCountry:"Country",clientJa4Digest:"JA4 Digest",clientUserAgent:"User Agent",requestHostname:"Hostname",requestPath:"Request Path",wafAction:"Action",wafRuleId:"Rule"};function fieldLabel(field){return FIELD_LABELS[field]??field}function windowLabel(opts){let range=`${formatUtcTime(opts.startMs,!0)} \u2013 ${formatUtcTime(opts.endMs,!0)} UTC`;if(opts.points===0)return range;let unit=opts.points===1?"point":"points";return`${range} \xB7 ${opts.points} ${unit} (${granularityLabel(opts.granularity)} each)`}function axisOf(series){let timestamps=new Set;for(let s of series)for(let point of s.timeseries)timestamps.add(point.timestamp);return[...timestamps].sort()}function peakOf(values,axis){let peak=0,peakTs="";for(let i=0;i<axis.length;i++)values[i]>peak&&(peak=values[i],peakTs=axis[i]);return{peak,peakTs}}function indent2(rendered){return rendered.split(`
|
|
486
|
+
`),await client.input.confirm("This is the only draft change. Publish to production now?",!1)){let publishStamp=stamp_default();output_manager_default.spinner("Publishing to production");try{await activateFirewallConfig(client,scope,"draft"),output_manager_default.log(`${import_chalk110.default.cyan("Published")} to production ${import_chalk110.default.gray(publishStamp())}`)}catch(e2){output_manager_default.error(`Failed to publish to production: ${mapFirewallApiError(e2,scope,"Unknown error")}`)}}}else hadExistingDraft&&output_manager_default.warn(`There are other draft changes. Review with ${import_chalk110.default.cyan(withGlobalFlags3(client,"firewall diff",scope))} before publishing.`)}function resolveIpRule(ips,identifier){if(!identifier)return[];let byId=ips.find(r=>r.id===identifier);if(byId)return[byId];let query=identifier.toLowerCase(),byIp=ips.filter(r=>r.ip.toLowerCase()===query);return byIp.length>0?byIp:ips.filter(r=>r.id.toLowerCase().includes(query))}function resolveRule(rules3,identifier){if(!identifier)return[];let byId=rules3.find(r=>r.id===identifier);if(byId)return[byId];let query=identifier.toLowerCase(),byName=rules3.filter(r=>r.name.toLowerCase()===query);if(byName.length>0)return byName;let byPartialName=rules3.filter(r=>r.name.toLowerCase().includes(query));return byPartialName.length>0?byPartialName:rules3.filter(r=>r.id.toLowerCase().includes(query))}function printActionImpactWarning(action){let actionType=action.mitigate?.action;if(actionType)switch(actionType){case"deny":output_manager_default.warn("This rule will deny matching requests. Legitimate traffic may be blocked if conditions are too broad.");break;case"challenge":output_manager_default.warn("This rule will challenge matching requests with a verification page. Some legitimate users or automated clients may be unable to complete the challenge.");break;case"rate_limit":output_manager_default.warn("This rule will rate limit matching requests. Legitimate traffic may be throttled if the limit is too low or keys are too broad.");break;default:break}}async function getBypass(client,projectId,options={}){let{teamId}=options,query=new URLSearchParams;query.set("projectId",projectId),teamId&&query.set("teamId",teamId);let url=`/v1/security/firewall/bypass?${query.toString()}`;return client.fetch(url)}import{isIP}from"node:net";var STRING_OPS=["eq","inc"],STRING_MATCH_OPS=["sub","pre","suf","re"],KEY_EXISTS_OPS=["ex"],STRING_ONLY=[...STRING_OPS],STRING_AND_MATCH=[...STRING_OPS,...STRING_MATCH_OPS],STRING_MATCH_AND_EXISTS=[...STRING_OPS,...STRING_MATCH_OPS,...KEY_EXISTS_OPS],CONDITION_TYPES=[{type:"path",displayName:"Request Path",description:"URL path of the request",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"route",displayName:"Route",description:"Route pattern (e.g., /blog/[slug])",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"raw_path",displayName:"Raw Path",description:"Pre-rewrite URL path",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"server_action",displayName:"Server Action Name",description:"Next.js Server Action name",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"method",displayName:"Method",description:"HTTP method (GET, POST, DELETE, etc.)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"GET",value:"GET"},{label:"HEAD",value:"HEAD"},{label:"POST",value:"POST"},{label:"DELETE",value:"DELETE"},{label:"PATCH",value:"PATCH"},{label:"PUT",value:"PUT"},{label:"CONNECT",value:"CONNECT"},{label:"OPTIONS",value:"OPTIONS"},{label:"TRACE",value:"TRACE"},{label:"DEBUG",value:"DEBUG"},{label:"QUERY",value:"QUERY"}]},{type:"host",displayName:"Hostname",description:"Request hostname",category:"request",requiresKey:!1,operators:STRING_AND_MATCH},{type:"protocol",displayName:"Protocol",description:"HTTP protocol version (HTTP/1.1, HTTP/2.0)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"HTTP/1.1",value:"HTTP/1.1"},{label:"HTTP/2.0",value:"HTTP/2.0"}]},{type:"environment",displayName:"Environment",description:"Deployment environment (preview, production)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"Preview",value:"preview"},{label:"Production",value:"production"}]},{type:"region",displayName:"Vercel Region",description:"Edge region serving the request",category:"request",requiresKey:!1,operators:STRING_ONLY},{type:"target_path",displayName:"Target Path",description:"Post-rewrite destination path",category:"request",requiresKey:!1,operators:STRING_AND_MATCH,valueValidation:"path"},{type:"scheme",displayName:"Scheme",description:"Request scheme (http, https)",category:"request",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"http",value:"http"},{label:"https",value:"https"}]},{type:"rate_limit_api_id",displayName:"Rate Limit API ID",description:"Identifier for rate-limit API grouping",category:"request",requiresKey:!1,operators:STRING_ONLY},{type:"ip_address",displayName:"IP Address",description:"Client IP address or CIDR range",category:"client",requiresKey:!1,operators:STRING_ONLY},{type:"user_agent",displayName:"User Agent",description:"Client User-Agent string",category:"client",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_country",displayName:"Country",description:"Country code (ISO 3166-1 alpha-2)",category:"geo",requiresKey:!1,operators:STRING_ONLY},{type:"geo_continent",displayName:"Continent",description:"Continent code (AF, AN, AS, EU, NA, OC, SA)",category:"geo",requiresKey:!1,operators:STRING_ONLY,presetValues:[{label:"Africa (AF)",value:"AF"},{label:"Antarctica (AN)",value:"AN"},{label:"Asia (AS)",value:"AS"},{label:"Europe (EU)",value:"EU"},{label:"North America (NA)",value:"NA"},{label:"Oceania (OC)",value:"OC"},{label:"South America (SA)",value:"SA"}]},{type:"geo_city",displayName:"City",description:"City name",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_country_region",displayName:"State / Region",description:"State or region code",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH},{type:"geo_as_number",displayName:"AS Number",description:"Autonomous System Number",category:"geo",requiresKey:!1,operators:STRING_AND_MATCH,valueValidation:"digits"},{type:"header",displayName:"Request Header",description:"HTTP request header (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"query",displayName:"Query Parameter",description:"URL query parameter (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"cookie",displayName:"Cookie",description:"HTTP cookie (requires key)",category:"key-value",requiresKey:!0,operators:STRING_MATCH_AND_EXISTS},{type:"ja4_digest",displayName:"JA4 Digest",description:"JA4 TLS fingerprint",category:"security",requiresKey:!1,operators:STRING_AND_MATCH},{type:"ja3_digest",displayName:"JA3 Digest",description:"JA3 TLS fingerprint",category:"security",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"enterprise"},{type:"bot_name",displayName:"Bot Name",description:"Verified bot name",category:"bot",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"security-plus"},{type:"bot_category",displayName:"Bot Category",description:"Verified bot category",category:"bot",requiresKey:!1,operators:STRING_AND_MATCH,planRequirement:"security-plus"}],CONDITION_TYPE_MAP=Object.fromEntries(CONDITION_TYPES.map(ct=>[ct.type,ct])),ALL_OPERATORS=["eq","neq","inc","ninc","sub","pre","suf","re","ex","nex","gt","gte","lt","lte"],CATEGORY_LABELS={request:"Request",client:"Client",geo:"Geo / Location","key-value":"Key-Value (Header / Query / Cookie)",security:"Security / TLS",bot:"Bot Detection"},VALID_ACTIONS=["deny","challenge","log","bypass","rate_limit","redirect"],VALID_DURATIONS=["1m","5m","15m","30m","1h"],VALID_ALGORITHMS=["fixed_window","token_bucket"];async function fetchPlanInfo(client){try{let{team}=await getScope(client);if(team)return{isEnterprise:team.billing.plan==="enterprise",hasSecurityPlus:team.securityPlus?.enabled===!0,known:!0}}catch{}return{isEnterprise:!1,hasSecurityPlus:!1,known:!1}}function getAvailableConditionTypes(planInfo){return CONDITION_TYPES.filter(ct=>!(ct.deprecated||ct.planRequirement==="enterprise"&&!planInfo?.isEnterprise||ct.planRequirement==="security-plus"&&!planInfo?.hasSecurityPlus))}function getActionLabel(action){return{deny:"Deny \u2014 Block traffic (403)",challenge:"Challenge \u2014 Verify at security checkpoint",log:"Log \u2014 Monitor without blocking",bypass:"Bypass \u2014 Skip other custom rules",rate_limit:"Rate Limit \u2014 Enforce request limits",redirect:"Redirect \u2014 Send to a different URL"}[action]||action}function getOperatorDisplayName(op,neg){let pair={eq:["equals","does not equal"],inc:["is any of","is not any of"],sub:["contains","does not contain"],pre:["starts with","does not start with"],suf:["ends with","does not end with"],re:["matches regex","does not match regex"],ex:["exists","does not exist"]}[op];return pair?neg?pair[1]:pair[0]:neg?`NOT ${op}`:op}function validateConditionValue(val,meta){if(!meta?.valueValidation)return!0;switch(meta.valueValidation){case"path":return val.startsWith("/")?!0:"Path must start with /";case"ip":{if(isIP(val))return!0;let slashIdx=val.lastIndexOf("/");if(slashIdx!==-1){let ip=val.slice(0,slashIdx),prefix=Number.parseInt(val.slice(slashIdx+1),10);if(isIP(ip)&&!Number.isNaN(prefix)&&prefix>=0)return!0}return"Please enter a valid IP address or CIDR range."}case"hostname":return/^[A-Za-z0-9-]{1,63}(?:\.[A-Za-z0-9-]{1,63})*$/.test(val)?!0:"Please enter a valid hostname.";case"digits":return/^\d+$/.test(val)?!0:"Please enter digits only.";default:return!0}}var FIREWALL_ACTION_METRIC="vercel.firewall_action.count";var VALUE_ALIAS="value",DEFAULT_TIMEOUT_MS2=45e3,ActivityTimeoutError=class extends Error{constructor(message){super(message),this.name="ActivityTimeoutError"}};function isRateLimited(error){return isAPIError(error)&&error.status===429}function rateLimitRetrySeconds(error){if(!isRateLimited(error))return;let ms47=error.retryAfterMs;if(!(typeof ms47!="number"||ms47<=0))return Math.ceil(ms47/1e3)}function isActivityTimeout(error){return isAPIError(error)&&error.status===408||error instanceof Error&&error.name==="ActivityTimeoutError"}function toBucketSeconds(granularity){return"minutes"in granularity?granularity.minutes*60:"hours"in granularity?granularity.hours*60*60:granularity.days*24*60*60}function alignQueryWindow(startTime,endTime,granularity){let stepMs=granularity?toBucketSeconds(granularity)*1e3:1e3;return{startTime:new Date(Math.floor(startTime.getTime()/stepMs)*stepMs),endTime:new Date(Math.ceil(endTime.getTime()/stepMs)*stepMs)}}async function queryFirewallObservability(client,opts){let groupBy=opts.groupBy??[],window=alignQueryWindow(opts.startTime,opts.endTime,opts.granularity),bucketed=opts.granularity!==void 0,ranked=groupBy.length>0&&opts.limit!==void 0,body={scope:{ownerId:opts.ownerId,projectIds:[opts.projectId]},timeRange:{start:window.startTime.toISOString(),end:window.endTime.toISOString()},metrics:{[VALUE_ALIAS]:{metric:opts.metric??FIREWALL_ACTION_METRIC,aggregation:"count"}},outputs:[VALUE_ALIAS],...opts.granularity?{bucketSeconds:toBucketSeconds(opts.granularity)}:{},...groupBy.length>0?{groupBy}:{},...opts.filter?{filter:opts.filter}:{},...ranked&&bucketed?{seriesSelection:{limit:opts.limit,mode:opts.approximateSelection?"approximate":"exact",rankBy:[{metric:VALUE_ALIAS,direction:"desc"}]}}:{},...ranked&&!bucketed?{rowLimit:opts.limit,orderBy:[{metric:VALUE_ALIAS,direction:"desc"}]}:{}},timeoutMs=opts.timeoutMs??DEFAULT_TIMEOUT_MS2,response;try{response=await client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:opts.ownerId,signal:AbortSignal.timeout(timeoutMs),bailOn429:!0})}catch(err){throw err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?new ActivityTimeoutError(`Timed out after ${Math.round(timeoutMs/1e3)}s waiting for ${opts.timeoutSubject??"firewall traffic data"}.`):err}return{summary:response.summary??[],series:response.series??[],startTime:window.startTime,endTime:window.endTime}}function rowValue(row){let raw=row.values?.[VALUE_ALIAS],n=typeof raw=="number"?raw:Number(raw);return Number.isFinite(n)?n:0}function rowDimension(row,field){return String(row.dimensions?.[field]??"")}function isUnsupportedDimension(error){if(!isAPIError(error)||error.status!==400)return!1;let pattern=/does not support|is not supported|not publicly queryable/i,issues=error.issues;return Array.isArray(issues)?issues.some(issue2=>typeof issue2?.message=="string"&&pattern.test(issue2.message)):pattern.test(error.serverMessage||error.message||"")}var ACTION_DIMENSION="wafAction";function actionFromRow(row){return rowDimension(row,ACTION_DIMENSION)||"unknown"}async function getFirewallMetrics(client,opts){let granularity=opts.granularity??{hours:1},result=await queryFirewallObservability(client,{ownerId:opts.ownerId,projectId:opts.projectId,startTime:opts.startTime,endTime:opts.endTime,granularity,groupBy:[ACTION_DIMENSION],filter:opts.filter,limit:100,timeoutMs:opts.timeoutMs,timeoutSubject:"firewall metrics"}),byAction=new Map,totalFromSummary=new Set;for(let row of result.summary){let action=actionFromRow(row);totalFromSummary.add(action),byAction.set(action,{action,total:rowValue(row),timeseries:[]})}for(let row of result.series){let action=actionFromRow(row),value=rowValue(row),series2=byAction.get(action);series2||(series2={action,total:0,timeseries:[]},byAction.set(action,series2)),series2.timeseries.push({timestamp:row.timestamp,value}),totalFromSummary.has(action)||(series2.total+=value)}let order=["allow","deny","challenge","log","rate_limit","bypass"],series=[...byAction.values()].sort((a,b)=>{let ai=order.indexOf(a.action),bi=order.indexOf(b.action);return ai===-1&&bi===-1?a.action.localeCompare(b.action):ai===-1?1:bi===-1?-1:ai-bi});for(let s of series)s.timeseries.sort((a,b)=>a.timestamp.localeCompare(b.timestamp));let totals={};for(let s of series)totals[s.action]=s.total;return{startTime:result.startTime.toISOString(),endTime:result.endTime.toISOString(),granularity,series,totals}}function quoteKqlValue(value){return`"${value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function eqFilter(field,value){return`${field}:${quoteKqlValue(value)}`}function neFilter(field,value){return`${field}!=${quoteKqlValue(value)}`}function nonEmptyFilter(field){return neFilter(field,"")}var TRAFFIC_DIMENSIONS=[{alias:"ip",field:"clientIp",label:"IP Address",widgetTitle:"Top IPs",excludeFilter:neFilter("clientIp","127.0.0.1"),headerDetailFields:["asnName","asnId","clientIpCountry"],defaultGroupBy:"path"},{alias:"ja4",field:"clientJa4Digest",label:"JA4 Digest",widgetTitle:"Top JA4 Digests",excludeFilter:nonEmptyFilter("clientJa4Digest"),headerDetailFields:["clientUserAgent"],defaultGroupBy:"path"},{alias:"asn",field:"asnName",label:"AS Name",widgetTitle:"Top AS Names",excludeFilter:`(${nonEmptyFilter("asnId")}) AND (${nonEmptyFilter("asnName")})`,groupBy:["asnName","asnId"],labelFields:["asnId"],headerDetailFields:["asnId"],defaultGroupBy:"ip"},{alias:"user-agent",field:"clientUserAgent",label:"User Agent",widgetTitle:"Top User Agents",excludeFilter:nonEmptyFilter("clientUserAgent"),defaultGroupBy:"path"},{alias:"path",field:"requestPath",label:"Request Path",widgetTitle:"Top Request Paths",excludeFilter:nonEmptyFilter("requestPath"),defaultGroupBy:"ip"},{alias:"rule",field:"wafRuleId",label:"Firewall Rule",widgetTitle:"Rules",excludeFilter:`(${nonEmptyFilter("wafRuleId")}) AND (${nonEmptyFilter("wafAction")})`,defaultGroupBy:"ip"},{alias:"host",field:"requestHostname",label:"Hostname",widgetTitle:"Top Hosts",defaultGroupBy:"path"},{alias:"bot",field:"botName",label:"Bot",widgetTitle:"Verified Bots",excludeFilter:nonEmptyFilter("botName"),defaultGroupBy:"path"},{alias:"unknown-bot",field:"botCategory",label:"Unknown Bot Category",widgetTitle:"Unknown Bot Traffic",excludeFilter:nonEmptyFilter("botCategory"),metric:"vercel.request.count",extraFilter:neFilter("botVerified","pass"),defaultGroupBy:"path"},{alias:"country",field:"clientIpCountry",label:"Country",widgetTitle:"Top Countries",excludeFilter:nonEmptyFilter("clientIpCountry"),defaultGroupBy:"ip"},{alias:"action",field:"wafAction",label:"Firewall Action",widgetTitle:"Actions",excludeFilter:nonEmptyFilter("wafAction"),defaultGroupBy:"rule"}];function getDimension(alias2){return TRAFFIC_DIMENSIONS.find(d=>d.alias===alias2)}function dimensionAliases(){return TRAFFIC_DIMENSIONS.map(d=>d.alias)}function andFilters(...parts){let nonEmpty=parts.filter(p=>!!(p&&p.length>0));if(nonEmpty.length!==0)return nonEmpty.length===1?nonEmpty[0]:nonEmpty.map(p=>`(${p})`).join(" AND ")}var RULE_ID_DIMENSION="wafRuleId",RULE_TRAFFIC_FILTER=`(${nonEmptyFilter(RULE_ID_DIMENSION)}) AND (${nonEmptyFilter("wafAction")})`,GRANULARITY_LADDER=[[6e4,{minutes:1}],[5*6e4,{minutes:5}],[15*6e4,{minutes:15}],[30*6e4,{minutes:30}],[36e5,{hours:1}],[2*36e5,{hours:2}],[4*36e5,{hours:4}],[12*36e5,{hours:12}],[24*36e5,{hours:24}]],DEFAULT_MAX_BUCKETS=24;function pickGranularity(spanMs,maxBuckets=DEFAULT_MAX_BUCKETS){for(let[stepMs,granularity]of GRANULARITY_LADDER)if(spanMs/stepMs<=maxBuckets)return granularity;return{hours:24}}async function getTopList(client,opts){let{summary}=await queryFirewallObservability(client,{...opts,granularity:void 0,limit:Math.min(opts.top,500)}),rows=summary.map(row=>({values:Object.fromEntries(opts.groupBy.map(field=>[field,rowDimension(row,field)])),total:rowValue(row)}));return rows.sort((a,b)=>b.total-a.total),rows.slice(0,opts.top)}async function getGroupedTimeseries(client,opts){let spanMs=opts.endTime.getTime()-opts.startTime.getTime(),granularity=opts.granularity??pickGranularity(spanMs),groupBy=opts.groupBy??[],result=await queryFirewallObservability(client,{...opts,granularity,groupBy}),keyOf=row=>groupBy.map(f=>rowDimension(row,f)).join(" \xB7 "),groups=new Map,pointsByGroup=new Map,axisSet=new Set,hasSummary=result.summary.length>0,getOrCreate=row=>{let key=keyOf(row),group=groups.get(key);return group||(group={values:Object.fromEntries(groupBy.map(field=>[field,rowDimension(row,field)])),key,total:0,series:[]},groups.set(key,group)),group};for(let row of result.summary)getOrCreate(row).total=rowValue(row);for(let row of result.series){let timestamp2=row.timestamp;if(!timestamp2)continue;axisSet.add(timestamp2);let group=getOrCreate(row),points=pointsByGroup.get(group.key);points||(points=new Map,pointsByGroup.set(group.key,points));let value=rowValue(row);points.set(timestamp2,(points.get(timestamp2)??0)+value),hasSummary||(group.total+=value)}let axis=[...axisSet].sort();for(let group of groups.values()){let points=pointsByGroup.get(group.key);group.series=axis.map(t=>points?.get(t)??0)}return{startTime:result.startTime.toISOString(),endTime:result.endTime.toISOString(),granularity,axis,groups:[...groups.values()].sort((a,b)=>b.total-a.total)}}var WELL_KNOWN_RULE_NAMES={sys_dos_mitigation:"DDoS Mitigation",ip_blocking:"IP Blocking",challenge_mode:"Attack Mode",default_web_traffic:"Allowed Requests",managed_bot_protection:"Bot Protection",managed_bot_filter:"Bot Protection",owasp_anomaly_detection:"OWASP Anomaly Detection",owasp_xss_detection:"OWASP XSS Detection",owasp_sqli_detection:"OWASP SQL Injection Detection",owasp_rfi_detection:"OWASP RFI Detection",owasp_lfi_detection:"OWASP LFI Detection",owasp_rce_detection:"OWASP RCE Detection",owasp_php_detection:"OWASP PHP Injection Detection",owasp_session_fixation_detection:"OWASP Session Fixation Detection",deployment_rules:"Deployment Rules",deployment_defined_rules:"Deployment Defined Rules"};function titleCaseManagedSuffix(ruleId){return ruleId.slice(8).split("_").filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}function ipBlockName(ip){return!ip.hostname||ip.hostname==="*"?`IP Block ${ip.ip}`:`IP Block ${ip.hostname} ${ip.ip}`}function resolveRuleDisplayName(ruleId,config){if(!ruleId)return ruleId;let custom=config?.rules.find(r=>r.id===ruleId);if(custom?.name)return custom.name;let ip=config?.ips.find(r=>r.id===ruleId);if(ip)return ipBlockName(ip);let known=WELL_KNOWN_RULE_NAMES[ruleId];return known||(ruleId.startsWith("managed_")?titleCaseManagedSuffix(ruleId):ruleId)}var import_chalk111=__toESM(require_source(),1);var MAX_VALUE_WIDTH=60,MAX_TREND_LABEL_WIDTH=40,NOT_SET="(not set)",FIELD_LABELS={asnId:"AS Number",asnName:"AS Name",clientIp:"IP Address",clientIpCountry:"Country",clientJa4Digest:"JA4 Digest",clientUserAgent:"User Agent",requestHostname:"Hostname",requestPath:"Request Path",wafAction:"Action",wafRuleId:"Rule"};function fieldLabel(field){return FIELD_LABELS[field]??field}function windowLabel(opts){let range=`${formatUtcTime(opts.startMs,!0)} \u2013 ${formatUtcTime(opts.endMs,!0)} UTC`;if(opts.points===0)return range;let unit=opts.points===1?"point":"points";return`${range} \xB7 ${opts.points} ${unit} (${granularityLabel(opts.granularity)} each)`}function axisOf(series){let timestamps=new Set;for(let s of series)for(let point of s.timeseries)timestamps.add(point.timestamp);return[...timestamps].sort()}function peakOf(values,axis){let peak=0,peakTs="";for(let i=0;i<axis.length;i++)values[i]>peak&&(peak=values[i],peakTs=axis[i]);return{peak,peakTs}}function indent2(rendered){return rendered.split(`
|
|
487
487
|
`).map(line2=>` ${line2}`.trimEnd())}function emptyLine(filtered){return import_chalk111.default.dim(filtered?" No requests match the current filters.":" No requests in this period.")}function retryLabel(seconds){if(seconds<90)return`${seconds}s`;let minutes=Math.round(seconds/60);if(minutes<90)return`${minutes} ${minutes===1?"minute":"minutes"}`;let hours=Math.round(seconds/3600);return`${hours} ${hours===1?"hour":"hours"}`}function unavailableLine(reason,retrySeconds){switch(reason){case"filter":return"Not reported alongside the filters in use.";case"plan":return"Needs Observability Plus.";case"rate-limit":return retrySeconds?`Rate limited by the Observability API. Retry in ${retryLabel(retrySeconds)}.`:"Rate limited by the Observability API.";case"timeout":return"Timed out. Narrow the window with `--since` and try again.";default:return"Couldn't load this table."}}function toTopListRows(rows,field,labelFields){return rows.filter(row=>row.values[field]).map(row=>{let extras=(labelFields??[]).map(f=>row.values[f]).filter(v=>!!v&&v!==row.values[field]);return{value:row.values[field],total:row.total,...extras.length>0?{label:`${row.values[field]} (${extras.join(", ")})`}:{}}})}function topListFetchCount(top,groupBy=[]){let extraFields=Math.max(0,groupBy.length-1);return top+1+extraFields*16}function formatTopList(list30,filtered){let lines=[` ${import_chalk111.default.bold(list30.title)}`];return list30.unavailable?(lines.push(import_chalk111.default.dim(` ${list30.message??unavailableLine(list30.unavailable,list30.retrySeconds)}`)),lines):list30.rows.length===0?(lines.push(emptyLine(filtered)),lines):(lines.push(...indent2(table(list30.rows.map(row=>[ellipsizeMiddle(row.label??row.value,MAX_VALUE_WIDTH),formatCount3(row.total)]),{align:["l","r"],hsep:3}))),lines)}function formatTrafficTopList(list30,filtered=!1){return formatTopList(list30,filtered).join(`
|
|
488
488
|
`)}function formatGroupedTrendTable(opts){let{axis}=opts.result,needsDate=windowNeedsDate(new Date(opts.result.startTime).getTime(),new Date(opts.result.endTime).getTime()),rows=[[opts.labelHeader,"Trend","Total","Peak","Peak at"].map(h=>import_chalk111.default.bold(import_chalk111.default.cyan(h)))];for(let group of opts.result.groups){let{peak,peakTs}=peakOf(group.series,axis);rows.push([ellipsizeMiddle(group.values[opts.field]||NOT_SET,MAX_TREND_LABEL_WIDTH),generateSparkline(group.series),formatCount3(group.total),peak>0?formatCount3(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return indent2(table(rows,{align:["l","l","r","r","r"],hsep:3}))}function formatTrafficList(opts){let startMs=new Date(opts.startTime).getTime(),endMs=new Date(opts.endTime).getTime(),axis=axisOf(opts.series),lines=[` ${import_chalk111.default.bold("Firewall traffic")} ${import_chalk111.default.dim(windowLabel({startMs,endMs,points:axis.length,granularity:opts.granularity}))}`,"",` ${import_chalk111.default.bold("Requests by Action")}`,formatActionTrendTable(opts.series)],shared=sharedUnavailable(opts.topLists);if(shared)return lines.push(""),lines.push(` ${import_chalk111.default.dim(shared.message??unavailableLine(shared.reason,shared.retrySeconds))}`),lines.push(import_chalk111.default.dim(` No top lists: ${opts.topLists.map(l=>l.title).join(", ")}.`)),lines.push(""),lines.join(`
|
|
489
489
|
`);for(let list30 of opts.topLists)lines.push(""),lines.push(...formatTopList(list30,opts.filtered));return lines.push(""),lines.join(`
|
|
@@ -491,7 +491,7 @@ ${import_chalk107.default.yellow("!")} No exposures or metric events in this win
|
|
|
491
491
|
`)}var import_chalk112=__toESM(require_source(),1);var OVERVIEW_TOP_RULES=8,MAX_RULE_VALUE_WIDTH=40;function formatOverviewOutput(opts){let lines=[],windowStartMs=new Date(opts.startTime).getTime(),windowEndMs=new Date(opts.endTime).getTime(),needsDate=windowNeedsDate(windowStartMs,windowEndMs),attacksSuffix=opts.attacksMitigatedIncomplete?` ${import_chalk112.default.dim("\xB7 at least, some alerts unread")}`:"";lines.push(` ${import_chalk112.default.bold("Attacks mitigated")} (this window) ${formatCount3(opts.attacksMitigated)}${attacksSuffix}`),lines.push("");let allTs=new Set;for(let s of opts.series)for(let p of s.timeseries)allTs.add(p.timestamp);let axis=[...allTs].sort(),bucket=opts.granularity?granularityLabel(opts.granularity):void 0,rangeLabel=`${formatUtcTime(windowStartMs,!0)} \u2013 ${formatUtcTime(windowEndMs,!0)} UTC`,pointsLabel=axis.length>0?` \xB7 ${axis.length} point${axis.length===1?"":"s"}${bucket?` (${bucket} each)`:""}`:"";lines.push(` ${import_chalk112.default.bold("Requests by Action")} ${rangeLabel+pointsLabel}`);let hasAnyTraffic=opts.series.some(s=>s.total>0||s.timeseries.some(p=>p.value>0));if(opts.series.length===0||axis.length===0||!hasAnyTraffic)lines.push(import_chalk112.default.dim(" No request data for this period."));else{let rows=[["Action","Trend","Total","Peak","Peak at"].map(h=>import_chalk112.default.bold(import_chalk112.default.cyan(h)))];for(let s of opts.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_chalk112.default.dim,trend=s.total>0?plain:import_chalk112.default.dim;rows.push([color(labelForAction(s.action)),trend(generateSparkline(values)),formatCount3(s.total),peak>0?formatCount3(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}let rendered=table(rows,{align:["l","l","r","r","r"],hsep:3});for(let line2 of rendered.split(`
|
|
492
492
|
`))lines.push(` ${line2}`.trimEnd())}if(lines.push(""),lines.push(` ${import_chalk112.default.bold("Rules")} (top ${OVERVIEW_TOP_RULES})`),opts.rules.length===0)lines.push(import_chalk112.default.dim(" No rule traffic for this period."));else{let rows=[["Rule","Requests","Id"].map(h=>import_chalk112.default.bold(import_chalk112.default.cyan(h)))];for(let r of opts.rules)rows.push([ellipsizeMiddle(r.name,MAX_RULE_VALUE_WIDTH),formatCount3(r.total),ellipsizeMiddle(r.id,MAX_RULE_VALUE_WIDTH)]);let rendered=table(rows,{align:["l","r","l"],hsep:3});for(let line2 of rendered.split(`
|
|
493
493
|
`))lines.push(` ${line2}`.trimEnd())}if(opts.annotations.length>0){lines.push(""),lines.push(import_chalk112.default.bold(" Alerts in this window"));for(let a of opts.annotations.slice(0,8)){let when=formatUtcTime(a.startedAt,needsDate),ago=`(${relativeTime(a.startedAt)})`,count2=a.count!==void 0?` \xB7 ${formatCount3(a.count)}`:"",detail=a.detail?` \xB7 ${colorizeDetail(a.detail)}`:"";lines.push(` ${import_chalk112.default.yellow("!")} ${when} UTC ${ago} ${a.title}${detail}${count2}`)}}return lines.push(""),lines.join(`
|
|
494
|
-
`)}var import_chalk113=__toESM(require_source(),1);var PLAN_UNAVAILABLE="Requires Pro or Enterprise",MS_PER_SECOND=1e3,MS_PER_MINUTE=60*MS_PER_SECOND,MS_PER_HOUR=60*MS_PER_MINUTE;function formatDuration(
|
|
494
|
+
`)}var import_chalk113=__toESM(require_source(),1);var PLAN_UNAVAILABLE="Requires Pro or Enterprise",MS_PER_SECOND=1e3,MS_PER_MINUTE=60*MS_PER_SECOND,MS_PER_HOUR=60*MS_PER_MINUTE;function formatDuration(ms47){let hours=Math.floor(ms47/MS_PER_HOUR),minutes=Math.floor(ms47%MS_PER_HOUR/MS_PER_MINUTE);return`${hours}h ${minutes}m`}function isAllSourcesBypass(ip){return ip==="0.0.0.0/0"||ip==="::/0"}var MAX_EXPIRY_SECONDS=4102444800;function parseExpirySeconds(expiry){if(!expiry||!/^\d+$/.test(expiry))return null;let seconds=Number(expiry);return Number.isSafeInteger(seconds)&&seconds<=MAX_EXPIRY_SECONDS?seconds:null}function allSourcesBypassExpiries(firewallBypassIps=[],bypass=[]){let expiries=[];for(let entry2 of firewallBypassIps){let[ip,expiry]=entry2.split("#");isAllSourcesBypass(ip)&&expiries.push(parseExpirySeconds(expiry))}for(let rule of bypass??[])!isAllSourcesBypass(rule.Ip)||rule.Domain!=="*"||expiries.push(rule.ExpiresAt??null);return expiries}function getMitigationsStatus(firewallBypassIps,bypass){let expiries=allSourcesBypassExpiries(firewallBypassIps,bypass);if(expiries.includes(null))return{paused:!0};let nowSeconds=Date.now()/MS_PER_SECOND,unexpired=expiries.filter(expiry=>expiry!==null&&expiry>nowSeconds);return unexpired.length?{paused:!0,resumesAt:Math.max(...unexpired)}:{paused:!1}}function formatAttackModeStatus(status6){if(!status6.enabled)return import_chalk113.default.dim("Off");if(status6.activeUntil){let remainingMs=status6.activeUntil-Date.now();return remainingMs<=0?import_chalk113.default.dim("Off (expired)"):import_chalk113.default.red(`On (expires in ${formatDuration(remainingMs)})`)}return import_chalk113.default.red("On")}function formatMitigationsStatus(status6){if(!status6.paused)return import_chalk113.default.green("Active");if(status6.resumesAt!==void 0){let remainingMs=status6.resumesAt*MS_PER_SECOND-Date.now();if(remainingMs>0)return import_chalk113.default.yellow(`Paused (auto-resumes in ${formatDuration(remainingMs)})`)}return import_chalk113.default.yellow("Paused")}function formatStatusOutput(opts){let{active,draft,bypass,attackMode,firewallBypassIps}=opts,lines=[];if(lines.push(formatAlignedLabel("Firewall",active?active.firewallEnabled?import_chalk113.default.green("Enabled"):import_chalk113.default.red("Disabled"):import_chalk113.default.dim("Not configured"))),bypass===null)lines.push(formatAlignedLabel("Bypass",import_chalk113.default.dim(PLAN_UNAVAILABLE)));else{let regularBypasses=bypass.filter(b=>!isAllSourcesBypass(b.Ip));lines.push(formatAlignedLabel("Bypass",`${regularBypasses.length} IP${regularBypasses.length!==1?"s":""}`))}if(lines.push(formatAlignedLabel("Mitigations",formatMitigationsStatus(getMitigationsStatus(firewallBypassIps,bypass)))),attackMode&&lines.push(formatAlignedLabel("Attack Mode",formatAttackModeStatus(attackMode))),active){lines.push(formatAlignedLabel("IP Blocks",String(active.ips.length)));let activeRules=active.rules.filter(r=>r.active).length,inactiveRules=active.rules.filter(r=>!r.active).length;lines.push(formatAlignedLabel("Rules",`${activeRules} active, ${inactiveRules} inactive (${active.rules.length} total)`))}if(lines.push(formatAlignedLabel("Bot Protection",formatBotProtectionStatus(getBotProtectionConfig(active?.managedRules)))),lines.push(formatAlignedLabel("AI Bots",formatAiBotsStatus(active?.managedRules?.ai_bots))),lines.push(formatAlignedLabel("OWASP",formatOwaspStatus(active?.managedRules?.owasp))),draft&&draft.changes.length>0){lines.push(""),lines.push(formatAlignedLabel("Draft",import_chalk113.default.yellow(`${draft.changes.length} unpublished change${draft.changes.length!==1?"s":""}`)));let activeRulesMap=new Map((active?.rules||[]).map(r=>[r.id,r]));lines.push(formatDiffOutput(draft.changes,activeRulesMap))}return lines.join(`
|
|
495
495
|
`)}function formatBypassTable(bypasses){let lines=[],domains2=bypasses.map(b=>b.Domain==="*"?"All domains":b.Domain),ipWidth=Math.max(7,...bypasses.map(b=>b.Ip.length)),domainWidth=Math.max(6,...domains2.map(d=>d.length)),gap=3;lines.push(` ${import_chalk113.default.dim("IP/CIDR".padEnd(ipWidth+gap))}${import_chalk113.default.dim("Domain".padEnd(domainWidth+gap))}${import_chalk113.default.dim("Note")}`);for(let i=0;i<bypasses.length;i++){let bypass=bypasses[i],ip=bypass.Ip.padEnd(ipWidth+gap),domain2=domains2[i].padEnd(domainWidth+gap),note=bypass.Note||"";lines.push(` ${ip}${domain2}${note}`)}return lines.join(`
|
|
496
496
|
`)}function annotateIpRules(activeIps,draftIps,changes){if(!draftIps)return activeIps.map(rule=>({rule,status:"live"}));let addedIds=new Set(changes.filter(c=>c.action==="ip.insert").map(c=>c.id).filter(id2=>id2!=null)),removedIds=new Set(changes.filter(c=>c.action==="ip.remove").map(c=>c.id).filter(id2=>id2!=null)),modifiedIds=new Set(changes.filter(c=>c.action==="ip.update").map(c=>c.id).filter(id2=>id2!=null)),result=[];for(let rule of draftIps)addedIds.has(rule.id)?result.push({rule,status:"added"}):modifiedIds.has(rule.id)?result.push({rule,status:"modified"}):result.push({rule,status:"live"});for(let rule of activeIps)removedIds.has(rule.id)&&result.push({rule,status:"removed"});return result}function formatIpBlocksTable(annotated){let lines=[],hostnames=annotated.map(a=>a.rule.hostname==="*"||a.rule.hostname===""?"All hosts":a.rule.hostname),gap=3,prefixWidth=2,ipWidth=Math.max(7,...annotated.map(a=>a.rule.ip.length)),hostnameWidth=Math.max(8,...hostnames.map(h=>h.length));lines.push(` ${" ".repeat(prefixWidth)}${import_chalk113.default.dim("IP/CIDR".padEnd(ipWidth+gap))}${import_chalk113.default.dim("Hostname".padEnd(hostnameWidth+gap))}${import_chalk113.default.dim("Notes")}`);for(let i=0;i<annotated.length;i++){let{rule,status:status6}=annotated[i],ip=rule.ip.padEnd(ipWidth+gap),hostname2=hostnames[i].padEnd(hostnameWidth+gap),notes=rule.notes||"",prefix=" ",colorFn=s=>s;status6==="added"?(prefix="+ ",colorFn=import_chalk113.default.green):status6==="removed"?(prefix="- ",colorFn=import_chalk113.default.red):status6==="modified"&&(prefix="~ ",colorFn=import_chalk113.default.yellow),lines.push(colorFn(` ${prefix}${ip}${hostname2}${notes}`))}return lines.join(`
|
|
497
497
|
`)}function getDiffSymbol(action){return action.endsWith(".insert")?{symbol:"+",color:import_chalk113.default.green}:action.endsWith(".remove")?{symbol:"-",color:import_chalk113.default.red}:{symbol:"~",color:import_chalk113.default.yellow}}function formatChangeDescription(change2,activeRules){let{action,id:id2,value}=change2;switch(action){case"rules.insert":return`Added rule "${value?.name||id2||"unknown"}"`;case"rules.update":{let draft=value,ruleName=draft?.name||id2||"unknown";if(activeRules&&id2&&draft&&typeof draft.active=="boolean"){let activeRule=activeRules.get(id2);if(activeRule&&activeRule.active!==draft.active){let nameUnchanged=activeRule.name===draft.name,conditionsUnchanged=JSON.stringify(activeRule.conditionGroup)===JSON.stringify(draft.conditionGroup),actionUnchanged=JSON.stringify(activeRule.action)===JSON.stringify(draft.action),descriptionUnchanged=(activeRule.description||"")===(draft.description||"");if(nameUnchanged&&conditionsUnchanged&&actionUnchanged&&descriptionUnchanged)return draft.active?`Enabled rule "${ruleName}"`:`Disabled rule "${ruleName}"`}}return`Modified rule "${ruleName}"`}case"rules.remove":return`Removed rule "${id2||"unknown"}"`;case"rules.priority":return`Reordered rule "${value?.name||id2||"unknown"}"`;case"ip.insert":return`Added IP block ${value?.ip||"unknown"}`;case"ip.remove":return`Removed IP block ${id2||"unknown"}`;case"ip.update":return`Modified IP block ${value?.ip||id2||"unknown"}`;case"firewallEnabled":return`${value?"Enabled":"Disabled"} firewall`;case"crs.update":return"Updated OWASP CRS configuration";case"crs.disable":return"Disabled OWASP CRS";case"managedRules.update":return"Updated managed ruleset configuration";case"managedRuleGroup.update":return"Updated managed rule group";case"botId.toggle":return`${value?"Enabled":"Disabled"} Bot ID detection`;case"ja3Enabled":return`${value?"Enabled":"Disabled"} JA3 fingerprinting`;case"ja4Enabled":return`${value?"Enabled":"Disabled"} JA4 fingerprinting`;case"logHeaders.update":return"Updated log headers configuration";default:return`${action}${id2?` (${id2})`:""}`}}function formatRuleFieldDiff(activeRule,draftValue){let lines=[];if(draftValue.name&&activeRule.name!==draftValue.name&&lines.push(import_chalk113.default.yellow(` ~ Name: "${activeRule.name}" \u2192 "${draftValue.name}"`)),draftValue.action&&JSON.stringify(activeRule.action)!==JSON.stringify(draftValue.action)){let oldAction=formatActionDisplay(activeRule.action),newAction=formatActionDisplay(draftValue.action);lines.push(import_chalk113.default.yellow(` ~ Action: ${oldAction} \u2192 ${newAction}`))}if(draftValue.conditionGroup&&JSON.stringify(activeRule.conditionGroup)!==JSON.stringify(draftValue.conditionGroup)){let oldConditions=new Set(activeRule.conditionGroup.flatMap(g=>g.conditions.map(c=>formatConditionCompact(c)))),newConditions=new Set(draftValue.conditionGroup.flatMap(g=>g.conditions.map(c=>formatConditionCompact(c)))),added=[...newConditions].filter(c=>!oldConditions.has(c)),removed=[...oldConditions].filter(c=>!newConditions.has(c));for(let c of added)lines.push(import_chalk113.default.green(` + Condition: ${c}`));for(let c of removed)lines.push(import_chalk113.default.red(` - Condition: ${c}`));added.length===0&&removed.length===0&&lines.push(import_chalk113.default.yellow(" ~ Condition groups restructured"))}return lines}var CHANGE_ACTION_ORDER={firewallEnabled:0,"rules.insert":1,"rules.update":2,"rules.remove":3,"rules.priority":4,"ip.insert":5,"ip.update":6,"ip.remove":7,"crs.update":8,"crs.disable":9,"managedRules.update":10,"managedRuleGroup.update":11,"botId.toggle":12,ja3Enabled:13,ja4Enabled:14,"logHeaders.update":15};function formatDiffOutput(changes,activeRules){let lines=[],sorted2=[...changes].sort((a,b)=>(CHANGE_ACTION_ORDER[a.action]??99)-(CHANGE_ACTION_ORDER[b.action]??99));for(let change2 of sorted2){let{symbol,color}=getDiffSymbol(change2.action),description=formatChangeDescription(change2,activeRules);if(lines.push(color(` ${symbol} ${description}`)),change2.action==="rules.update"&&activeRules&&change2.id){let activeRule=activeRules.get(change2.id);if(activeRule&&change2.value){let subLines=formatRuleFieldDiff(activeRule,change2.value);lines.push(...subLines)}}}return lines.join(`
|
|
@@ -637,7 +637,7 @@ ${formatRuleExpanded(modified)}
|
|
|
637
637
|
${formatAlertsList({...sections,from,to})}`),planIssue?output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
|
|
638
638
|
`):sourceError&&output_manager_default.print(` ${FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}
|
|
639
639
|
`),output_manager_default.print(`
|
|
640
|
-
`),0)}catch(e2){return failFirewallApi(client,e2,{fallback:"Failed to fetch firewall alerts",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alerts"})}}var import_chalk143=__toESM(require_source(),1);var EVENTS_TIMEOUT_MS=2e4,TOP_N=5;function apiTimestampMs(apiTimestamp){let pinned=new Date(`${apiTimestamp.replace(" ","T")}Z`).getTime();return Number.isNaN(pinned)?new Date(apiTimestamp).getTime():pinned}function toIso2(apiTimestamp){let
|
|
640
|
+
`),0)}catch(e2){return failFirewallApi(client,e2,{fallback:"Failed to fetch firewall alerts",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alerts"})}}var import_chalk143=__toESM(require_source(),1);var EVENTS_TIMEOUT_MS=2e4,TOP_N=5;function apiTimestampMs(apiTimestamp){let pinned=new Date(`${apiTimestamp.replace(" ","T")}Z`).getTime();return Number.isNaN(pinned)?new Date(apiTimestamp).getTime():pinned}function toIso2(apiTimestamp){let ms47=apiTimestampMs(apiTimestamp);return Number.isNaN(ms47)?apiTimestamp:new Date(ms47).toISOString()}function toPersistentAction(row){let redacted=isRedacted(row.action_type)||isRedacted(row.public_ip)||isRedacted(row.host);return{startTime:toIso2(row.startTime),endTime:toIso2(row.endTime),active:row.isActive,action:row.action,actionType:row.action_type,ruleType:isRedacted(row.action_type)?"hidden":row.action_type===SYSTEM_ACTION_TYPE?"system":"custom",...redacted?{redacted:!0}:{},host:row.host,ip:row.public_ip,requests:row.count,...row.ruleId?{ruleId:row.ruleId}:{},...row.ruleName?{ruleName:row.ruleName}:{}}}var SYSTEM_ACTION_TYPE="system-action",REDACTED_VALUE="***";function isRedacted(value){return value===REDACTED_VALUE}function ruleTypeLabel(actionType){return isRedacted(actionType)?"Hidden":actionType===SYSTEM_ACTION_TYPE?"System Rule":"Custom Rule"}var CLIENT_IP_DIMENSION="clientIp",HOST_DIMENSION="requestHostname",PATH_DIMENSION="requestPath";function persistentActionFilter(opts){return andFilters(isRedacted(opts.ip)?void 0:eqFilter(CLIENT_IP_DIMENSION,opts.ip),opts.host&&!isRedacted(opts.host)?eqFilter(HOST_DIMENSION,opts.host):void 0,opts.withPath?nonEmptyFilter(PATH_DIMENSION):void 0)}function aggregateTop(actions,key,top,mitigation){let totals=new Map;for(let action of actions){if(mitigation&&action.action!==mitigation)continue;let name=action[key];!name||isRedacted(name)||totals.set(name,(totals.get(name)??0)+action.count)}return[...totals.entries()].map(([name,count2])=>({name,count:count2})).sort((a,b)=>b.count-a.count).slice(0,top)}var PERSISTENT_ACTION_RETENTION_MS={enterprise:7*24*60*60*1e3,other:24*60*60*1e3};function clampPersistentActionWindow(opts){if(opts.planKnown===!1)return{from:opts.from,to:opts.to,empty:!1};let now=opts.now??Date.now(),retentionMs=opts.isEnterprise?PERSISTENT_ACTION_RETENTION_MS.enterprise:PERSISTENT_ACTION_RETENTION_MS.other,earliest=now-retentionMs;if(opts.from.getTime()>=earliest)return{from:opts.from,to:opts.to,empty:!1};let from=new Date(earliest);return{from,to:opts.to,requestedFrom:opts.from,empty:from.getTime()>=opts.to.getTime()}}function retentionLabel(isEnterprise){return isEnterprise?"7 days":"24 hours"}function startedAtMs(row){let ms47=apiTimestampMs(row.startTime);return Number.isNaN(ms47)?0:ms47}async function fetchFirewallPersistentActions(client,opts){let query=new URLSearchParams;query.set("projectId",opts.projectId),query.set("teamId",opts.teamId),query.set("startTimestamp",String(opts.startTime.getTime())),query.set("endTimestamp",String(opts.endTime.getTime())),opts.host&&query.set("hosts",opts.host);let timeoutMs=opts.timeoutMs??EVENTS_TIMEOUT_MS;try{return[...(await client.fetch(`/v1/security/firewall/events?${query.toString()}`,{accountId:opts.teamId,signal:AbortSignal.timeout(timeoutMs)})).actions??[]].sort((a,b)=>{let start=startedAtMs(b)-startedAtMs(a);return start!==0?start:b.count-a.count})}catch(err){throw err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?new Error(`Timed out after ${Math.round(timeoutMs/1e3)}s waiting for firewall events. Re-run the command \u2014 the next try is usually faster.`):err}}async function getFirewallEvents(client,opts){let actions=await fetchFirewallPersistentActions(client,opts),top=opts.top??TOP_N;return{ips:aggregateTop(actions,"public_ip",top,opts.action),hosts:aggregateTop(actions,"host",top)}}function summarizePersistentActions(actions){let challenging=new Set,blocking=new Set,otherActions=0,withheldActions=0,activeTotal=0;for(let action of actions)if(action.isActive){if(activeTotal+=1,isRedacted(action.public_ip)){action.action==="challenge"||action.action==="deny"?withheldActions+=1:otherActions+=1;continue}action.action==="challenge"?challenging.add(action.public_ip):action.action==="deny"?blocking.add(action.public_ip):otherActions+=1}return activeTotal===0?null:{challengingIps:challenging.size,blockingIps:blocking.size,otherActions,withheldActions,activeTotal}}var PREVIOUS_WINDOW_MS=24*60*60*1e3,GRANULARITY_MINUTES=15,GRANULARITY_MS=GRANULARITY_MINUTES*60*1e3;function isActivityUnavailable2(error){return isAPIError(error)&&error.status===402}function floorToBucket(ms47){return Math.floor(ms47/GRANULARITY_MS)*GRANULARITY_MS}function sumInWindow(series,action,startMs,endMs){let total=0;for(let s of series)if(s.action===action)for(let point of s.timeseries){let ts=new Date(point.timestamp).getTime();ts>=startMs&&ts<endMs&&(total+=point.value)}return total}function reqPerMin(total,windowMs){let minutes=windowMs/6e4;return minutes>0?total/minutes:0}function axisBetween(startMs,endMs,stepMs){let axis=[];for(let t=startMs;t<endMs;t+=stepMs)axis.push(t);return axis}function valuesOnAxis(series,axis){let byTs=new Map;for(let point of series?.timeseries??[])byTs.set(new Date(point.timestamp).getTime(),point.value);return axis.map(t=>byTs.get(t)??0)}async function inspect10(client,argv){let parsed=await parseSubcommandArgs2(argv,alertsInspectSubcommand,client,"alerts inspect");if(typeof parsed=="number")return parsed;let alertId=parsed.args[0];if(!alertId)return failFirewall(client,{message:`Alert id is required. Usage: ${withGlobalFlags3(client,"firewall alerts inspect <alertid>")}`,nextCommand:"firewall alerts inspect <alertid>",reason:AGENT_REASON.MISSING_ARGUMENTS});let link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0;if(!teamId)return failFirewall(client,{message:"Firewall alerts need a team. Run `vercel switch` to select a team or pass --scope <team>.",reason:AGENT_REASON.MISSING_SCOPE});let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall alerts inspect ${alertId}${asJson?" --json":""}`;output_manager_default.spinner(`Fetching alert ${import_chalk143.default.bold(alertId)}`);try{let resolved=await findFirewallAlert(client,{projectId:project.id,teamId,alertId});if(!resolved)return failFirewall(client,{message:`No firewall alert found for "${alertId}". Run ${withGlobalFlags3(client,"firewall alerts list")} to view recent alerts.`,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND});let{alert}=resolved,action=alert.action??"deny",anomalyStart=floorToBucket(alert.startedAt),anomalyEnd=Math.max(alert.resolvedAt??Date.now(),anomalyStart+GRANULARITY_MS),chartStart=floorToBucket(anomalyStart-PREVIOUS_WINDOW_MS),chartEnd=anomalyEnd;output_manager_default.spinner(`Fetching traffic for ${import_chalk143.default.bold(alert.title)}`);let eventsIssue,[metrics2,events]=await Promise.all([getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime:new Date(chartStart),endTime:new Date(chartEnd),granularity:{minutes:GRANULARITY_MINUTES}}).catch(err=>{if(isActivityUnavailable2(err))return null;throw err}),getFirewallEvents(client,{projectId:project.id,teamId,startTime:new Date(anomalyStart),endTime:new Date(anomalyEnd),action}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return isActivityUnavailable2(err)?(eventsIssue={reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE},null):(eventsIssue={reason:"error",message:apiServerMessage(err)||!isAPIError(err)&&err instanceof Error&&err.message||"Couldn't load denied IPs."},null)})]),rates,timeseries;if(metrics2){let previousMs=anomalyStart-chartStart,anomalyMs=anomalyEnd-anomalyStart,previousTotal=sumInWindow(metrics2.series,action,chartStart,anomalyStart),anomalyTotal=sumInWindow(metrics2.series,action,anomalyStart,anomalyEnd),previousReqPerMin=reqPerMin(previousTotal,previousMs),anomalyReqPerMin=reqPerMin(anomalyTotal,anomalyMs);rates={previousReqPerMin,anomalyReqPerMin,multiplier:previousReqPerMin>0?anomalyReqPerMin/previousReqPerMin:null};let axis=axisBetween(chartStart,chartEnd,GRANULARITY_MS),series=metrics2.series.find(s=>s.action===action);timeseries={action,startMs:chartStart,endMs:chartEnd,pointCount:axis.length,granularityMinutes:GRANULARITY_MINUTES,values:valuesOnAxis(series,axis)}}let hosts=events?.hosts&&events.hosts.length>0?events.hosts:resolved.hosts,ips=events?.ips;if(asJson)return outputJson2(client,{alert,status:alert.resolvedAt?"resolved":"active",previous24h:rates?{reqPerMin:rates.previousReqPerMin}:null,anomaly:rates?{reqPerMin:rates.anomalyReqPerMin,multiplier:rates.multiplier}:null,timeseries:timeseries?{action:timeseries.action,startTime:new Date(timeseries.startMs).toISOString(),endTime:new Date(timeseries.endMs).toISOString(),granularity:{minutes:timeseries.granularityMinutes},points:timeseries.values.map((value,i)=>({timestamp:new Date(timeseries.startMs+i*GRANULARITY_MS).toISOString(),value}))}:null,deniedIps:ips?.map(row=>({ip:row.name,count:row.count}))??null,topHosts:hosts?.map(row=>({host:row.name,count:row.count}))??null,...metrics2?{}:{activityUnavailable:{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}},...eventsIssue?{eventsUnavailable:eventsIssue}:{}}),0;if(output_manager_default.print(`
|
|
641
641
|
${formatAlertInspect({alert,rates,timeseries,ips,hosts})}`),!metrics2)output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
|
|
642
642
|
`);else if(eventsIssue?.reason==="plan")output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
|
|
643
643
|
`);else if(eventsIssue){let haveHosts=!!(hosts&&hosts.length>0);output_manager_default.print(` Couldn't load denied IPs${haveHosts?"":" and hosts"}.
|
|
@@ -1109,7 +1109,7 @@ Starting setup...
|
|
|
1109
1109
|
`),output_manager_default.print("\u2500".repeat(50)+`
|
|
1110
1110
|
`),summary.forEach(line2=>output_manager_default.print(`${line2}
|
|
1111
1111
|
`)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
|
|
1112
|
-
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG53={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG53),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-
|
|
1112
|
+
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG53={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG53),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-6LPADSVE.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-LSTTTOQM.js")).default;return queryFn(client,telemetry2)}}}var import_chalk250=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk250.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk250.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk250.default.gray(microfrontendsStamp())}`,emoji("success"))}
|
|
1113
1113
|
`),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk251=__toESM(require_source(),1);import{writeFile as writeFile6}from"fs/promises";import{existsSync as existsSync3}from"fs";import{join as join36}from"path";async function ensureMicrofrontendsContext(client,options){let link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm:options?.autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link;if(org.type!=="team")return output_manager_default.error("Microfrontends are only available for teams."),1;client.config.currentTeam=org.id;let{team}=await getScope(client);return team?{project,org,team,repoRoot}:(output_manager_default.error("Microfrontends are only available for teams."),1)}async function fetchMicrofrontendsGroups(client,teamId){output_manager_default.spinner("Fetching microfrontends groups\u2026");let response=await client.fetch(`/v1/microfrontends/groups?teamId=${teamId}`,{method:"GET"});return output_manager_default.stopSpinner(),response}function validateDefaultRoute(path3){if(!path3||!path3.startsWith("/"))return"Route must start with /";if(/\s/.test(path3))return"Route must not contain spaces";if(path3.includes("?")||path3.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path3,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path3){return!path3||!path3.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path3)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk251.default.bold(teamSlug)}.`),output_manager_default.log("");let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsGroupsPerTeam,maxMicrofrontendsPerGroup}=groupsResponse,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(groups.length>=maxMicrofrontendsGroupsPerTeam){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends group limit for ${planName}. Upgrade to Pro to create more groups.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Maximum number of microfrontends groups (${maxMicrofrontendsGroupsPerTeam}) reached.`),1}let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),2;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),2;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),2}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),2;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route;if(routeFromFlag)route=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),2;route=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk251.default.bold("Billing")),output_manager_default.log(` ${import_chalk251.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk251.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk251.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk251.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk251.default.green(`${freeRemaining} free`)+", "+import_chalk251.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk251.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk251.default.bold("Request fee:")} ${import_chalk251.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects)output_manager_default.log(`This group is within the free tier, so no project fee will be charged to ${import_chalk251.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`);else{let newPaidProjects=Math.min(newProjectCount,totalAfter-freeProjects);output_manager_default.log(`By proceeding, ${import_chalk251.default.bold(teamSlug)} will be charged for ${newPaidProjects} additional paid project${newPaidProjects>1?"s":""} on the team's monthly bill.`)}if(output_manager_default.log(""),!autoConfirm&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to confirm group creation in non-interactive mode."),1;if(!(autoConfirm||await client.input.confirm("Create microfrontends group?",!0)))return output_manager_default.log("Aborted."),0;let createStamp=stamp_default();output_manager_default.spinner("Creating microfrontends group\u2026");try{await client.fetch(`/v1/microfrontends/group?teamId=${team.id}`,{method:"POST",body:{groupName,defaultApp:{projectId:defaultApp.id,defaultRoute},otherApplications}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${defaultApp.name}/settings/microfrontends`;output_manager_default.success(`Microfrontends group "${groupName}" created ${import_chalk251.default.gray(createStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`);let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0;if(linkedProject&&linkedProject.id===defaultApp.id){let repoRoot=link.status==="linked"?link.repoRoot:void 0,projectDir=repoRoot?join36(repoRoot,linkedProject.rootDirectory||""):client.cwd,configPath=join36(projectDir,"microfrontends.json");if(!existsSync3(configPath)&&(output_manager_default.log(""),output_manager_default.log(`No changes to production traffic will take effect until a ${import_chalk251.default.bold("microfrontends.json")} is added to the default app. This configuration file specifies the path routing for the microfrontends group.`),client.stdin.isTTY&&!isNonInteractive&&await client.input.confirm("Create a microfrontends.json now?",!0))){let routingPaths={};for(let project of otherProjects){output_manager_default.log(`Enter routing paths for ${import_chalk251.default.bold(project.name)} (comma-separated, e.g. /docs, /docs/*)`);let pathsInput=await client.input.text({message:`Paths for ${project.name}:`,validate:val=>{if(!val.trim())return"At least one path is required";let paths=val.split(",").map(p=>p.trim());for(let p of paths){let result=validateRoutingPath(p);if(result!==!0)return`Invalid path "${p}": ${result}`}return!0}});routingPaths[project.name]=pathsInput.split(",").map(p=>p.trim())}let productionAlias=defaultApp.targets?.production?.alias?.[0],config=generateMicrofrontendsConfig(defaultApp.name,routingPaths,productionAlias);await writeFile6(configPath,config+`
|
|
1114
1114
|
`,"utf-8"),output_manager_default.success(`Created ${import_chalk251.default.bold("microfrontends.json")}`),output_manager_default.log("Create a preview deployment to test microfrontends before deploying to production.")}}else output_manager_default.log(`Next step: Add a ${import_chalk251.default.bold("microfrontends.json")} to your default app. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`);return 0}function generateMicrofrontendsConfig(defaultAppName,routingPaths,productionAlias){let fallback=productionAlias||"...your-production-domain.vercel.app",applications={[defaultAppName]:{development:{fallback}}};for(let[name,paths]of Object.entries(routingPaths))applications[name]={routing:[{paths}]};return JSON.stringify({$schema:"https://openapi.vercel.sh/microfrontends.json",applications},null,2)}function validateGroupName(name,existingGroups){return!name||name.trim().length===0?"Group name cannot be empty.":name.length>MAX_GROUP_NAME_LENGTH?`Group name must be ${MAX_GROUP_NAME_LENGTH} characters or less.`:existingGroups.some(g=>g.group.name===name)?`A group named "${name}" already exists.`:!0}function isProjectInMicrofrontendsGroup(project,groups){return groups.some(g=>g.projects.some(p=>p.id===project.id))}function parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp){let routeByProjectId=new Map;if(!projectDefaultRouteFlags||projectDefaultRouteFlags.length===0)return routeByProjectId;for(let entry2 of projectDefaultRouteFlags){let separatorIndex=entry2.indexOf("=");if(separatorIndex<=0||separatorIndex===entry2.length-1)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let projectIdentifier=entry2.slice(0,separatorIndex).trim(),route=entry2.slice(separatorIndex+1).trim();if(!projectIdentifier||!route)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let project=selectedProjects.find(p=>p.name===projectIdentifier||p.id===projectIdentifier);if(!project)return`Invalid --project-default-route value "${entry2}". Project "${projectIdentifier}" is not one of the selected projects.`;if(project.id===defaultApp.id)return`Invalid --project-default-route value "${entry2}". Use --default-route for the default app "${defaultApp.name}".`;let routeValidation=validateDefaultRoute(route);if(routeValidation!==!0)return`Invalid --project-default-route value "${entry2}": ${routeValidation}`;if(routeByProjectId.has(project.id))return`Duplicate --project-default-route for project "${project.name}".`;routeByProjectId.set(project.id,route)}return routeByProjectId}var import_chalk252=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2,totalAfter=existingMfeProjectCount+1,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(isLimitedPlan&&totalAfter>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}output_manager_default.log(`Adding project ${import_chalk252.default.bold(project.name)} to a microfrontends group on ${import_chalk252.default.bold(teamSlug)}.`),output_manager_default.log("");let groupFlag=parsedArgs.flags["--group"],defaultRouteFlag=parsedArgs.flags["--default-route"];if(totalAfter>freeProjects){if(client.nonInteractive){let settingsUrl2=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`,flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends add-to-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Adding a project to a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:openUrlInBrowserCommand(settingsUrl2),when:"user opens Microfrontends settings in the browser"},{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1)}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}if(selectedGroup.projects.length>=maxMicrofrontendsPerGroup){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Group "${selectedGroup.group.name}" has reached the maximum number of projects (${maxMicrofrontendsPerGroup}).`),1}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else client.stdin.isTTY&&(output_manager_default.log("Specify a default route for the project. This path will be used for deployment screenshots and the default link to the project."),defaultRoute=await client.input.text({message:"Default route (e.g. /docs):",validate:validateDefaultRoute}));output_manager_default.log(""),output_manager_default.log(import_chalk252.default.bold("Billing")),output_manager_default.log(` ${import_chalk252.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk252.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk252.default.yellow("$250.00/month"):projectFee=import_chalk252.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk252.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk252.default.bold("Request fee:")} ${import_chalk252.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects?output_manager_default.log(`Adding "${project.name}" is within the free tier, so no project fee will be charged to ${import_chalk252.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk252.default.bold(teamSlug)} will be charged for this project on the team's monthly bill.`),output_manager_default.log(""),!await client.input.confirm(`Add "${project.name}" to "${selectedGroup.group.name}"?`,!0))return output_manager_default.log("Aborted."),0;let addStamp=stamp_default();output_manager_default.spinner("Adding project to microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{microfrontendsGroupId:selectedGroup.group.id,isDefaultApp:!1,defaultRoute,enabled:!0}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`;return output_manager_default.success(`Project "${project.name}" added to group "${selectedGroup.group.name}" ${import_chalk252.default.gray(addStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`),output_manager_default.log(`Next step: Add routing paths for this project in your microfrontends.json configuration. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`),0}var import_chalk253=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk253.default.bold(project.name)} from microfrontends group ${import_chalk253.default.bold(projectGroup.group.name)} on ${import_chalk253.default.bold(teamSlug)}.`),output_manager_default.log(`After removal, "${project.name}" will no longer be a child app in the group and will not be part of the composed application.`);let isReferencedInConfig=!!projectGroup.config?.applications?.[project.name];if(isReferencedInConfig&&(output_manager_default.log(""),output_manager_default.warn(`The microfrontends.json configuration still contains an entry for "${project.name}".`),output_manager_default.warn("Removing this project will cause other microfrontends projects in the group to fail deploying until the configuration is updated."),!autoConfirm)){if(!client.stdin.isTTY)return output_manager_default.error("Cannot remove a project that is still referenced in microfrontends.json in non-interactive mode."),1;if(output_manager_default.log(""),!await client.input.confirm(`Remove "${project.name}" even though it is still referenced in microfrontends.json?`,!1))return output_manager_default.log("Aborted."),0}if(output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm removal."),1;if(!await client.input.confirm(`Remove "${project.name}" from "${projectGroup.group.name}"?`,!1))return output_manager_default.log("Aborted."),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing project from microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{enabled:!1}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Project "${project.name}" removed from group "${projectGroup.group.name}" ${import_chalk253.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk254=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk254.default.bold(linkedProject.name)})?`,!0))selectedGroup=linkedGroup;else{if(groups.length===1)return output_manager_default.log("Aborted."),0;{let remaining=groups.filter(g=>g.group.id!==linkedGroup.group.id),groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:remaining.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}else{let groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}let groupName=selectedGroup.group.name,projectCount=selectedGroup.projects.length;if(output_manager_default.log(""),output_manager_default.log(`This will delete the microfrontends group ${import_chalk254.default.bold(groupName)} and all of its settings.`),projectCount>0&&output_manager_default.log(`${projectCount} project${projectCount>1?"s":""} will be removed from the group.`),output_manager_default.log(import_chalk254.default.red("This action is not reversible.")),output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm deletion."),1;if(await client.input.text({message:`Type ${import_chalk254.default.bold(groupName)} to confirm deletion:`,validate:val=>val!==groupName?`You must type "${groupName}" to confirm.`:!0})!==groupName)return output_manager_default.log("Aborted."),0}let deleteStamp=stamp_default();output_manager_default.spinner("Deleting microfrontends group\u2026");try{await client.fetch(`/v2/teams/${team.id}/microfrontends/${selectedGroup.group.id}?teamId=${team.id}`,{method:"DELETE"})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Microfrontends group "${groupName}" deleted ${import_chalk254.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk255=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),2;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},2),2;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects2=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects2.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),2;let configFile=resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects2.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects:projects2};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
1115
1115
|
`),0;let groupTable=table([["Group",json.group.name],["ID",json.group.id],["Slug",json.group.slug],["Projects",String(json.projectCount)],["Default app",json.defaultApp??"(none)"],["Fallback environment",json.group.fallbackEnvironment??"(none)"],["Local config file",json.configFile??"(not found)"],["Config applications",json.config.applications.length>0?json.config.applications.join(", "):"(none)"]]);output_manager_default.log(""),output_manager_default.log(groupTable),output_manager_default.log(""),output_manager_default.log("Projects"),output_manager_default.log("");for(let project of projects2){let rows=[["Project",project.isDefaultApp?`${project.name} (default app)`:project.name],["Default route",project.defaultRoute??"(none)"],["Production domain",project.productionDomain??"(none)"],["Framework",project.framework??"(unknown)"],["Git org/repo",`${project.git.org??"(unknown)"}/${project.git.repo??"(unknown)"}`],["Root directory",project.git.rootDirectory??"(unknown)"]];project.packageName&&rows.push(["Package name",project.packageName]),project.inGroupConfig||rows.push(["In config",(0,import_chalk255.red)("no")]);let projectTable=table(rows);output_manager_default.log(projectTable),output_manager_default.log("")}for(let project of projects2)project.projectFetchStatus!=="ok"&&output_manager_default.warn(`Project metadata for "${project.id}" is incomplete (status: ${project.projectFetchStatus}).`);return 0}async function enrichGroupProject(client,teamId,group,groupProject,localRepoContext){let fullProject,projectFetchStatus="ok";try{let maybeProject=await getProjectByNameOrId(client,groupProject.id,teamId);maybeProject instanceof ProjectNotFound?projectFetchStatus="not_found":fullProject=maybeProject}catch{projectFetchStatus="error"}let name=groupProject.name??fullProject?.name??groupProject.id,inGroupConfig=Object.prototype.hasOwnProperty.call(group.config?.applications??{},name),rootDirectory=fullProject?.rootDirectory??null,gitRepo=fullProject?.link?.repo??null,gitOrg=fullProject?.link?.org??null,productionDomain=fullProject?.targets?.production?.alias?.[0]??fullProject?.targets?.production?.url??null,framework=fullProject?.framework??null,packageName2=await resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory);return{id:groupProject.id,name,isDefaultApp:!!groupProject.microfrontends?.isDefaultApp,enabled:!!groupProject.microfrontends?.enabled,defaultRoute:groupProject.microfrontends?.defaultRoute??null,productionDomain,framework,git:{org:gitOrg,repo:gitRepo,rootDirectory},packageName:packageName2,inGroupConfig,projectFetchStatus}}async function getLocalRepoContext(client){try{let link=await getLinkedProject(client,{cwd:client.cwd});return link.status!=="linked"?{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}:{repoRoot:link.repoRoot??null,linkedProjectId:link.project.id,linkedRepoOrg:link.project.link?.org??null,linkedRepoName:link.project.link?.repo??null}}catch{return{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}}}function isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo){return!localRepoContext.repoRoot||!localRepoContext.linkedRepoOrg||!localRepoContext.linkedRepoName?!1:localRepoContext.linkedRepoOrg===gitOrg&&localRepoContext.linkedRepoName===gitRepo}async function resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory){if(!isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo))return null;let projectDir=join37(localRepoContext.repoRoot,rootDirectory||""),packageJsonPath=join37(projectDir,"package.json"),pkg=await readJSONFile(packageJsonPath);return!pkg||pkg instanceof Error?null:typeof pkg.name=="string"?pkg.name:null}function resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName){let defaultProject=projects2.find(project=>project.isDefaultApp);if(!defaultProject||!isProjectInLocalRepo(localRepoContext,defaultProject.git.org,defaultProject.git.repo))return null;let projectDir=join37(localRepoContext.repoRoot,defaultProject.git.rootDirectory||""),configuredName=configuredConfigFileName??null;if(configuredName){let configuredPath=join37(projectDir,configuredName);if(existsSync4(configuredPath))return configuredPath}let jsonPath=join37(projectDir,"microfrontends.json"),jsoncPath=join37(projectDir,"microfrontends.jsonc");return existsSync4(jsonPath)?jsonPath:existsSync4(jsoncPath)?jsoncPath:null}function resolveConfiguredMicrofrontendsConfigFileName(configured){if(!configured)return null;let normalized=configured.trim();return!normalized.endsWith(".json")&&!normalized.endsWith(".jsonc")?null:normalized.replace(/^\/+/,"")}var MicrofrontendsTelemetryClient=class extends TelemetryClient{trackCliSubcommandPull(actual){this.trackCliSubcommand({subcommand:"pull",value:actual})}trackCliSubcommandCreateGroup(actual){this.trackCliSubcommand({subcommand:"create-group",value:actual})}trackCliSubcommandAddToGroup(actual){this.trackCliSubcommand({subcommand:"add-to-group",value:actual})}trackCliSubcommandRemoveFromGroup(actual){this.trackCliSubcommand({subcommand:"remove-from-group",value:actual})}trackCliSubcommandDeleteGroup(actual){this.trackCliSubcommand({subcommand:"delete-group",value:actual})}trackCliSubcommandInspectGroup(actual){this.trackCliSubcommand({subcommand:"inspect-group",value:actual})}};var COMMAND_CONFIG54={"create-group":getCommandAliases(createGroupSubcommand),"add-to-group":getCommandAliases(addToGroupSubcommand),"remove-from-group":getCommandAliases(removeFromGroupSubcommand),"delete-group":getCommandAliases(deleteGroupSubcommand),"inspect-group":getCommandAliases(inspectGroupSubcommand),pull:getCommandAliases(pullSubcommand)};async function main28(client){let telemetry2=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG54),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry2.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry2.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry2.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry2.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry2.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry2.trackCliSubcommandPull(subcommandOriginal),pull2(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_open17=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
|
|
@@ -1342,8 +1342,8 @@ ${import_chalk288.default.gray("No changes detected from current production vers
|
|
|
1342
1342
|
`),output_manager_default.print(` ${import_chalk295.default.gray("ID:")} ${route.id}
|
|
1343
1343
|
`),output_manager_default.print(`
|
|
1344
1344
|
${import_chalk295.default.bold("Staging version:")} ${version2.id}
|
|
1345
|
-
`),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG58={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG58),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-3PKYF5FY.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-MZ4LAS3L.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-AKGADEKU.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-YZATFLNR.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-TPLZXSRB.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-NKCN63SF.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-5TK3IVYM.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-TZAXCNLL.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-B5IFVCDR.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"enable")}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/;var LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>256)return`${label} must be at most 256 characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>256||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>15?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
1346
|
-
`)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand4:action==="disable"?disableSubcommand4:invokeSubcommand,usage2=`schedules ${action} <name>`,telemetry2=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,usage2);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage2);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage2,flags);if(!outputMode.valid)return outputMode.exitCode;let schedulesClient=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedulesClient=="number")return schedulesClient;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedule;try{action==="enable"?schedule=await schedulesClient.enable(identifier):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let
|
|
1345
|
+
`),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG58={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG58),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-MCMKL3PG.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-QVG74P23.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-NJV7TP3E.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-MJP72BUH.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-4G2JILHR.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-OFXKWFKJ.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-M6VGADUV.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-DGXZYLLN.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-GHJO6HJ7.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var import_ms42=__toESM(require_ms(),1);var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFor(duration){duration&&this.trackCliOption({option:"for",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="schedule_already_active"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.SCHEDULE_ALREADY_ACTIVE,message:context.name?`Schedule ${context.namespace}/${context.name} is already enabled without an end time. Disable it first, then enable it with --until or --for.`:"The schedule is already enabled without an end time. Disable it first, then enable it with --until or --for.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes","--until","--for"]}),when:"Disable the schedule before enabling it with an end time"}]}}}if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,activeUntil}){return this.changeState(name,namespace,"enable",activeUntil===void 0?void 0:{until:activeUntil})}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action,body){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0,...body&&{body}});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var import_ms41=__toESM(require_ms(),1),MAX_IDENTIFIER_LENGTH2=256,IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/,MAX_QUEUE_TOPIC_LENGTH=256,QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/,MAX_JITTER_MINUTES=15,LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>MAX_IDENTIFIER_LENGTH2)return`${label} must be at most ${MAX_IDENTIFIER_LENGTH2} characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>MAX_QUEUE_TOPIC_LENGTH||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>MAX_JITTER_MINUTES?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var UNIX_MILLISECONDS_PATTERN=/^\d+$/,ISO_DATE_PATTERN=/^(\d{4})-(\d{2})-(\d{2})/,DURATION_PATTERN=/^\d+(?:\.\d+)?\s*[a-z]+$/i;function parseEnableUntil(until,duration,now=Date.now()){if(until!==void 0&&duration!==void 0)return{valid:!1,error:"`--until` and `--for` cannot be used together."};if(duration!==void 0){let durationMs=DURATION_PATTERN.test(duration.trim())?(0,import_ms41.default)(duration.trim()):void 0;return durationMs===void 0||!(durationMs>0)?{valid:!1,error:"`--for` must be a duration such as 30m, 5h, or 10s."}:{valid:!0,value:now+durationMs}}if(until===void 0)return{valid:!0,value:void 0};let untilMs,isoDate=ISO_DATE_PATTERN.exec(until);if(UNIX_MILLISECONDS_PATTERN.test(until))untilMs=Number(until);else if(isoDate){let[,year,month,day]=isoDate.map(Number),daysInMonth=new Date(Date.UTC(year,month,0)).getUTCDate();untilMs=day>=1&&day<=daysInMonth?Date.parse(until):NaN}else return{valid:!1,error:DURATION_PATTERN.test(until.trim())?`\`--until\` must be a time, not a duration. Use \`--for ${until.trim()}\` instead.`:"`--until` must be an ISO 8601 time or Unix milliseconds."};return Number.isFinite(untilMs)?untilMs<=now?{valid:!1,error:"`--until` must be in the future."}:{valid:!0,value:untilMs}:{valid:!1,error:"`--until` must be an ISO 8601 time or Unix milliseconds."}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
1346
|
+
`)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand4:action==="disable"?disableSubcommand4:invokeSubcommand,usage2=`schedules ${action} <name>`,telemetry2=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,enableFlags=flags;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,usage2);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionUntil(enableFlags["--until"]),telemetry2.trackCliOptionFor(enableFlags["--for"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage2);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage2,flags);if(!outputMode.valid)return outputMode.exitCode;let activeUntil=parseEnableUntil(enableFlags["--until"],enableFlags["--for"]);if(!activeUntil.valid)return invalidScheduleArguments(client,usage2,activeUntil.error);if(flags["--local"]&&activeUntil.value!==void 0)return invalidScheduleArguments(client,usage2,"Cannot combine --local with --until or --for. Local Schedules does not support enabling a schedule until a time.");let schedulesClient=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedulesClient=="number")return schedulesClient;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedule;try{action==="enable"?schedule=await schedulesClient.enable({...identifier,activeUntil:activeUntil.value}):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let pastTense=action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked",enabledUntil=schedule?.activeUntil??activeUntil.value,message=action==="enable"&&enabledUntil!==void 0?`${pastTense} schedule ${identifier.namespace}/${identifier.name} until ${new Date(enabledUntil).toISOString()} (in ${(0,import_ms42.default)(Math.max(enabledUntil-Date.now(),1e3),{long:!0})}).`:`${pastTense} schedule ${identifier.namespace}/${identifier.name}.`;if(schedule)return writeScheduleMutationResult(client,schedule,message,outputMode.json);if(outputMode.json){let result=client.nonInteractive?{status:AGENT_STATUS.OK,message}:{invoked:!0,name:identifier.name,namespace:identifier.namespace};client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
1347
1347
|
`)}else output_manager_default.success(message);return 0}var SchedulesCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionCron(cron){cron&&this.trackCliOption({option:"cron",value:this.redactedValue})}trackCliOptionAt(at){at&&this.trackCliOption({option:"at",value:this.redactedValue})}trackCliOptionTimezone(timezone){timezone&&this.trackCliOption({option:"timezone",value:timezone})}trackCliOptionJitter(jitter){jitter!==void 0&&this.trackCliOption({option:"jitter",value:String(jitter)})}trackCliOptionTopic(topic){topic&&this.trackCliOption({option:"topic",value:this.redactedValue})}trackCliOptionPayload(payload){payload!==void 0&&this.trackCliOption({option:"payload",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE13="schedules create <name> --cron <expression> --topic <topic>";async function create6(client,argv){let telemetry2=new SchedulesCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(createSubcommand6.options))}catch(error){return invalidScheduleArguments(client,USAGE13,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE13);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionCron(flags["--cron"]),telemetry2.trackCliOptionAt(flags["--at"]),telemetry2.trackCliOptionTimezone(flags["--timezone"]),telemetry2.trackCliOptionJitter(flags["--jitter"]),telemetry2.trackCliOptionTopic(flags["--topic"]),telemetry2.trackCliOptionPayload(flags["--payload"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE13);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!0);if(!expression.valid)return invalidScheduleArguments(client,USAGE13,expression.error);let topic=flags["--topic"];if(!topic?.trim())return invalidScheduleArguments(client,USAGE13,"A target queue topic is required. Use `--topic`.");let topicError=validateScheduleQueueTopic(topic);if(topicError)return invalidScheduleArguments(client,USAGE13,topicError);let jitter=parseCreateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE13,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE13,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE13,payload.error);let outputMode=parseScheduleOutput(client,USAGE13,flags);if(!outputMode.valid)return outputMode.exitCode;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await schedules.create({name:identifier.name,namespace:identifier.namespace,expression:expression.value,target:{topic},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...jitter.value!==void 0&&{jitter:jitter.value},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"create",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Created schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var SchedulesDeleteTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE14="schedules delete <name> --yes";async function deleteSchedule(client,argv){let telemetry2=new SchedulesDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(deleteSubcommand4.options))}catch(error){return invalidScheduleArguments(client,USAGE14,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE14);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE14);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,USAGE14,flags);if(!outputMode.valid)return outputMode.exitCode;let skipConfirmation=flags["--yes"]??!1;if(client.nonInteractive&&!skipConfirmation)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:flags["--local"]?"Deleting a local schedule requires confirmation. Re-run with `--yes`.":"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:flags["--local"]?scheduleCommandWithGlobalFlags(client,`schedules delete ${quoteArg(identifier.name)} --namespace ${quoteArg(identifier.namespace)} --yes`):buildCommandWithYes(client.argv)}]},1),1;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;let target=flags["--local"]?"local schedule":"schedule";if(!skipConfirmation&&!await client.input.confirm(`Delete ${target} ${identifier.namespace}/${identifier.name}? This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;outputMode.json||output_manager_default.spinner("Deleting schedule\u2026");let deletedScheduleId;try{deletedScheduleId=(await schedules.delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted ${target} ${identifier.namespace}/${identifier.name}.`;if(outputMode.json){let deleted={name:identifier.name,namespace:identifier.namespace,scheduleId:deletedScheduleId},result=client.nonInteractive?{status:AGENT_STATUS.OK,deleted,message}:{deleted:!0,...deleted};client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
1348
1348
|
`)}else output_manager_default.success(message);return 0}var import_chalk296=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"List schedule executions with valid options"}]}),2):(output_manager_default.fatal(message),2)}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExecutionStatus(status6){return status6==="succeeded"?import_chalk296.default.green("Succeeded"):status6==="failed"?import_chalk296.default.red("Failed"):import_chalk296.default.gray("Unavailable")}function formatPercentage3(value){return value===null?import_chalk296.default.gray("-"):`${Number((value*100).toFixed(2))}%`}function formatDuration3(value){return value===null?import_chalk296.default.gray("-"):value<1e3?`${Math.round(value)}ms`:value<6e4?`${Number((value/1e3).toFixed(1))}s`:`${Number((value/6e4).toFixed(1))}m`}function formatInvocationCount(value){return`${value} invocation${value===1?"":"s"}`}function executionMetrics(metrics2){return[formatAlignedLabel("Range",`${formatDate(metrics2.from)} \u2013 ${formatDate(metrics2.to)}`),formatAlignedLabel("Recorded",formatInvocationCount(metrics2.recordedInvocations)),formatAlignedLabel("Failed",formatInvocationCount(metrics2.failedInvocations)),formatAlignedLabel("Error Rate",formatPercentage3(metrics2.errorRate)),formatAlignedLabel("Avg Duration",formatDuration3(metrics2.averageDurationMs))].join(`
|
|
1349
1349
|
`)}function executionTable(executions2){let rows=[["Execution ID","Status","Source","Fired At"].map(header=>import_chalk296.default.dim(header)),...executions2.map(execution=>[import_chalk296.default.bold(execution.executionId),formatExecutionStatus(execution.status),execution.invokeSource?capitalize2(execution.invokeSource):import_chalk296.default.gray("-"),execution.firedAt===null?import_chalk296.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
|
|
@@ -1377,22 +1377,22 @@ ${scheduleTable(result.data)}
|
|
|
1377
1377
|
`);for(let finding of findings)output_manager_default.print(` ${finding}
|
|
1378
1378
|
`);for(let finding of mutedFindings.sort())output_manager_default.print(` ${import_chalk299.default.dim(`${finding} (muted)`)}
|
|
1379
1379
|
`);posture&&posture.violationsCount>findings.length&&output_manager_default.print(` ${import_chalk299.default.gray(`Showing ${findings.length} of ${posture.violationsCount}${posture.truncated?"+":""} findings (raise with --limit)`)}
|
|
1380
|
-
`)}}var COMMAND_CONFIG61={check:["check"]};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG61);return parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand2,{parent:securityCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var import_chalk300=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa3=__toESM(require_execa(),1);import{z as z3}from"zod";var MARKETPLACE="openai-curated-remote",PLUGIN_ID=`vercel@${MARKETPLACE}`,INSTALL_COMMAND=`codex plugin add ${PLUGIN_ID}`,pluginListSchema=z3.object({installed:z3.array(z3.object({pluginId:z3.string(),enabled:z3.boolean(),version:z3.string().nullable().optional()}))});async function runCodex(args){let{stdout}=await(0,import_execa3.default)("codex",args,{encoding:"utf8",stdin:"ignore",timeout:6e4,maxBuffer:1048576});return stdout}async function installedPlugin(){let stdout=await runCodex(["plugin","list","--marketplace",MARKETPLACE,"--json"]),{installed:installed2}=pluginListSchema.parse(JSON.parse(stdout));return installed2.find(plugin=>plugin.pluginId===PLUGIN_ID)}async function setupCodexPlugin(client,opts){if(!await codex.detect(opts.home))return{status:"not_detected",message:"Codex was not detected on this machine."};let before;try{before=await installedPlugin()}catch{return{status:"failed",message:"Couldn't inspect Codex plugins. Install or update the Codex CLI, sign in with `codex login`, then re-run `vercel setup --plugin --agent codex`."}}if(before?.enabled)return{status:"up_to_date",message:`Vercel plugin for Codex is installed${before.version?` (v${before.version})`:""}.`};let action=before?"enable":"install";if(opts.dryRun)return{status:"dry_run",action,message:`Setup would ${action} the Vercel plugin for Codex from the OpenAI marketplace.`};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:`Re-run with --yes to ${action} the Vercel plugin for Codex.`};if(printAlignedLabel("Plugin","Vercel for Codex (OpenAI marketplace)"),!await client.input.confirm(before?"Enable this plugin?":"Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for Codex."}}output_manager_default.spinner(`${before?"Enabling":"Installing"} the Vercel plugin for Codex\u2026`);try{let stdout=await runCodex(["plugin","add",PLUGIN_ID,"--json"]),install2=z3.object({appsNeedingAuth:z3.array(z3.unknown()).optional()}).parse(JSON.parse(stdout)),after=await installedPlugin();if(!after?.enabled)return{status:"failed",message:"The Vercel plugin is not enabled in Codex. Open Codex's /plugins browser, enable Vercel, then re-run `vercel setup --plugin --agent codex`."};let version2=after.version?` v${after.version}`:"",connection=install2.appsNeedingAuth?.length?" Connect Vercel in Codex's /plugins browser to use its connected tools.":" Start a new Codex session to load the plugin.";return{status:before?"enabled":"installed",message:`${before?"Enabled":"Installed"} the Vercel plugin for Codex${version2}.${connection}`}}catch{return{status:"failed",message:`Failed to set up the Vercel plugin for Codex. Run \`${INSTALL_COMMAND}\` to finish setup in Codex.`}}finally{output_manager_default.stopSpinner()}}var SetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){for(let agent2 of agents??[])this.trackCliOption({option:"agent",value:agent2})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry2=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,"Invalid setup arguments. Run vercel setup --help for usage."),printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("setup"),output_manager_default.print(help(setupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.args.length>1){let message="The setup command does not accept positional arguments. Use --plugin or --gateway to select a step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}let{flags}=parsedArgs,onlyPlugin=flags["--plugin"],onlyGateway=flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent2=>agent2.toLowerCase()))]:void 0;if(agents?.some(agent2=>!getAgentById(agent2)||onlyPlugin&&!onlyGateway&&!["claude-code","codex"].includes(agent2))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code and --agent
|
|
1380
|
+
`)}}var COMMAND_CONFIG61={check:["check"]};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG61);return parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand2,{parent:securityCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var import_chalk300=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa3=__toESM(require_execa(),1);import{z as z3}from"zod";var MARKETPLACE="openai-curated-remote",PLUGIN_ID=`vercel@${MARKETPLACE}`,INSTALL_COMMAND=`codex plugin add ${PLUGIN_ID}`,pluginListSchema=z3.object({installed:z3.array(z3.object({pluginId:z3.string(),enabled:z3.boolean(),version:z3.string().nullable().optional()}))});async function runCodex(args){let{stdout}=await(0,import_execa3.default)("codex",args,{encoding:"utf8",stdin:"ignore",timeout:6e4,maxBuffer:1048576});return stdout}async function installedPlugin(){let stdout=await runCodex(["plugin","list","--marketplace",MARKETPLACE,"--json"]),{installed:installed2}=pluginListSchema.parse(JSON.parse(stdout));return installed2.find(plugin=>plugin.pluginId===PLUGIN_ID)}async function setupCodexPlugin(client,opts){if(!await codex.detect(opts.home))return{status:"not_detected",message:"Codex was not detected on this machine."};let before;try{before=await installedPlugin()}catch{return{status:"failed",message:"Couldn't inspect Codex plugins. Install or update the Codex CLI, sign in with `codex login`, then re-run `vercel setup --plugin --agent codex`."}}if(before?.enabled)return{status:"up_to_date",message:`Vercel plugin for Codex is installed${before.version?` (v${before.version})`:""}.`};let action=before?"enable":"install";if(opts.dryRun)return{status:"dry_run",action,message:`Setup would ${action} the Vercel plugin for Codex from the OpenAI marketplace.`};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:`Re-run with --yes to ${action} the Vercel plugin for Codex.`};if(printAlignedLabel("Plugin","Vercel for Codex (OpenAI marketplace)"),!await client.input.confirm(before?"Enable this plugin?":"Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for Codex."}}output_manager_default.spinner(`${before?"Enabling":"Installing"} the Vercel plugin for Codex\u2026`);try{let stdout=await runCodex(["plugin","add",PLUGIN_ID,"--json"]),install2=z3.object({appsNeedingAuth:z3.array(z3.unknown()).optional()}).parse(JSON.parse(stdout)),after=await installedPlugin();if(!after?.enabled)return{status:"failed",message:"The Vercel plugin is not enabled in Codex. Open Codex's /plugins browser, enable Vercel, then re-run `vercel setup --plugin --agent codex`."};let version2=after.version?` v${after.version}`:"",connection=install2.appsNeedingAuth?.length?" Connect Vercel in Codex's /plugins browser to use its connected tools.":" Start a new Codex session to load the plugin.";return{status:before?"enabled":"installed",message:`${before?"Enabled":"Installed"} the Vercel plugin for Codex${version2}.${connection}`}}catch{return{status:"failed",message:`Failed to set up the Vercel plugin for Codex. Run \`${INSTALL_COMMAND}\` to finish setup in Codex.`}}finally{output_manager_default.stopSpinner()}}var import_execa4=__toESM(require_execa(),1);init_main();import{isAbsolute as isAbsolute7,join as join38}from"node:path";var PLUGIN_SOURCE="github:vercel/vercel-plugin",PLUGIN_ID2="vercel-plugin";async function openCodeMajorVersion(){try{let{stdout}=await(0,import_execa4.default)("opencode",["--version"],{stdin:"ignore",timeout:1e4}),match=/(\d+)\.\d+\.\d+/.exec(stdout);return match?Number(match[1]):void 0}catch{return}}function selectsPlugin(selector){return selector==="*"||(selector.endsWith(".*")?PLUGIN_ID2.startsWith(selector.slice(0,-1)):selector===PLUGIN_ID2)}async function pluginConfigState(home){let xdg=process.env.XDG_CONFIG_HOME,dir=process.env.OPENCODE_CONFIG_DIR||join38(xdg&&isAbsolute7(xdg)?xdg:join38(home,".config"),"opencode"),state={status:"missing"};for(let file of["opencode.json","opencode.jsonc"]){let path3=join38(dir,file),text3=await readFileOrNull(path3);if(!text3)continue;let errors=[],config=parse(text3,errors,{allowTrailingComma:!0});if(errors.length>0||!Array.isArray(config?.plugins))continue;let plugins=config.plugins;for(let entry2 of plugins){if(typeof entry2=="string"&&entry2.startsWith("-")){state.status!=="missing"&&selectsPlugin(entry2.slice(1))&&(state={status:"disabled",rule:entry2,file:path3});continue}let target=typeof entry2=="string"?entry2:entry2?.package;(target===PLUGIN_SOURCE||state.status!=="missing"&&target&&selectsPlugin(target))&&(state={status:"enabled"})}}return state}async function setupOpenCodePlugin(client,opts){let majorVersion=await openCodeMajorVersion();if(majorVersion===void 0)return{status:"not_detected",message:"OpenCode was not detected on this machine."};if(majorVersion<2)return{status:"unsupported",message:"The Vercel plugin needs OpenCode 2. Upgrade OpenCode, then re-run `vercel setup --plugin --agent opencode`."};let state=await pluginConfigState(opts.home);if(state.status==="disabled")return{status:"disabled",message:`The Vercel plugin is disabled by "${state.rule}" in ${state.file}. Remove that entry or add "${PLUGIN_ID2}" after it to enable the plugin.`};if(state.status==="enabled")return{status:"up_to_date",message:"Vercel plugin for OpenCode is installed."};if(opts.dryRun)return{status:"dry_run",action:"install",message:"Setup would install the Vercel plugin for OpenCode."};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:"Re-run with --yes to install the Vercel plugin for OpenCode."};if(printAlignedLabel("Plugin",`Vercel for OpenCode (${PLUGIN_SOURCE})`),!await client.input.confirm("Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for OpenCode."}}output_manager_default.spinner("Installing the Vercel plugin for OpenCode\u2026");try{await(0,import_execa4.default)("opencode",["plugin","add",PLUGIN_SOURCE],{stdin:"ignore",timeout:12e4})}catch{return{status:"failed",message:`Failed to install the Vercel plugin for OpenCode. Run \`opencode plugin add ${PLUGIN_SOURCE}\` to finish setup.`}}finally{output_manager_default.stopSpinner()}return{status:"installed",message:"Installed the Vercel plugin for OpenCode. Restart OpenCode, then run /mcps to sign in to the Vercel MCP server."}}var SetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){for(let agent2 of agents??[])this.trackCliOption({option:"agent",value:agent2})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry2=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,"Invalid setup arguments. Run vercel setup --help for usage."),printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("setup"),output_manager_default.print(help(setupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.args.length>1){let message="The setup command does not accept positional arguments. Use --plugin or --gateway to select a step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}let{flags}=parsedArgs,onlyPlugin=flags["--plugin"],onlyGateway=flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent2=>agent2.toLowerCase()))]:void 0;if(agents?.some(agent2=>!getAgentById(agent2)||onlyPlugin&&!onlyGateway&&!["claude-code","codex","opencode"].includes(agent2))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code, --agent codex, and --agent opencode.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}telemetry2.trackCliOptionAgent(agents),telemetry2.trackCliFlagPlugin(onlyPlugin),telemetry2.trackCliFlagGateway(onlyGateway),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagYes(yes);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
|
|
1381
1381
|
${import_chalk300.default.bold(` ${STEP_LABELS[step]}`)}
|
|
1382
1382
|
`);let outcome=step==="plugin"?await runPluginStep(client,{yes:!!yes,dryRun:!!dryRun,canPrompt:canPrompt2,home,machine,onlyStep:steps.length===1,agents}):await runGatewayStep(client,{yes:!!yes,dryRun:!!dryRun,agents});if(outcomes.set(step,outcome),machine&&!outcome.ok)break}}catch(error){return output_manager_default.stopSpinner(),machine&&writeSetupError(client,"setup_failed","Failed to complete setup."),printError(error),1}let failed=[...outcomes.values()].some(o=>!o.ok),complete=[...outcomes.values()].every(o=>o.complete),gutter=failed?import_chalk300.default.red("\u2717"):complete?import_chalk300.default.green("\u2713"):" ",heading=complete?dryRun?"Dry run complete":"Setup complete":"Setup incomplete";output_manager_default.print(`
|
|
1383
1383
|
${gutter} ${import_chalk300.default.bold(heading)}
|
|
1384
1384
|
`);for(let[step,outcome]of outcomes)printAlignedLabel(STEP_LABELS[step],outcome.summary);return failed?1:0}function writeSetupError(client,reason,message){client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
|
|
1385
|
-
`)}async function runPluginStep(client,opts){let targets2=[{agent:"claude-code",name:"Claude Code",setup:setupVercelPlugin},{agent:"codex",name:"Codex",setup:setupCodexPlugin}].filter(target=>!opts.agents||opts.agents.includes(target.agent)),results=[];for(let target of targets2){let result2=await target.setup(client,opts);results.push({...result2,agent:target.agent,name:target.name})}let detected=results.filter(result2=>result2.status!=="not_detected"),visible=detected.length>0?detected:results;for(let result2 of visible)output_manager_default.print(` ${result2.message}
|
|
1386
|
-
`);let result=["failed","confirmation_required","declined","installed","enabled","updated","dry_run","up_to_date","not_detected"].map(status6=>results.find(result2=>result2.status===status6)).find(result2=>result2!==void 0)??{status:"not_detected",message:"No Vercel plugin is available for the selected agents."},message=visible.map(result2=>result2.message).join(" ")||result.message;visible.length===0&&output_manager_default.print(` ${message}
|
|
1385
|
+
`)}async function runPluginStep(client,opts){let targets2=[{agent:"claude-code",name:"Claude Code",setup:setupVercelPlugin},{agent:"codex",name:"Codex",setup:setupCodexPlugin},{agent:"opencode",name:"OpenCode",setup:setupOpenCodePlugin}].filter(target=>!opts.agents||opts.agents.includes(target.agent)),results=[];for(let target of targets2){let result2=await target.setup(client,opts);results.push({...result2,agent:target.agent,name:target.name})}let detected=results.filter(result2=>result2.status!=="not_detected"),visible=detected.length>0?detected:results;for(let result2 of visible)output_manager_default.print(` ${result2.message}
|
|
1386
|
+
`);let result=["failed","confirmation_required","declined","disabled","installed","enabled","updated","dry_run","up_to_date","unsupported","not_detected"].map(status6=>results.find(result2=>result2.status===status6)).find(result2=>result2!==void 0)??{status:"not_detected",message:"No Vercel plugin is available for the selected agents."},message=visible.map(result2=>result2.message).join(" ")||result.message;visible.length===0&&output_manager_default.print(` ${message}
|
|
1387
1387
|
`);let confirmationRequired=result.status==="confirmation_required",ok=result.status!=="failed"&&!confirmationRequired;return opts.machine&&(opts.onlyStep||!ok)&&client.stdout.write(`${JSON.stringify({status:confirmationRequired?AGENT_STATUS.ACTION_REQUIRED:ok?AGENT_STATUS.OK:AGENT_STATUS.ERROR,reason:confirmationRequired?AGENT_REASON.CONFIRMATION_REQUIRED:`plugin_${result.status}`,message,plugins:results,...confirmationRequired&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`setup${opts.onlyStep?" --plugin":""}${opts.agents?.map(agent2=>` --agent ${agent2}`).join("")??""} --yes`,void 0,{globalFlags:"all"})}]}},null,2)}
|
|
1388
|
-
`),{ok,complete:ok
|
|
1388
|
+
`),{ok,complete:ok&&!["declined","disabled","unsupported"].includes(result.status),summary:visible.length>0?visible.map(result2=>summarizePlugin(result2,result2.name)).join("; "):"Skipped (no plugin available for the selected agents)"}}function summarizePlugin(result,name){switch(result.status){case"installed":return`Installed for ${name}`;case"enabled":return`Enabled for ${name}`;case"updated":return`Updated for ${name}`;case"up_to_date":return`Already installed for ${name}`;case"not_detected":return`Skipped (${name} not detected)`;case"unsupported":return`Skipped (${name} needs an upgrade)`;case"disabled":return`Disabled in ${name} config`;case"declined":return`Skipped for ${name}`;case"confirmation_required":return`Confirmation required for ${name} (re-run with --yes)`;case"dry_run":return`Would ${result.action??"install"} for ${name}`;case"failed":return`Failed for ${name}`}}async function runGatewayStep(client,opts){let argv=[];opts.yes&&argv.push("--yes"),opts.dryRun&&argv.push("--dry-run");for(let agent2 of opts.agents??[])argv.push("--agent",agent2);let result=await setupCodingAgents(client,argv),summaries={configured:"Completed (see above)",already_configured:"Already configured",dry_run:"Previewed (see above)",canceled:"Canceled (no changes applied)",skipped:"Skipped (see above)",agent_prompt:"Prompt generated (apply it with your agent)",failed:"Failed \u2014 see the messages above"};return{ok:result.exitCode===0,complete:result.exitCode===0&&result.outcome!=="canceled"&&result.outcome!=="skipped"&&result.outcome!=="agent_prompt",summary:summaries[result.outcome]}}var import_chalk301=__toESM(require_source(),1);var SignupTelemetryClient=class extends TelemetryClient{trackCliOptionEmail(email2){email2&&this.trackCliOption({option:"email",value:this.redactedValue})}trackState(...args){this.trackLoginState(...args)}};function isValidEmail(value){return email.test(value.trim())}async function signup(client){let telemetry2=new SignupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(signupCommand.options))}catch(error){return printError(error,client),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("signup"),output_manager_default.print(help(signupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.flags["--token"])return output_manager_default.error('`--token` may not be used with the "signup" command'),2;if(parsedArgs.args.slice(1).length)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("signup --email user@example.com")}`),2;let emailOption=parsedArgs.flags["--email"];telemetry2.trackCliOptionEmail(emailOption);let email2=emailOption?.trim();if(email2&&!isValidEmail(email2))return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The value provided for --email is not a valid email address."}),output_manager_default.error(`Couldn't use ${import_chalk301.default.bold(email2)}: not a valid email address.`),2;let canPrompt2=client.stdin.isTTY===!0&&!client.nonInteractive&&!client.isAgent;if(!email2){if(!canPrompt2)return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Provide an email address with --email."}),output_manager_default.error(`Provide an email address with ${import_chalk301.default.bold("--email")}. Example: ${getCommandName("signup --email user@example.com")}`),2;email2=await client.input.text({message:"Email?",validate:value=>isValidEmail(value)?!0:"Enter a valid email address."}),email2=email2.trim()}telemetry2.trackState("started");try{let tokens=await performDeviceCodeFlow(client,{signupEmail:email2});if(!tokens)return telemetry2.trackState("error"),1;await saveDeviceCodeTokens(client,tokens)}catch(error){return telemetry2.trackState("error"),printError(error),1}return output_manager_default.print(`
|
|
1389
1389
|
${import_chalk301.default.cyan("Welcome to Vercel!")} Your account is ready and you are signed in.
|
|
1390
1390
|
|
|
1391
1391
|
Run ${getCommandName("deploy")} to deploy, or ${getCommandName("setup")} to set up the Vercel plugin and connect your coding agents to AI Gateway.
|
|
1392
1392
|
|
|
1393
1393
|
${emoji("tip")} To deploy every commit automatically,
|
|
1394
1394
|
connect a Git Repository (${import_chalk301.default.bold(output_manager_default.link("vercel.link/git","https://vercel.link/git",{color:!1}))}).
|
|
1395
|
-
`),telemetry2.trackState("success"),0}var import_chalk302=__toESM(require_source(),1),import_frameworks3=__toESM(require_frameworks(),1),import_fs_detectors=__toESM(require_dist2(),1);import{access as access2,readFile as readFile9}from"fs/promises";import{join as
|
|
1395
|
+
`),telemetry2.trackState("success"),0}var import_chalk302=__toESM(require_source(),1),import_frameworks3=__toESM(require_frameworks(),1),import_fs_detectors=__toESM(require_dist2(),1);import{access as access2,readFile as readFile9}from"fs/promises";import{join as join39}from"path";import{homedir as homedir3}from"os";import{spawn as spawn4}from"child_process";var SkillsTelemetryClient=class extends TelemetryClient{trackCliFlagJson(v){v&&this.trackCliFlag("json")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var SKILLS_API="https://skills.sh/api/search",FETCH_TIMEOUT_MS2=1e4,MIN_INSTALLS=100,MAX_RESULTS=8,MAX_FRAMEWORK_RESULTS=4,MAX_DEP_QUERIES=5,NOTABLE_DEPS=new Set(["prisma","@prisma/client","drizzle-orm","mongoose","typeorm","sequelize","tailwindcss","next-auth","@auth/core","@clerk/nextjs","lucia","@supabase/supabase-js","@trpc/server","graphql","@apollo/client","stripe","zustand","@reduxjs/toolkit","@tanstack/react-query","playwright","@playwright/test","cypress","vitest","jest","sanity","payload","contentful","turborepo","docker-compose","firebase","@sentry/nextjs","zod","convex","upstash","flags","@flags-sdk/vercel","@vercel/flags"]);async function searchSkills(query){try{let url=`${SKILLS_API}?q=${encodeURIComponent(query)}`,controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS2);try{let res=await fetch(url,{signal:controller.signal});return res.ok?(await res.json()).skills??[]:(output_manager_default.debug(`Skills API returned ${res.status} for query "${query}"`),[])}finally{clearTimeout(timeout)}}catch(err){return output_manager_default.debug(`Skills search failed for "${query}": ${err}`),[]}}async function detectProjectFramework(cwd){try{let fs3=new import_fs_detectors.LocalFileSystemDetector(cwd),detected=await(0,import_fs_detectors.detectFrameworks)({fs:fs3,frameworkList:import_frameworks3.frameworkList});if(detected.length>0)return{name:detected[0].name,slug:detected[0].slug||""}}catch{}return null}async function readPackageDeps(cwd){try{let raw=await readFile9(join39(cwd,"package.json"),"utf8"),pkg=JSON.parse(raw),allDeps={...pkg.dependencies,...pkg.devDependencies},depNames=Object.keys(allDeps),notable=depNames.filter(d=>NOTABLE_DEPS.has(d)),language=depNames.includes("typescript")?"typescript":"javascript";return{deps:notable,language}}catch{return{deps:[],language:"unknown"}}}function cleanDepName(dep){return dep.replace(/^@/,"").replace(/\//g,"-")}async function isSkillInstalled(name,cwd){let sanitized=name.toLowerCase().replace(/\s+/g,"-"),dirs=[join39(cwd,".agents","skills",sanitized),join39(homedir3(),".agents","skills",sanitized)];for(let dir of dirs)try{return await access2(dir),!0}catch{}return!1}function formatInstalls(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}async function skills(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(skillsCommand.options))}catch(error){return printError(error),2}let telemetry2=new SkillsTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("skills"),output_manager_default.print(help(skillsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliArgumentQuery(parsedArgs.args[1]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,query=parsedArgs.args[1],{cwd}=client,yes=parsedArgs.flags["--yes"]??!1;try{return query?await directSearch(client,query,asJson,cwd):await autoDetect(client,cwd,asJson,yes)}catch(err){return printError(err),1}}async function directSearch(client,query,asJson,cwd){output_manager_default.spinner("Searching skills...");let results=await searchSkills(query);output_manager_default.stopSpinner();let filtered=results.filter(s=>s.installs>=MIN_INSTALLS).slice(0,MAX_RESULTS),{exitCode:exitCode2}=await displayResults(client,filtered,asJson,`Search: "${query}"`,cwd);return exitCode2}async function autoDetect(client,cwd,asJson,yes){output_manager_default.spinner("Detecting project...");let[framework,{deps,language}]=await Promise.all([detectProjectFramework(cwd),readPackageDeps(cwd)]);if(!framework&&deps.length===0)return output_manager_default.stopSpinner(),output_manager_default.log("Could not detect a framework or notable dependencies in this directory."),output_manager_default.log(`Try searching directly: ${import_chalk302.default.cyan("vercel skills <query>")}`),0;let detectedParts=[];framework&&detectedParts.push(framework.name),language!=="unknown"&&detectedParts.push(language),deps.length>0&&detectedParts.push(deps.join(", ")),output_manager_default.stopSpinner(),output_manager_default.log(`Detected: ${import_chalk302.default.bold(detectedParts.join(" + "))}`),output_manager_default.spinner("Searching for relevant skills...");let queries=[];if(framework){let slug=(framework.slug||framework.name).toLowerCase().replace(/-\d+$/,"");queries.push({term:slug,tier:"framework"});let base=slug.replace(/(kit|js)$/,"");base&&base!==slug&&queries.push({term:base,tier:"framework"}),output_manager_default.debug(`Framework queries: ${queries.map(q=>q.term).join(", ")}`)}for(let dep of deps.slice(0,MAX_DEP_QUERIES))queries.push({term:cleanDepName(dep),tier:"dependency"});output_manager_default.debug(`Total queries: ${queries.map(q=>`${q.term} (${q.tier})`).join(", ")}`);let searchResults=await Promise.allSettled(queries.map(async q=>({tier:q.tier,skills:await searchSkills(q.term)}))),frameworkSkills=new Map,depSkills=new Map;for(let result of searchResults){if(result.status!=="fulfilled")continue;let{tier,skills:resultSkills}=result.value,bucket=tier==="framework"?frameworkSkills:depSkills;for(let skill of resultSkills){if(skill.installs<MIN_INSTALLS)continue;let existing=bucket.get(skill.skillId);(!existing||skill.installs>existing.installs)&&bucket.set(skill.skillId,skill)}}let sortByInstalls=(a,b)=>b.installs-a.installs,topFramework=Array.from(frameworkSkills.values()).sort(sortByInstalls).slice(0,MAX_FRAMEWORK_RESULTS);for(let fw of topFramework)depSkills.delete(fw.skillId);let topDeps=Array.from(depSkills.values()).sort(sortByInstalls).slice(0,MAX_RESULTS-topFramework.length),ranked=[...topFramework,...topDeps];output_manager_default.debug(`Results: ${topFramework.length} framework + ${topDeps.length} dependency skills`),output_manager_default.stopSpinner();let{exitCode:exitCode2,results:displayedResults,installedChecks}=await displayResults(client,ranked,asJson,`Detected: ${detectedParts.join(" + ")}`,cwd);if(exitCode2!==0||asJson)return exitCode2;let installable=displayedResults.map((s,i)=>({...s,installed:installedChecks[i]})).filter(s=>!s.installed);if(installable.length===0)return output_manager_default.log(import_chalk302.default.green("All recommended skills are already installed.")),0;let toInstall;if(yes)toInstall=installable;else if(client.stdin.isTTY){let selected=await client.input.checkbox({message:"Select skills to install",choices:installable.map(s=>({name:`${s.skillId} ${import_chalk302.default.gray(`(${s.source})`)}`,value:s,checked:!0}))});if(!Array.isArray(selected)||selected.length===0)return output_manager_default.log("No skills selected."),0;toInstall=selected}else return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;output_manager_default.log(`
|
|
1396
1396
|
Installing ${toInstall.length} skill${toInstall.length>1?"s":""}...
|
|
1397
1397
|
`);let bySource=new Map;for(let skill of toInstall){let existing=bySource.get(skill.source)??[];existing.push(skill.skillId),bySource.set(skill.source,existing)}let succeeded=[],failed=[];for(let[source,skillIds]of bySource){let label=skillIds.length===1?skillIds[0]:skillIds.join(", ");output_manager_default.spinner(`Installing ${label} from ${source}...`);let args=["skills","add",source];for(let id2 of skillIds)args.push("--skill",id2);args.push("-y"),output_manager_default.debug(`> npx ${args.join(" ")}`);let code2=await runCommand("npx",args);output_manager_default.stopSpinner(),code2!==0?failed.push(...skillIds):succeeded.push(...skillIds)}return succeeded.length>0&&output_manager_default.success(`Installed ${succeeded.length} skill${succeeded.length>1?"s":""}: ${succeeded.join(", ")}`),failed.length>0&&output_manager_default.error(`Failed to install: ${failed.join(", ")}`),0}async function displayResults(client,results,asJson,context,cwd){let empty={exitCode:0,results,installedChecks:[]};if(results.length===0)return output_manager_default.log("No skills found."),output_manager_default.log(`Try searching directly: ${import_chalk302.default.cyan("vercel skills <query>")}`),empty;let installedChecks=await Promise.all(results.map(s=>isSkillInstalled(s.skillId,cwd)));if(asJson){output_manager_default.stopSpinner();let skillsWithStatus=results.map((s,i)=>({...s,installed:installedChecks[i]}));return client.stdout.write(`${JSON.stringify({context,skills:skillsWithStatus},null,2)}
|
|
1398
1398
|
`),{exitCode:0,results,installedChecks}}let tableData=[["Skill","Installs","Source",""].map(h=>import_chalk302.default.bold(import_chalk302.default.cyan(h))),...results.map((s,i)=>[s.skillId,formatInstalls(s.installs),import_chalk302.default.gray(s.source),installedChecks[i]?import_chalk302.default.green("installed"):""])];return output_manager_default.log(`
|
|
@@ -1413,8 +1413,8 @@ ${table(tableData,{hsep:4})}`),{exitCode:0,results,installedChecks}}function run
|
|
|
1413
1413
|
`)}var import_chalk311=__toESM(require_source(),1);var StorageStatusTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function status3(client,argv){let telemetry2=new StorageStatusTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(statusSubcommand5.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,all=flags["--all"]??!1,storeIdentifier=args[0];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliArgumentStore(storeIdentifier),args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage status [store]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});let needsProject=!!flags["--project"]||!all&&!storeIdentifier,accountId,project;if(needsProject){let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}else{let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}let stores;if(storeIdentifier){let store=await resolveStorageStore(client,storeIdentifier,accountId);if(typeof store=="number")return store;stores=[store]}else{output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner()}let scopedProjectId=project?.id,summaries=stores.map(store=>summarizeStore3(store,scopedProjectId)).filter(summary=>all||storeIdentifier||summary.connections.length>0);return asJson?(client.stdout.write(`${JSON.stringify({stores:summaries},null,2)}
|
|
1414
1414
|
`),0):summaries.length===0?(output_manager_default.log(project?`No storage resources are connected to ${import_chalk311.default.bold(project.name)}. Use ${getCommandName("storage status --all")} to list every resource in this scope.`:"No storage resources found in this scope."),0):(printStatusTable(summaries),0)}function summarizeStore3(store,projectId){let connections2=getConnections(store).filter(connection=>!projectId||connection.projectId===projectId);return{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store),status:store.status??null,connections:connections2.map(connection=>summarizeConnection(store,connection))}}function summarizeConnection(store,connection){return{id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments,envVarPrefix:connection.envVarPrefix??null,auth:inferConnectionAuth(store,connection.environmentVariables),environmentVariables:connection.environmentVariables??null}}function formatAuthCell(connection){return connection.auth==="unknown"?import_chalk311.default.dim("unknown"):describeStorageAuth({effective:connection.auth,readWriteToken:(connection.environmentVariables??[]).some(name=>name.endsWith("_READ_WRITE_TOKEN"))})}function printStatusTable(summaries){let rows=[["Store","Product","Project","Environments","Credentials","Env vars"].map(header=>import_chalk311.default.bold(import_chalk311.default.cyan(header)))];for(let store of summaries){if(store.connections.length===0){rows.push([store.name,store.product,import_chalk311.default.dim("not connected"),import_chalk311.default.dim("\u2013"),import_chalk311.default.dim("\u2013"),import_chalk311.default.dim("\u2013")]);continue}for(let[index,connection]of store.connections.entries())rows.push([index===0?store.name:"",index===0?store.product:"",connection.project.name,connection.environments.join(", "),formatAuthCell(connection),connection.environmentVariables?.length?connection.environmentVariables.join(", "):import_chalk311.default.dim("\u2013")])}output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
|
|
1415
1415
|
|
|
1416
|
-
`)}var import_chalk312=__toESM(require_source(),1);var StorageUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};function sameEnvironments(a,b){if(a.length!==b.length)return!1;let left=new Set(a);return b.every(value=>left.has(value))}async function update8(client,argv){let telemetry2=new StorageUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(updateSubcommand10.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwTokenFlag=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwTokenFlag),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage update <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),2;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environmentsFlag=resolveEnvironments(flags["--environment"]);if(!environmentsFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environmentsFlag.message});let prefixFlag=resolvePrefix(flags["--prefix"]);if(!prefixFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefixFlag.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let target=resolveProjectConnection(store,scope.project.id,environmentsFlag.explicit?environmentsFlag.environments:void 0);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${scope.project.name}.`,next:[{command:getCommandNamePlain(`storage connect ${store.name}`),when:"create the connection"}]});if(target.status==="ambiguous")return failWith(client,{reason:"ambiguous_connection",message:`${scope.project.name} has more than one connection to ${store.name} (${target.connections.map(connection2=>connection2.environments.join("+")).join(", ")}). Pass --environment to pick one.`});let connection=target.connection,currentEnvVars=connection.environmentVariables??[],currentAuth=inferConnectionAuth(store,connection.environmentVariables),hasOidcVars=currentEnvVars.some(name=>name.endsWith("_STORE_ID")),hasRwTokenNow=currentEnvVars.some(name=>name.endsWith("_READ_WRITE_TOKEN")),requestedMode=authMode.explicit?authMode.mode:currentAuth==="token"?"token":"oidc",addRwToken=addRwTokenFlag||!authMode.explicit&&hasRwTokenNow,auth=resolveStorageAuth({store,mode:requestedMode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let environments=environmentsFlag.explicit?environmentsFlag.environments:connection.environments,currentPrefix=normalizeEnvVarPrefix(connection.envVarPrefix),prefix=prefixFlag.prefix!==void 0?prefixFlag.prefix:currentPrefix,environmentsChanged=environmentsFlag.explicit&&!sameEnvironments(environments,connection.environments),prefixChanged=flags["--prefix"]!==void 0&&prefix!==currentPrefix,needsOidcUpgrade=storeSupportsOidc(store)&&auth.auth.effective==="oidc"&&!hasOidcVars,rwTokenChanged=storeSupportsOidc(store)&&auth.auth.readWriteToken!==hasRwTokenNow;if(!environmentsChanged&&!prefixChanged&&!needsOidcUpgrade&&!rwTokenChanged)return failWith(client,{reason:AGENT_REASON.NO_CHANGES_REQUESTED,message:`Nothing to update: ${store.name} on ${scope.project.name} already matches the requested configuration.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"inspect the current connection"}]});let plan=buildStoragePlan({action:"update",dryRun,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:planUpdateEnvVars({store,auth:auth.auth,prefix,connection,prefixChanged})});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Updating storage connection\u2026",500),needsOidcUpgrade&&await upgradeStoreConnectionToOidc(client,{store,connectionId:connection.id,auth:auth.auth,accountId:scope.accountId});let patchEnvironments=environmentsChanged?environments:void 0,patchPrefix=prefixChanged?prefix??null:void 0,patchSkipReadWriteToken=storeSupportsOidc(store)?!auth.auth.readWriteToken:void 0;(patchEnvironments!==void 0||patchPrefix!==void 0||patchSkipReadWriteToken!==void 0)&&await updateStoreConnection(client,{store,connectionId:connection.id,accountId:scope.accountId,environments:patchEnvironments,envVarPrefix:patchPrefix,skipReadWriteToken:patchSkipReadWriteToken})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while updating the connection: ${error.message}`})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"update",dryRun:!1,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:diffEnvVarNames(currentEnvVars,verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Updated ${import_chalk312.default.bold(store.name)} on ${import_chalk312.default.bold(scope.project.name)} (${environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,[...connection.environments,...environments])}),0}var COMMAND_CONFIG62={list:getCommandAliases(listSubcommand22),create:getCommandAliases(createSubcommand7),inspect:getCommandAliases(getSubcommand3),delete:getCommandAliases(deleteSubcommand5),connect:getCommandAliases(connectSubcommand3),status:getCommandAliases(statusSubcommand5),update:getCommandAliases(updateSubcommand10),disconnect:getCommandAliases(disconnectSubcommand3)};async function main33(client){let telemetry2=new StorageTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification(storageCommand.options),{permissive:!0})}catch(error){return printError(error),2}let needHelp=!!parsedArguments.flags["--help"],subArgs=parsedArguments.args.slice(1),{subcommand,subcommandOriginal,args}=getSubcommand7(subArgs,COMMAND_CONFIG62);if(!subcommand)return needHelp?(telemetry2.trackCliFlagHelp("storage"),output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),0):subArgs.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG62)),2):(output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),2);function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:storageCommand}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(listSubcommand22),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list26(client,args));case"create":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(createSubcommand7),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create7(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(getSubcommand3),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"storage get","storage inspect"),get4(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(deleteSubcommand5),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteStore(client,args));case"connect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(connectSubcommand3),0):(telemetry2.trackCliSubcommandConnect(subcommandOriginal),connect3(client,args));case"status":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(statusSubcommand5),0):(telemetry2.trackCliSubcommandStatus(subcommandOriginal),status3(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(updateSubcommand10),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update8(client,args));case"disconnect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(disconnectSubcommand3),0):(telemetry2.trackCliSubcommandDisconnect(subcommandOriginal),disconnect3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG62)),2}}var import_ms41=__toESM(require_ms(),1),import_chalk313=__toESM(require_source(),1);function formatBranchMatcher(branchMatcher){return branchMatcher?.type==="equals"?branchMatcher.pattern:branchMatcher?.type==="startsWith"?`${branchMatcher.pattern}${import_chalk313.default.dim("*")}`:branchMatcher?.type==="endsWith"?`${import_chalk313.default.dim("*")}${branchMatcher.pattern}`:import_chalk313.default.dim("No branch configuration")}var TYPE_MAP={production:"Production",preview:"Preview",development:"Development"},BRANCH_TRACKING_MAP={production:project=>project.link?.productionBranch??"main",preview:(_,env)=>env.slug==="preview"?import_chalk313.default.dim("All unassigned git branches"):formatBranchMatcher(env.branchMatcher),development:()=>import_chalk313.default.dim("Accessible via CLI")};async function list27(client,argv){let{cwd}=client,telemetry2=new TelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand23.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let validationResult=validateLsArgs({commandName:"target ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink(targetCommand.name,client,cwd,{autoConfirm,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let start=Date.now(),projectSlugLink=formatProject(link.org.slug,link.project.name);output_manager_default.spinner(`Fetching custom environments for ${projectSlugLink}`);let url=`/projects/${encodeURIComponent(link.project.id)}/custom-environments`,{environments:result}=await client.fetch(url,{method:"GET",accountId:link.org.id});output_manager_default.stopSpinner();let elapsed2=(0,import_ms41.default)(Date.now()-start);if(result=withDefaultEnvironmentsIncluded(result),asJson){let jsonOutput={targets:result.map(target=>({id:target.id,slug:target.slug,type:target.type,description:target.description,branchMatcher:target.branchMatcher,createdAt:target.createdAt,updatedAt:target.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1417
|
-
`)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${import_chalk313.default.gray(`[${elapsed2}]`)}`);let tablePrint=table([["Target Name","Branch Tracking","Type","Updated"].map(header=>import_chalk313.default.bold(import_chalk313.default.cyan(header))),...result.flatMap(target=>[[formatEnvironment(link.org.slug,link.project.name,target),BRANCH_TRACKING_MAP[target.type](link.project,target),TYPE_MAP[target.type],import_chalk313.default.gray(target.updatedAt>0?(0,
|
|
1416
|
+
`)}var import_chalk312=__toESM(require_source(),1);var StorageUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};function sameEnvironments(a,b){if(a.length!==b.length)return!1;let left=new Set(a);return b.every(value=>left.has(value))}async function update8(client,argv){let telemetry2=new StorageUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(updateSubcommand10.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwTokenFlag=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwTokenFlag),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage update <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),2;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environmentsFlag=resolveEnvironments(flags["--environment"]);if(!environmentsFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environmentsFlag.message});let prefixFlag=resolvePrefix(flags["--prefix"]);if(!prefixFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefixFlag.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let target=resolveProjectConnection(store,scope.project.id,environmentsFlag.explicit?environmentsFlag.environments:void 0);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${scope.project.name}.`,next:[{command:getCommandNamePlain(`storage connect ${store.name}`),when:"create the connection"}]});if(target.status==="ambiguous")return failWith(client,{reason:"ambiguous_connection",message:`${scope.project.name} has more than one connection to ${store.name} (${target.connections.map(connection2=>connection2.environments.join("+")).join(", ")}). Pass --environment to pick one.`});let connection=target.connection,currentEnvVars=connection.environmentVariables??[],currentAuth=inferConnectionAuth(store,connection.environmentVariables),hasOidcVars=currentEnvVars.some(name=>name.endsWith("_STORE_ID")),hasRwTokenNow=currentEnvVars.some(name=>name.endsWith("_READ_WRITE_TOKEN")),requestedMode=authMode.explicit?authMode.mode:currentAuth==="token"?"token":"oidc",addRwToken=addRwTokenFlag||!authMode.explicit&&hasRwTokenNow,auth=resolveStorageAuth({store,mode:requestedMode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let environments=environmentsFlag.explicit?environmentsFlag.environments:connection.environments,currentPrefix=normalizeEnvVarPrefix(connection.envVarPrefix),prefix=prefixFlag.prefix!==void 0?prefixFlag.prefix:currentPrefix,environmentsChanged=environmentsFlag.explicit&&!sameEnvironments(environments,connection.environments),prefixChanged=flags["--prefix"]!==void 0&&prefix!==currentPrefix,needsOidcUpgrade=storeSupportsOidc(store)&&auth.auth.effective==="oidc"&&!hasOidcVars,rwTokenChanged=storeSupportsOidc(store)&&auth.auth.readWriteToken!==hasRwTokenNow;if(!environmentsChanged&&!prefixChanged&&!needsOidcUpgrade&&!rwTokenChanged)return failWith(client,{reason:AGENT_REASON.NO_CHANGES_REQUESTED,message:`Nothing to update: ${store.name} on ${scope.project.name} already matches the requested configuration.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"inspect the current connection"}]});let plan=buildStoragePlan({action:"update",dryRun,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:planUpdateEnvVars({store,auth:auth.auth,prefix,connection,prefixChanged})});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Updating storage connection\u2026",500),needsOidcUpgrade&&await upgradeStoreConnectionToOidc(client,{store,connectionId:connection.id,auth:auth.auth,accountId:scope.accountId});let patchEnvironments=environmentsChanged?environments:void 0,patchPrefix=prefixChanged?prefix??null:void 0,patchSkipReadWriteToken=storeSupportsOidc(store)?!auth.auth.readWriteToken:void 0;(patchEnvironments!==void 0||patchPrefix!==void 0||patchSkipReadWriteToken!==void 0)&&await updateStoreConnection(client,{store,connectionId:connection.id,accountId:scope.accountId,environments:patchEnvironments,envVarPrefix:patchPrefix,skipReadWriteToken:patchSkipReadWriteToken})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while updating the connection: ${error.message}`})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"update",dryRun:!1,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:diffEnvVarNames(currentEnvVars,verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Updated ${import_chalk312.default.bold(store.name)} on ${import_chalk312.default.bold(scope.project.name)} (${environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,[...connection.environments,...environments])}),0}var COMMAND_CONFIG62={list:getCommandAliases(listSubcommand22),create:getCommandAliases(createSubcommand7),inspect:getCommandAliases(getSubcommand3),delete:getCommandAliases(deleteSubcommand5),connect:getCommandAliases(connectSubcommand3),status:getCommandAliases(statusSubcommand5),update:getCommandAliases(updateSubcommand10),disconnect:getCommandAliases(disconnectSubcommand3)};async function main33(client){let telemetry2=new StorageTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification(storageCommand.options),{permissive:!0})}catch(error){return printError(error),2}let needHelp=!!parsedArguments.flags["--help"],subArgs=parsedArguments.args.slice(1),{subcommand,subcommandOriginal,args}=getSubcommand7(subArgs,COMMAND_CONFIG62);if(!subcommand)return needHelp?(telemetry2.trackCliFlagHelp("storage"),output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),0):subArgs.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG62)),2):(output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),2);function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:storageCommand}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(listSubcommand22),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list26(client,args));case"create":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(createSubcommand7),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create7(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(getSubcommand3),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"storage get","storage inspect"),get4(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(deleteSubcommand5),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteStore(client,args));case"connect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(connectSubcommand3),0):(telemetry2.trackCliSubcommandConnect(subcommandOriginal),connect3(client,args));case"status":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(statusSubcommand5),0):(telemetry2.trackCliSubcommandStatus(subcommandOriginal),status3(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(updateSubcommand10),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update8(client,args));case"disconnect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(disconnectSubcommand3),0):(telemetry2.trackCliSubcommandDisconnect(subcommandOriginal),disconnect3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG62)),2}}var import_ms43=__toESM(require_ms(),1),import_chalk313=__toESM(require_source(),1);function formatBranchMatcher(branchMatcher){return branchMatcher?.type==="equals"?branchMatcher.pattern:branchMatcher?.type==="startsWith"?`${branchMatcher.pattern}${import_chalk313.default.dim("*")}`:branchMatcher?.type==="endsWith"?`${import_chalk313.default.dim("*")}${branchMatcher.pattern}`:import_chalk313.default.dim("No branch configuration")}var TYPE_MAP={production:"Production",preview:"Preview",development:"Development"},BRANCH_TRACKING_MAP={production:project=>project.link?.productionBranch??"main",preview:(_,env)=>env.slug==="preview"?import_chalk313.default.dim("All unassigned git branches"):formatBranchMatcher(env.branchMatcher),development:()=>import_chalk313.default.dim("Accessible via CLI")};async function list27(client,argv){let{cwd}=client,telemetry2=new TelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand23.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let validationResult=validateLsArgs({commandName:"target ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink(targetCommand.name,client,cwd,{autoConfirm,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let start=Date.now(),projectSlugLink=formatProject(link.org.slug,link.project.name);output_manager_default.spinner(`Fetching custom environments for ${projectSlugLink}`);let url=`/projects/${encodeURIComponent(link.project.id)}/custom-environments`,{environments:result}=await client.fetch(url,{method:"GET",accountId:link.org.id});output_manager_default.stopSpinner();let elapsed2=(0,import_ms43.default)(Date.now()-start);if(result=withDefaultEnvironmentsIncluded(result),asJson){let jsonOutput={targets:result.map(target=>({id:target.id,slug:target.slug,type:target.type,description:target.description,branchMatcher:target.branchMatcher,createdAt:target.createdAt,updatedAt:target.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1417
|
+
`)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${import_chalk313.default.gray(`[${elapsed2}]`)}`);let tablePrint=table([["Target Name","Branch Tracking","Type","Updated"].map(header=>import_chalk313.default.bold(import_chalk313.default.cyan(header))),...result.flatMap(target=>[[formatEnvironment(link.org.slug,link.project.name,target),BRANCH_TRACKING_MAP[target.type](link.project,target),TYPE_MAP[target.type],import_chalk313.default.gray(target.updatedAt>0?(0,import_ms43.default)(Date.now()-target.updatedAt):"-")]])],{hsep:3}).replace(/^/gm," ");output_manager_default.print(`
|
|
1418
1418
|
${tablePrint}
|
|
1419
1419
|
|
|
1420
1420
|
`)}return 0}function withDefaultEnvironmentsIncluded(environments){return[{id:"production",slug:"production",createdAt:0,updatedAt:0,type:"production",description:"",domains:[]},{id:"preview",slug:"preview",createdAt:0,updatedAt:0,type:"preview",description:"",domains:[]},{id:"development",slug:"development",createdAt:0,updatedAt:0,type:"development",description:"",domains:[]},...environments.slice().sort((a,b)=>a.slug.localeCompare(b.slug))]}var TargetTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(subcommandActual){this.trackCliSubcommand({subcommand:"list",value:subcommandActual})}};var COMMAND_CONFIG63={ls:getCommandAliases(listSubcommand23)};async function main34(client){let parsedArgs,flagsSpecification=getFlagsSpecification(targetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{telemetryEventStore}=client,telemetry2=new TargetTelemetryClient({opts:{store:telemetryEventStore}});parsedArgs.args=parsedArgs.args.slice(1);let subcommand=parsedArgs.args[0],args=parsedArgs.args.slice(1),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("target"),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:targetCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":case"list":return needHelp?(telemetry2.trackCliFlagHelp("target","list"),printHelp(listSubcommand23),0):(telemetry2.trackCliSubcommandList(subcommand),await list27(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG63)),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),2}}var import_chalk314=__toESM(require_source(),1);var TeamsListTelemetryClient=class extends TelemetryClient{trackCliOptionNext(value){value&&value>0&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionLimit(value){value&&value>0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionUntil(value){value&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionSince(value){value&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionCount(value){value&&value>0&&this.trackCliOption({option:"count",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list28(client,argv){let{config,telemetryEventStore}=client,telemetry2=new TeamsListTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand24.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let validationResult=validateLsArgs({commandName:"teams ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let next=parsedArgs.flags["--next"],limit=parsedArgs.flags["--limit"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliOptionCount(parsedArgs.flags["--count"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("Please provide a number for flag `--next`"),2;try{getPaginationOpts(parsedArgs.flags)}catch(error){return output_manager_default.error(error instanceof Error?error.message:String(error)),1}output_manager_default.spinner("Fetching teams");let teamsResponse=await getTeams(client,{next,limit,apiVersion:2}),teams2=teamsResponse.teams??[],{pagination}=teamsResponse,{currentTeam}=config;output_manager_default.spinner("Fetching user information");let user=await getUser(client),accountIsCurrent=!currentTeam&&user.version!=="northstar";accountIsCurrent&&(currentTeam=user.id);let teamList=teams2.map(({id:id2,slug,name,billing})=>({id:id2,name,plan:billing?.plan??null,value:slug,isCurrent:id2===currentTeam}));if(user.version!=="northstar"&&teamList.unshift({id:user.id,name:user.email,plan:user.billing?.plan??null,value:user.username||user.email,isCurrent:accountIsCurrent}),!accountIsCurrent){let index=teamList.findIndex(choice=>choice.id===currentTeam);if(index!==-1){let choice=teamList.splice(index,1)[0];teamList.unshift(choice)}}if(output_manager_default.stopSpinner(),teamList.length===0)return output_manager_default.error(`No teams are visible to the current credential. Run ${cmd(`${packageName} whoami`)} to check which account you're authenticated as, or re-authorize your credential with team-level access.`),1;if(asJson){let jsonOutput={teams:teamList.map(team=>({id:team.id,slug:team.value,name:team.name,plan:team.plan,current:team.isCurrent})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
@@ -1457,8 +1457,8 @@ Common cases:
|
|
|
1457
1457
|
`),output_manager_default.log(`${import_chalk321.default.bold("Telemetry status")}: ${status6}
|
|
1458
1458
|
`);let learnMoreMessage=`
|
|
1459
1459
|
|
|
1460
|
-
Learn more: ${import_chalk321.default.cyan("https://vercel.com/docs/cli/about-telemetry")}`;return enabled?output_manager_default.log(`You have opted in to Vercel CLI telemetry${learnMoreMessage}`):(output_manager_default.log("You have opted out of Vercel CLI telemetry"),output_manager_default.log(`No data will be collected from your machine${learnMoreMessage}`)),0}async function enable5(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!0}},writeToConfigFile(client.config),await status4(client),0}async function disable5(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!1}},writeToConfigFile(client.config),await status4(client),0}import{randomUUID as randomUUID3}from"node:crypto";function configPreference(value){return value===void 0?"unset":value?"enabled":"disabled"}function getConfigTelemetryEvents(config){return[{key:"config_auto_update",value:configPreference(config.updates?.auto)},{key:"config_bypass_min_release_age",value:configPreference(config.updates?.bypassMinReleaseAge)},{key:"config_use_native_binary",value:configPreference(config.useNativeBinary)},{key:"config_credential_storage",value:config.credStorage??"unset"}]}import{createHash as createHash5,randomUUID as randomUUID2}from"node:crypto";import{mkdir as mkdir2,readFile as readFile10,realpath,rename as rename2,rm as rm11,writeFile as writeFile7}from"node:fs/promises";import{dirname as dirname8,join as
|
|
1461
|
-
`,{flag:"wx",mode:384}),await rename2(temporaryPath,filePath)}finally{await rm11(temporaryPath,{force:!0}).catch(()=>{})}}function getFreshContext(cache,installationKey,currentTime,maxAgeMs,failureMaxAgeMs){let cached=cache.installations[installationKey];if(!cached||!isVersionContext(cached.context))return;let contextMaxAgeMs=cached.context.status==="resolved"?maxAgeMs:failureMaxAgeMs;if(Number.isFinite(cached.collectedAt)&¤tTime-cached.collectedAt<=contextMaxAgeMs)return{...cached.context,source:"cache"}}function boundedInstallations(installations){return Object.fromEntries(Object.entries(installations).sort(([,left],[,right])=>right.collectedAt-left.collectedAt).slice(0,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS))}function getVersionContextCacheFilePath(globalConfigDirectory=getGlobalPathConfig()){return
|
|
1460
|
+
Learn more: ${import_chalk321.default.cyan("https://vercel.com/docs/cli/about-telemetry")}`;return enabled?output_manager_default.log(`You have opted in to Vercel CLI telemetry${learnMoreMessage}`):(output_manager_default.log("You have opted out of Vercel CLI telemetry"),output_manager_default.log(`No data will be collected from your machine${learnMoreMessage}`)),0}async function enable5(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!0}},writeToConfigFile(client.config),await status4(client),0}async function disable5(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!1}},writeToConfigFile(client.config),await status4(client),0}import{randomUUID as randomUUID3}from"node:crypto";function configPreference(value){return value===void 0?"unset":value?"enabled":"disabled"}function getConfigTelemetryEvents(config){return[{key:"config_auto_update",value:configPreference(config.updates?.auto)},{key:"config_bypass_min_release_age",value:configPreference(config.updates?.bypassMinReleaseAge)},{key:"config_use_native_binary",value:configPreference(config.useNativeBinary)},{key:"config_credential_storage",value:config.credStorage??"unset"}]}import{createHash as createHash5,randomUUID as randomUUID2}from"node:crypto";import{mkdir as mkdir2,readFile as readFile10,realpath,rename as rename2,rm as rm11,writeFile as writeFile7}from"node:fs/promises";import{dirname as dirname8,join as join40,resolve as resolve13}from"node:path";function getPackageManagerInstallCommand(context,version2="latest"){if(context.upgradeCommand===void 0)throw context.upgradeError;return context.upgradeCommand.includes("@latest")?context.upgradeCommand.replace("@latest",`@${version2}`):context.upgradeCommand}async function resolvePackageManagerContext(version2,runtime,options){try{let info=await getUpdateCommandInfo(void 0,options.signal);return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:info.packageManager,packageManagerAssumed:info.assumed,global:info.global,upgradeCommand:info.command}}catch(error){if(options.signal?.aborted)throw error;let upgradeError=error instanceof Error?error:new Error("Could not detect a supported global npm, pnpm, Yarn, or Bun installation of Vercel CLI. Update it with the package manager that installed it.");return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:void 0,packageManagerAssumed:!1,global:void 0,upgradeCommand:void 0,upgradeError}}}async function getVersionContext(options={}){let version2=pkg_default.version,runtime=isNativeBinaryInstall()?"native":"node";if(await isCurlInstall()){let installRoot=getInstallRoot(),state=await readNativeInstallState(installRoot);return{version:version2,runtime:"native",manager:"installer",canSwitchVersions:!0,installRoot,track:state?.track,slot:state?.slot,activeVersion:state?.version,pendingProduction:state?.pendingProduction,prBuild:state?.track==="pr"&&state.pr?{number:state.pr,sha:state.buildSha}:void 0}}return resolvePackageManagerContext(version2,runtime,options)}function describeRuntime(context){return context.runtime==="native"?"native binary":"Node.js"}function describeManager(context){if(context.manager==="installer")return`Vercel installer (${context.installRoot})`;if(context.global===void 0)return"package manager (unsupported installation)";let scope=context.global?"global":"local";return context.packageManagerAssumed?`package manager (assumed ${context.packageManager}, ${scope})`:`package manager (${context.packageManager}, ${scope})`}var VERSION_CONTEXT_TIMEOUT_MS=1e4;function getVersionContextTelemetryEvents(context){let events=[{key:"version_context_status",value:context.status},{key:"version_context_source",value:context.source}];return context.status!=="resolved"||(events.push({key:"version_context_runtime",value:context.runtime},{key:"version_context_manager",value:context.manager}),context.manager==="installer"?events.push({key:"version_context_track",value:context.track},{key:"version_context_slot",value:context.slot}):events.push({key:"version_context_package_manager",value:context.packageManager},{key:"version_context_package_manager_assumed",value:String(context.packageManagerAssumed)},{key:"version_context_global",value:String(context.global)})),events}async function collectVersionContextForTelemetry(timeoutMs=VERSION_CONTEXT_TIMEOUT_MS){let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new Error("Version context collection timed out"))},timeoutMs);timeout.unref();try{let context=await getVersionContext({signal:controller.signal});return context.manager==="installer"?{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,track:context.track??"legacy",slot:context.slot??"legacy"}:{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,packageManager:context.packageManager??"unknown",packageManagerAssumed:context.packageManagerAssumed,global:context.global??"unknown"}}catch{return{status:controller.signal.aborted?"cancelled":"error",source:"detected"}}finally{clearTimeout(timeout)}}var VERSION_CONTEXT_CACHE_MAX_AGE_MS=7*24*60*60*1e3,VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS=60*60*1e3,VERSION_CONTEXT_CACHE_SCHEMA_VERSION=1,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS=20,VERSION_CONTEXT_CACHE_LOCK_WAIT_MS=250;function isResolvedVersionContext(value){if(!value||typeof value!="object")return!1;let context=value;return context.status!=="resolved"||context.source!=="detected"&&context.source!=="cache"||context.runtime!=="native"&&context.runtime!=="node"?!1:context.manager==="installer"?(context.track==="production"||context.track==="pr"||context.track==="legacy")&&(context.slot==="a"||context.slot==="b"||context.slot==="legacy"):context.manager==="package-manager"&&typeof context.packageManagerAssumed=="boolean"&&typeof context.packageManager=="string"&&(typeof context.global=="boolean"||context.global==="unknown")}function isVersionContext(value){if(isResolvedVersionContext(value))return!0;if(!value||typeof value!="object")return!1;let context=value;return(context.status==="cancelled"||context.status==="error")&&(context.source==="detected"||context.source==="cache")}async function readVersionContextCache(filePath){try{let value=JSON.parse(await readFile10(filePath,"utf8"));if(value.schemaVersion===VERSION_CONTEXT_CACHE_SCHEMA_VERSION&&value.installations&&typeof value.installations=="object")return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:value.installations}}catch{}return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:{}}}async function writeVersionContextCache(filePath,cache){let temporaryPath=`${filePath}.${process.pid}.${randomUUID2()}.tmp`;try{await mkdir2(dirname8(filePath),{recursive:!0}),await writeFile7(temporaryPath,`${JSON.stringify(cache,null,2)}
|
|
1461
|
+
`,{flag:"wx",mode:384}),await rename2(temporaryPath,filePath)}finally{await rm11(temporaryPath,{force:!0}).catch(()=>{})}}function getFreshContext(cache,installationKey,currentTime,maxAgeMs,failureMaxAgeMs){let cached=cache.installations[installationKey];if(!cached||!isVersionContext(cached.context))return;let contextMaxAgeMs=cached.context.status==="resolved"?maxAgeMs:failureMaxAgeMs;if(Number.isFinite(cached.collectedAt)&¤tTime-cached.collectedAt<=contextMaxAgeMs)return{...cached.context,source:"cache"}}function boundedInstallations(installations){return Object.fromEntries(Object.entries(installations).sort(([,left],[,right])=>right.collectedAt-left.collectedAt).slice(0,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS))}function getVersionContextCacheFilePath(globalConfigDirectory=getGlobalPathConfig()){return join40(globalConfigDirectory,"telemetry-version-context.json")}async function getVersionContextInstallationKey(){let runtime=isNativeBinaryInstall()?"native":"node",entrypoint=runtime==="native"?process.execPath:process.argv[1],canonicalEntrypoint=await realpath(entrypoint).catch(()=>resolve13(entrypoint));return createHash5("sha256").update(`${runtime}\0${canonicalEntrypoint}`).digest("hex")}async function collectCachedVersionContextForTelemetry({cacheFilePath=getVersionContextCacheFilePath(),failureMaxAgeMs=VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS,installationKey,maxAgeMs=VERSION_CONTEXT_CACHE_MAX_AGE_MS,now=Date.now,timeoutMs=VERSION_CONTEXT_TIMEOUT_MS}={}){let key=installationKey??await getVersionContextInstallationKey(),currentTime=now(),initialCache=await readVersionContextCache(cacheFilePath),initialContext=getFreshContext(initialCache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(initialContext)return initialContext;try{return await withDirectoryLock(`${cacheFilePath}.lock`,async()=>{let cache=await readVersionContextCache(cacheFilePath),contextAfterLock=getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(contextAfterLock)return contextAfterLock;let context=await collectVersionContextForTelemetry(timeoutMs);try{cache.installations[key]={collectedAt:currentTime,context:{...context,source:"detected"}},cache.installations=boundedInstallations(cache.installations),await writeVersionContextCache(cacheFilePath,cache)}catch{}return context},{waitMs:VERSION_CONTEXT_CACHE_LOCK_WAIT_MS,retryMs:25,abandonedAfterMs:3e4,busyMessage:()=>"Version context cache is busy"})}catch{let cache=await readVersionContextCache(cacheFilePath);return getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs)??{status:"cancelled",source:"detected"}}}var TELEMETRY_FLUSH_TIMEOUT_MS=1e4;async function flush(client,args,{timeoutMs=TELEMETRY_FLUSH_TIMEOUT_MS}={}){let url=process.env.VERCEL_TELEMETRY_BRIDGE_URL||"https://telemetry.vercel.com/api/vercel-cli/v1/events",{headers,body,invocationId}=JSON.parse(args[0]),versionContext=await collectCachedVersionContextForTelemetry().catch(()=>({status:"error",source:"detected"})),firstEvent=body[0],contextEvents=[...getVersionContextTelemetryEvents(versionContext),...getConfigTelemetryEvents(client.config)];for(let event of contextEvents)body.push({id:randomUUID3(),event_time:Date.now(),team_id:firstEvent?.team_id,user_id:firstEvent?.user_id,project_id:firstEvent?.project_id,...event});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),response;try{response=await fetch2(url,{method:"POST",headers,body:JSON.stringify(body.map(event=>invocationId&&event.invocation_id==null?{...event,invocation_id:invocationId}:event)),signal:controller.signal});let status6=response.status,wasRecorded=(response.headers.get("x-vercel-cli-tracked")||"")==="1";return status6===204?wasRecorded?process.stderr.write("Telemetry event tracked"):process.stderr.write("Telemetry event ignored"):process.stderr.write(`Failed to send telemetry events. Unexpected response from telemetry server: ${status6}`),0}catch(error){return error instanceof Error&&process.stderr.write(`Failed to send telemetry events. ${error.message}`),1}finally{response?.body?.cancel().catch(()=>{}),clearTimeout(timeout)}}var TelemetryTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(_){}trackCliSubcommandFlush(_){}};var import_chalk322=__toESM(require_source(),1);var COMMAND_CONFIG66={status:getCommandAliases(statusSubcommand6),enable:getCommandAliases(enableSubcommand5),disable:getCommandAliases(disableSubcommand5),flush:getCommandAliases(flushSubcommand)};async function telemetry(client){let telemetryClient=new TelemetryTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(telemetryCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:telemetryCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("telemetry",subcommand),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(statusSubcommand6),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status4(client));case"flush":return flush(client,args);case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(enableSubcommand5),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable5(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(disableSubcommand5),0):disable5(client);default:{let errorMessage2=parsedArguments.args.length!==2?"Invalid number of arguments":"Invalid subcommand";return output_manager_default.print(`${import_chalk322.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
|
|
1462
1462
|
`),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),2}}}var TracesTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2,kind="requestId"){id2&&this.trackCliArgument({arg:kind,value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliOptionEnvironment(value){this.trackRedactedOption("environment",value)}trackCliOptionService(value){this.trackRedactedOption("service",value)}trackCliOptionName(value){this.trackRedactedOption("name",value)}trackCliOptionKind(value){this.trackRedactedOption("kind",value)}trackCliOptionStatus(value){this.trackRedactedOption("status",value)}trackCliOptionDeploymentId(value){this.trackRedactedOption("deployment-id",value)}trackCliOptionRequestId(value){this.trackRedactedOption("request-id",value)}trackCliOptionTraceId(value){this.trackRedactedOption("trace-id",value)}trackCliOptionSpanId(value){this.trackRedactedOption("span-id",value)}trackCliFlagRoot(root){root&&this.trackCliFlag("root")}trackCliOptionSince(value){this.trackRedactedOption("since",value)}trackCliOptionUntil(value){this.trackRedactedOption("until",value)}trackCliOptionLimit(value){value!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionQuery(value){this.trackRedactedOption("query",value)}trackCliOptionColumns(value){this.trackRedactedOption("columns",value)}trackRedactedOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackCliOptionView(view){view&&this.trackCliOption({option:"view",value:view})}};var import_chalk323=__toESM(require_source(),1),import_open20=__toESM(require_open(),1);var OBSERVABILITY_API_URL="https://vercel.com/api/observability-api/",QUERY_REASON_HEADER="x-vercel-observability-query-reason",QUERY_REASON="cli/traces-get",QueryEngineResponseError=class extends Error{constructor(message){super(message),this.name="QueryEngineResponseError"}};async function fetchTrace({client,teamId,projectId,requestId,traceId}){let traceUrl=new URL(traceId!==void 0?`v1/traces/${encodeURIComponent(traceId)}`:`v1/traces/requests/${encodeURIComponent(requestId)}`,OBSERVABILITY_API_URL);traceUrl.searchParams.set("teamId",teamId),traceUrl.searchParams.set("projectId",projectId);let response=await client.fetch(traceUrl.href,{headers:{[QUERY_REASON_HEADER]:QUERY_REASON}});return{trace:mapTrace(response),partial:isRecord4(response.meta)&&response.meta.partial===!0}}function mapTrace(response){if(!isRecord4(response)||typeof response.traceId!="string"||!Array.isArray(response.spans))throw new QueryEngineResponseError("Observability API returned an invalid resolved trace.");return{traceId:response.traceId,...typeof response.rootSpanId=="string"?{rootSpanId:response.rootSpanId}:{},spans:response.spans.map(mapSpan)}}function mapSpan(value){if(!isRecord4(value)||typeof value.spanId!="string")throw new QueryEngineResponseError("Observability API returned an invalid trace span.");if(typeof value.name!="string"||typeof value.durationMs!="number")throw new QueryEngineResponseError("Observability API returned an invalid trace span.");let timestamp2=parseTimestamp(value.timestamp),attributes=isRecord4(value.attributes)?value.attributes:void 0,status6=isRecord4(value.status)?value.status:void 0,statusCode=status6?.code==="ERROR"?1:0,statusMessage=typeof status6?.message=="string"?status6.message:void 0;return{spanId:value.spanId,...typeof value.parentSpanId=="string"&&value.parentSpanId?{parentSpanId:value.parentSpanId}:{},name:value.name,duration:durationTuple(value.durationMs),startTime:timestampTuple(timestamp2),...attributes?{attributes}:{},status:{code:statusCode,...statusMessage?{message:statusMessage}:{}}}}function parseTimestamp(value){if(typeof value!="string")throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");let timestamp2=Date.parse(value);if(!Number.isFinite(timestamp2))throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");return timestamp2}function durationTuple(durationMs){let nanoseconds=Math.round(durationMs*1e6);if(!Number.isSafeInteger(nanoseconds)||nanoseconds<0)throw new QueryEngineResponseError("Observability API returned an invalid span duration.");return[Math.floor(nanoseconds/1e9),nanoseconds%1e9]}function timestampTuple(timestampMs){let seconds=Math.floor(timestampMs/1e3);return[seconds,(timestampMs-seconds*1e3)*1e6]}function isRecord4(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var ATTR_HINT_KEYS=["http.url","http.target","db.statement","http.status_code"];function tupleToUs(tuple){if(!tuple||tuple.length!==2)return null;let[seconds,nanoseconds]=tuple;return typeof seconds!="number"||typeof nanoseconds!="number"?null:seconds*1e6+nanoseconds/1e3}function getDurationUs(span){let us=tupleToUs(span.duration);return us===null?null:us<0?0:us}function getStartTimeUs(span){return tupleToUs(span.startTime)}function readAttrString(attributes,key){let value=attributes?.[key];if(typeof value=="string")return value;if(typeof value=="number")return String(value)}function resolveRootSpan(trace3){if(trace3.spans.length!==0){if(trace3.rootSpanId){let match=trace3.spans.find(span=>span.spanId===trace3.rootSpanId);if(match)return match}return trace3.spans[0]}}function compareByStart(a,b){let startA=getStartTimeUs(a),startB=getStartTimeUs(b);return startA===null&&startB===null?0:startA===null?1:startB===null?-1:startA-startB}function analyze(trace3){let root=resolveRootSpan(trace3),rootDurationUs=root?getDurationUs(root):null,rootStartUs=root?getStartTimeUs(root):null,spansById=new Map;for(let span of trace3.spans)spansById.set(span.spanId,span);let childrenByParent=new Map;for(let span of trace3.spans){if(!span.parentSpanId||!spansById.has(span.parentSpanId))continue;let list30=childrenByParent.get(span.parentSpanId);list30?list30.push(span):childrenByParent.set(span.parentSpanId,[span])}for(let list30 of childrenByParent.values())list30.sort(compareByStart);let spanInfo=new Map;for(let span of trace3.spans){let durationUs=getDurationUs(span),children=childrenByParent.get(span.spanId)??[],childTotalUs=0;for(let child of children){let cd=getDurationUs(child);cd!==null&&(childTotalUs+=cd)}let selfTimeUs=durationUs===null?null:Math.max(0,durationUs-childTotalUs),startOffsetUs=null;if(rootStartUs!==null){let startUs=getStartTimeUs(span);startUs!==null&&(startOffsetUs=Math.max(0,startUs-rootStartUs))}spanInfo.set(span.spanId,{span,durationUs,selfTimeUs,startOffsetUs})}let visited=new Set,treeOrder=[],truncatedAtDepth=!1;root&&(truncatedAtDepth=walkTree(root,0,childrenByParent,visited,treeOrder)||truncatedAtDepth);let orphanOrder=[],orphanRoots=trace3.spans.filter(span=>!visited.has(span.spanId)&&(!span.parentSpanId||!spansById.has(span.parentSpanId))).sort(compareByStart);for(let orphan of orphanRoots)truncatedAtDepth=walkTree(orphan,0,childrenByParent,visited,orphanOrder)||truncatedAtDepth;for(let span of trace3.spans)visited.has(span.spanId)||(orphanOrder.push({span,depth:0}),visited.add(span.spanId));let errorSpans=trace3.spans.filter(span=>span.status?.code===1),byName=new Map;for(let span of trace3.spans){let name=span.name||"<unnamed>",durationUs=getDurationUs(span)??0,entry2=byName.get(name);entry2?(entry2.count+=1,entry2.totalUs+=durationUs):byName.set(name,{count:1,totalUs:durationUs})}let repeatedOps=[];for(let[name,{count:count2,totalUs}]of byName)count2>=2&&repeatedOps.push({name,count:count2,totalUs,perCallUs:totalUs/count2});return repeatedOps.sort((a,b)=>b.totalUs-a.totalUs),{trace:trace3,root,rootDurationUs,rootStartUs,spanInfo,treeOrder,orphanOrder,errorSpans,repeatedOps,truncatedAtDepth}}function walkTree(span,depth,childrenByParent,visited,out){if(visited.has(span.spanId))return!1;if(visited.add(span.spanId),depth>=256)return out.push({span,depth}),!0;out.push({span,depth});let truncated=!1,children=childrenByParent.get(span.spanId)??[];for(let child of children)truncated=walkTree(child,depth+1,childrenByParent,visited,out)||truncated;return truncated}var UNKNOWN="<unknown>",UNNAMED="<unnamed>",ATTR_VALUE_MAX_LEN=80,TRACE_ID_MAX_LEN=13;function renderMarkdown(trace3,options){let analysis=analyze(trace3),sections=[];return sections.push(renderHeader(analysis,options)),analysis.errorSpans.length>0&§ions.push(renderErrors(analysis)),analysis.repeatedOps.length>0&§ions.push(renderRepeatedOps(analysis)),sections.push(renderTree(analysis)),`${sections.join(`
|
|
1463
1463
|
|
|
1464
1464
|
`)}
|
|
@@ -1469,10 +1469,10 @@ Learn more: ${import_chalk321.default.cyan("https://vercel.com/docs/cli/about-te
|
|
|
1469
1469
|
`);for(let node of analysis.treeOrder)lines.push(formatTreeRow(node,analysis));if(analysis.orphanOrder.length>0){lines.push("","### Orphan spans","");for(let node of analysis.orphanOrder)lines.push(formatTreeRow(node,analysis))}return analysis.truncatedAtDepth&&lines.push("",`_Tree truncated at depth ${256}._`),lines.join(`
|
|
1470
1470
|
`)}function formatTreeRow(node,analysis){let{span,depth}=node,info=analysis.spanInfo.get(span.spanId),indent3=" ".repeat(depth),parts=[],durationUs=info?.durationUs??null;if(parts.push(`\`${formatDurationUs(durationUs)}\``),analysis.rootDurationUs!==null&&analysis.rootDurationUs>0&&parts.push(formatPct(durationUs,analysis.rootDurationUs)),analysis.rootStartUs!==null){let offset=info?.startOffsetUs??null;parts.push(formatOffset(offset))}if(parts.push(`\`${span.name||UNNAMED}\``),span.status?.code===1){let message=span.status.message;parts.push(message?`[error: ${message}]`:"[error]")}let[hint]=collectAttrHints(span.attributes);return hint&&parts.push(`\u2014 \`${hint.key}\`: ${hint.value}`),`${indent3}- ${parts.join(" ")}`}function formatEndpoint(method,target,status6){let left=method&&target?`${method} ${target}`:method??target,path3=left?`\`${left}\``:UNKNOWN;return status6?`${path3} \u2192 ${status6}`:path3}function formatSpansLine(count2,errors){return errors===0?String(count2):`${count2} (${errors} ${errors===1?"error":"errors"})`}function formatDurationUs(us){return us===null?UNKNOWN:us<1e3?`${Math.round(us)}\u03BCs`:us<1e6?`${(us/1e3).toFixed(1)}ms`:`${(us/1e6).toFixed(1)}s`}function formatOffset(us){return us===null?`+${UNKNOWN}`:`+${formatDurationUs(us)}`}function formatPct(us,rootUs){if(us===null||rootUs<=0)return UNKNOWN;let pct=us/rootUs*100;return pct>0&&pct<1?"<1%":`${Math.round(pct)}%`}function collectAttrHints(attributes){if(!attributes)return[];let out=[];for(let key of ATTR_HINT_KEYS){let value=readAttrString(attributes,key);value!==void 0&&out.push({key,value:ellipsis(value,ATTR_VALUE_MAX_LEN)})}return out}var VIEW_OPTIONS=["timeline","tree","waterfall"];function isView(value){return VIEW_OPTIONS.includes(value)}function buildDashboardUrl({teamSlug,projectName,traceId,view}){let base=`https://vercel.com/${encodeURIComponent(teamSlug)}/${encodeURIComponent(projectName)}/logs/traces/${encodeURIComponent(traceId)}`;return view&&view!=="timeline"?`${base}?view=${encodeURIComponent(view)}`:base}async function resolveDashboardScope({client,scopeFlag,projectName,linkedProject}){let teamSlug;if(scopeFlag)scopeFlag.startsWith("team_")?teamSlug=(await getTeamByIdOrSlug(client,scopeFlag)).slug:teamSlug=scopeFlag;else if(linkedProject.status==="linked")teamSlug=linkedProject.org.slug;else return{error:"Unable to resolve team slug for the dashboard URL.",reason:AGENT_REASON.NOT_LINKED};return{teamSlug,projectName}}async function get5(client,telemetry2){let parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand4.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let positional=parsedArgs.args.slice(1),identifiers=[getSubcommand4.name,...getSubcommand4.aliases].includes(positional[0])?positional.slice(1):positional,id2=identifiers[0],isTraceId=id2!==void 0&&/^[a-fA-F0-9]{32}$/.test(id2),json=parsedArgs.flags["--json"],scopeFlag=parsedArgs.flags["--scope"]?.trim()||void 0,projectFlag=parsedArgs.flags["--project"],openFlag2=parsedArgs.flags["--open"],viewFlag=parsedArgs.flags["--view"];if(telemetry2.trackCliArgumentId(id2,isTraceId?"traceId":"requestId"),telemetry2.trackCliFlagJson(json),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliFlagOpen(openFlag2),telemetry2.trackCliOptionView(viewFlag),json&&openFlag2){let msg="`--json` and `--open` cannot be used together.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),2}if(viewFlag&&!openFlag2){let msg="`--view` can only be used with `--open`.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),2}let view;if(viewFlag!==void 0){if(!isView(viewFlag)){let msg=`\`--view\` must be one of: ${VIEW_OPTIONS.join(", ")}. Received: ${viewFlag}`;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),2}view=viewFlag}if(!id2)return output_manager_default.print(help(getSubcommand4,{parent:tracesCommand,columns:client.stderr.columns})),2;if(identifiers.length>1){let msg="Provide one trace ID or request ID.";return client.nonInteractive&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.fatal(msg),2}let target=isTraceId?{traceId:id2.toLowerCase()}:{requestId:id2},teamId,projectId,linkedProject;if(linkedProject=await getLinkedProject(client),linkedProject.status==="error")if(scopeFlag&&projectFlag)linkedProject={status:"not_linked",org:null,project:null};else return linkedProject.exitCode;let scope;try{scope=await resolveScope({client,flags:{scope:scopeFlag,project:projectFlag},linkedProject})}catch(err){return printError(err),1}if("message"in scope)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:scope.reason,message:scope.message}),output_manager_default.error(scope.message),1;teamId=scope.teamId,projectId=scope.projectId,output_manager_default.spinner("Fetching trace\u2026");let trace3,partial;try{({trace:trace3,partial}=await fetchTrace({client,teamId,projectId,...target}))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}output_manager_default.stopSpinner();let rootRequestId=resolveRootSpan(trace3)?.attributes?.["vercel.request_id"],requestId=target.requestId??(typeof rootRequestId=="string"&&rootRequestId.trim()!==""?rootRequestId:void 0);if(partial&&output_manager_default.warn("Trace is incomplete because it exceeded the span limit."),openFlag2){if(!linkedProject){let msg="Unable to resolve project link for the dashboard URL.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:msg}),output_manager_default.error(msg),1}let resolved=await resolveDashboardScope({client,scopeFlag,projectName:scope.projectName,linkedProject});if("error"in resolved)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:resolved.reason,message:resolved.error}),output_manager_default.error(resolved.error),1;let url=buildDashboardUrl({teamSlug:resolved.teamSlug,projectName:resolved.projectName,traceId:trace3.traceId,view});return output_manager_default.log(`Opening ${url} in your browser...`),await(0,import_open20.default)(url),0}if(json)return client.stdout.write(`${JSON.stringify(trace3,null,2)}
|
|
1471
1471
|
`),0;client.stdout.write(renderMarkdown(trace3,{requestId}));try{let resolved=await resolveDashboardScope({client,scopeFlag,projectName:scope.projectName,linkedProject});if("error"in resolved)output_manager_default.warn(resolved.error);else{let url=buildDashboardUrl({...resolved,traceId:trace3.traceId,view});output_manager_default.log(`View trace: ${url}`)}}catch(err){output_manager_default.print(`${import_chalk323.default.yellow("!")} Failed to resolve the dashboard URL. Use --open to retry.
|
|
1472
|
-
`),output_manager_default.debug(String(err))}return output_manager_default.log("Run with --json for full trace data."),0}var import_chalk324=__toESM(require_source(),1);import{z as z5}from"zod";var
|
|
1472
|
+
`),output_manager_default.debug(String(err))}return output_manager_default.log("Run with --json for full trace data."),0}var import_chalk324=__toESM(require_source(),1);import{z as z5}from"zod";var import_ms44=__toESM(require_ms(),1);import{z as z4}from"zod";var DEFAULT_LIMIT3=100,MAX_LIMIT4=1e3,SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z4.iso.datetime({offset:!0}),timeInputSchema=z4.union([isoDateTimeSchema,z4.iso.date()]),TIME_FORMAT_HINT="Use a duration with units such as 100ms or 30m, an ISO timestamp, or YYYY-MM-DD at midnight UTC.";async function resolveSpanSearchScope(client,project){if(project!==void 0){let scope2=await resolveConfigScope(client,{project});return"exitCode"in scope2?scope2:{ownerId:scope2.teamId,projectIds:[scope2.projectId]}}let scope;try{scope=await getScope(client,{resolveLocalScope:!0})}catch(error){return{exitCode:handleTracingApiError(client,error)}}return scope.isCrossTeamRepo&&!scope.localOrgId&&!scope.explicitScopeProvided&&(!scope.app||scope.user)?{exitCode:invalidArguments(client,"This repository has projects across multiple teams. Pass `--scope <team>` or run from a linked project directory.")}:scope.team?{ownerId:scope.team.id}:{exitCode:invalidArguments(client,"A team scope is required. Pass `--scope <team>` or run `vercel switch <team>`.")}}function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms44.default)(value);if(duration!==void 0&&(duration<=0||!/[a-z]/i.test(value))||duration===void 0&&!timeInputSchema.safeParse(value).success)return null;let date=new Date(duration===void 0?value:now-duration);return Number.isFinite(date.getTime())?date:null}catch{return null}}function buildFilter(flags,spanKind){let clauses=["NOT (service.name:vercel.* AND span.kind:1)"],query=flags["--query"];typeof query=="string"&&clauses.push(`(${query.trim()})`),spanKind!==void 0&&clauses.push(`span.kind:${spanKind}`),flags["--root"]&&clauses.push("span.isRoot:1");let filters=[["--environment","environment"],["--service","service.name"],["--name","span.name"],["--status","span.status.code"],["--deployment-id","deployment.id"],["--request-id","request.id"],["--trace-id","trace.id"],["--span-id","span.id"]];for(let[flag,dimension]of filters){let rawValue=flags[flag];if(typeof rawValue!="string")continue;let value=flag==="--status"?{error:"Error",ok:"Ok",unset:"Unset"}[rawValue]:rawValue.trim();clauses.push(`${dimension}:${JSON.stringify(value)}`)}return clauses.join(" AND ")}function trackSpanQueryOptions(flags,telemetry2){telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliOptionService(flags["--service"]),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionKind(flags["--kind"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionDeploymentId(flags["--deployment-id"]),telemetry2.trackCliOptionRequestId(flags["--request-id"]),telemetry2.trackCliOptionTraceId(flags["--trace-id"]),telemetry2.trackCliOptionSpanId(flags["--span-id"]),telemetry2.trackCliFlagRoot(flags["--root"]),telemetry2.trackCliOptionSince(flags["--since"]),telemetry2.trackCliOptionUntil(flags["--until"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionQuery(flags["--query"])}async function resolveSpanQuery(client,flags,telemetry2){let project=flags["--project"],environment=flags["--environment"]?.trim().toLowerCase(),status6=flags["--status"]?.trim().toLowerCase(),query=flags["--query"];if(trackSpanQueryOptions(flags,telemetry2),environment!==void 0&&!["production","preview"].includes(environment))return{exitCode:invalidArguments(client,"`--environment` must be one of: production, preview.")};if(status6!==void 0&&!["error","ok","unset"].includes(status6))return{exitCode:invalidArguments(client,"`--status` must be one of: error, ok, unset.")};for(let flag of["--service","--name","--deployment-id","--request-id","--trace-id","--span-id"])if(flags[flag]!==void 0&&flags[flag]?.trim()==="")return{exitCode:invalidArguments(client,`\`${flag}\` must not be empty.`)};if(query!==void 0&&query.trim()==="")return{exitCode:invalidArguments(client,"`--query` must not be empty.")};let spanKind;if(flags["--kind"]!==void 0){let value=flags["--kind"].trim().toUpperCase();if(spanKind=/^[0-5]$/.test(value)?Number(value):SPAN_KINDS.indexOf(value.replace(/^SPAN_KIND_/,"")),spanKind===-1)return{exitCode:invalidArguments(client,"`--kind` must be one of: UNSPECIFIED (0), INTERNAL (1), SERVER (2), CLIENT (3), PRODUCER (4), CONSUMER (5).")}}let limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:MAX_LIMIT4,defaultValue:DEFAULT_LIMIT3});if(!limitResult.valid)return{exitCode:invalidArguments(client,limitResult.message)};let now=Date.now(),start=parseTime(flags["--since"]??"1h",now),end=flags["--until"]!==void 0?parseTime(flags["--until"],now):new Date(now);if(!start)return{exitCode:invalidArguments(client,`Invalid time format for \`--since\`. ${TIME_FORMAT_HINT}`)};if(!end)return{exitCode:invalidArguments(client,`Invalid time format for \`--until\`. ${TIME_FORMAT_HINT}`)};if(start.getTime()>=end.getTime())return{exitCode:invalidArguments(client,"`--since` must be earlier than `--until`.")};if(end.getTime()-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"The requested time range must not exceed 30 days.")};if(now-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"`--since` must be within the last 30 days.")};let scope=await resolveSpanSearchScope(client,project);return"exitCode"in scope?scope:{scope,timeRange:{start:start.toISOString(),end:end.toISOString()},filter:buildFilter({...flags,"--environment":environment,"--status":status6},spanKind),limit:limitResult.value}}function fetchSpanQuery(client,teamId,request2){let query=new URLSearchParams({teamId});return client.fetch(`/v1/observability/events?${query}`,{method:"POST",headers:{"x-vercel-observability-query-reason":"cli/traces-search"},body:request2,bailOn429:!0})}function handleSpanQueryError(client,err){if(isAPIError(err)){let issues=z4.array(z4.object({path:z4.string(),message:z4.string()})).safeParse(err.issues);if(issues.success&&issues.data.length>0){let details=issues.data.map(issue2=>`${issue2.path}: ${issue2.message}`).join(", ");err.serverMessage=`${err.serverMessage}: ${details}`,(err.status===400||err.status===422)&&issues.data.some(issue2=>issue2.path==="filter")&&(err.serverMessage+=". Filter error positions refer to the generated filter, including CLI-added clauses."),err.message=`${err.serverMessage} (${err.status})`}}return handleTracingApiError(client,err)}var select=["span","resource"],spanSchema=z5.object({span:z5.object({startTime:isoDateTimeSchema,traceId:z5.string(),id:z5.string(),parentSpanId:z5.string().nullable(),isRoot:z5.number(),traceState:z5.string(),name:z5.string(),kind:z5.string(),status:z5.object({code:z5.string(),message:z5.string()}),duration:z5.number(),attributes:z5.record(z5.string(),z5.unknown()),events:z5.array(z5.object({name:z5.string(),timestamp:isoDateTimeSchema,attributes:z5.record(z5.string(),z5.unknown())})).optional(),links:z5.array(z5.object({traceId:z5.string(),spanId:z5.string(),traceState:z5.string(),attributes:z5.record(z5.string(),z5.unknown())})).optional()}).passthrough(),resource:z5.object({attributes:z5.record(z5.string(),z5.unknown())})}),responseSchema=z5.object({events:z5.array(spanSchema),pagination:z5.object({hasMore:z5.boolean(),nextCursor:z5.string().nullable()}),meta:z5.record(z5.string(),z5.unknown())});function formatDuration4(durationMs){if(durationMs===0)return"0ms";if(durationMs<1e-6)return"<1ns";let units=[[1e-6,"ns"],[.001,"\u03BCs"],[1,"ms"],[1e3,"s"],[6e4,"m"],[36e5,"h"],[864e5,"d"]],index=units.length-1;for(;durationMs<units[index][0];)index--;let value=Number((durationMs/units[index][0]).toFixed(1));return index<units.length-1&&value>=Math.round(units[index+1][0]/units[index][0])&&(index++,value=Number((durationMs/units[index][0]).toFixed(1))),`${value}${units[index][1]}`}function cell(value){return value||"-"}function stringAttribute(attributes,key){let value=attributes[key];return typeof value=="string"?value:null}var spanColumns={"span.startTime":{header:"TIME",format:event=>new Date(event.span.startTime).toISOString()},"span.duration":{header:"DURATION",format:event=>formatDuration4(event.span.duration)},"span.name":{header:"SPAN NAME",format:event=>ellipsis(cell(event.span.name),60)},"span.status.code":{header:"STATUS",format:event=>event.span.status.code.toUpperCase()==="ERROR"?import_chalk324.default.red("ERROR"):cell(event.span.status.code.toUpperCase())},"service.name":{header:"SERVICE NAME",format:event=>{let serviceName=stringAttribute(event.resource.attributes,"service.name");return serviceName?.startsWith("vercel.")?`\u25B2 ${serviceName}`:cell(serviceName)}},environment:{header:"ENVIRONMENT",format:event=>cell(stringAttribute(event.resource.attributes,"deployment.environment.name"))},"request.id":{header:"REQUEST ID",format:event=>stringAttribute(event.span.attributes,"vercel.request_id")?.split("::").at(-1)||"-"},"trace.id":{header:"TRACE ID",format:event=>cell(event.span.traceId)},"span.id":{header:"SPAN ID",format:event=>cell(event.span.id)},"parent.id":{header:"PARENT ID",format:event=>cell(event.span.parentSpanId)},"span.kind":{header:"SPAN KIND",format:event=>SPAN_KINDS.find((kind,index)=>event.span.kind===String(index)||event.span.kind.toUpperCase()===kind)??cell(event.span.kind)}};function printSpans(client,spans,columns){if(spans.length===0){client.stdout.write(`No spans found for this period.
|
|
1473
1473
|
`);return}client.stdout.write(`${table([columns.map(column=>column.header),...spans.map(span=>columns.map(column=>column.format(span)))])}
|
|
1474
1474
|
`)}async function search2(client,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(searchSubcommand3.options))}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{flags}=parsedArgs,json=!!(flags["--json"]||client.nonInteractive),columnsOption=flags["--columns"];if(telemetry2.trackCliOptionColumns(columnsOption),parsedArgs.args.slice(2).length>0)return trackSpanQueryOptions(flags,telemetry2),invalidArguments(client,`Unexpected argument: ${parsedArgs.args.slice(2)[0]}.`);let columns=Object.values(spanColumns).filter(column=>column!==spanColumns["span.kind"]&&column!==spanColumns["request.id"]&&column!==spanColumns.environment);if(columnsOption!==void 0){if(json)return invalidArguments(client,"`--columns` cannot be combined with `--json` or `--non-interactive`.");let names=columnsOption.split(",").map(name=>name.trim());if(names.some(name=>!Object.hasOwn(spanColumns,name)))return invalidArguments(client,`Invalid column selection. Available columns: ${Object.keys(spanColumns).join(", ")}.`);if(new Set(names).size!==names.length)return invalidArguments(client,"Columns cannot repeat. List each column once.");columns=names.map(name=>spanColumns[name])}let query=await resolveSpanQuery(client,flags,telemetry2);if("exitCode"in query)return query.exitCode;let request2={...query,event:"vercel.span",select,order:"desc"};json||output_manager_default.spinner("Searching spans\u2026");let rawResponse;try{rawResponse=await fetchSpanQuery(client,query.scope.ownerId,request2)}catch(err){return handleSpanQueryError(client,err)}finally{json||output_manager_default.stopSpinner()}let result=responseSchema.safeParse(rawResponse);if(!result.success)return handleTracingApiError(client,new Error("The Observability API returned an invalid span search response."));if(json)for(let span of result.data.events)client.stdout.write(`${JSON.stringify(span)}
|
|
1475
|
-
`);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG67={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-
|
|
1475
|
+
`);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG67={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-V7SAJGMS.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):(subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"traces get","traces inspect"),get5(client,telemetry2))}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function installProductionRelease({version:requested,skipIfCurrent=!1,currentVersion=pkg_default.version,track}={}){let pinned=requested&&requested!=="latest"?requested:void 0,version2=pinned;try{if(output_manager_default.spinner("Checking for updates\u2026",0),pinned){let available=await listAvailableVersions(packageName).catch(()=>{});if(available&&!available.includes(pinned))return output_manager_default.stopSpinner(),output_manager_default.error(`Version ${pinned} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}else version2=await resolveLatestNativeVersion();let target=version2,current=!((track??(await readActivePointer(getInstallRoot()).catch(()=>{}))?.track)==="pr")&&import_semver.default.valid(currentVersion)?currentVersion:void 0;return skipIfCurrent&¤t&&import_semver.default.gte(current,target)?(output_manager_default.stopSpinner(),output_manager_default.log(`No upgrade available. Vercel CLI is already up to date (v${current}).`),0):(await installAndActivateProductionVersion(target),output_manager_default.stopSpinner(),!current||import_semver.default.gt(target,current)?output_manager_default.success(`Upgraded Vercel CLI to v${target}.`):(output_manager_default.success(`Vercel CLI v${target} is active.`),import_semver.default.lt(target,current)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
|
|
1476
1476
|
${CURL_INSTALL_COMMAND}`)),0)}catch(error){output_manager_default.stopSpinner();let reason=error instanceof Error?error.message:String(error);return output_manager_default.fatal(version2?`Failed to install Vercel CLI v${version2}: ${reason}`:`Failed to resolve the latest Vercel CLI version: ${reason}`),output_manager_default.log(`To reinstall the CLI manually, run:
|
|
1477
1477
|
${CURL_INSTALL_COMMAND}`),1}}var import_semver2=__toESM(require_semver(),1);async function upgrade(client){try{return await runUpgrade(client)}catch(error){return printError(error),1}}async function runUpgrade(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(upgradeCommand.options),telemetry2=new UpgradeTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_semver2.default.valid(targetArg)??void 0:void 0;if(telemetry2.trackCliArgumentVersion(targetArg?targetArg==="latest"?"latest":target?"version":"invalid":void 0),parsedArgs.args.length>2)return output_manager_default.error(`Unexpected argument: "${parsedArgs.args[2]}".`),1;if(targetArg&&!target)return output_manager_default.error(`Invalid version: "${targetArg}". Use a major.minor.patch version or "latest".`),1;let dryRun=parsedArgs.flags["--dry-run"],enableAuto=parsedArgs.flags["--enable-auto"],disableAuto=parsedArgs.flags["--disable-auto"],bypassMinReleaseAge=parsedArgs.flags["--bypass-min-release-age"],disableMinReleaseAgeBypass=parsedArgs.flags["--disable-min-release-age-bypass"],enableBinary=parsedArgs.flags["--enable-binary"],disableBinary=parsedArgs.flags["--disable-binary"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagEnableAuto(enableAuto),telemetry2.trackCliFlagDisableAuto(disableAuto),telemetry2.trackCliFlagBypassMinReleaseAge(bypassMinReleaseAge),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(disableMinReleaseAgeBypass),telemetry2.trackCliFlagEnableBinary(enableBinary),telemetry2.trackCliFlagDisableBinary(disableBinary),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),enableAuto&&disableAuto)return output_manager_default.error("Cannot use --enable-auto and --disable-auto together"),2;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),2;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),2;let hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableBinary||disableBinary||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade flags."),2;let installerManaged=await isCurlInstall();if(installerManaged&&bypassMinReleaseAge&&!hasSettingsOnlyFlag)return output_manager_default.fatal("Can't use `--bypass-min-release-age` with a CLI installed by the Vercel installer. The installer downloads releases directly from the registry and has no minimum release-age setting.\nRun `vc upgrade` without the flag."),1;if(dryRun||asJson){let requestedPreference;disableMinReleaseAgeBypass?requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!1}:enableBinary||disableBinary?requestedPreference={name:"useNativeBinary",label:"native Vercel CLI binary",enabled:!!enableBinary}:enableAuto||disableAuto?requestedPreference={name:"autoUpdatesEnabled",label:"automatic CLI updates",enabled:!!enableAuto}:bypassMinReleaseAge&&(requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!0});let detectedUpdateCommand=hasSettingsOnlyFlag||installerManaged?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,installationType=installerManaged?"installer":await isGlobal()?"global":"local";if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType,...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1478
1478
|
`)}else output_manager_default.print(`Current version: ${pkg_default.version}
|
|
@@ -1501,16 +1501,16 @@ Learn more: ${import_chalk321.default.cyan("https://vercel.com/docs/cli/about-te
|
|
|
1501
1501
|
`),context.track==="production"&&context.activeVersion&&import_semver4.default.valid(context.activeVersion)&&import_semver4.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
|
|
1502
1502
|
`),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
|
|
1503
1503
|
`),0)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.fatal(`Failed to check for updates: ${error instanceof Error?error.message:String(error)}`),1}}var COMMAND_CONFIG68={list:getCommandAliases(listSubcommand27),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand11),check:getCommandAliases(checkSubcommand3),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(versionCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG68),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand27),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),0):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),0):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),0):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),0):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk327.default.red("Error")}: Invalid subcommand. See help instructions for usage:
|
|
1504
|
-
`),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk332=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils26=__toESM(require_dist(),1);var
|
|
1504
|
+
`),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk332=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils26=__toESM(require_dist(),1);var import_ms45=__toESM(require_ms(),1);import{DateTime}from"luxon";var LA_TIMEZONE="America/Los_Angeles";function toISOOrThrow(dt){if(!dt.isValid)throw new Error(`Invalid DateTime: ${dt.invalidReason}`);let iso=dt.toISO();if(!iso)throw new Error("Failed to convert DateTime to ISO");return iso}function getDefaultFromDateTime(){return DateTime.now().setZone(LA_TIMEZONE).startOf("month")}function getDefaultToDateTime(){return DateTime.utc()}function getDefaultFromDate(){let dt=getDefaultFromDateTime();return toISOOrThrow(dt.toUTC())}function getDefaultToDate(){let dt=getDefaultToDateTime();return toISOOrThrow(dt.toUTC())}function isRelativeTime(input){return(0,import_ms45.default)(input)!==void 0}function parseBillingDate(dateStr,isEndDate=!1){let relativeMs=(0,import_ms45.default)(dateStr);if(relativeMs!==void 0)return new Date(Date.now()-relativeMs).toISOString();if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601 (YYYY-MM-DDTHH:mm:ss), or relative (7d)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601, or relative (7d)`);let finalDateTime=isEndDate?laDateTime.plus({days:1}):laDateTime;return toISOOrThrow(finalDateTime.toUTC())}function getISOWeekNumber(dateStr){let date=new Date(dateStr);date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7));let yearStart=new Date(Date.UTC(date.getUTCFullYear(),0,1));return Math.ceil(((date.getTime()-yearStart.getTime())/864e5+1)/7)}function getISOWeekYear(dateStr){let date=new Date(dateStr);return date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7)),date.getUTCFullYear()}function getPeriodKey(chargePeriodStart,breakdownPeriod){if(!chargePeriodStart)return"Unknown";switch(breakdownPeriod){case"daily":return chargePeriodStart.substring(0,10);case"weekly":{let weekYear=getISOWeekYear(chargePeriodStart),weekNum=getISOWeekNumber(chargePeriodStart);return`${weekYear}-W${weekNum.toString().padStart(2,"0")}`}case"monthly":return chargePeriodStart.substring(0,7);default:return chargePeriodStart.substring(0,10)}}var VALID_BREAKDOWN_PERIODS=["daily","weekly","monthly"];function isValidBreakdownPeriod(value){return value!==void 0&&VALID_BREAKDOWN_PERIODS.includes(value)}var VALID_GROUP_BY_DIMENSIONS=["project","region"];function isValidGroupByDimension(value){return value!==void 0&&VALID_GROUP_BY_DIMENSIONS.includes(value)}var import_chalk329=__toESM(require_source(),1);function formatUsageAmount(amount,unit){if(unit==="managed_infrastructure_units")return formatUsageQuantity(amount,"MIUs",{showSmallValues:!0});let formattedAmount=amount.toFixed(2);return amount!==0&&Number(formattedAmount)===0?amount>0?"<$0.01":">-$0.01":`$${formattedAmount}`}function formatUsageQuantity(quantity,unit="",options={}){let displayUnit=quantity===1&&options.singularUnit?options.singularUnit:unit;if(options.unitKind==="digitalStorage")return formatStorageQuantity(quantity,unit,options.showSmallValues);let formatter=new Intl.NumberFormat("en-US",{maximumFractionDigits:2,notation:options.compact&&Math.abs(quantity)>=1e3?"compact":"standard"}),formattedQuantity=formatter.format(quantity),roundsToZero=formatter.format(Math.abs(quantity))===formatter.format(0),displayQuantity=options.showSmallValues&&quantity!==0&&roundsToZero?quantity>0?`<${formatter.format(.01)}`:`>${formatter.format(-.01)}`:formattedQuantity;return displayUnit?`${displayQuantity} ${displayUnit}`:displayQuantity}function formatStorageQuantity(quantity,unit,showSmallValues=!1){let units=["byte","kilobyte","megabyte","gigabyte","terabyte"],symbols=["B","KB","MB","GB","TB"],startIndex=units.indexOf(unit.toLowerCase());if(startIndex===-1)return formatUsageQuantity(quantity,unit,{showSmallValues});let value=quantity,unitIndex=startIndex;for(;Math.abs(value)>=1e3&&unitIndex<symbols.length-1;)value/=1e3,unitIndex++;return formatUsageQuantity(value,symbols[unitIndex],{showSmallValues})}var import_chalk328=__toESM(require_source(),1);import{DateTime as DateTime2}from"luxon";function formatServiceName(name,service){return service.included?`${name} (Flat Rate CDN)`:name}function formatServiceCost(service,costUnit){return service.included?"Included":formatUsageAmount(service.cost,costUnit)}function isEmptyService(service){return(service.category==="subscription"||service.quantity===0)&&service.cost===0}function visibleServices(services){return[...services.values()].filter(service=>!isEmptyService(service)).map(service=>[service.name,service])}function outputUsageHeader(data,title6,elapsedSuffix){let{log}=output_manager_default;log(`${title6} for ${data.contextType} ${import_chalk328.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk328.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk328.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk328.default.gray(`Accrued through ${formatDate4(data.usageThrough)} in ${data.costUnit==="managed_infrastructure_units"?"MIUs":"USD"}, before credits and discounts.`)),log("")}function outputHiddenServicesHint(hiddenCount){hiddenCount<=0||output_manager_default.log(import_chalk328.default.gray(`${hiddenCount} ${hiddenCount===1?"service":"services"} with no usage hidden. Add --json to include ${hiddenCount===1?"it":"them"}.`))}function formatRange(from,to){let start=parseDate(from),end=parseDate(to);if(!start||!end)return`${from} to ${to}`;let sameYear=start.year===end.year;return`${start.toFormat(sameYear?"LLL d":"LLL d, yyyy")}\u2013${end.toFormat("LLL d, yyyy")}`}function formatDate4(value){return parseDate(value)?.toFormat("LLL d, yyyy")??value}function parseDate(value){let date=DateTime2.fromISO(value,{zone:"utc"});return date.isValid?date:null}function outputAggregated({data,startTime}){let{print,log}=output_manager_default;if(outputUsageHeader(data,"Usage",elapsed(Date.now()-startTime)),data.creditBalance){log(import_chalk329.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk329.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk329.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk329.default.gray("Remaining")} ${formatCredit(data.creditBalance.remaining,data.creditBalance.currency)}`);let progress=data.creditBalance.allocated>0?data.creditBalance.used/data.creditBalance.allocated*100:0;log(` ${import_chalk329.default.gray("Progress")} ${Math.round(progress)}%`),log("")}let allServices=[...data.services.entries()],sortedServices=visibleServices(data.services).sort((a,b)=>b[1].cost-a[1].cost);if(sortedServices.length===0){log("No usage data found for this period."),outputHiddenServicesHint(allServices.length);return}let usage2=sortedServices.filter(([,service])=>service.category==="usage"),subscriptions=sortedServices.filter(([,service])=>service.category==="subscription");usage2.length>0&&(log(import_chalk329.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk329.default.bold("Subscription licenses")),printTable(print,subscriptions,"Subscriptions subtotal",data.costUnit),log("")),printCostSummary(print,usage2,subscriptions,data.costUnit),outputHiddenServicesHint(allServices.length-sortedServices.length)}function formatCadence(cadence){return cadence.split("_").map(word=>word[0].toUpperCase()+word.slice(1)).join(" ")}function formatCredit(amount,currency){return formatUsageAmount(amount,currency)}function printCostSummary(print,usage2,subscriptions,costUnit){let subscriptionCost=sumCost(subscriptions),infrastructureCost=sumCost(usage2),rows=[["Subscriptions",formatUsageAmount(subscriptionCost,costUnit)],["Infrastructure usage",formatUsageAmount(infrastructureCost,costUnit)],[import_chalk329.default.bold("Estimated total"),import_chalk329.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1505
1505
|
`)}function sumCost(services){return services.reduce((total,[,service])=>total+service.cost,0)}function printTable(print,services,subtotalLabel,costUnit){let headers=["Service","Usage","Cost"],rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:service.category==="usage",singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,costUnit)]),subtotal=services.reduce((total,[,service])=>total+service.cost,0);rows.push([import_chalk329.default.bold(subtotalLabel),"",import_chalk329.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk329.default.bold(import_chalk329.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
|
|
1506
1506
|
${tablePrint}
|
|
1507
1507
|
`)}var import_chalk330=__toESM(require_source(),1);function getPeriodLabel(period){switch(period){case"daily":return"Daily";case"weekly":return"Weekly";case"monthly":return"Monthly"}}function outputBreakdown({data,breakdownPeriod,startTime}){let{print,log}=output_manager_default,periodLabel=getPeriodLabel(breakdownPeriod);outputUsageHeader(data,`${periodLabel} usage`,elapsed(Date.now()-startTime));let sortedPeriods=[...data.periodUsage.keys()].sort();if(sortedPeriods.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let periodKey of sortedPeriods){let periodData=data.periodUsage.get(periodKey),allServices=[...periodData.services.entries()],sortedServices=visibleServices(periodData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-sortedServices.length,sortedServices.length===0)continue;log(`${import_chalk330.default.bold(import_chalk330.default.cyan(periodKey))} (${formatUsageAmount(periodData.totalCost,data.costUnit)})`);let rows=sortedServices.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk330.default.bold(import_chalk330.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1508
1508
|
`)}outputHiddenServicesHint(hiddenCount)}var import_chalk331=__toESM(require_source(),1);function getDimensionLabel(dimension){return dimension==="project"?"Project":"Region"}function outputGroupBy({data,groupByDimension,startTime}){let{print,log}=output_manager_default,dimensionLabel=getDimensionLabel(groupByDimension);outputUsageHeader(data,`Usage by ${dimensionLabel}`,elapsed(Date.now()-startTime));let sortedGroups=[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost);if(sortedGroups.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let[groupName,groupData]of sortedGroups){let allServices=[...groupData.services.entries()],services=visibleServices(groupData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-services.length,services.length===0)continue;log(`${import_chalk331.default.bold(import_chalk331.default.cyan(groupName))} (${formatUsageAmount(groupData.totalCost,data.costUnit)})`);let rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk331.default.bold(import_chalk331.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1509
1509
|
`)}log(""),log(`${import_chalk331.default.gray("Estimated total:")} ${import_chalk331.default.bold(formatUsageAmount(data.totalCost,data.costUnit))}`),outputHiddenServicesHint(hiddenCount)}function serializeService(service){return{name:service.name,product:service.product,quantity:service.quantity,unit:service.unit,cost:service.cost,included:service.included,category:service.category}}function outputJson9(client,{data,fromDate,toDate,breakdownPeriod,groupByDimension}){let sortedServices=[...data.services.entries()].sort((a,b)=>b[1].cost-a[1].cost),jsonOutput={period:{from:fromDate,to:toDate},context:data.contextName,costUnit:data.costUnit};data.creditBalance&&(jsonOutput.creditBalance=data.creditBalance),breakdownPeriod&&(jsonOutput.breakdown={period:breakdownPeriod,data:[...data.periodUsage.keys()].sort().map(periodKey=>{let period=data.periodUsage.get(periodKey);return{periodKey,services:[...period.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:period.totalCost}}})}),groupByDimension&&(jsonOutput.groupBy={dimension:groupByDimension,data:[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost).map(([name,group])=>({name,services:[...group.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:group.totalCost}}))}),jsonOutput.services=sortedServices.map(([,service])=>serializeService(service)),jsonOutput.totals={cost:data.totalCost},client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1510
|
-
`)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner,warn}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(fromFlag!==void 0&&parsedArgs.flags["--since"]!==void 0)return error("Pass only one of --since or --from. (--from is deprecated.)"),2;if(toFlag!==void 0&&parsedArgs.flags["--until"]!==void 0)return error("Pass only one of --until or --to. (--to is deprecated.)"),2;fromFlag!==void 0&&warn("`--from` is deprecated, please use `--since` instead"),toFlag!==void 0&&warn("`--to` is deprecated, please use `--until` instead");let sinceFlag=parsedArgs.flags["--since"]??fromFlag,untilFlag=parsedArgs.flags["--until"]??toFlag;if(untilFlag&&!sinceFlag)return error("--until requires --since. Omit both to show the current billing cycle."),2;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),2;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),2;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),2;let sinceDate,untilDate;try{sinceDate=sinceFlag?parseBillingDate(sinceFlag,!1):void 0,untilDate=untilFlag?parseBillingDate(untilFlag,!0):void 0}catch(err){return error(err.message),2}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils26.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!sinceFlag,fromDate=sinceDate??(billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate()),toDate=untilDate??(sinceFlag?new Date().toISOString():billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()),fromDisplay=sinceFlag&&!isRelativeTime(sinceFlag)?sinceFlag:extractDatePortion(fromDate),toDisplay=untilFlag&&!isRelativeTime(untilFlag)?untilFlag:extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk332.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG69={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-SXE2THDP.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-GKZFZINR.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),(await import("./chunks/add-CCFBYKZH.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-MTH57FUD.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-DPVWWH4Q.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-UWL7N6ZS.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PUIFBQKZ.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-SIR5XTJN.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-77REB4BF.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-IQJVHHAW.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-CP57O3II.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG69)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms44=__toESM(require_ms(),1),import_chalk333=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk333.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1510
|
+
`)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner,warn}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(fromFlag!==void 0&&parsedArgs.flags["--since"]!==void 0)return error("Pass only one of --since or --from. (--from is deprecated.)"),2;if(toFlag!==void 0&&parsedArgs.flags["--until"]!==void 0)return error("Pass only one of --until or --to. (--to is deprecated.)"),2;fromFlag!==void 0&&warn("`--from` is deprecated, please use `--since` instead"),toFlag!==void 0&&warn("`--to` is deprecated, please use `--until` instead");let sinceFlag=parsedArgs.flags["--since"]??fromFlag,untilFlag=parsedArgs.flags["--until"]??toFlag;if(untilFlag&&!sinceFlag)return error("--until requires --since. Omit both to show the current billing cycle."),2;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),2;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),2;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),2;let sinceDate,untilDate;try{sinceDate=sinceFlag?parseBillingDate(sinceFlag,!1):void 0,untilDate=untilFlag?parseBillingDate(untilFlag,!0):void 0}catch(err){return error(err.message),2}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils26.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!sinceFlag,fromDate=sinceDate??(billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate()),toDate=untilDate??(sinceFlag?new Date().toISOString():billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()),fromDisplay=sinceFlag&&!isRelativeTime(sinceFlag)?sinceFlag:extractDatePortion(fromDate),toDisplay=untilFlag&&!isRelativeTime(untilFlag)?untilFlag:extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk332.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG69={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-SWSNZDIB.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-ZNSHEHOX.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),(await import("./chunks/add-WX7XBOMM.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-LDTDOVVC.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-72VFNBSP.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-DTYYE77N.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-FIPVJJWA.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-AXG4E43Q.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-SXRDMEPO.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-2V2VJOSJ.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-WZ74DZVX.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG69)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms46=__toESM(require_ms(),1),import_chalk333=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk333.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1511
1511
|
`)}else output_manager_default.log(`${(0,import_pluralize28.default)("Webhook",webhooks.length,!0)} found under ${import_chalk333.default.bold(contextName)} ${import_chalk333.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
1512
1512
|
|
|
1513
|
-
`));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,
|
|
1513
|
+
`));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms46.default)(current-webhook.createdAt):"-",eventsDisplay=webhook.events.length>2?`${webhook.events.slice(0,2).join(", ")} +${webhook.events.length-2}`:webhook.events.join(", ");return[webhook.id,webhook.url,eventsDisplay,import_chalk333.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk334=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function get6(client,argv){let telemetry2=new WebhooksGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[webhookId]=args,getStamp=stamp_default();if(!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:getCommandNamePlain("webhooks ls")},{command:getCommandNamePlain("webhooks inspect <id>")}]},2),output_manager_default.error(`${getCommandName("webhooks inspect <id>")} expects one argument`),2;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk334.default.cyan(`${getCommandName("webhooks inspect <id>")}`)}`),2;output_manager_default.debug("Fetching webhook info");let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk334.default.bold(contextName)}`);let webhook;try{webhook=await getWebhook(client,webhookId)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"webhook_not_found",message:`Webhook not found: ${webhookId}.`,next:[{command:getCommandNamePlain("webhooks ls")}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),output_manager_default.log(`Run ${getCommandName("webhooks ls")} to see your webhooks.`),1;throw err}if(asJson){output_manager_default.stopSpinner();let jsonOutput=client.nonInteractive?{status:"ok",webhook,message:`Webhook ${webhookId} found.`,next:[{command:getCommandNamePlain(`webhooks rm ${webhookId} --yes`),when:"Remove this webhook"}]}:webhook;client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1514
1514
|
`)}else{output_manager_default.log(`Webhook ${webhookId} found under ${import_chalk334.default.bold(contextName)} ${import_chalk334.default.gray(getStamp())}`),output_manager_default.print(`
|
|
1515
1515
|
`),output_manager_default.print(import_chalk334.default.bold(` General
|
|
1516
1516
|
|