vercel 60.0.1 → 60.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.
Files changed (36) hide show
  1. package/dist/chunks/chunk-2TBUMUHF.js +7 -0
  2. package/dist/chunks/{chunk-S74YKDNZ.js → chunk-3CQQXHDI.js} +1 -1
  3. package/dist/chunks/{chunk-V6IKQCOT.js → chunk-5U25FWD5.js} +1 -1
  4. package/dist/chunks/{chunk-42IHNZIE.js → chunk-7HT5KIFA.js} +1 -1
  5. package/dist/chunks/chunk-DKV4IVH5.js +7 -0
  6. package/dist/chunks/{chunk-LLXCLOZO.js → chunk-DPH3CQXE.js} +1 -1
  7. package/dist/chunks/chunk-H4IUDU5W.js +9 -0
  8. package/dist/chunks/{chunk-FXZ6TVIP.js → chunk-KOOED3TJ.js} +2 -2
  9. package/dist/chunks/{chunk-EOIRBY3F.js → chunk-MSLHCYBD.js} +1 -1
  10. package/dist/chunks/{chunk-25MLFUQD.js → chunk-TTMLSKF7.js} +1 -1
  11. package/dist/chunks/{chunk-2HZGNTI4.js → chunk-WH6M54KF.js} +1 -1
  12. package/dist/chunks/{chunk-TKBORMUF.js → chunk-WKZ6JSGZ.js} +1 -1
  13. package/dist/chunks/{config-2327CWL2.js → config-4FCRR7C5.js} +1 -1
  14. package/dist/chunks/{constants-NCE2LWSS.js → constants-G4UYVLOF.js} +1 -1
  15. package/dist/chunks/{login-VJZGWSOW.js → login-X3KPMMEP.js} +1 -1
  16. package/dist/chunks/ls-GD6LB7IE.js +8 -0
  17. package/dist/chunks/{openapi-G3HACVTQ.js → openapi-7JUPKBWV.js} +1 -1
  18. package/dist/chunks/{prompt-missing-credentials-KCPCA6L7.js → prompt-missing-credentials-PPUSNDNC.js} +1 -1
  19. package/dist/chunks/rm-OYSWVVSJ.js +8 -0
  20. package/dist/chunks/set-GESKJPQA.js +7 -0
  21. package/dist/commands/build/index.js +1 -1
  22. package/dist/commands/deploy/index.js +2 -2
  23. package/dist/commands/dev/index.js +7 -7
  24. package/dist/commands/env/index.js +1 -1
  25. package/dist/commands/link/index.js +1 -1
  26. package/dist/commands/list/index.js +1 -1
  27. package/dist/commands-bulk.js +81 -71
  28. package/dist/index.js +2 -2
  29. package/dist/version.mjs +1 -1
  30. package/package.json +55 -55
  31. package/dist/chunks/chunk-IRM6H42E.js +0 -7
  32. package/dist/chunks/chunk-M5AV545M.js +0 -7
  33. package/dist/chunks/chunk-UQW7M4LS.js +0 -9
  34. package/dist/chunks/ls-BVBCVIRX.js +0 -8
  35. package/dist/chunks/rm-5W45I3TO.js +0 -8
  36. package/dist/chunks/set-XWOUJJ7R.js +0 -7
@@ -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{resolveScope}from"./chunks/chunk-IRM6H42E.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.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-CD4FLZED.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-SGU7YIY3.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-6PFC3KWQ.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-G77TCKNI.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-LUVIR6F2.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-77WAICTF.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-2HZGNTI4.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-25MLFUQD.js";import{dump,load,main}from"./chunks/chunk-42IHNZIE.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeNativeSelfUpdate,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-2ZIWDSUX.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-Q5VLP2LY.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-LNOX5GIA.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-LLXCLOZO.js";import"./chunks/chunk-IXN5A5WZ.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-EOIRBY3F.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-6A6LV2S2.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.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-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-JMNAVONO.js";import"./chunks/chunk-3KQRJYBJ.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-M6UYGRPW.js";import{resolveProjectContext}from"./chunks/chunk-ZWYU5SBC.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-H4FTGLWV.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-STO2JRII.js";import"./chunks/chunk-GK5C5TE5.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-WUH5HYCX.js";import{require_frameworks}from"./chunks/chunk-KK4AJES5.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,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,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,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,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,inspectSubcommand4 as inspectSubcommand6,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,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 listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,mcpCommand,membersAddFlags,membersRemoveFlags,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,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,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,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-FXZ6TVIP.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,tracesCommand}from"./chunks/chunk-M5AV545M.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QFPCR4NL.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-5ENY7DSN.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-UTVDFSQS.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-SW7MNF4H.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-CVKB54WW.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-Y7PHTVZ6.js";import"./chunks/chunk-WSZHNPA6.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-5UOVEMYX.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-V6IKQCOT.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-4OKKSZVX.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-N5AIKGEO.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-RLCFE3MK.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPurchasePending,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.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-2TBUMUHF.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.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-CD4FLZED.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-SGU7YIY3.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-6PFC3KWQ.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-G77TCKNI.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-LUVIR6F2.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-77WAICTF.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-WH6M54KF.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-TTMLSKF7.js";import{dump,load,main}from"./chunks/chunk-7HT5KIFA.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeNativeSelfUpdate,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-2ZIWDSUX.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-Q5VLP2LY.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-LNOX5GIA.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-DPH3CQXE.js";import"./chunks/chunk-IXN5A5WZ.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-MSLHCYBD.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-6A6LV2S2.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.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-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-JMNAVONO.js";import"./chunks/chunk-3KQRJYBJ.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-M6UYGRPW.js";import{resolveProjectContext}from"./chunks/chunk-ZWYU5SBC.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-H4FTGLWV.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-STO2JRII.js";import"./chunks/chunk-GK5C5TE5.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-WUH5HYCX.js";import{require_frameworks}from"./chunks/chunk-KK4AJES5.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,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,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,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,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,inspectSubcommand4 as inspectSubcommand6,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,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 listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,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,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,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,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-KOOED3TJ.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-DKV4IVH5.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QFPCR4NL.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-5ENY7DSN.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-UTVDFSQS.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-SW7MNF4H.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-CVKB54WW.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-Y7PHTVZ6.js";import"./chunks/chunk-WSZHNPA6.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-5UOVEMYX.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5U25FWD5.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-4OKKSZVX.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-N5AIKGEO.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-RLCFE3MK.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPurchasePending,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.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
 
@@ -33,8 +33,8 @@ ${BEST_PRACTICES_END}
33
33
  `)?`
34
34
  `:`
35
35
 
36
- `;await writeFile(filePath,existing+separator+BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Appended Vercel best practices to ${import_chalk.default.bold(targetFile)}`)}else await writeFile(filePath,BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Created ${import_chalk.default.bold(targetFile)} with Vercel best practices`)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}return output_manager_default.log(import_chalk.default.dim("Run vercel deploy to ship your project")),0}async function agent(client){let parsedArgs,flagsSpecification=getFlagsSpecification(agentCommand.options),telemetry2=new AgentTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("agent"),output_manager_default.print(help(agentCommand,{columns:client.stderr.columns})),2;let subcommand=parsedArgs.args[1];if(telemetry2.trackCliArgumentInit(subcommand),!subcommand||subcommand==="init"){let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(yes);try{return await agentInit(client,yes)}catch(error){return printError(error),1}}return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(agentCommand,{columns:client.stderr.columns})),1}var AgentRunsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandTrace(actual){this.trackCliSubcommand({subcommand:"trace",value:actual})}trackCliSubcommandProjects(actual){this.trackCliSubcommand({subcommand:"projects",value:actual})}};var import_chalk3=__toESM(require_source(),1);var AGENT_RUNS_API_BASE="https://vercel.com/api/observability/agent-runs",DEFAULT_TRACE_MAX_FIELD_LENGTH=8e3,MAX_TRACE_FIELD_LENGTH=5e4;function getAgentRunsApiBase(){return process.env.VERCEL_AGENT_RUNS_API_URL||AGENT_RUNS_API_BASE}function buildAgentRunsUrl(query){let url=new URL(getAgentRunsApiBase());if(url.searchParams.set("teamSlug",query.teamId),query.view==="team"?url.searchParams.set("view","team"):query.projectId&&url.searchParams.set("project",query.projectId),url.searchParams.set("environment",query.environment||"production"),query.since){let from=parseTimeFlag(query.since),to=query.until?parseTimeFlag(query.until):new Date;url.searchParams.set("from",String(Math.floor(from.getTime()/1e3))),url.searchParams.set("to",String(Math.floor(to.getTime()/1e3)))}return typeof query.page=="number"&&url.searchParams.set("page",String(Math.max(1,Math.floor(query.page)))),typeof query.pageSize=="number"&&url.searchParams.set("pageSize",String(Math.max(1,Math.floor(query.pageSize)))),query.search&&url.searchParams.set("search",query.search),query.runId&&url.searchParams.set("runId",query.runId),query.trace&&url.searchParams.set("trace","1"),query.traceStreamId&&url.searchParams.set("traceStreamId",query.traceStreamId),query.traceAfterCursor&&url.searchParams.set("traceAfterCursor",query.traceAfterCursor),typeof query.traceBeforeChunk=="number"&&url.searchParams.set("traceBeforeChunk",String(query.traceBeforeChunk)),url.href}async function fetchAgentRuns(client,query){return client.fetch(buildAgentRunsUrl(query),{useCurrentTeam:!1})}var MISSING_PROJECT_SCOPE_MESSAGE="No linked project found. Run `vercel link`, pass --cwd to a linked dir, or use --scope <team> and --project <name>.",MISSING_TEAM_SCOPE_MESSAGE="No team scope found. Run `vercel link`, pass --cwd to a linked dir, or use --scope <team>.";async function resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject}){let flagScope=scopeFlag?.trim()||void 0,flagProject=projectFlag?.trim()||void 0;if(flagScope&&(flagProject||!requireProject))return{ok:!0,teamId:flagScope,projectId:flagProject,contextName:flagProject?`${flagScope}/${flagProject}`:flagScope};let linkedProject=await getLinkedProject(client);if(linkedProject.status==="error")return{ok:!1,exitCode:linkedProject.exitCode};if(linkedProject.status==="linked"){let{org,project}=linkedProject;if(flagScope&&flagScope!==org.id&&flagScope!==org.slug)return{ok:!1,exitCode:invalidArguments(client,`\`--scope ${flagScope}\` doesn't match the linked project's team. Pass \`--project <name>\` to query a project in that team.`)};let teamName=flagScope??org.slug,projectName=requireProject?flagProject??project.name:flagProject;return{ok:!0,teamId:flagScope??org.id,projectId:requireProject?flagProject??project.id:flagProject,contextName:projectName?`${teamName}/${projectName}`:teamName}}let message=requireProject?MISSING_PROJECT_SCOPE_MESSAGE:MISSING_TEAM_SCOPE_MESSAGE;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message}),output_manager_default.error(message),{ok:!1,exitCode:1}}function normalizeApiErrorText(message){return message.replace(/\s*\(\d{3}\)\s*$/,"").trim()}function handleAgentRunsApiError(client,err){if(isAPIError(err)){let reason=err.status===403?"forbidden":err.status===401?"not_authorized":err.status===404?AGENT_REASON.NOT_FOUND:err.status===429?"rate_limited":AGENT_REASON.API_ERROR;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:normalizeApiErrorText(err.serverMessage||err.message)})}else outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:"unexpected_error",message:err instanceof Error?err.message:String(err)});printError(err)}function invalidArguments(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message}),output_manager_default.error(message),1}function normalizeTraceMaxFieldLength(value){return typeof value!="number"||!Number.isFinite(value)?DEFAULT_TRACE_MAX_FIELD_LENGTH:Math.min(Math.max(Math.floor(value),0),MAX_TRACE_FIELD_LENGTH)}function truncateLargeStrings(value,maxLength){return maxLength===0?value:typeof value=="string"?value.length<=maxLength?value:`${value.slice(0,maxLength)}... [truncated ${value.length-maxLength} chars]`:Array.isArray(value)?value.map(item=>truncateLargeStrings(item,maxLength)):value&&typeof value=="object"?Object.fromEntries(Object.entries(value).map(([key,entry2])=>[key,truncateLargeStrings(entry2,maxLength)])):value}var import_chalk2=__toESM(require_source(),1),import_ms=__toESM(require_ms(),1),import_title=__toESM(require_lib2(),1);function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function asArray(value){return Array.isArray(value)?value.filter(isRecord):[]}function readString(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="string"&&value.length>0)return value}}function readNumber(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="number"&&Number.isFinite(value))return value}}function readRecord(record,...keys){if(record)for(let key of keys){let value=record[key];if(isRecord(value))return value}}function readTimestampMs(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value=="string"&&value.length>0){let parsed=Date.parse(value);if(!Number.isNaN(parsed))return parsed}}}var PLACEHOLDER="-";function runId(run3){return readString(run3,"id","runId")??PLACEHOLDER}function formatRunStatus(run3){let status6=readString(run3,"status","state");if(!status6)return PLACEHOLDER;let label=(0,import_title.default)(status6.replace(/[_-]+/g," ")),CIRCLE="\u25CF ";switch(status6.toLowerCase()){case"completed":case"succeeded":case"success":case"ready":return import_chalk2.default.green(CIRCLE)+label;case"error":case"errored":case"failed":case"timed out":case"timed_out":return import_chalk2.default.red(CIRCLE)+label;case"running":case"in progress":case"in_progress":case"pending":case"queued":case"started":return import_chalk2.default.yellow(CIRCLE)+label;case"canceled":case"cancelled":return import_chalk2.default.gray(label);default:return label}}function runModel(run3){return readString(run3,"model")??PLACEHOLDER}function runTrigger(run3){return readString(run3,"trigger")??readString(readRecord(run3,"trigger"),"label","type","name")??PLACEHOLDER}function runTitle(run3){return readString(run3,"title","name")}function runStartedAtMs(run3){return readTimestampMs(run3,"createdAt","startedAt","startTime")}function runDurationMs(run3){let explicit=readNumber(run3,"durationMs","duration");if(explicit!==void 0)return explicit;let start=readTimestampMs(run3,"startedAt","createdAt","startTime"),end=readTimestampMs(run3,"endedAt","completedAt","endTime");if(start!==void 0&&end!==void 0&&end>=start)return end-start}function runTotalTokens(run3){let usage2=readRecord(run3,"usage")??run3,total=readNumber(usage2,"totalTokens","total");if(total!==void 0)return total;let input=readNumber(usage2,"inputTokens","promptTokens","input"),output=readNumber(usage2,"outputTokens","completionTokens","output");if(input!==void 0||output!==void 0)return(input??0)+(output??0)}function formatAge(timestampMs){if(timestampMs===void 0)return PLACEHOLDER;let delta=Date.now()-timestampMs;return delta<1e3?"just now":`${(0,import_ms.default)(delta)} ago`}function formatTimestamp(timestampMs){return timestampMs===void 0?PLACEHOLDER:new Date(timestampMs).toISOString()}function formatDurationMs(value){return value===void 0?PLACEHOLDER:value<1e3?`${Math.round(value)}ms`:value<6e4?`${(value/1e3).toFixed(1)}s`:(0,import_ms.default)(Math.round(value))}function formatCount(value){return value===void 0?PLACEHOLDER:value<1e4?String(value):value<1e6?`${(value/1e3).toFixed(1)}k`:`${(value/1e6).toFixed(1)}m`}var AgentRunsQueryTelemetryClient=class extends TelemetryClient{trackCliOptionEnvironment(value){value&&this.trackCliOption({option:"environment",value:["production","preview"].includes(value)?value:this.redactedValue})}trackCliOptionSince(value){value&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(value){value&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionProject(value){value&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var AgentRunsListTelemetryClient=class extends AgentRunsQueryTelemetryClient{trackCliOptionSearch(value){value&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionNext(value){typeof value=="number"&&this.trackCliOption({option:"next",value:String(value)})}trackCliOptionPage(value){typeof value=="number"&&this.trackCliOption({option:"page",value:String(value)})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:String(value)})}};async function list2(client){let telemetry2=new AgentRunsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--search":search2,"--next":next,"--page":legacyPage,"--limit":limit,"--json":json,"--scope":scopeFlag}=parsedArgs.flags,page=next??legacyPage;if(telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliOptionSearch(search2),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionPage(legacyPage),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliFlagJson(json),until&&!since)return invalidArguments(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;let fetchStamp=stamp_default();output_manager_default.spinner(`Fetching Agent Runs in ${import_chalk3.default.bold(scope.contextName)}\u2026`);let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,page,pageSize:limit,search:search2})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
37
- `),0;let runList2=asArray(data.runs);if(runList2.length===0)return search2||since?output_manager_default.log("No Agent Runs match the current filters."):output_manager_default.log("No Agent Runs found."),0;output_manager_default.log(`Agent Runs under ${import_chalk3.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Run ID","Status","Trigger","Model","Tokens","Duration","Age"].map(header=>import_chalk3.default.bold(import_chalk3.default.cyan(header))),...runList2.map(run3=>[import_chalk3.default.bold(runId(run3)),formatRunStatus(run3),runTrigger(run3),runModel(run3),formatCount(runTotalTokens(run3)),import_chalk3.default.gray(formatDurationMs(runDurationMs(run3))),import_chalk3.default.gray(formatAge(runStartedAtMs(run3)))])];client.stdout.write(`
36
+ `;await writeFile(filePath,existing+separator+BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Appended Vercel best practices to ${import_chalk.default.bold(targetFile)}`)}else await writeFile(filePath,BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Created ${import_chalk.default.bold(targetFile)} with Vercel best practices`)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}return output_manager_default.log(import_chalk.default.dim("Run vercel deploy to ship your project")),0}async function agent(client){let parsedArgs,flagsSpecification=getFlagsSpecification(agentCommand.options),telemetry2=new AgentTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("agent"),output_manager_default.print(help(agentCommand,{columns:client.stderr.columns})),2;let subcommand=parsedArgs.args[1];if(telemetry2.trackCliArgumentInit(subcommand),!subcommand||subcommand==="init"){let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(yes);try{return await agentInit(client,yes)}catch(error){return printError(error),1}}return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(agentCommand,{columns:client.stderr.columns})),1}var AgentRunsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandTrace(actual){this.trackCliSubcommand({subcommand:"trace",value:actual})}trackCliSubcommandProjects(actual){this.trackCliSubcommand({subcommand:"projects",value:actual})}};var import_chalk3=__toESM(require_source(),1);var AGENT_RUNS_API_BASE="https://vercel.com/api/observability/agent-runs",DEFAULT_TRACE_MAX_FIELD_LENGTH=8e3,MAX_TRACE_FIELD_LENGTH=5e4;function getAgentRunsApiBase(){return process.env.VERCEL_AGENT_RUNS_API_URL||AGENT_RUNS_API_BASE}function buildAgentRunsUrl(query){let url=new URL(getAgentRunsApiBase());if(url.searchParams.set("teamSlug",query.teamId),query.view==="team"?url.searchParams.set("view","team"):query.projectId&&url.searchParams.set("project",query.projectId),url.searchParams.set("environment",query.environment||"production"),query.since){let from=parseTimeFlag(query.since),to=query.until?parseTimeFlag(query.until):new Date;url.searchParams.set("from",String(Math.floor(from.getTime()/1e3))),url.searchParams.set("to",String(Math.floor(to.getTime()/1e3)))}return typeof query.page=="number"&&url.searchParams.set("page",String(Math.max(1,Math.floor(query.page)))),typeof query.pageSize=="number"&&url.searchParams.set("pageSize",String(Math.max(1,Math.floor(query.pageSize)))),query.search&&url.searchParams.set("search",query.search),query.runId&&url.searchParams.set("runId",query.runId),query.trace&&url.searchParams.set("trace","1"),query.traceStreamId&&url.searchParams.set("traceStreamId",query.traceStreamId),query.traceAfterCursor&&url.searchParams.set("traceAfterCursor",query.traceAfterCursor),typeof query.traceBeforeChunk=="number"&&url.searchParams.set("traceBeforeChunk",String(query.traceBeforeChunk)),url.href}async function fetchAgentRuns(client,query){return client.fetch(buildAgentRunsUrl(query),{useCurrentTeam:!1})}var MISSING_PROJECT_SCOPE_MESSAGE="No linked project found. Run `vercel link`, pass --cwd to a linked dir, or use --scope <team> and --project <name>.",MISSING_TEAM_SCOPE_MESSAGE="No team scope found. Run `vercel link`, pass --cwd to a linked dir, or use --scope <team>.";async function resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject}){let flagScope=scopeFlag?.trim()||void 0,flagProject=projectFlag?.trim()||void 0;if(flagScope&&(flagProject||!requireProject))return{ok:!0,teamId:flagScope,projectId:flagProject,contextName:flagProject?`${flagScope}/${flagProject}`:flagScope};let linkedProject=await getLinkedProject(client);if(linkedProject.status==="error")return{ok:!1,exitCode:linkedProject.exitCode};if(linkedProject.status==="linked"){let{org,project}=linkedProject;if(flagScope&&flagScope!==org.id&&flagScope!==org.slug)return{ok:!1,exitCode:invalidArguments2(client,`\`--scope ${flagScope}\` doesn't match the linked project's team. Pass \`--project <name>\` to query a project in that team.`)};let teamName=flagScope??org.slug,projectName=requireProject?flagProject??project.name:flagProject;return{ok:!0,teamId:flagScope??org.id,projectId:requireProject?flagProject??project.id:flagProject,contextName:projectName?`${teamName}/${projectName}`:teamName}}let message=requireProject?MISSING_PROJECT_SCOPE_MESSAGE:MISSING_TEAM_SCOPE_MESSAGE;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message}),output_manager_default.error(message),{ok:!1,exitCode:1}}function normalizeApiErrorText(message){return message.replace(/\s*\(\d{3}\)\s*$/,"").trim()}function handleAgentRunsApiError(client,err){if(isAPIError(err)){let reason=err.status===403?"forbidden":err.status===401?"not_authorized":err.status===404?AGENT_REASON.NOT_FOUND:err.status===429?"rate_limited":AGENT_REASON.API_ERROR;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:normalizeApiErrorText(err.serverMessage||err.message)})}else outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:"unexpected_error",message:err instanceof Error?err.message:String(err)});printError(err)}function invalidArguments2(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message}),output_manager_default.error(message),1}function normalizeTraceMaxFieldLength(value){return typeof value!="number"||!Number.isFinite(value)?DEFAULT_TRACE_MAX_FIELD_LENGTH:Math.min(Math.max(Math.floor(value),0),MAX_TRACE_FIELD_LENGTH)}function truncateLargeStrings(value,maxLength){return maxLength===0?value:typeof value=="string"?value.length<=maxLength?value:`${value.slice(0,maxLength)}... [truncated ${value.length-maxLength} chars]`:Array.isArray(value)?value.map(item=>truncateLargeStrings(item,maxLength)):value&&typeof value=="object"?Object.fromEntries(Object.entries(value).map(([key,entry2])=>[key,truncateLargeStrings(entry2,maxLength)])):value}var import_chalk2=__toESM(require_source(),1),import_ms=__toESM(require_ms(),1),import_title=__toESM(require_lib2(),1);function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function asArray(value){return Array.isArray(value)?value.filter(isRecord):[]}function readString(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="string"&&value.length>0)return value}}function readNumber(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="number"&&Number.isFinite(value))return value}}function readRecord(record,...keys){if(record)for(let key of keys){let value=record[key];if(isRecord(value))return value}}function readTimestampMs(record,...keys){if(record)for(let key of keys){let value=record[key];if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value=="string"&&value.length>0){let parsed=Date.parse(value);if(!Number.isNaN(parsed))return parsed}}}var PLACEHOLDER="-";function runId(run3){return readString(run3,"id","runId")??PLACEHOLDER}function formatRunStatus(run3){let status6=readString(run3,"status","state");if(!status6)return PLACEHOLDER;let label=(0,import_title.default)(status6.replace(/[_-]+/g," ")),CIRCLE="\u25CF ";switch(status6.toLowerCase()){case"completed":case"succeeded":case"success":case"ready":return import_chalk2.default.green(CIRCLE)+label;case"error":case"errored":case"failed":case"timed out":case"timed_out":return import_chalk2.default.red(CIRCLE)+label;case"running":case"in progress":case"in_progress":case"pending":case"queued":case"started":return import_chalk2.default.yellow(CIRCLE)+label;case"canceled":case"cancelled":return import_chalk2.default.gray(label);default:return label}}function runModel(run3){return readString(run3,"model")??PLACEHOLDER}function runTrigger(run3){return readString(run3,"trigger")??readString(readRecord(run3,"trigger"),"label","type","name")??PLACEHOLDER}function runTitle(run3){return readString(run3,"title","name")}function runStartedAtMs(run3){return readTimestampMs(run3,"createdAt","startedAt","startTime")}function runDurationMs(run3){let explicit=readNumber(run3,"durationMs","duration");if(explicit!==void 0)return explicit;let start=readTimestampMs(run3,"startedAt","createdAt","startTime"),end=readTimestampMs(run3,"endedAt","completedAt","endTime");if(start!==void 0&&end!==void 0&&end>=start)return end-start}function runTotalTokens(run3){let usage2=readRecord(run3,"usage")??run3,total=readNumber(usage2,"totalTokens","total");if(total!==void 0)return total;let input=readNumber(usage2,"inputTokens","promptTokens","input"),output=readNumber(usage2,"outputTokens","completionTokens","output");if(input!==void 0||output!==void 0)return(input??0)+(output??0)}function formatAge(timestampMs){if(timestampMs===void 0)return PLACEHOLDER;let delta=Date.now()-timestampMs;return delta<1e3?"just now":`${(0,import_ms.default)(delta)} ago`}function formatTimestamp(timestampMs){return timestampMs===void 0?PLACEHOLDER:new Date(timestampMs).toISOString()}function formatDurationMs(value){return value===void 0?PLACEHOLDER:value<1e3?`${Math.round(value)}ms`:value<6e4?`${(value/1e3).toFixed(1)}s`:(0,import_ms.default)(Math.round(value))}function formatCount(value){return value===void 0?PLACEHOLDER:value<1e4?String(value):value<1e6?`${(value/1e3).toFixed(1)}k`:`${(value/1e6).toFixed(1)}m`}var AgentRunsQueryTelemetryClient=class extends TelemetryClient{trackCliOptionEnvironment(value){value&&this.trackCliOption({option:"environment",value:["production","preview"].includes(value)?value:this.redactedValue})}trackCliOptionSince(value){value&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(value){value&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionProject(value){value&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var AgentRunsListTelemetryClient=class extends AgentRunsQueryTelemetryClient{trackCliOptionSearch(value){value&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionNext(value){typeof value=="number"&&this.trackCliOption({option:"next",value:String(value)})}trackCliOptionPage(value){typeof value=="number"&&this.trackCliOption({option:"page",value:String(value)})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:String(value)})}};async function list2(client){let telemetry2=new AgentRunsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--search":search3,"--next":next,"--page":legacyPage,"--limit":limit,"--json":json,"--scope":scopeFlag}=parsedArgs.flags,page=next??legacyPage;if(telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliOptionSearch(search3),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionPage(legacyPage),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliFlagJson(json),until&&!since)return invalidArguments2(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;let fetchStamp=stamp_default();output_manager_default.spinner(`Fetching Agent Runs in ${import_chalk3.default.bold(scope.contextName)}\u2026`);let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,page,pageSize:limit,search:search3})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
37
+ `),0;let runList2=asArray(data.runs);if(runList2.length===0)return search3||since?output_manager_default.log("No Agent Runs match the current filters."):output_manager_default.log("No Agent Runs found."),0;output_manager_default.log(`Agent Runs under ${import_chalk3.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Run ID","Status","Trigger","Model","Tokens","Duration","Age"].map(header=>import_chalk3.default.bold(import_chalk3.default.cyan(header))),...runList2.map(run3=>[import_chalk3.default.bold(runId(run3)),formatRunStatus(run3),runTrigger(run3),runModel(run3),formatCount(runTotalTokens(run3)),import_chalk3.default.gray(formatDurationMs(runDurationMs(run3))),import_chalk3.default.gray(formatAge(runStartedAtMs(run3)))])];client.stdout.write(`
38
38
  ${table(rows,{hsep:3}).replace(/^/gm," ")}
39
39
 
40
40
  `);let pagination=readRecord(data,"pagination"),total=readNumber(pagination,"total","totalCount");if(total!==void 0&&total>runList2.length){let nextPageArgs=["vercel agent-runs list",scopeFlag?`--scope ${scopeFlag}`:"",projectFlag?`--project ${projectFlag}`:"",`--next ${(page??1)+1}`].filter(Boolean).join(" ");output_manager_default.log(`Showing ${runList2.length} of ${total} Agent Runs. Run ${cmd(nextPageArgs)} for more.`)}return output_manager_default.log(`Run ${cmd("vercel agent-runs inspect <runId>")} for run details.`),0}var import_chalk4=__toESM(require_source(),1);var AgentInspectTelemetryClient=class extends AgentRunsQueryTelemetryClient{trackCliArgumentRunId(value){value&&this.trackCliArgument({arg:"runId",value:this.redactedValue})}};function formatStartedAt(run3){let startedAt=runStartedAtMs(run3);return startedAt===void 0?"-":`${formatAge(startedAt)} ${import_chalk4.default.gray(formatTimestamp(startedAt))}`}function renderDetail(run3){let usage2=readRecord(run3,"usage"),rows=[[import_chalk4.default.bold("Run ID"),runId(run3)],[import_chalk4.default.bold("Status"),formatRunStatus(run3)]],title6=runTitle(run3);title6&&rows.push([import_chalk4.default.bold("Title"),title6]),rows.push([import_chalk4.default.bold("Trigger"),runTrigger(run3)],[import_chalk4.default.bold("Model"),runModel(run3)],[import_chalk4.default.bold("Started"),formatStartedAt(run3)],[import_chalk4.default.bold("Duration"),formatDurationMs(runDurationMs(run3))]);let input=readNumber(usage2,"inputTokens","promptTokens","input"),outputTokens=readNumber(usage2,"outputTokens","completionTokens","output"),total=runTotalTokens(run3);(input!==void 0||outputTokens!==void 0||total!==void 0)&&rows.push([import_chalk4.default.bold("Tokens"),`${formatCount(input)} in / ${formatCount(outputTokens)} out / ${formatCount(total)} total`]);let sections=[table(rows,{hsep:3})],events=asArray(run3.events);if(events.length>0){let eventTimes=events.map(event=>readTimestampMs(event,"timestamp","createdAt","time","at")),knownTimes=[runStartedAtMs(run3),...eventTimes].filter(time=>time!==void 0),baseTime=knownTimes.length?Math.min(...knownTimes):void 0,eventRows=[["Time","Event"].map(header=>import_chalk4.default.bold(import_chalk4.default.cyan(header))),...events.map((event,index)=>{let time=eventTimes[index],offset=time!==void 0&&baseTime!==void 0&&time>=baseTime?`+${formatDurationMs(time-baseTime)}`:formatTimestamp(time);return[import_chalk4.default.gray(offset),readString(event,"type","name","event","message")??"-"]})];sections.push(`${import_chalk4.default.bold("Events")}
@@ -42,16 +42,16 @@ ${table(eventRows,{hsep:3})}`)}let subagents=asArray(run3.subagents??run3.subAge
42
42
  ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
43
43
 
44
44
  `)}
45
- `}async function inspect(client){let telemetry2=new AgentInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),runIdArg=positional[0]===inspectSubcommand.name?positional[1]:positional[0],{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliArgumentRunId(runIdArg),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliFlagJson(json),!runIdArg)return output_manager_default.print(help(inspectSubcommand,{parent:agentRunsCommand,columns:client.stderr.columns})),2;if(until&&!since)return invalidArguments(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;output_manager_default.spinner("Fetching Agent Run\u2026");let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,runId:runIdArg})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
45
+ `}async function inspect(client){let telemetry2=new AgentInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),runIdArg=positional[0]===inspectSubcommand.name?positional[1]:positional[0],{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliArgumentRunId(runIdArg),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliFlagJson(json),!runIdArg)return output_manager_default.print(help(inspectSubcommand,{parent:agentRunsCommand,columns:client.stderr.columns})),2;if(until&&!since)return invalidArguments2(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;output_manager_default.spinner("Fetching Agent Run\u2026");let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,runId:runIdArg})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
46
46
  `),0;let run3=isRecord(data.run)?data.run:data;return client.stdout.write(renderDetail(run3)),output_manager_default.log(`Run with ${cmd("--json")} for full run data.`),0}var AgentTraceTelemetryClient=class extends AgentRunsQueryTelemetryClient{trackCliArgumentRunId(value){value&&this.trackCliArgument({arg:"runId",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionPrevious(value){value&&this.trackCliOption({option:"previous",value:this.redactedValue})}trackCliOptionMaxFieldLength(value){typeof value=="number"&&this.trackCliOption({option:"max-field-length",value:String(value)})}};var INLINE_VALUE_MAX_LEN=2e3;function toDisplayString(value){if(value!=null){if(typeof value=="string")return value;try{return JSON.stringify(value)}catch{return String(value)}}}function pushBlock(lines,label,value){let text3=toDisplayString(value);text3&&lines.push(`- **${label}:** ${ellipsis(text3.trim(),INLINE_VALUE_MAX_LEN)}`)}function renderTurn(turn,index){let lines=[`## Turn ${index+1}`],messages=asArray(turn.messages);for(let message of messages){let role=readString(message,"role","type")??"message";pushBlock(lines,role,message.content??message.text),pushBlock(lines,`${role} reasoning`,message.reasoning)}pushBlock(lines,"reasoning",turn.reasoning);let toolCalls=asArray(turn.toolCalls??turn.tool_calls);for(let toolCall of toolCalls){let name=readString(toolCall,"name","toolName","tool")??"<unnamed tool>";lines.push(`- **tool call:** \`${name}\``);let input=toDisplayString(toolCall.input??toolCall.args??toolCall.arguments);input&&lines.push(` - input: ${ellipsis(input.trim(),INLINE_VALUE_MAX_LEN)}`);let outputValue=toDisplayString(toolCall.output??toolCall.result);outputValue&&lines.push(` - output: ${ellipsis(outputValue.trim(),INLINE_VALUE_MAX_LEN)}`)}return lines.join(`
47
47
  `)}function resolveTurns(trace3){let direct=asArray(trace3.turns);if(direct.length>0)return direct;let framework=readString(trace3,"framework");if(framework){let nested=asArray(readRecord(trace3,framework)?.turns);if(nested.length>0)return nested}for(let value of Object.values(trace3))if(isRecord(value)){let nested=asArray(value.turns);if(nested.length>0)return nested}return[]}var MAX_CONTINUATION_LENGTH=4096;function readTracePage(data){if(!isRecord(data))return;let trace3=readRecord(data,"trace")??data,framework=readString(trace3,"framework"),payload=(framework?readRecord(trace3,framework):void 0)??readRecord(trace3,"eve");if(!payload)return;let earlier=readRecord(payload,"earlier"),later=readRecord(payload,"later"),earlierStreamId=readString(earlier,"streamId"),beforeChunk=readNumber(earlier,"beforeChunk"),laterStreamId=readString(later,"streamId"),cursor2=readString(later,"cursor"),droppedSide=readString(readRecord(payload,"truncated"),"droppedSide");return{...droppedSide==="oldest"||droppedSide==="newest"?{droppedSide}:{},...earlierStreamId&&beforeChunk!==void 0&&Number.isSafeInteger(beforeChunk)&&beforeChunk>0?{earlier:{streamId:earlierStreamId,beforeChunk}}:{},...laterStreamId&&cursor2?{later:{streamId:laterStreamId,cursor:cursor2}}:{}}}function quoteCommandArgument(value,placeholder){return/[\x00-\x1F\x7F]/.test(value)?placeholder:/^[A-Za-z0-9_./:=@%+,-]+$/.test(value)?value:`'${value.replaceAll("'",`'"'"'`)}'`}function encodeTraceContinuation(continuation){return Buffer.from(JSON.stringify(continuation),"utf8").toString("base64url")}function parseTraceContinuation(value){if(!(value.length===0||value.length>MAX_CONTINUATION_LENGTH||!/^[A-Za-z0-9_-]+$/.test(value)))try{let decoded=JSON.parse(Buffer.from(value,"base64url").toString("utf8"));if(!isRecord(decoded)||decoded.version!==1||decoded.direction!=="earlier"&&decoded.direction!=="later"||typeof decoded.streamId!="string"||decoded.streamId.length===0)return;if(decoded.direction==="earlier"&&typeof decoded.beforeChunk=="number"&&Number.isSafeInteger(decoded.beforeChunk)&&decoded.beforeChunk>0&&decoded.cursor===void 0||decoded.direction==="later"&&typeof decoded.cursor=="string"&&decoded.cursor.length>0&&decoded.beforeChunk===void 0)return decoded}catch{return}}function buildTracePageCommand({runId:runId2,continuation,globalFlags,project,environment,since,until,maxFieldLength}){let args=["vercel",...globalFlags.map(flag=>quoteCommandArgument(flag,"<value>")),"agent-runs","trace",quoteCommandArgument(runId2,"<runId>")],optionalArgs=[["--project",project],["--environment",environment],["--since",since],["--until",until],["--max-field-length",maxFieldLength]];for(let[flag,value]of optionalArgs)value!==void 0&&args.push(flag,quoteCommandArgument(String(value),"<value>"));return args.push(continuation.direction==="later"?"--next":"--previous",encodeTraceContinuation(continuation)),args.join(" ")}function getTracePagination(tracePage){if(!(!tracePage?.earlier&&!tracePage?.later))return{next:tracePage.later?encodeTraceContinuation({version:1,direction:"later",...tracePage.later}):null,previous:tracePage.earlier?encodeTraceContinuation({version:1,direction:"earlier",...tracePage.earlier}):null}}function logTracePagination(tracePage,{runId:runId2,globalFlags,project,environment,since,until,maxFieldLength}){tracePage?.droppedSide&&output_manager_default.log(`Trace coverage is incomplete: ${tracePage.droppedSide} activity was not returned in this page.`),tracePage?.earlier&&(output_manager_default.log("Older activity is available. Run:"),output_manager_default.print(` ${buildTracePageCommand({runId:runId2,continuation:{version:1,direction:"earlier",...tracePage.earlier},globalFlags,project,environment,since,until,maxFieldLength})}
48
48
  `)),tracePage?.later&&(output_manager_default.log("Newer activity is available. Run:"),output_manager_default.print(` ${buildTracePageCommand({runId:runId2,continuation:{version:1,direction:"later",...tracePage.later},globalFlags,project,environment,since,until,maxFieldLength})}
49
49
  `))}function renderTrace(data,runIdArg){let trace3=readRecord(data,"trace")??data,turns=resolveTurns(trace3);return turns.length===0?void 0:`${[`# Agent Run ${runIdArg}`,`- **Turns:** ${turns.length}`,...turns.map((turn,index)=>renderTurn(turn,index))].join(`
50
50
 
51
51
  `)}
52
- `}async function trace(client){let telemetry2=new AgentTraceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(traceSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),runIdArg=positional[0]===traceSubcommand.name?positional[1]:positional[0],{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--next":nextCursor,"--previous":previousCursor,"--max-field-length":maxFieldLengthFlag,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliArgumentRunId(runIdArg),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliOptionNext(nextCursor),telemetry2.trackCliOptionPrevious(previousCursor),telemetry2.trackCliOptionMaxFieldLength(maxFieldLengthFlag),telemetry2.trackCliFlagJson(json),!runIdArg)return output_manager_default.print(help(traceSubcommand,{parent:agentRunsCommand,columns:client.stderr.columns})),2;if(until&&!since)return invalidArguments(client,"`--until` requires `--since`.");if(maxFieldLengthFlag!==void 0&&(!Number.isFinite(maxFieldLengthFlag)||maxFieldLengthFlag<0))return invalidArguments(client,"`--max-field-length` must be a non-negative number.");if(nextCursor!==void 0&&previousCursor!==void 0)return invalidArguments(client,"`--next` and `--previous` cannot be used together.");let continuationValue=nextCursor??previousCursor,continuation=continuationValue!==void 0?parseTraceContinuation(continuationValue):void 0,expectedDirection=nextCursor!==void 0?"later":"earlier";if(continuationValue!==void 0&&continuation?.direction!==expectedDirection){let flag=nextCursor!==void 0?"--next":"--previous";return invalidArguments(client,`Invalid or expired \`${flag}\` cursor. Omit \`${flag}\` to restart the trace.`)}let tracePageQuery=continuation?.direction==="later"?{traceStreamId:continuation.streamId,traceAfterCursor:continuation.cursor}:continuation?.direction==="earlier"?{traceStreamId:continuation.streamId,traceBeforeChunk:continuation.beforeChunk}:void 0,scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;output_manager_default.spinner("Fetching Agent Run trace\u2026");let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,runId:runIdArg,trace:!0,...tracePageQuery})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}output_manager_default.stopSpinner();let maxFieldLength=normalizeTraceMaxFieldLength(maxFieldLengthFlag),bounded=truncateLargeStrings(data,maxFieldLength),tracePage=readTracePage(data),pagination=getTracePagination(tracePage);if(json){let jsonPayload=pagination&&isRecord(bounded)?{...bounded,pagination}:bounded;return client.stdout.write(`${JSON.stringify(jsonPayload,null,2)}
52
+ `}async function trace(client){let telemetry2=new AgentTraceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(traceSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),runIdArg=positional[0]===traceSubcommand.name?positional[1]:positional[0],{"--project":projectFlag,"--environment":environment,"--since":since,"--until":until,"--next":nextCursor,"--previous":previousCursor,"--max-field-length":maxFieldLengthFlag,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliArgumentRunId(runIdArg),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliOptionNext(nextCursor),telemetry2.trackCliOptionPrevious(previousCursor),telemetry2.trackCliOptionMaxFieldLength(maxFieldLengthFlag),telemetry2.trackCliFlagJson(json),!runIdArg)return output_manager_default.print(help(traceSubcommand,{parent:agentRunsCommand,columns:client.stderr.columns})),2;if(until&&!since)return invalidArguments2(client,"`--until` requires `--since`.");if(maxFieldLengthFlag!==void 0&&(!Number.isFinite(maxFieldLengthFlag)||maxFieldLengthFlag<0))return invalidArguments2(client,"`--max-field-length` must be a non-negative number.");if(nextCursor!==void 0&&previousCursor!==void 0)return invalidArguments2(client,"`--next` and `--previous` cannot be used together.");let continuationValue=nextCursor??previousCursor,continuation=continuationValue!==void 0?parseTraceContinuation(continuationValue):void 0,expectedDirection=nextCursor!==void 0?"later":"earlier";if(continuationValue!==void 0&&continuation?.direction!==expectedDirection){let flag=nextCursor!==void 0?"--next":"--previous";return invalidArguments2(client,`Invalid or expired \`${flag}\` cursor. Omit \`${flag}\` to restart the trace.`)}let tracePageQuery=continuation?.direction==="later"?{traceStreamId:continuation.streamId,traceAfterCursor:continuation.cursor}:continuation?.direction==="earlier"?{traceStreamId:continuation.streamId,traceBeforeChunk:continuation.beforeChunk}:void 0,scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag,requireProject:!0});if(!scope.ok)return scope.exitCode;output_manager_default.spinner("Fetching Agent Run trace\u2026");let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,projectId:scope.projectId,environment,since,until,runId:runIdArg,trace:!0,...tracePageQuery})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}output_manager_default.stopSpinner();let maxFieldLength=normalizeTraceMaxFieldLength(maxFieldLengthFlag),bounded=truncateLargeStrings(data,maxFieldLength),tracePage=readTracePage(data),pagination=getTracePagination(tracePage);if(json){let jsonPayload=pagination&&isRecord(bounded)?{...bounded,pagination}:bounded;return client.stdout.write(`${JSON.stringify(jsonPayload,null,2)}
53
53
  `),0}let rendered=isRecord(bounded)?renderTrace(bounded,runIdArg):void 0,traceCommandContext={runId:runIdArg,globalFlags:getGlobalFlagsFromArgs(client.argv.slice(2)),project:projectFlag,environment,since,until,maxFieldLength:maxFieldLengthFlag};return rendered?(client.stdout.write(rendered),logTracePagination(tracePage,traceCommandContext),output_manager_default.log("Run with --json for raw trace data."),0):(client.stdout.write(`${JSON.stringify(bounded,null,2)}
54
- `),logTracePagination(tracePage,traceCommandContext),0)}var import_chalk5=__toESM(require_source(),1);var AgentProjectsTelemetryClient=class extends AgentRunsQueryTelemetryClient{};async function projects(client){let telemetry2=new AgentProjectsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(projectsSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{"--environment":environment,"--since":since,"--until":until,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliFlagJson(json),until&&!since)return invalidArguments(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag:void 0,requireProject:!1});if(!scope.ok)return scope.exitCode;let fetchStamp=stamp_default();output_manager_default.spinner(`Fetching projects with Agent Runs in ${import_chalk5.default.bold(scope.contextName)}\u2026`);let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,view:"team",environment,since,until})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
54
+ `),logTracePagination(tracePage,traceCommandContext),0)}var import_chalk5=__toESM(require_source(),1);var AgentProjectsTelemetryClient=class extends AgentRunsQueryTelemetryClient{};async function projects(client){let telemetry2=new AgentProjectsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(projectsSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{"--environment":environment,"--since":since,"--until":until,"--json":json,"--scope":scopeFlag}=parsedArgs.flags;if(telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionSince(since),telemetry2.trackCliOptionUntil(until),telemetry2.trackCliFlagJson(json),until&&!since)return invalidArguments2(client,"`--until` requires `--since`.");let scope=await resolveAgentRunsScope(client,{scopeFlag,projectFlag:void 0,requireProject:!1});if(!scope.ok)return scope.exitCode;let fetchStamp=stamp_default();output_manager_default.spinner(`Fetching projects with Agent Runs in ${import_chalk5.default.bold(scope.contextName)}\u2026`);let data;try{data=await fetchAgentRuns(client,{teamId:scope.teamId,view:"team",environment,since,until})}catch(err){return output_manager_default.stopSpinner(),handleAgentRunsApiError(client,err),1}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(data,null,2)}
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
 
@@ -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),1}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.`),1):(output_manager_default.error(formatResult.error),1)}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,ms39])=>`${provider}: ${ms39}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),1}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),1;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models edit <slug>")} expects a virtual model slug.`),1;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."),1;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)}
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,ms40])=>`${provider}: ${ms40}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),1}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),1;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models edit <slug>")} expects a virtual model slug.`),1;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."),1;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),1}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),1;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models rm <slug>")} expects a virtual model slug.`),1;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),1}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),1;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models restore <slug>")} expects a virtual model slug.`),1;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),1}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})),2;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),2):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list7(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),edit2(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove5(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),2):(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,id=typeof payload?.id=="string"?payload.id:typeof payload?.session_id=="string"?payload.session_id:"";return record.type!=="session_meta"||!payload||!uuidValidate(id)||typeof payload.session_id=="string"&&payload.session_id!==id||payload.originator!=="Codex Desktop"&&!(payload.originator==null&&payload.source==="vscode")||(gateway?payload.model_provider!=="vercel":payload.model_provider==="vercel")?null:{record,payload,id,delimiter:newline<0?"":carriageReturn?`\r
@@ -148,7 +148,7 @@ ${preserved.join(`
148
148
  `),{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)}
149
149
  `),{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)}
150
150
  `),{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)}
151
- `)}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&&params.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 id=row.slug??idByName.get(normalizeName(row.name))??void 0;!id||seen.has(id)||(seen.add(id),resolved.push({id,name:nameById.get(id)??row.name}))}return resolved}function withTimeout(run3,ms39){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms39}ms`))},ms39);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:1,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("="),id=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id||!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(id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id}" in --agent-config.`);overrides[id]=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(id=>getAgentById(id.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 id of Object.keys(overrides))if(!selected.some(a=>a.id===id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id}", which isn't selected. Add --agent ${id} (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(`
151
+ `)}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&&params.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 id=row.slug??idByName.get(normalizeName(row.name))??void 0;!id||seen.has(id)||(seen.add(id),resolved.push({id,name:nameById.get(id)??row.name}))}return resolved}function withTimeout(run3,ms40){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms40}ms`))},ms40);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:1,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("="),id=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id||!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(id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id}" in --agent-config.`);overrides[id]=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(id=>getAgentById(id.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 id of Object.keys(overrides))if(!selected.some(a=>a.id===id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id}", which isn't selected. Add --agent ${id} (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(`
152
152
  `)}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(`
153
153
  `),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.
154
154
  `))),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(`
@@ -262,7 +262,7 @@ ${documentationLines}`),!0}function formatTargets(serviceName,targets,width){let
262
262
  `)}function formatExamples(service,methods){let lines=["",` ${import_chalk54.default.dim("Examples:")}`];for(let method of methods){let parts=[packageName,COMMAND,service,"--connection-method",method.connectionMethod];for(let field of method.templateFields??[])parts.push("--param",`${field.key}=${field.placeholder??"<value>"}`);parts.push("--name",`${service}-${method.connectionMethod}`),!(method.create.managed===!0)&&method.create.manual&&parts.push("--data","@credentials.json"),lines.push(""),lines.push(` ${import_chalk54.default.dim("-")} Connect with ${method.label}`),lines.push(""),lines.push(` ${import_chalk54.default.cyan(`$ ${parts.join(" ")}`)}`)}return lines.push(""),lines.push(` ${import_chalk54.default.dim(`Run \`${packageName} ${COMMAND} --help\` for all options.`)}`),lines.push(""),lines.join(`
263
263
  `)}function describeLines(description,docsUrl,width){let lines=[];if(description)for(let line2 of wrapPlain(description,width-6))lines.push(indented(import_chalk54.default.dim(line2)));return docsUrl&&lines.push(indented(import_chalk54.default.dim(`Docs: ${docsUrl}`))),lines}function indented(text3){return` ${text3}`}var import_chalk55=__toESM(require_source(),1);async function update(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect update <id>"),1;let iconFlag=flags["--icon"],backgroundColor=flags["--background-color"],accentColor=flags["--accent-color"];if(iconFlag!==void 0&&iconFlag.length===0)return output_manager_default.error("Icon path cannot be empty."),1;try{validateHexColor(backgroundColor,"background color"),validateHexColor(accentColor,"accent color")}catch(err){return output_manager_default.error(err.message),1}if(iconFlag===void 0&&backgroundColor===void 0&&accentColor===void 0)return output_manager_default.error("Specify at least one of: --icon, --background-color, --accent-color."),1;let preparedIcon;if(iconFlag)try{preparedIcon=await prepareConnexIcon(iconFlag,client.cwd)}catch(err){return output_manager_default.error(err.message),1}if(await selectConnexTeam(client,"Select the team for this connector"),preparedIcon){try{output_manager_default.spinner("Verifying connector..."),await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`)}catch(err){return output_manager_default.stopSpinner(),err.status===404?output_manager_default.error(`Connector not found: ${import_chalk55.default.bold(clientIdOrUid)}`):output_manager_default.error(`Failed to verify ${import_chalk55.default.bold(clientIdOrUid)}: ${err.message}`),1}output_manager_default.stopSpinner()}let iconSha;if(preparedIcon){try{output_manager_default.spinner("Uploading icon..."),iconSha=await uploadConnexIcon(client,preparedIcon)}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error(err.message),1}output_manager_default.stopSpinner()}let body={};iconSha&&(body.icon=iconSha),backgroundColor&&(body.backgroundColor=backgroundColor),accentColor&&(body.accentColor=accentColor);let updated;try{output_manager_default.spinner("Updating connector..."),updated=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`,{method:"PATCH",body})}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error(`Connector not found: ${import_chalk55.default.bold(clientIdOrUid)}`),1):(output_manager_default.error(`Failed to update ${import_chalk55.default.bold(clientIdOrUid)}: ${err.message}`),1)}if(output_manager_default.stopSpinner(),asJson)client.stdout.write(`${JSON.stringify({id:updated.id,uid:updated.uid,type:updated.type,name:updated.name,icon:updated.icon??null,backgroundColor:updated.backgroundColor??null,accentColor:updated.accentColor??null},null,2)}
264
264
  `);else{let displayName=updated.uid||updated.id;output_manager_default.success(`Connector ${import_chalk55.default.bold(displayName)} updated.`)}return 0}var import_chalk56=__toESM(require_source(),1);var import_strip_ansi2=__toESM(require_strip_ansi(),1);function sanitizeForTerminal(value){return(0,import_strip_ansi2.default)(value)}async function list13(client,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,allProjects=flags["--all-projects"]===!0,types=(flags["--type"]??[]).flatMap(v=>v.split(",").map(s=>s.trim().toLowerCase())).filter(Boolean),services=(flags["--service"]??[]).flatMap(v=>v.split(",").map(s=>s.trim().toLowerCase())).filter(Boolean),searchQuery=flags["--search"],projectId,projectName;if(!allProjects){let linked=await getLinkedProject(client);if(linked.status==="error")return linked.exitCode;linked.status==="linked"&&(linked.org.type==="team"?client.config.currentTeam=linked.org.id:client.config.currentTeam=void 0,projectId=linked.project.id,projectName=linked.project.name)}let unscoped=!projectId;unscoped&&await selectConnexTeam(client,"Select the team whose connectors you want to list");let params=new URLSearchParams;flags["--limit"]!==void 0&&params.set("limit",String(flags["--limit"])),flags["--next"]&&params.set("cursor",flags["--next"]),unscoped?params.set("include","projects"):projectId&&params.set("projectId",projectId),types.length>0&&params.set("type",types.join(",")),services.length>0&&params.set("service",services.join(",")),searchQuery&&params.set("search",searchQuery);let query=params.toString(),url=`/v1/connect/connectors${query?`?${query}`:""}`;output_manager_default.spinner("Fetching connectors\u2026");let response;try{response=await client.fetch(url)}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error("Connect is not enabled for this team. Contact support to enable it."),1):(printError(err,client),1)}output_manager_default.stopSpinner();let clients=response.clients??[];if(asJson){let jsonClients=clients.map(c=>{let item={uid:c.uid,id:c.id,name:c.name,type:c.type,typeName:c.typeName,createdAt:c.createdAt,icon:c.icon??null,backgroundColor:c.backgroundColor??null,accentColor:c.accentColor??null};if(unscoped){let projectsInclude=c.includes?.projects;item.projects=(projectsInclude?.items??[]).map(p=>p.project).filter(p=>!!p),item.hasMoreProjects=projectsInclude?.hasMore===!0}return item});return client.stdout.write(`${JSON.stringify({connectors:jsonClients,cursor:response.cursor},null,2)}
265
- `),0}if(clients.length===0)return unscoped?output_manager_default.log(`No connectors found. Create one with \`${packageName} connect create <type>\`.`):output_manager_default.log(`No connectors linked to ${import_chalk56.default.bold(projectName??"this project")}. Run \`${packageName} connect list --all-projects\` to see every connector in the team.`),0;!unscoped&&projectName&&output_manager_default.log(`Connectors linked to ${import_chalk56.default.bold(projectName)}:`);let headers=["UID","ID","Name","Type"];unscoped&&headers.push("Projects");let rows=clients.map(c=>{let row=[sanitizeForTerminal(c.uid||"")||import_chalk56.default.gray("\u2013"),c.id,sanitizeForTerminal(c.name||"")||import_chalk56.default.gray("\u2013"),sanitizeForTerminal(c.typeName||c.type)];if(unscoped){let projectsInclude=c.includes?.projects,names=(projectsInclude?.items??[]).map(p=>p.project?.name).filter(n=>!!n).map(sanitizeForTerminal),more=projectsInclude?.hasMore===!0,cell;if(names.length===0&&!more)cell=import_chalk56.default.gray("\u2013");else{let parts=[];names.length&&parts.push(names.join(", ")),more&&parts.push(import_chalk56.default.gray("+ more")),cell=parts.join(" ")}row.push(cell)}return row});if(output_manager_default.print(`${table([headers.map(h=>import_chalk56.default.bold(import_chalk56.default.cyan(h))),...rows],{hsep:4})}
265
+ `),0}if(clients.length===0)return unscoped?output_manager_default.log(`No connectors found. Create one with \`${packageName} connect create <type>\`.`):output_manager_default.log(`No connectors linked to ${import_chalk56.default.bold(projectName??"this project")}. Run \`${packageName} connect list --all-projects\` to see every connector in the team.`),0;!unscoped&&projectName&&output_manager_default.log(`Connectors linked to ${import_chalk56.default.bold(projectName)}:`);let headers=["UID","ID","Name","Type"];unscoped&&headers.push("Projects");let rows=clients.map(c=>{let row=[sanitizeForTerminal(c.uid||"")||import_chalk56.default.gray("\u2013"),c.id,sanitizeForTerminal(c.name||"")||import_chalk56.default.gray("\u2013"),sanitizeForTerminal(c.typeName||c.type)];if(unscoped){let projectsInclude=c.includes?.projects,names=(projectsInclude?.items??[]).map(p=>p.project?.name).filter(n=>!!n).map(sanitizeForTerminal),more=projectsInclude?.hasMore===!0,cell2;if(names.length===0&&!more)cell2=import_chalk56.default.gray("\u2013");else{let parts=[];names.length&&parts.push(names.join(", ")),more&&parts.push(import_chalk56.default.gray("+ more")),cell2=parts.join(" ")}row.push(cell2)}return row});if(output_manager_default.print(`${table([headers.map(h=>import_chalk56.default.bold(import_chalk56.default.cyan(h))),...rows],{hsep:4})}
266
266
  `),response.cursor){let parts=[`${packageName} connect list`];allProjects&&parts.push("--all-projects");for(let t of types)parts.push(`--type ${t}`);for(let s of services)parts.push(`--service ${s}`);searchQuery&&parts.push(`--search "${searchQuery}"`),parts.push(`--next ${response.cursor}`),output_manager_default.log(`To see more, run \`${parts.join(" ")}\``)}return 0}var import_open4=__toESM(require_open(),1);async function token(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,clientId=args[0];if(!clientId)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect token <id>"),1;let subject=flags["--subject"];if(subject&&subject!=="app"&&subject!=="user")return output_manager_default.error('Invalid --subject value. Must be "app" or "user".'),1;await selectConnexTeam(client,"Select the team for this token request");let tokenParams={};flags["--installation-id"]&&(tokenParams.installationId=flags["--installation-id"]),flags["--scopes"]?tokenParams.scopes=parseScopes(flags["--scopes"]):flags["--no-default-scopes"]||(tokenParams.scopes=["*"]);let body={...tokenParams};subject==="app"?body.subject={type:"app"}:subject==="user"&&(body.subject={type:"user",id:client.authConfig.userId}),output_manager_default.spinner("Fetching token...");let result=await fetchToken(client,clientId,body);if(output_manager_default.stopSpinner(),result.ok)return printTokenResult(client,result.data,asJson);let errorCode=result.errorCode,errorMessage2=result.errorMessage??"Failed to get token";if(errorCode==="not_found")return output_manager_default.error("Connector not found or Connect is not enabled for this team."),1;if(errorCode==="unresolved_token")return output_manager_default.error(`${errorMessage2} This connector does not support getting a token for the requested subject.`),1;if(!isActionable(errorCode))return output_manager_default.error(errorMessage2),1;let teamId=client.config.currentTeam;if(!teamId)return output_manager_default.error(`${errorMessage2} Unable to build recovery URL: no team resolved.`),1;let actionLabel=errorCode==="user_authorization_required"?"authorization":"installation",isInteractive=!!(client.stdin.isTTY&&client.stdout.isTTY);if(!(!!flags["--yes"]||isInteractive)){let{requestCode:requestCode2}=generateRequestCode(),actionUrl2=buildActionUrl(errorCode,clientId,teamId,requestCode2,tokenParams);return output_manager_default.error(errorMessage2),output_manager_default.log(`To ${actionLabel}, open: ${actionUrl2}`),output_manager_default.log(`Or re-run with --yes to open the browser automatically: vercel connect token ${clientId} --yes`),1}if(output_manager_default.error(errorMessage2),!flags["--yes"]&&isInteractive&&!await client.input.confirm(`Open browser to ${actionLabel}?`,!0))return 0;let{verifier,requestCode}=generateRequestCode(),actionUrl=buildActionUrl(errorCode,clientId,teamId,requestCode,tokenParams);output_manager_default.log(`Opening browser for ${actionLabel}...`),output_manager_default.log(`If the browser doesn't open, visit:
267
267
  ${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),output_manager_default.spinner(`Waiting for ${actionLabel} to complete in the browser...`);let pollData=await awaitConnexResult(client,verifier);if(output_manager_default.stopSpinner(),!pollData)return 1;let retryBody={...body};pollData.installationId&&!retryBody.installationId&&(retryBody.installationId=pollData.installationId),output_manager_default.spinner("Fetching token...");let retryResult=await fetchToken(client,clientId,retryBody);return output_manager_default.stopSpinner(),retryResult.ok?printTokenResult(client,retryResult.data,asJson):(output_manager_default.error(retryResult.errorMessage??`Failed to get token after ${actionLabel}`),1)}function parseScopes(raw){return raw.split(/[\s,]+/).map(s=>s.trim()).filter(Boolean)}function isActionable(code2){return code2==="user_authorization_required"||code2==="client_installation_required"}function buildActionUrl(code2,clientId,teamId,requestCode,tokenParams){let path3=code2==="user_authorization_required"?"authorize":"install",params=new URLSearchParams({teamId,request_code:requestCode});for(let[key,value]of Object.entries(tokenParams))value!==void 0&&params.set(key,Array.isArray(value)?value.join(","):value);return`https://vercel.com/api/v1/connect/${path3}/${encodeURIComponent(clientId)}?${params.toString()}`}function printTokenResult(client,data,asJson){return asJson?client.stdout.write(`${JSON.stringify(data,null,2)}
268
268
  `):client.stdout.write(`${data.token}
@@ -397,7 +397,7 @@ ${indent(nameservers.join(`
397
397
  `).map(line2=>` ${line2}`).join(`
398
398
  `)}function renderStructuredOutput(diagnosis){let{facts}=diagnosis,{config}=facts,dnsMethods=getDnsMethods(diagnosis),domainConnectMethod=dnsMethods.find(method=>method.kind==="domain-connect"),domainConnect=domainConnectMethod?.kind==="domain-connect"?domainConnectMethod.configuration:null,canRecommendDns=diagnosis.configurationStatus!=="scope-resolution-required"&&diagnosis.configurationStatus!=="project-attachment-recommended"&&facts.ownership!=="platform-managed",payload={status:diagnosis.ok?AGENT_STATUS.OK:AGENT_STATUS.ACTION_REQUIRED,...diagnosis.details,...diagnosis.next.length?{next:diagnosis.next}:{},...domainConnect?{domainConnect}:{},domain:facts.domainName,domainStatus:diagnosis.status,configurationStatus:diagnosis.configurationStatus,ok:diagnosis.ok,issues:diagnosis.issues,misconfigured:config.misconfigured,configuredBy:config.configuredBy,serviceType:config.serviceType,ipStatus:config.ipStatus??null,dnssecEnabled:config.dnssecEnabled??null,acceptedChallenges:config.acceptedChallenges??[],current:{nameservers:config.nameservers??[],cnames:config.cnames??[],aValues:config.aValues??[]},recommended:{ipv4:canRecommendDns?config.recommendedIPv4??[]:[],cname:canRecommendDns?config.recommendedCNAME??[]:[],records:diagnosis.recommendedDnsRecords,nameservers:getRecommendedNameservers(dnsMethods)},conflicts:diagnosis.steps.flatMap(step=>step.kind==="remove-conflict"?[step.conflict]:[]),domainOwnership:facts.ownership,project:serializeProject(facts.project)};return`${JSON.stringify(payload,null,2)}
399
399
  `}function renderStructuredError(error){return`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:error.reason,error:error.code,message:error.message,...error.next?.length?{next:error.next}:{}},null,2)}
400
- `}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry2=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliFlagStrict(flags["--strict"]),telemetry2.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run2(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run2(client,options){let elapsed2=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed2())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),1}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG27={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main9(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),1}let telemetry2=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG27),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:domainsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand4)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add6(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand6)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect7(client,args));case"move":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry2.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry2.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry2.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand2)):(telemetry2.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand7)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm6(client,args));case"transferIn":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry2.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry2.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry2.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry2.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand11)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls6(client,args))}}var ExperimentsTelemetryClient=class extends TelemetryClient{trackSubcommand(subcommand,actual){this.trackCliSubcommand({subcommand,value:actual})}};function experimentsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/experiments`}function experimentUrl(projectId,experimentIdOrSlug){return`${experimentsUrl(projectId)}/${encodeURIComponent(experimentIdOrSlug)}`}async function listExperiments(client,projectId){return(await client.fetch(experimentsUrl(projectId))).data}function getExperiment(client,projectId,experimentIdOrSlug){return client.fetch(experimentUrl(projectId,experimentIdOrSlug))}function createExperiment(client,projectId,body){return client.fetch(experimentsUrl(projectId),{method:"PUT",body})}function updateExperiment(client,projectId,experimentIdOrSlug,body){return client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"PATCH",body})}function applyExperimentAction(client,projectId,experimentIdOrSlug,action){return client.fetch(`${experimentUrl(projectId,experimentIdOrSlug)}/actions`,{method:"POST",body:action})}async function deleteExperiment(client,projectId,experimentIdOrSlug){await client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"DELETE"})}function getExperimentAnalysis(client,projectId,experimentId,body){return client.fetch(`/v3/projects/${encodeURIComponent(projectId)}/experiments/${encodeURIComponent(experimentId)}/results`,{method:"POST",body})}var OBSERVABILITY_EVENTS_PATH="/v1/observability/events";function observabilityEventsUrl(){let override2=process.env.VERCEL_OBSERVABILITY_EVENTS_URL;return override2||OBSERVABILITY_EVENTS_PATH}async function resolveAnalyticsProjectId(client,ownerId,projectId){let groups;try{({groups=[]}=await client.fetch("/v1/microfrontends/groups",{accountId:ownerId}))}catch{return projectId}for(let group of groups){let entry2=group.projects?.find(project=>project.id===projectId);if(!entry2)continue;let settings=entry2.microfrontends;return!settings?.enabled||settings.isDefaultApp||settings.routeObservabilityToThisProject||settings.routeObservabilityToDefaultApp===!1?projectId:group.projects?.find(project=>project.microfrontends?.isDefaultApp)?.id??projectId}return projectId}function queryAnalyticsEvents(client,ownerId,projectId,{filter,select,start,end,limit,order="desc"}){return client.fetch(observabilityEventsUrl(),{method:"POST",body:{event:"vercel.analytics",scope:{ownerId,projectIds:[projectId]},timeRange:{start,end},select,filter,order,limit},accountId:ownerId})}var import_chalk102=__toESM(require_source(),1),import_ms13=__toESM(require_ms(),1);var CONTAMINATION_WARNING_RATIO=.01;function safeResourceToken(value){return value&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)?value:void 0}function getExperimentIdentifier(experiment){return experiment.slug||experiment.id}function experimentToken(experiment){return safeResourceToken(experiment.slug)??safeResourceToken(experiment.id)}function command(client,template){return withGlobalFlags(client,template,{preserveProject:!0})}function buildExperimentNextCommands(client,experiment){let id=experimentToken(experiment),flag=safeResourceToken(experiment.flagSlug);if(!id)return[];let inspectFlag=flag?{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)}:void 0;return experiment.state==="draft"?[{label:"Start experiment",command:command(client,`experiments start ${id} --ramp <percentage>`)},{label:"Edit settings",command:command(client,`experiments update ${id} --file <file>`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]:experiment.state==="running"?[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Ramp exposures",command:command(client,`experiments set-ramp ${id} --ramp <percentage>`)},{label:"Make decision",command:command(client,`experiments decide ${id} --winner <variant-id> --rationale <text>`)},...inspectFlag?[inspectFlag]:[]]:[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Return to draft",command:command(client,`experiments return-to-draft ${id}`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]}function buildListNextCommands(client){return[{label:"Inspect experiment",command:command(client,"experiments inspect <experiment>")},{label:"Open experiments",command:command(client,"experiments open")},{label:"Create experiment",command:command(client,"experiments create --file <file>")}]}function buildDeletedNextCommands(client,experiment){let flag=safeResourceToken(experiment.flagSlug);return[...flag?[{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)},{label:"Edit flag",command:command(client,`flags open ${flag}`)}]:[],{label:"List experiments",command:command(client,"experiments ls")}]}function printNextCommands(next){if(next.length===0)return;let labelWidth=Math.max(ALIGNED_LABEL_WIDTH,...next.map(item=>item.label.length+1));output_manager_default.print(`
400
+ `}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry2=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliFlagStrict(flags["--strict"]),telemetry2.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run2(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run2(client,options){let elapsed2=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed2())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),1}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG27={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main9(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),1}let telemetry2=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG27),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:domainsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand4)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add6(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand6)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect7(client,args));case"move":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry2.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry2.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry2.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand2)):(telemetry2.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand7)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm6(client,args));case"transferIn":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry2.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry2.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry2.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry2.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand11)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls6(client,args))}}var ExperimentsTelemetryClient=class extends TelemetryClient{trackSubcommand(subcommand,actual){this.trackCliSubcommand({subcommand,value:actual})}};function experimentsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/experiments`}function experimentUrl(projectId,experimentIdOrSlug){return`${experimentsUrl(projectId)}/${encodeURIComponent(experimentIdOrSlug)}`}async function listExperiments(client,projectId){return(await client.fetch(experimentsUrl(projectId))).data}function getExperiment(client,projectId,experimentIdOrSlug){return client.fetch(experimentUrl(projectId,experimentIdOrSlug))}function createExperiment(client,projectId,body){return client.fetch(experimentsUrl(projectId),{method:"PUT",body})}function updateExperiment(client,projectId,experimentIdOrSlug,body){return client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"PATCH",body})}function applyExperimentAction(client,projectId,experimentIdOrSlug,action){return client.fetch(`${experimentUrl(projectId,experimentIdOrSlug)}/actions`,{method:"POST",body:action})}async function deleteExperiment(client,projectId,experimentIdOrSlug){await client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"DELETE"})}function getExperimentAnalysis(client,projectId,experimentId,body){return client.fetch(`/v3/projects/${encodeURIComponent(projectId)}/experiments/${encodeURIComponent(experimentId)}/results`,{method:"POST",body})}var OBSERVABILITY_EVENTS_PATH="/v1/observability/events";function observabilityEventsUrl(){let override2=process.env.VERCEL_OBSERVABILITY_EVENTS_URL;return override2||OBSERVABILITY_EVENTS_PATH}async function resolveAnalyticsProjectId(client,ownerId,projectId){let groups;try{({groups=[]}=await client.fetch("/v1/microfrontends/groups",{accountId:ownerId}))}catch{return projectId}for(let group of groups){let entry2=group.projects?.find(project=>project.id===projectId);if(!entry2)continue;let settings=entry2.microfrontends;return!settings?.enabled||settings.isDefaultApp||settings.routeObservabilityToThisProject||settings.routeObservabilityToDefaultApp===!1?projectId:group.projects?.find(project=>project.microfrontends?.isDefaultApp)?.id??projectId}return projectId}function queryAnalyticsEvents(client,ownerId,projectId,{filter,select:select2,start,end,limit,order="desc"}){return client.fetch(observabilityEventsUrl(),{method:"POST",body:{event:"vercel.analytics",scope:{ownerId,projectIds:[projectId]},timeRange:{start,end},select:select2,filter,order,limit},accountId:ownerId})}var import_chalk102=__toESM(require_source(),1),import_ms13=__toESM(require_ms(),1);var CONTAMINATION_WARNING_RATIO=.01;function safeResourceToken(value){return value&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)?value:void 0}function getExperimentIdentifier(experiment){return experiment.slug||experiment.id}function experimentToken(experiment){return safeResourceToken(experiment.slug)??safeResourceToken(experiment.id)}function command(client,template){return withGlobalFlags(client,template,{preserveProject:!0})}function buildExperimentNextCommands(client,experiment){let id=experimentToken(experiment),flag=safeResourceToken(experiment.flagSlug);if(!id)return[];let inspectFlag=flag?{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)}:void 0;return experiment.state==="draft"?[{label:"Start experiment",command:command(client,`experiments start ${id} --ramp <percentage>`)},{label:"Edit settings",command:command(client,`experiments update ${id} --file <file>`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]:experiment.state==="running"?[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Ramp exposures",command:command(client,`experiments set-ramp ${id} --ramp <percentage>`)},{label:"Make decision",command:command(client,`experiments decide ${id} --winner <variant-id> --rationale <text>`)},...inspectFlag?[inspectFlag]:[]]:[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Return to draft",command:command(client,`experiments return-to-draft ${id}`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]}function buildListNextCommands(client){return[{label:"Inspect experiment",command:command(client,"experiments inspect <experiment>")},{label:"Open experiments",command:command(client,"experiments open")},{label:"Create experiment",command:command(client,"experiments create --file <file>")}]}function buildDeletedNextCommands(client,experiment){let flag=safeResourceToken(experiment.flagSlug);return[...flag?[{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)},{label:"Edit flag",command:command(client,`flags open ${flag}`)}]:[],{label:"List experiments",command:command(client,"experiments ls")}]}function printNextCommands(next){if(next.length===0)return;let labelWidth=Math.max(ALIGNED_LABEL_WIDTH,...next.map(item=>item.label.length+1));output_manager_default.print(`
401
401
  `);for(let item of next)printAlignedLabel(item.label,`\`${item.command}\``,{labelWidth,emphasis:"subtle"})}function printExperimentsTable(experiments2){let now=Date.now(),rows=experiments2.map(experiment=>[import_chalk102.default.bold(getExperimentIdentifier(experiment)),experiment.state,experiment.decision?.outcome??"\u2014",experiment.flagSlug,experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`,`${(0,import_ms13.default)(now-experiment.updatedAt)} ago`]);output_manager_default.print(`
402
402
  ${formatTable(["Experiment","State","Decision","Flag","Ramp","Updated"],["l","l","l","l","r","l"],[{name:"",rows}])}
403
403
  `)}function formatTimestamp2(timestamp){return timestamp===void 0?"\u2014":new Date(timestamp).toISOString()}function printExperimentDetails(experiment){let metricCount=Object.keys(experiment.metrics??{}).length,decision=experiment.decision?experiment.decision.outcome==="winner"?`Winner: ${experiment.decision.winnerVariantId??"unknown"}`:"Abandoned":"\u2014";printAlignedLabel("Experiment",experiment.name),printAlignedLabel("ID",experiment.id),printAlignedLabel("Slug",experiment.slug??"\u2014"),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Unit",experimentUnitLabel(experiment)),printAlignedLabel("Target",`${experiment.targetPercentage}%`),printAlignedLabel("Ramp",experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`),printAlignedLabel("Control",experiment.controlVariantId),printAlignedLabel("Variants",String(experiment.variants.length)),printAlignedLabel("Metrics",String(metricCount)),printAlignedLabel("Decision",decision),printAlignedLabel("Ramp ID",experiment.rampId??"\u2014"),printAlignedLabel("Created",formatTimestamp2(experiment.createdAt)),printAlignedLabel("Updated",formatTimestamp2(experiment.updatedAt))}function metricRole(experiment,alias2){return experiment.primaryMetric===alias2?"Primary":experiment.guardrailMetrics?.includes(alias2)?"Guardrail":experiment.secondaryMetrics?.includes(alias2)?"Secondary":"Other"}function formatPercentage(value){return value==null?"\u2014":`${(value*100).toFixed(2)}%`}function metricValue(type,variant){switch(type){case"conversion":return formatPercentage(variant.conversionRate);case"funnel":return formatPercentage(variant.overallRate);case"retention":return formatPercentage(variant.retentionRate);case"mean":return variant.mean?.toFixed(3)??"\u2014";case"ratio":return variant.ratio?.toFixed(3)??"\u2014";default:return"\u2014"}}function assessExperimentAnalysis(experiment,analysis){let issues=[],hasSampleSizeEstimate=!1;for(let[alias2,metric]of Object.entries(analysis.metrics)){let control=metric.variants.find(variant=>variant.isBaseline);if(control)for(let variant of metric.variants){if(variant.isBaseline||variant.requiredSampleSize==null)continue;hasSampleSizeEstimate=!0;let smallerArm=Math.min(control.exposedUnits,variant.exposedUnits);smallerArm>=variant.requiredSampleSize||issues.push({metric:alias2,role:metricRole(experiment,alias2),variantId:variant.variantId,controlUnits:control.exposedUnits,variantUnits:variant.exposedUnits,requiredUnitsPerArm:variant.requiredSampleSize,remainingUnitsInSmallerArm:variant.requiredSampleSize-smallerArm})}}let reasons=[],hasExposureInvariantFailure=analysis.warnings.some(warning2=>warning2.startsWith("Exposure invariant failed")),includesMaterialContamination=(analysis.contamination.totalUnits>0?analysis.contamination.contaminatedUnits/analysis.contamination.totalUnits:0)>=CONTAMINATION_WARNING_RATIO&&!analysis.excludeContaminated;analysis.srm.isValid||reasons.push("sample_ratio_mismatch"),hasExposureInvariantFailure&&reasons.push("exposure_invariant_failed"),includesMaterialContamination&&reasons.push("contamination_included"),issues.length>0&&reasons.push("insufficient_sample_size");let trust;return!analysis.srm.isValid||hasExposureInvariantFailure?trust={status:"failed",summary:!analysis.srm.isValid&&hasExposureInvariantFailure?"Do not trust \u2014 data quality checks failed":analysis.srm.isValid?"Do not trust \u2014 exposure counts disagree":"Do not trust \u2014 sample ratio mismatch",reasons}:includesMaterialContamination?trust={status:"caution",summary:"Use caution \u2014 contaminated units are included",reasons}:issues.length>0?trust={status:"directional",summary:"Directional only \u2014 insufficient sample size",reasons}:trust={status:"passed",summary:"Health checks passed",reasons},{trust,sampleSize:{status:issues.length>0?"insufficient":hasSampleSizeEstimate?"no_insufficiency_detected":"unavailable",issues}}}function printAnalysisWarning(message){output_manager_default.print(`${import_chalk102.default.yellow("!")} ${message}
@@ -414,13 +414,13 @@ ${import_chalk102.default.yellow("!")} No exposures or metric events in this win
414
414
  `),output_manager_default.print(`${diagnosedEventRow(event)}
415
415
  `),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_chalk102.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_chalk102.default.gray(event.timestamp),kind:event=>event.kind==="exposure"?import_chalk102.default.cyan(event.kind):import_chalk102.default.magenta(event.kind),what:event=>diagnosedEventName(event),variant:event=>event.variantId?import_chalk102.default.bold(event.variantId):import_chalk102.default.dim("\u2014"),unit:event=>event.unit??import_chalk102.default.dim("\u2014"),note:event=>event.assignmentReason?import_chalk102.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)}
416
416
  `)}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(`
417
- `)}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}\`.`),1}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 id=requireExperimentArgument(parsed.args,usage2);if(!id)return 1;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,id);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 1;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 1;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),1;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 1;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."),1;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),1;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 1;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_chalk103=__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 1;let jsonOutput=isJson(parsed.flags),fail=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk103.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk103.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 fail(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail(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 fail({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(ms39,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms39);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,inspectSubcommand7);if(!parsed)return 1;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,listSubcommand12);if(!parsed)return 1;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 1;let[id,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),1;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(!id&&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{id?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id),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}
417
+ `)}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}\`.`),1}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 id=requireExperimentArgument(parsed.args,usage2);if(!id)return 1;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,id);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 1;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 1;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),1;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 1;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."),1;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),1;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 1;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_chalk103=__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 1;let jsonOutput=isJson(parsed.flags),fail=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk103.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk103.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 fail(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail(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 fail({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(ms40,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms40);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,inspectSubcommand7);if(!parsed)return 1;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,listSubcommand12);if(!parsed)return 1;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 1;let[id,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),1;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(!id&&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{id?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id),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}
418
418
  `),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 1;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 1;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 1;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 1;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 1;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 1;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 1;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 1;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."),1;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."),1;"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_CONFIG28={list:getCommandAliases(listSubcommand12),inspect:getCommandAliases(inspectSubcommand7),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),1}let subArgs=parsed.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG28),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:listSubcommand12,run:runList},inspect:{command:inspectSubcommand7,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_chalk109=__toESM(require_source(),1);var import_chalk104=__toESM(require_source(),1);var MANAGED_BOT_RULE_IDS=["bot-protection","ai-bots","bot-id"],ALIASES={"bot-protection":"bot-protection","bot protection":"bot-protection",bot_protection:"bot-protection",bot_filter:"bot-protection",managed_bot_protection:"bot-protection",managed_bot_filter:"bot-protection","ai-bots":"ai-bots","ai bots":"ai-bots",ai_bots:"ai-bots",managed_ai_bots:"ai-bots","bot-id":"bot-id",botid:"bot-id",bot_id:"bot-id"},ACTIONS={"bot-protection":["off","log","challenge"],"ai-bots":["allow","log","challenge","deny"],"bot-id":["basic","deep-analysis"]},NAMES={"bot-protection":"Bot Protection","ai-bots":"AI Bots","bot-id":"BotID"},WAF_RULE_IDS={"bot-protection":"managed_bot_protection","ai-bots":"managed_ai_bots"};function resolveManagedBotRuleId(identifier){if(identifier)return ALIASES[identifier.trim().toLowerCase()]}function managedBotActions(id){return ACTIONS[id]}function formatManagedBotAction(action){return action==="deep-analysis"?"Deep Analysis":action.charAt(0).toUpperCase()+action.slice(1)}function botProtectionConfig(managedRules){return managedRules?.bot_filter??managedRules?.bot_protection}function currentBotProtectionAction(config){let ruleset=botProtectionConfig(config?.managedRules);return ruleset?.active?ruleset.action==="log"?"log":"challenge":"off"}function currentAiBotsAction(config){let ruleset=config?.managedRules?.ai_bots;return ruleset?.active?ruleset.action==="challenge"?"challenge":ruleset.action==="deny"?"deny":"log":"allow"}function currentBotIdAction(config){return config?.botIdEnabled?"deep-analysis":"basic"}function getManagedBotRule(config,id){let action=id==="bot-protection"?currentBotProtectionAction(config):id==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id,name:NAMES[id],action,wafRuleId:WAF_RULE_IDS[id]}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id=>getManagedBotRule(config,id))}function parseManagedBotAction(id,raw){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=ACTIONS[id];return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${NAMES[id]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id,action){if(id==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id==="bot-protection"?"bot_protection":"ai_bots";return action==="off"||action==="allow"?{action:"managedRules.update",id:patchId,value:{active:!1}}:{action:"managedRules.update",id:patchId,value:{active:!0,action}}}function suggestedManagedBotAction(rule){return rule.id==="bot-protection"?rule.action==="challenge"?"log":"challenge":rule.id==="ai-bots"?rule.action==="deny"?"allow":"deny":rule.action==="deep-analysis"?"basic":"deep-analysis"}function managedBotTrafficWarning(id,from,to){if(id==="ai-bots"&&to==="deny")return"AI Bots deny blocks known AI crawlers from this project.";if(id==="bot-protection"&&from==="off"&&to==="challenge")return"Bot Protection challenge will present a verification page to non-browser traffic."}function managedBotJson(rule){return{id:rule.id,name:rule.name,action:rule.action,wafRuleId:rule.wafRuleId??null}}function projectScope(project,teamId){return{type:"project",projectId:project.id,teamId,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({})})}function withGlobalFlags3(client,commandTemplate,scope){let template=scope?.type==="team"?`${commandTemplate} --team-level`:commandTemplate;return withGlobalFlags(client,template,{preserveProject:!0})}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},1),1):(output_manager_default.error(message),1)}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,displayName:project.name}}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}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"}]},1),1}return printError(err),1}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}
419
419
  `),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){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:opts.reason??AGENT_REASON.INVALID_ARGUMENTS,message:opts.message,next:[...opts.fix?[{command:withGlobalFlags3(client,opts.fix.command),...opts.fix.when?{when:opts.fix.when}:{}}]:[],...opts.nextCommand?[{command:withGlobalFlags3(client,opts.nextCommand)}]:[]]}),1):(output_manager_default.error(opts.message),opts.fix&&output_manager_default.log(opts.fix.hint),1)}function refuseManagedBotMutation(client,scope,identifier,verb){if(scope.type!=="project")return null;let id=resolveManagedBotRuleId(identifier);if(!id)return null;let command2=`firewall rules edit ${id} --action <action>`;return failFirewall(client,{message:`Can't ${verb} "${identifier}". That's a managed bot rule.`,fix:{command:command2,hint:`Use ${import_chalk104.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)+`
420
420
  `)}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(`
421
421
  ${import_chalk104.default.gray(`This change is staged. Run ${import_chalk104.default.cyan(withGlobalFlags3(client,"firewall publish",scope))} to make it live, or ${import_chalk104.default.cyan(withGlobalFlags3(client,"firewall discard",scope))} to undo.`)}
422
422
  `),!hadExistingDraft&&!opts.skipPrompts&&client.stdin.isTTY&&!client.nonInteractive){if(output_manager_default.print(`
423
- `),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_chalk104.default.cyan("Published")} to production ${import_chalk104.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_chalk104.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 ms39=error.retryAfterMs;if(!(typeof ms39!="number"||ms39<=0))return Math.ceil(ms39/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}}var import_chalk105=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk105.default.blue,deny:import_chalk105.default.red,challenge:import_chalk105.default.yellow,log:import_chalk105.default.magenta,rate_limit:import_chalk105.default.cyan,"rate-limit":import_chalk105.default.cyan,bypass:import_chalk105.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(ms39,withDate){let d=new Date(ms39),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(ms39){return`${formatUtcTime(ms39,!0)} UTC (${relativeTime(ms39)})`}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_chalk105.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_chalk105.default.bold(import_chalk105.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_chalk105.default.dim,trend=s.total>0?plain:import_chalk105.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(`
423
+ `),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_chalk104.default.cyan("Published")} to production ${import_chalk104.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_chalk104.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 ms40=error.retryAfterMs;if(!(typeof ms40!="number"||ms40<=0))return Math.ceil(ms40/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}}var import_chalk105=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk105.default.blue,deny:import_chalk105.default.red,challenge:import_chalk105.default.yellow,log:import_chalk105.default.magenta,rate_limit:import_chalk105.default.cyan,"rate-limit":import_chalk105.default.cyan,bypass:import_chalk105.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(ms40,withDate){let d=new Date(ms40),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(ms40){return`${formatUtcTime(ms40,!0)} UTC (${relativeTime(ms40)})`}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_chalk105.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_chalk105.default.bold(import_chalk105.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_chalk105.default.dim,trend=s.total>0?plain:import_chalk105.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(`
424
424
  `).map(line2=>` ${line2}`.trimEnd()).join(`
425
425
  `)}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(id){return id.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id){let match=id.match(/-(\d{13})$/);return match?Number(match[1]):void 0}function daysCovering(startMs,endMs){return Math.max(1,Math.ceil((endMs-startMs)/864e5))}function mapGroupAsAlert(group,alertId){let nested=(group.alerts??[]).map(mapO11yAlert).filter(a=>a!==null),hit=nested.find(a=>a.id===alertId)??nested[0];if(hit)return hit;let startedAt=group.recordedStartedAt;return startedAt?mapO11yAlert({id:alertId,title:group.title,type:group.type,startedAt,resolvedAt:group.recordedResolvedAt,data:group.alerts?.[0]?.data}):null}async function getO11yAlertById(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId);try{let group=await client.fetch(`/alerts/v3/groups/${encodeURIComponent(opts.alertId)}?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal});return mapGroupAsAlert(group,opts.alertId)}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function findFirewallAlert(client,opts){let timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,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}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 timestamp=row.timestamp;if(!timestamp)continue;axisSet.add(timestamp);let group=getOrCreate(row),points=pointsByGroup.get(group.key);points||(points=new Map,pointsByGroup.set(group.key,points));let value=rowValue(row);points.set(timestamp,(points.get(timestamp)??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_chalk106=__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(`
426
426
  `).map(line2=>` ${line2}`.trimEnd())}function emptyLine(filtered){return import_chalk106.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_chalk106.default.bold(list30.title)}`];return list30.unavailable?(lines.push(import_chalk106.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(`
@@ -430,7 +430,7 @@ ${import_chalk102.default.yellow("!")} No exposures or metric events in this win
430
430
  `)}var import_chalk107=__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_chalk107.default.dim("\xB7 at least, some alerts unread")}`:"";lines.push(` ${import_chalk107.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_chalk107.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_chalk107.default.dim(" No request data for this period."));else{let rows=[["Action","Trend","Total","Peak","Peak at"].map(h=>import_chalk107.default.bold(import_chalk107.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_chalk107.default.dim,trend=s.total>0?plain:import_chalk107.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(`
431
431
  `))lines.push(` ${line2}`.trimEnd())}if(lines.push(""),lines.push(` ${import_chalk107.default.bold("Rules")} (top ${OVERVIEW_TOP_RULES})`),opts.rules.length===0)lines.push(import_chalk107.default.dim(" No rule traffic for this period."));else{let rows=[["Rule","Requests","Id"].map(h=>import_chalk107.default.bold(import_chalk107.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(`
432
432
  `))lines.push(` ${line2}`.trimEnd())}if(opts.annotations.length>0){lines.push(""),lines.push(import_chalk107.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_chalk107.default.yellow("!")} ${when} UTC ${ago} ${a.title}${detail}${count2}`)}}return lines.push(""),lines.join(`
433
- `)}var import_chalk108=__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(ms39){let hours=Math.floor(ms39/MS_PER_HOUR),minutes=Math.floor(ms39%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_chalk108.default.dim("Off");if(status6.activeUntil){let remainingMs=status6.activeUntil-Date.now();return remainingMs<=0?import_chalk108.default.dim("Off (expired)"):import_chalk108.default.red(`On (expires in ${formatDuration(remainingMs)})`)}return import_chalk108.default.red("On")}function formatMitigationsStatus(status6){if(!status6.paused)return import_chalk108.default.green("Active");if(status6.resumesAt!==void 0){let remainingMs=status6.resumesAt*MS_PER_SECOND-Date.now();if(remainingMs>0)return import_chalk108.default.yellow(`Paused (auto-resumes in ${formatDuration(remainingMs)})`)}return import_chalk108.default.yellow("Paused")}function formatStatusOutput(opts){let{active,draft,bypass,attackMode,planInfo,firewallBypassIps}=opts,lines=[];if(lines.push(formatAlignedLabel("Firewall",active?active.firewallEnabled?import_chalk108.default.green("Enabled"):import_chalk108.default.red("Disabled"):import_chalk108.default.dim("Not configured"))),bypass===null)lines.push(formatAlignedLabel("Bypass",import_chalk108.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,planInfo))),draft&&draft.changes.length>0){lines.push(""),lines.push(formatAlignedLabel("Draft",import_chalk108.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(`
433
+ `)}var import_chalk108=__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(ms40){let hours=Math.floor(ms40/MS_PER_HOUR),minutes=Math.floor(ms40%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_chalk108.default.dim("Off");if(status6.activeUntil){let remainingMs=status6.activeUntil-Date.now();return remainingMs<=0?import_chalk108.default.dim("Off (expired)"):import_chalk108.default.red(`On (expires in ${formatDuration(remainingMs)})`)}return import_chalk108.default.red("On")}function formatMitigationsStatus(status6){if(!status6.paused)return import_chalk108.default.green("Active");if(status6.resumesAt!==void 0){let remainingMs=status6.resumesAt*MS_PER_SECOND-Date.now();if(remainingMs>0)return import_chalk108.default.yellow(`Paused (auto-resumes in ${formatDuration(remainingMs)})`)}return import_chalk108.default.yellow("Paused")}function formatStatusOutput(opts){let{active,draft,bypass,attackMode,planInfo,firewallBypassIps}=opts,lines=[];if(lines.push(formatAlignedLabel("Firewall",active?active.firewallEnabled?import_chalk108.default.green("Enabled"):import_chalk108.default.red("Disabled"):import_chalk108.default.dim("Not configured"))),bypass===null)lines.push(formatAlignedLabel("Bypass",import_chalk108.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,planInfo))),draft&&draft.changes.length>0){lines.push(""),lines.push(formatAlignedLabel("Draft",import_chalk108.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(`
434
434
  `)}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_chalk108.default.dim("IP/CIDR".padEnd(ipWidth+gap))}${import_chalk108.default.dim("Domain".padEnd(domainWidth+gap))}${import_chalk108.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(`
435
435
  `)}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(id=>id!=null)),removedIds=new Set(changes.filter(c=>c.action==="ip.remove").map(c=>c.id).filter(id=>id!=null)),modifiedIds=new Set(changes.filter(c=>c.action==="ip.update").map(c=>c.id).filter(id=>id!=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_chalk108.default.dim("IP/CIDR".padEnd(ipWidth+gap))}${import_chalk108.default.dim("Hostname".padEnd(hostnameWidth+gap))}${import_chalk108.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_chalk108.default.green):status6==="removed"?(prefix="- ",colorFn=import_chalk108.default.red):status6==="modified"&&(prefix="~ ",colorFn=import_chalk108.default.yellow),lines.push(colorFn(` ${prefix}${ip}${hostname2}${notes}`))}return lines.join(`
436
436
  `)}function getDiffSymbol(action){return action.endsWith(".insert")?{symbol:"+",color:import_chalk108.default.green}:action.endsWith(".remove")?{symbol:"-",color:import_chalk108.default.red}:{symbol:"~",color:import_chalk108.default.yellow}}function formatChangeDescription(change2,activeRules){let{action,id,value}=change2;switch(action){case"rules.insert":return`Added rule "${value?.name||id||"unknown"}"`;case"rules.update":{let draft=value,ruleName=draft?.name||id||"unknown";if(activeRules&&id&&draft&&typeof draft.active=="boolean"){let activeRule=activeRules.get(id);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 "${id||"unknown"}"`;case"rules.priority":return`Reordered rule "${value?.name||id||"unknown"}"`;case"ip.insert":return`Added IP block ${value?.ip||"unknown"}`;case"ip.remove":return`Removed IP block ${id||"unknown"}`;case"ip.update":return`Modified IP block ${value?.ip||id||"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}${id?` (${id})`:""}`}}function formatRuleFieldDiff(activeRule,draftValue){let lines=[];if(draftValue.name&&activeRule.name!==draftValue.name&&lines.push(import_chalk108.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_chalk108.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_chalk108.default.green(` + Condition: ${c}`));for(let c of removed)lines.push(import_chalk108.default.red(` - Condition: ${c}`));added.length===0&&removed.length===0&&lines.push(import_chalk108.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(`
@@ -576,7 +576,7 @@ ${formatRuleExpanded(modified)}
576
576
  ${formatAlertsList({...sections,from,to})}`),planIssue?output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
577
577
  `):sourceError&&output_manager_default.print(` ${FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}
578
578
  `),output_manager_default.print(`
579
- `),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_chalk138=__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 toIso(apiTimestamp){let ms39=apiTimestampMs(apiTimestamp);return Number.isNaN(ms39)?apiTimestamp:new Date(ms39).toISOString()}function toPersistentAction(row){let redacted=isRedacted(row.action_type)||isRedacted(row.public_ip)||isRedacted(row.host);return{startTime:toIso(row.startTime),endTime:toIso(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 ms39=apiTimestampMs(row.startTime);return Number.isNaN(ms39)?0:ms39}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(ms39){return Math.floor(ms39/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 inspect9(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_chalk138.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_chalk138.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(`
579
+ `),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_chalk138=__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 toIso(apiTimestamp){let ms40=apiTimestampMs(apiTimestamp);return Number.isNaN(ms40)?apiTimestamp:new Date(ms40).toISOString()}function toPersistentAction(row){let redacted=isRedacted(row.action_type)||isRedacted(row.public_ip)||isRedacted(row.host);return{startTime:toIso(row.startTime),endTime:toIso(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 ms40=apiTimestampMs(row.startTime);return Number.isNaN(ms40)?0:ms40}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(ms40){return Math.floor(ms40/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 inspect9(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_chalk138.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_chalk138.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(`
580
580
  ${formatAlertInspect({alert,rates,timeseries,ips,hosts})}`),!metrics2)output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
581
581
  `);else if(eventsIssue?.reason==="plan")output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
582
582
  `);else if(eventsIssue){let haveHosts=!!(hosts&&hosts.length>0);output_manager_default.print(` Couldn't load denied IPs${haveHosts?"":" and hosts"}.
@@ -905,7 +905,7 @@ ${table(lines,{hsep:2}).replace(/^/gm," ")}
905
905
  `),0}catch(err){if(isAPIError(err))return output_manager_default.error(err.serverMessage||`Could not list installations (${err.status}). If your API version requires a specific integration, pass --integration <slug>.`),1;throw err}}var import_chalk226=__toESM(require_source(),1);async function installMarketplaceIntegration(client,integrationIdOrSlug,acceptedPolicies){return client.fetch(`/v2/integrations/integration/${encodeURIComponent(integrationIdOrSlug)}/marketplace/install`,{method:"POST",json:!0,body:{acceptedPolicies,source:"cli"}})}function logPolicyLinksSummary(links){output_manager_default.log(`Marketplace addendum: ${links.marketplace_addendum}`),links.integration_privacy_policy&&output_manager_default.log(`Privacy policy: ${links.integration_privacy_policy}`),links.integration_eula&&output_manager_default.log(`Terms of service: ${links.integration_eula}`)}async function acceptTerms(client,argv){let spec=getFlagsSpecification(acceptTermsSubcommand.options),parsed;try{parsed=parseArguments(argv,spec)}catch(e2){return printError(e2),1}let formatResult=validateJsonOutput(parsed.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let preferJson=formatResult.jsonOutput||shouldEmitNonInteractiveCommandError(client);if(parsed.args.length<1){let msg=`Missing integration slug. Example: \`${packageName} integration accept-terms <integration>\``;return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:msg,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration discover",packageName,{prependGlobalFlags:!0}),when:"Find integration slugs"}]},1),output_manager_default.error(msg),1}if(parsed.args.length>1){let msg="Specify only one integration at a time.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg},1),output_manager_default.error(msg),1}let integrationSlug=parsed.args[0],{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found. Run `vercel switch` or use --scope."),1;client.config.currentTeam=team.id;let integration;try{integration=await fetchIntegration(client,integrationSlug)}catch(error){let msg=isAPIError(error)&&error.serverMessage||error.message;return output_manager_default.error(`Failed to load integration "${integrationSlug}": ${msg}`),1}if(integration.capabilities?.requiresBrowserInstall){let msg=`Integration "${integration.slug}" requires accepting terms in the browser (or device attestation). Use \`${packageName} integration add ${integration.slug}\` instead.`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,policy_links:getMarketplacePolicyLinks(integration),hint:"The dashboard accept-terms flow is required for this integration.",next:[{command:buildCommandWithGlobalFlags(client.argv,`integration add ${integration.slug}`,packageName,{prependGlobalFlags:!0}),when:"Open browser / complete required install steps"}]},1),output_manager_default.error(msg),1}let existing=(await fetchInstallations(client,integration)).find(i=>i.ownerId===team.id&&i.installationType==="marketplace"),policyLinks=getMarketplacePolicyLinks(integration);if(existing)return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,installationId:existing.id,alreadyInstalled:!0,policy_links:policyLinks},null,2)}
906
906
  `),0):(output_manager_default.log(`Integration ${import_chalk226.default.bold(integration.slug)} is already installed for this team.`),0);let acceptedPolicies;if(shouldEmitNonInteractiveCommandError(client)){let msg="Marketplace terms cannot be accepted in non-interactive mode. Run this command in an interactive terminal as a human.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INTEGRATION_TERMS_ACCEPTANCE_REQUIRED,message:msg,policy_links:getMarketplacePolicyLinks(integration),hint:`Open the policy links, then run \`${packageName} integration accept-terms ${integration.slug}\` interactively.`},1),output_manager_default.error(msg),1}if(acceptedPolicies=await promptForTermAcceptance(client,integration),!acceptedPolicies)return 1;try{let result=await installMarketplaceIntegration(client,integration.id,acceptedPolicies);return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,installationId:result.id,installed:!0,policy_links:policyLinks},null,2)}
907
907
  `),0):(output_manager_default.success(`Terms accepted. Integration ${import_chalk226.default.bold(integration.slug)} is installed for this team.`),logPolicyLinksSummary(policyLinks),0)}catch(error){if(isAPIError(error)&&error.status===409)return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,alreadyInstalled:!0,policy_links:policyLinks},null,2)}
908
- `),0):(output_manager_default.log(`Integration ${import_chalk226.default.bold(integration.slug)} is already installed for this team.`),0);let msg=isAPIError(error)&&error.serverMessage||error.message;return output_manager_default.error(`Failed to accept terms for "${integration.slug}": ${msg}`),1}}var COMMAND_CONFIG48={add:getCommandAliases(addSubcommand6),"accept-terms":getCommandAliases(acceptTermsSubcommand),open:getCommandAliases(openSubcommand5),list:getCommandAliases(listSubcommand15),installations:getCommandAliases(installationsSubcommand),categories:getCommandAliases(categoriesSubcommand),discover:getCommandAliases(discoverSubcommand),guide:getCommandAliases(guideSubcommand),balance:getCommandAliases(balanceSubcommand),remove:getCommandAliases(removeSubcommand11),resource:getCommandAliases(resourceSubcommand),update:getCommandAliases(updateSubcommand6)};async function main24(client){let telemetry2=new IntegrationTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(integrationCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand7(args.slice(1),COMMAND_CONFIG48),needHelp=flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:integrationCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("integration"),output_manager_default.print(help(integrationCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"add":{if(needHelp)return telemetry2.trackCliFlagHelp("integration",subcommandOriginal),await printAddDynamicHelp(client,subArgs[0],addSubcommand6,cmd2=>printHelp(cmd2),"integration add")||printHelp(addSubcommand6),0;telemetry2.trackCliSubcommandAdd(subcommandOriginal);let addFlagsSpec=getFlagsSpecification(addSubcommand6.options),addParsedArgs;try{addParsedArgs=parseArguments(subArgs,addFlagsSpec)}catch(error){return printError(error),1}return add9(client,addParsedArgs.args,addParsedArgs.flags,"integration add")}case"accept-terms":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(acceptTermsSubcommand),0):(telemetry2.trackCliSubcommandAcceptTerms(subcommandOriginal),acceptTerms(client,subArgs));case"list":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(listSubcommand15),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list20(client));case"installations":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(installationsSubcommand),0):(telemetry2.trackCliSubcommandInstallations(subcommandOriginal),installationsList(client,subArgs));case"categories":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(categoriesSubcommand),0):(telemetry2.trackCliSubcommandCategories(subcommandOriginal),categories(client,subArgs));case"discover":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(discoverSubcommand),0):(telemetry2.trackCliSubcommandDiscover(subcommandOriginal),discover(client,subArgs));case"guide":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(guideSubcommand),0):(telemetry2.trackCliSubcommandGuide(subcommandOriginal),guide(client,subArgs));case"balance":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(balanceSubcommand),0):(telemetry2.trackCliSubcommandBalance(subcommandOriginal),balance(client));case"open":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(openSubcommand5),0):(telemetry2.trackCliSubcommandOpen(subcommandOriginal),openIntegration(client,subArgs));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(removeSubcommand11),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove11(client,subArgs));case"resource":{if(subArgs.length===0&&needHelp)return telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(resourceSubcommand),0;telemetry2.trackCliSubcommandResource(subcommandOriginal);let nestedParent={...resourceSubcommand,name:"integration resource"};return dispatchResourceSubcommand(client,subArgs,!!needHelp,{helpBreadcrumb:"integration resource",parentForChildHelp:nestedParent})}case"update":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(updateSubcommand6),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update4(client,subArgs));default:{let validSubcommands=Object.keys(COMMAND_CONFIG48).join(" | "),missingSubcommand=subArgs.length===0,message=missingSubcommand?`Please specify a valid subcommand: ${validSubcommands}`:`Unknown subcommand "${subArgs[0]}". Valid subcommands: ${validSubcommands}`;return outputAgentError(client,{status:"error",reason:missingSubcommand?AGENT_REASON.MISSING_ARGUMENTS:AGENT_REASON.INVALID_ARGUMENTS,message,hint:missingSubcommand?`Pass a subcommand after \`integration\`, for example \`${packageName} integration installations\` or \`${packageName} integration list\`. Global flags such as \`--cwd\` may appear anywhere.`:`Check the spelling or run \`${packageName} integration --help\` for the list of subcommands.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration --help",packageName,{prependGlobalFlags:!0}),when:"Show all integration subcommands and options"},...missingSubcommand?[{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"List marketplace installations for the current team"}]:[]]},2),output_manager_default.error(message),2}}}var KmsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandAddKey(actual){this.trackCliSubcommand({subcommand:"add-key",value:actual})}trackCliSubcommandImportKey(actual){this.trackCliSubcommand({subcommand:"import-key",value:actual})}trackCliSubcommandActivateKey(actual){this.trackCliSubcommand({subcommand:"activate-key",value:actual})}trackCliSubcommandRevokeKey(actual){this.trackCliSubcommand({subcommand:"revoke-key",value:actual})}trackCliSubcommandAddGrant(actual){this.trackCliSubcommand({subcommand:"add-grant",value:actual})}trackCliSubcommandUpdateGrant(actual){this.trackCliSubcommand({subcommand:"update-grant",value:actual})}trackCliSubcommandRemoveGrant(actual){this.trackCliSubcommand({subcommand:"remove-grant",value:actual})}};var import_chalk229=__toESM(require_source(),1),import_pluralize16=__toESM(require_pluralize(),1);var ISSUERS_PATH="/v1/kms/issuers";function issuerPath(issuerId){return`${ISSUERS_PATH}/${encodeURIComponent(issuerId)}`}async function getIssuers(client,{limit,next}={}){let query=new URLSearchParams;limit!==void 0&&query.set("limit",String(limit)),next!==void 0&&query.set("next",next);let search2=query.toString();return client.fetch(search2?`${ISSUERS_PATH}?${search2}`:ISSUERS_PATH)}async function getIssuer(client,issuerId){return client.fetch(issuerPath(issuerId))}async function createIssuer(client,payload){return client.fetch(ISSUERS_PATH,{method:"POST",body:payload})}async function updateIssuer(client,issuerId,payload){return client.fetch(issuerPath(issuerId),{method:"PATCH",body:payload})}async function deleteIssuer(client,issuerId){await client.fetch(issuerPath(issuerId),{method:"DELETE"})}var import_chalk227=__toESM(require_source(),1),import_ms21=__toESM(require_ms(),1);function relativeAge(isoDate){let elapsed2=Date.now()-new Date(isoDate).getTime();return elapsed2>0?`${(0,import_ms21.default)(elapsed2)} ago`:(0,import_ms21.default)(-elapsed2)}function activeSigningKey(issuer){return issuer.signingKeys.find(key=>key.status==="active")}function describeKeyStatus(key){return key.status==="pending"?key.activateAt?`pending \xB7 activates in ${(0,import_ms21.default)(Math.max(0,new Date(key.activateAt).getTime()-Date.now()))}`:"pending \xB7 activate manually":key.status==="revoking"?key.revokeAt?`revoking \xB7 revoked in ${(0,import_ms21.default)(Math.max(0,new Date(key.revokeAt).getTime()-Date.now()))}`:"revoking":"active"}function formatIssuersTable(issuers){let rows=issuers.map(issuer=>{let active=activeSigningKey(issuer);return[issuer.id,issuer.name,issuer.algorithm,active?active.keyId:import_chalk227.default.gray("none"),import_chalk227.default.gray(relativeAge(issuer.createdAt))]});return formatTable(["ID","Name","Algorithm","Active Key","Age"],["l","l","l","l","l"],[{rows}])}function formatSigningKeysTable(keys){let rows=keys.map(key=>[key.keyId,key.algorithm,describeKeyStatus(key),key.importKeyId??import_chalk227.default.gray("-"),import_chalk227.default.gray(relativeAge(key.createdAt))]);return formatTable(["Key ID","Algorithm","Status","JWKS kid","Age"],["l","l","l","l","l"],[{rows}])}function formatGrantsTable(policies){let rows=policies.map(policy=>isProjectGrant(policy)?[policy.kind,policy.projectId,policy.environments.join(", "),policy.tokenClaims?"yes":import_chalk227.default.gray("no")]:[policy.kind,policy.clientId,import_chalk227.default.gray("-"),policy.tokenClaims?"yes":import_chalk227.default.gray("no")]);return formatTable(["Kind","Target","Environments","Token Claims"],["l","l","l","l"],[{rows}])}function indentTable(table3){return table3.replace(/^(.*)/gm," $1")}function printIssuerRows(issuer,gutterLabel){gutterLabel?(printAlignedLabel(gutterLabel.label,issuer.name,{gutter:gutterLabel.gutter}),printAlignedLabel("Issuer",issuer.id)):(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Name",issuer.name)),printAlignedLabel("Algorithm",issuer.algorithm),printAlignedLabel("Origin",issuer.origin),issuer.managedBy&&printAlignedLabel("Managed By",issuer.managedBy)}function printSigningKeyRows(key,gutterLabel){printAlignedLabel(gutterLabel.label,key.keyId,{gutter:gutterLabel.gutter}),printAlignedLabel("Algorithm",key.algorithm),printAlignedLabel("Status",describeKeyStatus(key)),key.importKeyId&&printAlignedLabel("JWKS kid",key.importKeyId)}var import_chalk228=__toESM(require_source(),1);var MANAGED_ISSUER_CODE="issuer_managed_by_mismatch";function handleKmsApiError(client,err,{notFound,attempted,contextName,next}){if(!isAPIError(err))return;if(err.status===404&&notFound)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_NOT_FOUND,message:notFound,next},1),output_manager_default.error(notFound),1;if(err.status===403&&err.code===MANAGED_ISSUER_CODE){let message2=`${attempted} isn't available for this issuer. It was provisioned by another Vercel service, which manages its keys and grants.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_MANAGED,message:message2},1),output_manager_default.error(message2),1}if(err.status===403){let message2=`${attempted} requires the Owner role on ${contextName}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:message2,...err.action&&{action:err.action},...typeof err.resource=="string"&&{resource:err.resource}},1),output_manager_default.error(message2),output_manager_default.log(`Ask an Owner of ${import_chalk228.default.bold(contextName)} to run it, or switch teams with ${import_chalk228.default.cyan("--scope")}.`),1}let message=err.serverMessage||err.message;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message},1),output_manager_default.error(message),1}var KmsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls8(client,argv){let telemetry2=new KmsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand16.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"kms ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]),telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching KMS issuers under ${import_chalk229.default.bold(contextName)}`);let response;try{response=await getIssuers(client,{limit:opts["--limit"],next:opts["--next"]})}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{attempted:"Listing KMS issuers",contextName});if(handled!==void 0)return handled;throw err}let{issuers,pagination}=response;if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuers,pagination,message:`${(0,import_pluralize16.default)("issuer",issuers.length,!0)} found.`,next:[{command:getCommandNamePlain("kms inspect <issuerId>"),when:"Show an issuer with its keys and grants"}]}:{issuers,pagination};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
908
+ `),0):(output_manager_default.log(`Integration ${import_chalk226.default.bold(integration.slug)} is already installed for this team.`),0);let msg=isAPIError(error)&&error.serverMessage||error.message;return output_manager_default.error(`Failed to accept terms for "${integration.slug}": ${msg}`),1}}var COMMAND_CONFIG48={add:getCommandAliases(addSubcommand6),"accept-terms":getCommandAliases(acceptTermsSubcommand),open:getCommandAliases(openSubcommand5),list:getCommandAliases(listSubcommand15),installations:getCommandAliases(installationsSubcommand),categories:getCommandAliases(categoriesSubcommand),discover:getCommandAliases(discoverSubcommand),guide:getCommandAliases(guideSubcommand),balance:getCommandAliases(balanceSubcommand),remove:getCommandAliases(removeSubcommand11),resource:getCommandAliases(resourceSubcommand),update:getCommandAliases(updateSubcommand6)};async function main24(client){let telemetry2=new IntegrationTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(integrationCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand7(args.slice(1),COMMAND_CONFIG48),needHelp=flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:integrationCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("integration"),output_manager_default.print(help(integrationCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"add":{if(needHelp)return telemetry2.trackCliFlagHelp("integration",subcommandOriginal),await printAddDynamicHelp(client,subArgs[0],addSubcommand6,cmd2=>printHelp(cmd2),"integration add")||printHelp(addSubcommand6),0;telemetry2.trackCliSubcommandAdd(subcommandOriginal);let addFlagsSpec=getFlagsSpecification(addSubcommand6.options),addParsedArgs;try{addParsedArgs=parseArguments(subArgs,addFlagsSpec)}catch(error){return printError(error),1}return add9(client,addParsedArgs.args,addParsedArgs.flags,"integration add")}case"accept-terms":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(acceptTermsSubcommand),0):(telemetry2.trackCliSubcommandAcceptTerms(subcommandOriginal),acceptTerms(client,subArgs));case"list":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(listSubcommand15),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list20(client));case"installations":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(installationsSubcommand),0):(telemetry2.trackCliSubcommandInstallations(subcommandOriginal),installationsList(client,subArgs));case"categories":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(categoriesSubcommand),0):(telemetry2.trackCliSubcommandCategories(subcommandOriginal),categories(client,subArgs));case"discover":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(discoverSubcommand),0):(telemetry2.trackCliSubcommandDiscover(subcommandOriginal),discover(client,subArgs));case"guide":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(guideSubcommand),0):(telemetry2.trackCliSubcommandGuide(subcommandOriginal),guide(client,subArgs));case"balance":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(balanceSubcommand),0):(telemetry2.trackCliSubcommandBalance(subcommandOriginal),balance(client));case"open":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(openSubcommand5),0):(telemetry2.trackCliSubcommandOpen(subcommandOriginal),openIntegration(client,subArgs));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(removeSubcommand11),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove11(client,subArgs));case"resource":{if(subArgs.length===0&&needHelp)return telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(resourceSubcommand),0;telemetry2.trackCliSubcommandResource(subcommandOriginal);let nestedParent={...resourceSubcommand,name:"integration resource"};return dispatchResourceSubcommand(client,subArgs,!!needHelp,{helpBreadcrumb:"integration resource",parentForChildHelp:nestedParent})}case"update":return needHelp?(telemetry2.trackCliFlagHelp("integration",subcommandOriginal),printHelp(updateSubcommand6),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update4(client,subArgs));default:{let validSubcommands=Object.keys(COMMAND_CONFIG48).join(" | "),missingSubcommand=subArgs.length===0,message=missingSubcommand?`Please specify a valid subcommand: ${validSubcommands}`:`Unknown subcommand "${subArgs[0]}". Valid subcommands: ${validSubcommands}`;return outputAgentError(client,{status:"error",reason:missingSubcommand?AGENT_REASON.MISSING_ARGUMENTS:AGENT_REASON.INVALID_ARGUMENTS,message,hint:missingSubcommand?`Pass a subcommand after \`integration\`, for example \`${packageName} integration installations\` or \`${packageName} integration list\`. Global flags such as \`--cwd\` may appear anywhere.`:`Check the spelling or run \`${packageName} integration --help\` for the list of subcommands.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration --help",packageName,{prependGlobalFlags:!0}),when:"Show all integration subcommands and options"},...missingSubcommand?[{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"List marketplace installations for the current team"}]:[]]},2),output_manager_default.error(message),2}}}var KmsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandAddKey(actual){this.trackCliSubcommand({subcommand:"add-key",value:actual})}trackCliSubcommandImportKey(actual){this.trackCliSubcommand({subcommand:"import-key",value:actual})}trackCliSubcommandActivateKey(actual){this.trackCliSubcommand({subcommand:"activate-key",value:actual})}trackCliSubcommandRevokeKey(actual){this.trackCliSubcommand({subcommand:"revoke-key",value:actual})}trackCliSubcommandAddGrant(actual){this.trackCliSubcommand({subcommand:"add-grant",value:actual})}trackCliSubcommandUpdateGrant(actual){this.trackCliSubcommand({subcommand:"update-grant",value:actual})}trackCliSubcommandRemoveGrant(actual){this.trackCliSubcommand({subcommand:"remove-grant",value:actual})}};var import_chalk229=__toESM(require_source(),1),import_pluralize16=__toESM(require_pluralize(),1);var ISSUERS_PATH="/v1/kms/issuers";function issuerPath(issuerId){return`${ISSUERS_PATH}/${encodeURIComponent(issuerId)}`}async function getIssuers(client,{limit,next}={}){let query=new URLSearchParams;limit!==void 0&&query.set("limit",String(limit)),next!==void 0&&query.set("next",next);let search3=query.toString();return client.fetch(search3?`${ISSUERS_PATH}?${search3}`:ISSUERS_PATH)}async function getIssuer(client,issuerId){return client.fetch(issuerPath(issuerId))}async function createIssuer(client,payload){return client.fetch(ISSUERS_PATH,{method:"POST",body:payload})}async function updateIssuer(client,issuerId,payload){return client.fetch(issuerPath(issuerId),{method:"PATCH",body:payload})}async function deleteIssuer(client,issuerId){await client.fetch(issuerPath(issuerId),{method:"DELETE"})}var import_chalk227=__toESM(require_source(),1),import_ms21=__toESM(require_ms(),1);function relativeAge(isoDate){let elapsed2=Date.now()-new Date(isoDate).getTime();return elapsed2>0?`${(0,import_ms21.default)(elapsed2)} ago`:(0,import_ms21.default)(-elapsed2)}function activeSigningKey(issuer){return issuer.signingKeys.find(key=>key.status==="active")}function describeKeyStatus(key){return key.status==="pending"?key.activateAt?`pending \xB7 activates in ${(0,import_ms21.default)(Math.max(0,new Date(key.activateAt).getTime()-Date.now()))}`:"pending \xB7 activate manually":key.status==="revoking"?key.revokeAt?`revoking \xB7 revoked in ${(0,import_ms21.default)(Math.max(0,new Date(key.revokeAt).getTime()-Date.now()))}`:"revoking":"active"}function formatIssuersTable(issuers){let rows=issuers.map(issuer=>{let active=activeSigningKey(issuer);return[issuer.id,issuer.name,issuer.algorithm,active?active.keyId:import_chalk227.default.gray("none"),import_chalk227.default.gray(relativeAge(issuer.createdAt))]});return formatTable(["ID","Name","Algorithm","Active Key","Age"],["l","l","l","l","l"],[{rows}])}function formatSigningKeysTable(keys){let rows=keys.map(key=>[key.keyId,key.algorithm,describeKeyStatus(key),key.importKeyId??import_chalk227.default.gray("-"),import_chalk227.default.gray(relativeAge(key.createdAt))]);return formatTable(["Key ID","Algorithm","Status","JWKS kid","Age"],["l","l","l","l","l"],[{rows}])}function formatGrantsTable(policies){let rows=policies.map(policy=>isProjectGrant(policy)?[policy.kind,policy.projectId,policy.environments.join(", "),policy.tokenClaims?"yes":import_chalk227.default.gray("no")]:[policy.kind,policy.clientId,import_chalk227.default.gray("-"),policy.tokenClaims?"yes":import_chalk227.default.gray("no")]);return formatTable(["Kind","Target","Environments","Token Claims"],["l","l","l","l"],[{rows}])}function indentTable(table3){return table3.replace(/^(.*)/gm," $1")}function printIssuerRows(issuer,gutterLabel){gutterLabel?(printAlignedLabel(gutterLabel.label,issuer.name,{gutter:gutterLabel.gutter}),printAlignedLabel("Issuer",issuer.id)):(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Name",issuer.name)),printAlignedLabel("Algorithm",issuer.algorithm),printAlignedLabel("Origin",issuer.origin),issuer.managedBy&&printAlignedLabel("Managed By",issuer.managedBy)}function printSigningKeyRows(key,gutterLabel){printAlignedLabel(gutterLabel.label,key.keyId,{gutter:gutterLabel.gutter}),printAlignedLabel("Algorithm",key.algorithm),printAlignedLabel("Status",describeKeyStatus(key)),key.importKeyId&&printAlignedLabel("JWKS kid",key.importKeyId)}var import_chalk228=__toESM(require_source(),1);var MANAGED_ISSUER_CODE="issuer_managed_by_mismatch";function handleKmsApiError(client,err,{notFound,attempted,contextName,next}){if(!isAPIError(err))return;if(err.status===404&&notFound)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_NOT_FOUND,message:notFound,next},1),output_manager_default.error(notFound),1;if(err.status===403&&err.code===MANAGED_ISSUER_CODE){let message2=`${attempted} isn't available for this issuer. It was provisioned by another Vercel service, which manages its keys and grants.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_MANAGED,message:message2},1),output_manager_default.error(message2),1}if(err.status===403){let message2=`${attempted} requires the Owner role on ${contextName}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:message2,...err.action&&{action:err.action},...typeof err.resource=="string"&&{resource:err.resource}},1),output_manager_default.error(message2),output_manager_default.log(`Ask an Owner of ${import_chalk228.default.bold(contextName)} to run it, or switch teams with ${import_chalk228.default.cyan("--scope")}.`),1}let message=err.serverMessage||err.message;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message},1),output_manager_default.error(message),1}var KmsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls8(client,argv){let telemetry2=new KmsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand16.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"kms ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]),telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching KMS issuers under ${import_chalk229.default.bold(contextName)}`);let response;try{response=await getIssuers(client,{limit:opts["--limit"],next:opts["--next"]})}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{attempted:"Listing KMS issuers",contextName});if(handled!==void 0)return handled;throw err}let{issuers,pagination}=response;if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuers,pagination,message:`${(0,import_pluralize16.default)("issuer",issuers.length,!0)} found.`,next:[{command:getCommandNamePlain("kms inspect <issuerId>"),when:"Show an issuer with its keys and grants"}]}:{issuers,pagination};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
909
909
  `),0}if(issuers.length===0)return output_manager_default.log(`No issuers found under ${import_chalk229.default.bold(contextName)}. Run ${getCommandName("kms add <name>")} to create one.`),0;if(output_manager_default.log(`${(0,import_pluralize16.default)("issuer",issuers.length,!0)} found under ${import_chalk229.default.bold(contextName)} ${import_chalk229.default.gray(lsStamp())}`),output_manager_default.print(indentTable(formatIssuersTable(issuers))),output_manager_default.print(`
910
910
 
911
911
  `),pagination.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page, run ${getCommandName(`kms ls${flags} --next ${pagination.next}`)}`)}return 0}var import_chalk231=__toESM(require_source(),1);var import_chalk230=__toESM(require_source(),1);function kmsSuggestion(subcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${subcommand} ${globalFlags.join(" ")}`:subcommand;return getCommandNamePlain(full)}function missingArgument(client,options){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:options.reason,message:options.message,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers to find an ID"},{command:kmsSuggestion(options.usage,client.argv)}]},1),output_manager_default.error(options.message),output_manager_default.log(`Usage: ${import_chalk230.default.cyan(getCommandName(options.usage))}`),1}function invalidArgumentCount(client,usage2){let message=`Too many arguments. Usage: ${getCommandNamePlain(usage2)}`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},1),output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk230.default.cyan(getCommandName(usage2))}`),1}function invalidInput(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},1),output_manager_default.error(message),1}var KmsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE="kms inspect <issuerId>";async function inspect15(client,argv){let telemetry2=new KmsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand10.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry2.trackCliArgumentIssuerId(issuerId),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE});if(args.length>1)return invalidArgumentCount(client,USAGE);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client);client.nonInteractive||output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Reading this issuer",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuer,message:`Issuer ${issuer.id} found.`,next:[{command:getCommandNamePlain(`kms add-key ${issuer.id}`),when:"Rotate to a new signing key"}]}:issuer;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
@@ -940,12 +940,12 @@ ${table(lines,{hsep:2}).replace(/^/gm," ")}
940
940
  `),0}return printAlignedLabel("Updated",grant.projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Environments",grant.environments.join(", ")),printAlignedLabel("Token Claims",grant.tokenClaims?"set":import_chalk236.default.gray("none")),output_manager_default.print(`
941
941
  `),output_manager_default.log(`Inspect the issuer: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var KmsRmGrantTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliArgumentProjectId(projectId){projectId&&this.trackCliArgument({arg:"projectId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var USAGE12="kms rm-grant <issuerId> <projectId>";async function rmGrant(client,argv){let telemetry2=new KmsRmGrantTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeGrantSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[issuerId,projectId]=args;if(telemetry2.trackCliArgumentIssuerId(issuerId),telemetry2.trackCliArgumentProjectId(projectId),telemetry2.trackCliFlagYes(opts["--yes"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:`${USAGE12} --yes`});if(!projectId)return missingArgument(client,{reason:AGENT_REASON.MISSING_PROJECT,message:`A project ID is required. Run ${getCommandNamePlain(`kms inspect ${issuerId}`)} to list the issuer's grants.`,usage:`${USAGE12} --yes`});if(args.length>2)return invalidArgumentCount(client,USAGE12);let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Removing a grant stops the project from signing new tokens with this issuer. Re-run with --yes to confirm.",next:[{command:buildCommandWithYes(client.argv)}]},1);let{contextName}=await getScope(client),grant;if(!skipConfirmation){output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Removing a project grant",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),grant=issuer.policies.filter(isProjectGrant).find(policy=>policy.projectId===projectId),!grant){let message=`No grant for project ${projectId} on issuer ${issuerId}.`;return output_manager_default.error(message),output_manager_default.log(`Run ${getCommandName(`kms inspect ${issuerId}`)} to list its grants.`),1}if(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Project",grant.projectId),printAlignedLabel("Environments",grant.environments.join(", ")),output_manager_default.print(`
942
942
  `),!await client.input.confirm(`Remove ${param(grant.projectId)}'s access to this issuer?`,!1))return output_manager_default.log("Canceled"),0}client.nonInteractive||output_manager_default.spinner(`Removing grant for ${projectId}`);try{await deleteProjectGrant(client,issuerId,projectId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`No grant for project ${projectId} on issuer ${issuerId}.`,attempted:"Removing a project grant",contextName,next:[{command:kmsSuggestion(`kms inspect ${issuerId}`,client.argv),when:"List the issuer's grants"}]});if(handled!==void 0)return handled;throw err}return output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,grant:{issuerId,projectId},message:`Grant for project ${projectId} removed.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer's remaining grants"}]},null,2)}
943
- `),0):(printAlignedLabel("Removed",projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Team",contextName),0)}var COMMAND_CONFIG49={list:getCommandAliases(listSubcommand16),inspect:getCommandAliases(inspectSubcommand10),add:getCommandAliases(addSubcommand7),import:getCommandAliases(importSubcommand2),update:getCommandAliases(updateSubcommand7),remove:getCommandAliases(removeSubcommand12),"add-key":getCommandAliases(addKeySubcommand),"import-key":getCommandAliases(importKeySubcommand),"activate-key":getCommandAliases(activateKeySubcommand),"revoke-key":getCommandAliases(revokeKeySubcommand),"add-grant":getCommandAliases(addGrantSubcommand),"update-grant":getCommandAliases(updateGrantSubcommand),"remove-grant":getCommandAliases(removeGrantSubcommand)};async function main25(client){let parsedArgs,flagsSpecification=getFlagsSpecification(kmsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new KmsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG49),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("kms"),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:kmsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(listSubcommand16)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls8(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(inspectSubcommand10)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect15(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addSubcommand7)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add10(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importSubcommand2)):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importIssuer(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateSubcommand7)):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update5(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeSubcommand12)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm8(client,args));case"add-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addKeySubcommand)):(telemetry2.trackCliSubcommandAddKey(subcommandOriginal),addKey(client,args));case"import-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importKeySubcommand)):(telemetry2.trackCliSubcommandImportKey(subcommandOriginal),importKey(client,args));case"activate-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(activateKeySubcommand)):(telemetry2.trackCliSubcommandActivateKey(subcommandOriginal),activateKey(client,args));case"revoke-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(revokeKeySubcommand)):(telemetry2.trackCliSubcommandRevokeKey(subcommandOriginal),revokeKey(client,args));case"add-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addGrantSubcommand)):(telemetry2.trackCliSubcommandAddGrant(subcommandOriginal),addGrant(client,args));case"update-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateGrantSubcommand)):(telemetry2.trackCliSubcommandUpdateGrant(subcommandOriginal),updateGrant(client,args));case"remove-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeGrantSubcommand)):(telemetry2.trackCliSubcommandRemoveGrant(subcommandOriginal),rmGrant(client,args));default:return args.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG49)),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls8(client,args))}}var import_error_utils18=__toESM(require_dist(),1);var LogoutTelemetryClient=class extends TelemetryClient{};var import_error_utils17=__toESM(require_dist(),1);async function logout(client){let{authConfig}=client;if(!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let revocationResponse=await revocationRequest({token:authConfig.token});output_manager_default.debug(`'Revocation response:', ${await revocationResponse.clone().text()}`);let[revocationError]=await processRevocationResponse(revocationResponse),logoutError=!1;revocationError&&(output_manager_default.error(revocationError.message),output_manager_default.debug(revocationError.cause),output_manager_default.error("Failed during logout"),logoutError=!0);try{if(client.updateConfig({currentTeam:void 0}),client.writeToConfigFile(),client.emptyAuthConfig(),client.persistAuthConfig(),output_manager_default.debug("Configuration has been deleted"),!logoutError)return output_manager_default.success("Logged out!"),0}catch(err){output_manager_default.debug((0,import_error_utils17.errorToString)(err)),output_manager_default.error("Failed during logout")}return 1}async function logout2(client){let{authConfig,config}=client,parsedArgs=null,flagsSpecification=getFlagsSpecification(logoutCommand.options),telemetry2=new LogoutTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("logout"),output_manager_default.print(help(logoutCommand,{columns:client.stderr.columns})),0;if("refreshToken"in authConfig)return await logout(client);if(output_manager_default.debug("Falling back to legacy logout"),!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let exitCode2=0;try{await client.fetch("/v3/user/tokens/current",{method:"DELETE",useCurrentTeam:!1})}catch(err){isAPIError(err)&&(err.status===403?output_manager_default.debug("Token is invalid so it cannot be revoked"):err.status!==200&&(output_manager_default.debug(err?.message??""),exitCode2=1))}delete config.currentTeam,delete authConfig.token,delete authConfig.userId;try{authConfig.skipWrite||(writeToConfigFile(config),persistAuthConfig(authConfig,config)),output_manager_default.debug("Configuration has been deleted")}catch(err){output_manager_default.debug((0,import_error_utils18.errorToString)(err)),exitCode2=1}return exitCode2===0?output_manager_default.log("Logged out!"):output_manager_default.error("Failed during logout"),exitCode2}var import_error_utils19=__toESM(require_dist(),1),import_chalk237=__toESM(require_source(),1),import_format38=__toESM(require_format(),1);var import_ms22=__toESM(require_ms(),1),LOG_LEVEL_SEVERITY={info:0,warning:1,error:2,fatal:3};function getLogLevelSeverity(level){return LOG_LEVEL_SEVERITY[level]??-1}function getDisplayLog(logs2,requestedLevels){if(logs2.length===0)return;let matchingLogs=requestedLevels&&requestedLevels.length>0?logs2.filter(log=>requestedLevels.includes(log.level)):logs2;return(matchingLogs.length>0?matchingLogs:logs2).reduce((selected,current)=>getLogLevelSeverity(current.level)>getLogLevelSeverity(selected.level)?current:selected)}function parseRelativeTime(input){if(input==="now")return Date.now();let now=Date.now(),msValue=(0,import_ms22.default)(input);if(typeof msValue=="number")return now-msValue;let date=new Date(input);if(!isNaN(date.getTime()))return date.getTime();throw new Error(`Invalid time format: ${input}`)}async function fetchRequestLogs(client,options){let{projectId,ownerId,deploymentId,environment,level,statusCode,source,since,until,search:search2,requestId,branch,page=0}=options,now=Date.now(),defaultStartDate=now-24*60*60*1e3,query=new URLSearchParams;query.set("projectId",projectId),query.set("ownerId",ownerId),query.set("page",String(page)),query.set("startDate",String(since?parseRelativeTime(since):defaultStartDate)),query.set("endDate",String(until?parseRelativeTime(until):now)),deploymentId&&query.set("deploymentId",deploymentId),environment&&query.set("environment",environment),level&&level.length>0&&query.set("level",level.join(",")),statusCode&&query.set("statusCode",statusCode),source&&source.length>0&&query.set("source",source.join(",")),search2&&query.set("search",search2),requestId&&query.set("requestId",requestId),branch&&query.set("branch",branch);let url=`${client.apiUrl==="https://api.vercel.com"?"https://vercel.com":client.apiUrl}/api/logs/request-logs?${query.toString()}`,data=await client.fetch(url);return{logs:(data.rows||[]).map(row=>{let requestLogs=(row.logs||[]).map(log=>({level:log.level||"info",message:log.message||"",messageTruncated:log.messageTruncated})),displayLog=getDisplayLog(requestLogs,options.level),firstEvent=row.events?.[0];return{id:row.requestId||"",timestamp:row.timestamp?new Date(row.timestamp).getTime():Date.now(),deploymentId:row.deploymentId||"",projectId:options.projectId,level:displayLog?.level||"info",message:displayLog?.message||"",messageTruncated:displayLog?.messageTruncated,source:firstEvent?.source||"static",domain:row.domain||"",requestMethod:row.requestMethod||"",requestPath:row.requestPath||"",responseStatusCode:row.statusCode||0,environment:row.environment||"production",branch:row.branch,cache:row.cache,cacheReason:row.cacheReason,pprState:row.pprState,traceId:row.traceId,logs:requestLogs}}),pagination:{hasMore:data.hasMoreRows??!1}}}async function*fetchAllRequestLogs(client,options){let page=0,remaining=options.limit??100,hasMore=!0;for(;hasMore&&remaining>0;){let response=await fetchRequestLogs(client,{...options,page});if(!response.logs||response.logs.length===0)break;for(let log of response.logs)if(yield log,remaining--,remaining<=0)return;hasMore=response.pagination?.hasMore??!1,page++}}var LogsTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(v){v&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliOptionDeployment(v){v&&this.trackCliOption({option:"deployment",value:this.redactedValue})}trackCliOptionEnvironment(v){if(v){let allowed=["production","preview"].includes(v)?v:this.redactedValue;this.trackCliOption({option:"environment",value:allowed})}}trackCliOptionLevel(v){if(v&&v.length>0){let allowedLevels=["error","warning","info","fatal"],sanitized=v.every(l=>allowedLevels.includes(l))?v.join(","):this.redactedValue;this.trackCliOption({option:"level",value:sanitized})}}trackCliOptionStatusCode(v){v&&this.trackCliOption({option:"status-code",value:this.redactedValue})}trackCliOptionSource(v){if(v&&v.length>0){let allowedSources=["serverless","edge-function","edge-middleware","static"],sanitized=v.every(s=>allowedSources.includes(s))?v.join(","):this.redactedValue;this.trackCliOption({option:"source",value:sanitized})}}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}trackCliFlagFollow(v){v&&this.trackCliFlag("follow")}trackCliFlagNoFollow(v){v&&this.trackCliFlag("no-follow")}trackCliOptionQuery(v){v&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionRequestId(v){v&&this.trackCliOption({option:"request-id",value:this.redactedValue})}trackCliFlagExpand(v){v&&this.trackCliFlag("expand")}trackCliOptionBranch(v){v&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagNoBranch(v){v&&this.trackCliFlag("no-branch")}};async function getLatestDeployment(client,projectId,filters={}){let query=new URLSearchParams;query.set("projectId",projectId),query.set("limit","1"),query.set("state","READY"),filters.branch&&query.set("branch",filters.branch),filters.userId&&query.set("users",filters.userId),filters.target&&query.set("target",filters.target);let{deployments}=await client.fetch(`/v6/deployments?${query}`);return deployments.length===0?null:{id:deployments[0].uid,url:deployments[0].url}}async function getActiveProductionDeployment(client,projectId){try{let{deployment}=await client.fetch(`/projects/${encodeURIComponent(projectId)}/production-deployment`);return deployment}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function resolveFollowDeployment({branch,client,environment,logsTarget}){let{deployment,orgSlug,projectId,projectSlug}=logsTarget;if(deployment?.id)return{deploymentId:deployment.id,label:"deployment"};if(branch){output_manager_default.spinner(`Finding latest deployment for branch "${branch}"`,1e3);let branchDeployment=await getLatestDeployment(client,projectId,{branch,target:environment});if(output_manager_default.stopSpinner(),branchDeployment)return output_manager_default.debug(`Found deployment ${branchDeployment.id} for branch ${branch}`),{deploymentId:branchDeployment.id,label:`latest deployment on branch "${branch}"`};let environmentLabel=environment?` ${environment}`:"",deployHint=environment?`Deploy that branch to ${environment} first`:"Deploy that branch first";return output_manager_default.error(`No READY${environmentLabel} deployments found for branch "${branch}" in ${formatProject(orgSlug,projectSlug)}. ${deployHint} or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1}}if(environment==="production"){output_manager_default.spinner("Finding production deployment",1e3);let productionDeployment2=await getActiveProductionDeployment(client,projectId);return output_manager_default.stopSpinner(),productionDeployment2?(output_manager_default.debug(`Found production deployment ${productionDeployment2.id} (${productionDeployment2.url})`),{deploymentId:productionDeployment2.id,label:"production deployment"}):(output_manager_default.error(`No active production deployment found for ${formatProject(orgSlug,projectSlug)}. Deploy or promote to production first, or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}if(environment==="preview"){let user2=await getUser(client);output_manager_default.spinner("Finding your latest deployment",1e3);let userDeployment2=await getLatestDeployment(client,projectId,{userId:user2.id,target:"preview"});return output_manager_default.stopSpinner(),userDeployment2?(output_manager_default.debug(`Found latest deployment ${userDeployment2.id} (${userDeployment2.url}) created by current user`),{deploymentId:userDeployment2.id,label:"your latest deployment"}):(output_manager_default.error(`No READY preview deployments found for ${formatProject(orgSlug,projectSlug)}. Deploy a preview first or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}output_manager_default.spinner("Finding production deployment",1e3);let productionDeployment=await getActiveProductionDeployment(client,projectId);if(output_manager_default.stopSpinner(),productionDeployment)return output_manager_default.debug(`Found production deployment ${productionDeployment.id} (${productionDeployment.url})`),{deploymentId:productionDeployment.id,label:"production deployment"};let user=await getUser(client);output_manager_default.spinner("Finding your latest deployment",1e3);let userDeployment=await getLatestDeployment(client,projectId,{userId:user.id});return output_manager_default.stopSpinner(),userDeployment?(output_manager_default.debug(`Found latest deployment ${userDeployment.id} (${userDeployment.url}) created by current user`),{deploymentId:userDeployment.id,label:"your latest deployment"}):(output_manager_default.error(`No READY deployments found for ${formatProject(orgSlug,projectSlug)}. Deploy first or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}var TIME_ONLY_FORMAT="HH:mm:ss.SS",DATE_TIME_FORMAT="MMM DD HH:mm:ss.SS";function table2({columns,rows,tableWidth,formatHeader,formatRow}){let zeroPad=[0,0],maxWidths=columns.map(col=>{let headerWidth=col.label.length;return Math.max(headerWidth,...rows.map(row=>col.getValue(row).length))}),colPaddings=columns.map(col=>col.padding??zeroPad),finalWidths=[],usedWidth=0,stretchIndex=-1;for(let i=0;i<columns.length;i++){let col=columns[i],padding2=colPaddings[i][0]+colPaddings[i][1];col.width==="stretch"?(stretchIndex=i,finalWidths.push(0)):typeof col.width=="number"?(finalWidths.push(col.width),usedWidth+=col.width+padding2):(finalWidths.push(maxWidths[i]),usedWidth+=maxWidths[i]+padding2)}if(usedWidth+=(columns.length-1)*2,stretchIndex>=0){let stretchPadding=colPaddings[stretchIndex][0]+colPaddings[stretchIndex][1];finalWidths[stretchIndex]=Math.max(10,tableWidth-usedWidth-stretchPadding)}let pad=(value,width)=>value.length>width?value.slice(0,width-1)+"\u2026":value.padEnd(width),headerStr=columns.map((col,i)=>{let padded=pad(col.label,finalWidths[i]);return" ".repeat(colPaddings[i][0])+padded+" ".repeat(colPaddings[i][1])}).join(" "),header=formatHeader?formatHeader(headerStr):headerStr,formattedRows=rows.map(row=>{let rowStr=columns.map((col,i)=>{let value=col.getValue(row),padded=pad(value,finalWidths[i]),formatted=col.format?col.format(padded,row):padded;return" ".repeat(colPaddings[i][0])+formatted+" ".repeat(colPaddings[i][1])}).join(" ");return formatRow?formatRow(rowStr,row):rowStr});return{header,rows:formattedRows}}function logsSpanMultipleDays(logs2){if(logs2.length===0)return!1;let firstDay=new Date(logs2[0].timestamp).toDateString();return logs2.some(log=>new Date(log.timestamp).toDateString()!==firstDay)}function parseLevels(levels){return levels?typeof levels=="string"?[levels]:levels:[]}function parseSources(sources){return sources?typeof sources=="string"?[sources]:sources:[]}function isNonLiveTerminalDeployment(deployment){return deployment.readyState==="ERROR"||deployment.readyState==="CANCELED"}function getInspectCommand(deployment,contextName,{plain=!1}={}){let scopeOption=contextName?` --scope ${contextName}`:"",command2=`inspect https://${deployment.url}${scopeOption}`;return plain?`\`${getCommandNamePlain(command2)}\``:getCommandName(command2)}function printNonLiveDeploymentError(deployment,contextName){let inspectCommand2=getInspectCommand(deployment,contextName);output_manager_default.error(`Logs are unavailable because deployment ${import_chalk237.default.bold(deployment.id)} never reached READY and ended in ${deployment.readyState}.
944
- Run ${inspectCommand2} for deployment details.`)}async function resolveLogsTarget(client,{contextName,deploymentOption,projectOption}){if(deploymentOption){output_manager_default.spinner(`Resolving deployment "${deploymentOption}"`,1e3);let deployment;try{deployment=await getDeployment(client,contextName,deploymentOption)}catch(err){if(err instanceof DeploymentNotFound)return output_manager_default.error(`Deployment not found: ${deploymentOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(err instanceof InvalidDeploymentId)return output_manager_default.error(`Invalid deployment ID: ${deploymentOption}`),{exitCode:1};throw err}finally{output_manager_default.stopSpinner()}if(!deployment.projectId)return output_manager_default.error("Deployment is not associated with a project."),{exitCode:1};output_manager_default.spinner(`Fetching project "${deployment.projectId}"`,1e3);let project=await getProjectByNameOrId(client,deployment.projectId);if(output_manager_default.stopSpinner(),project instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${deployment.projectId} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(projectOption){output_manager_default.spinner(`Fetching project "${projectOption}"`,1e3);let explicitProject=await getProjectByNameOrId(client,projectOption);if(output_manager_default.stopSpinner(),explicitProject instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${projectOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(explicitProject.id!==project.id)return output_manager_default.error(`The deployment "${deploymentOption}" does not belong to "${projectOption}" project. Remove either the deployment selection or the ${import_chalk237.default.bold("--project")} option.`),{exitCode:1}}return{projectId:project.id,projectSlug:project.name,orgSlug:contextName,ownerId:project.accountId,deployment,targetSource:"deployment"}}if(projectOption){output_manager_default.spinner(`Fetching project "${projectOption}"`,1e3);let project=await getProjectByNameOrId(client,projectOption);return output_manager_default.stopSpinner(),project instanceof ProjectNotFound?(output_manager_default.error(`Project not found: ${projectOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1}):{projectId:project.id,projectSlug:project.name,orgSlug:contextName,ownerId:project.accountId,targetSource:"explicit-project"}}let link=await getLinkedProject(client);return link.status==="error"?{exitCode:link.exitCode}:link.status==="not_linked"?(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Run ${getCommandName("link")} to begin, or specify a project with ${import_chalk237.default.bold("--project")}.`),{exitCode:1}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{projectId:link.project.id,projectSlug:link.project.name,orgSlug:link.org.slug,ownerId:link.org.id,targetSource:"linked-project"})}async function logs(client){let parsedArguments,flagsSpecification=getFlagsSpecification(logsCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),output_manager_default.print(help(logsCommand,{columns:client.stderr.columns})),1}let telemetry2=new LogsTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArguments.flags["--help"])return telemetry2.trackCliFlagHelp("logs"),output_manager_default.print(help(logsCommand,{columns:client.stderr.columns})),0;let subArgs=parsedArguments.args.slice(1),[deploymentArgument]=subArgs,projectOption=parsedArguments.flags["--project"],deploymentFlag=parsedArguments.flags["--deployment"],environmentOption=parsedArguments.flags["--environment"],deploymentOption=deploymentFlag;if(deploymentArgument){let deploymentIdOrHost=deploymentArgument;try{deploymentIdOrHost=new URL(deploymentArgument).hostname}catch{}deploymentOption=deploymentIdOrHost}let levelOption=parsedArguments.flags["--level"],statusCodeOption=parsedArguments.flags["--status-code"],sourceOption=parsedArguments.flags["--source"],sinceOption=parsedArguments.flags["--since"],untilOption=parsedArguments.flags["--until"],limitOption=parsedArguments.flags["--limit"],jsonOption=parsedArguments.flags["--json"],queryOption=parsedArguments.flags["--query"],searchOption=parsedArguments.flags["--search"],requestIdOption=parsedArguments.flags["--request-id"],expandOption=parsedArguments.flags["--expand"],branchFlagValue=parsedArguments.flags["--branch"],noBranchFlagValue=parsedArguments.flags["--no-branch"],noFollowFlagValue=parsedArguments.flags["--no-follow"],followOption=parsedArguments.flags["--follow"];if(telemetry2.trackCliArgumentUrlOrDeploymentId(deploymentArgument),telemetry2.trackCliOptionProject(projectOption),telemetry2.trackCliOptionDeployment(deploymentFlag),telemetry2.trackCliOptionEnvironment(environmentOption),telemetry2.trackCliOptionLevel(levelOption),telemetry2.trackCliOptionStatusCode(statusCodeOption),telemetry2.trackCliOptionSource(sourceOption),telemetry2.trackCliOptionSince(sinceOption),telemetry2.trackCliOptionUntil(untilOption),telemetry2.trackCliOptionLimit(limitOption),telemetry2.trackCliFlagJson(jsonOption),telemetry2.trackCliFlagFollow(followOption),telemetry2.trackCliFlagNoFollow(noFollowFlagValue),telemetry2.trackCliOptionQuery(queryOption),telemetry2.trackCliOptionSearch(searchOption),telemetry2.trackCliOptionRequestId(requestIdOption),telemetry2.trackCliFlagExpand(expandOption),telemetry2.trackCliOptionBranch(branchFlagValue),telemetry2.trackCliFlagNoBranch(noBranchFlagValue),followOption){let usedIncompatible=[{flag:"--level",value:levelOption},{flag:"--status-code",value:statusCodeOption},{flag:"--source",value:sourceOption},{flag:"--since",value:sinceOption},{flag:"--until",value:untilOption},{flag:"--limit",value:limitOption},{flag:"--query",value:queryOption},{flag:"--search",value:searchOption},{flag:"--request-id",value:requestIdOption}].filter(f=>f.value!==void 0&&f.value!==null).map(f=>import_chalk237.default.bold(f.flag));if(usedIncompatible.length>0)return output_manager_default.error(`The ${import_chalk237.default.bold("--follow")} flag does not support filtering. Remove: ${usedIncompatible.join(", ")}`),1}let contextName;try{({contextName}=await getScope(client))}catch(err){if((0,import_error_utils19.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return output_manager_default.error(err.message),1;throw err}let logsTarget=await resolveLogsTarget(client,{contextName,deploymentOption,projectOption});if("exitCode"in logsTarget)return logsTarget.exitCode;let{projectId,projectSlug,orgSlug,ownerId,deployment}=logsTarget,deploymentId=deployment?.id;if(deployment&&isNonLiveTerminalDeployment(deployment)){let inspectContextName=detectExplicitScope(client)?contextName:void 0,inspectCommand2=getInspectCommand(deployment,inspectContextName,{plain:!0});return jsonOption?client.stdout.write(`${JSON.stringify({type:"deployment_error",message:`Logs are unavailable because deployment ${deployment.id} never reached READY and ended in ${deployment.readyState}. Run ${inspectCommand2} for deployment details.`})}
945
- `):printNonLiveDeploymentError(deployment,inspectContextName),1}let branchOption=typeof branchFlagValue=="string"?branchFlagValue:void 0;if(environmentOption&&!["production","preview"].includes(environmentOption))return output_manager_default.error(`Invalid environment: ${environmentOption}. Must be "production" or "preview".`),1;if(followOption){let followDeployment=await resolveFollowDeployment({branch:branchOption,client,environment:environmentOption,logsTarget});if("exitCode"in followDeployment)return followDeployment.exitCode;jsonOption||output_manager_default.print(`Streaming logs for ${followDeployment.label} ${import_chalk237.default.bold(followDeployment.deploymentId)} starting from ${import_chalk237.default.bold((0,import_format38.default)(Date.now(),TIME_ONLY_FORMAT))}
943
+ `),0):(printAlignedLabel("Removed",projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Team",contextName),0)}var COMMAND_CONFIG49={list:getCommandAliases(listSubcommand16),inspect:getCommandAliases(inspectSubcommand10),add:getCommandAliases(addSubcommand7),import:getCommandAliases(importSubcommand2),update:getCommandAliases(updateSubcommand7),remove:getCommandAliases(removeSubcommand12),"add-key":getCommandAliases(addKeySubcommand),"import-key":getCommandAliases(importKeySubcommand),"activate-key":getCommandAliases(activateKeySubcommand),"revoke-key":getCommandAliases(revokeKeySubcommand),"add-grant":getCommandAliases(addGrantSubcommand),"update-grant":getCommandAliases(updateGrantSubcommand),"remove-grant":getCommandAliases(removeGrantSubcommand)};async function main25(client){let parsedArgs,flagsSpecification=getFlagsSpecification(kmsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new KmsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG49),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("kms"),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:kmsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(listSubcommand16)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls8(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(inspectSubcommand10)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect15(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addSubcommand7)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add10(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importSubcommand2)):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importIssuer(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateSubcommand7)):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update5(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeSubcommand12)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm8(client,args));case"add-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addKeySubcommand)):(telemetry2.trackCliSubcommandAddKey(subcommandOriginal),addKey(client,args));case"import-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importKeySubcommand)):(telemetry2.trackCliSubcommandImportKey(subcommandOriginal),importKey(client,args));case"activate-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(activateKeySubcommand)):(telemetry2.trackCliSubcommandActivateKey(subcommandOriginal),activateKey(client,args));case"revoke-key":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(revokeKeySubcommand)):(telemetry2.trackCliSubcommandRevokeKey(subcommandOriginal),revokeKey(client,args));case"add-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addGrantSubcommand)):(telemetry2.trackCliSubcommandAddGrant(subcommandOriginal),addGrant(client,args));case"update-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateGrantSubcommand)):(telemetry2.trackCliSubcommandUpdateGrant(subcommandOriginal),updateGrant(client,args));case"remove-grant":return needHelp?(telemetry2.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeGrantSubcommand)):(telemetry2.trackCliSubcommandRemoveGrant(subcommandOriginal),rmGrant(client,args));default:return args.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG49)),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls8(client,args))}}var import_error_utils18=__toESM(require_dist(),1);var LogoutTelemetryClient=class extends TelemetryClient{};var import_error_utils17=__toESM(require_dist(),1);async function logout(client){let{authConfig}=client;if(!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let revocationResponse=await revocationRequest({token:authConfig.token});output_manager_default.debug(`'Revocation response:', ${await revocationResponse.clone().text()}`);let[revocationError]=await processRevocationResponse(revocationResponse),logoutError=!1;revocationError&&(output_manager_default.error(revocationError.message),output_manager_default.debug(revocationError.cause),output_manager_default.error("Failed during logout"),logoutError=!0);try{if(client.updateConfig({currentTeam:void 0}),client.writeToConfigFile(),client.emptyAuthConfig(),client.persistAuthConfig(),output_manager_default.debug("Configuration has been deleted"),!logoutError)return output_manager_default.success("Logged out!"),0}catch(err){output_manager_default.debug((0,import_error_utils17.errorToString)(err)),output_manager_default.error("Failed during logout")}return 1}async function logout2(client){let{authConfig,config}=client,parsedArgs=null,flagsSpecification=getFlagsSpecification(logoutCommand.options),telemetry2=new LogoutTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("logout"),output_manager_default.print(help(logoutCommand,{columns:client.stderr.columns})),0;if("refreshToken"in authConfig)return await logout(client);if(output_manager_default.debug("Falling back to legacy logout"),!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let exitCode2=0;try{await client.fetch("/v3/user/tokens/current",{method:"DELETE",useCurrentTeam:!1})}catch(err){isAPIError(err)&&(err.status===403?output_manager_default.debug("Token is invalid so it cannot be revoked"):err.status!==200&&(output_manager_default.debug(err?.message??""),exitCode2=1))}delete config.currentTeam,delete authConfig.token,delete authConfig.userId;try{authConfig.skipWrite||(writeToConfigFile(config),persistAuthConfig(authConfig,config)),output_manager_default.debug("Configuration has been deleted")}catch(err){output_manager_default.debug((0,import_error_utils18.errorToString)(err)),exitCode2=1}return exitCode2===0?output_manager_default.log("Logged out!"):output_manager_default.error("Failed during logout"),exitCode2}var import_error_utils19=__toESM(require_dist(),1),import_chalk237=__toESM(require_source(),1),import_format38=__toESM(require_format(),1);var import_ms22=__toESM(require_ms(),1),LOG_LEVEL_SEVERITY={info:0,warning:1,error:2,fatal:3};function getLogLevelSeverity(level){return LOG_LEVEL_SEVERITY[level]??-1}function getDisplayLog(logs2,requestedLevels){if(logs2.length===0)return;let matchingLogs=requestedLevels&&requestedLevels.length>0?logs2.filter(log=>requestedLevels.includes(log.level)):logs2;return(matchingLogs.length>0?matchingLogs:logs2).reduce((selected,current)=>getLogLevelSeverity(current.level)>getLogLevelSeverity(selected.level)?current:selected)}function parseRelativeTime(input){if(input==="now")return Date.now();let now=Date.now(),msValue=(0,import_ms22.default)(input);if(typeof msValue=="number")return now-msValue;let date=new Date(input);if(!isNaN(date.getTime()))return date.getTime();throw new Error(`Invalid time format: ${input}`)}async function fetchRequestLogs(client,options){let{projectId,ownerId,deploymentId,environment,level,statusCode,source,since,until,search:search3,requestId,branch,page=0}=options,now=Date.now(),defaultStartDate=now-24*60*60*1e3,query=new URLSearchParams;query.set("projectId",projectId),query.set("ownerId",ownerId),query.set("page",String(page)),query.set("startDate",String(since?parseRelativeTime(since):defaultStartDate)),query.set("endDate",String(until?parseRelativeTime(until):now)),deploymentId&&query.set("deploymentId",deploymentId),environment&&query.set("environment",environment),level&&level.length>0&&query.set("level",level.join(",")),statusCode&&query.set("statusCode",statusCode),source&&source.length>0&&query.set("source",source.join(",")),search3&&query.set("search",search3),requestId&&query.set("requestId",requestId),branch&&query.set("branch",branch);let url=`${client.apiUrl==="https://api.vercel.com"?"https://vercel.com":client.apiUrl}/api/logs/request-logs?${query.toString()}`,data=await client.fetch(url);return{logs:(data.rows||[]).map(row=>{let requestLogs=(row.logs||[]).map(log=>({level:log.level||"info",message:log.message||"",messageTruncated:log.messageTruncated})),displayLog=getDisplayLog(requestLogs,options.level),firstEvent=row.events?.[0];return{id:row.requestId||"",timestamp:row.timestamp?new Date(row.timestamp).getTime():Date.now(),deploymentId:row.deploymentId||"",projectId:options.projectId,level:displayLog?.level||"info",message:displayLog?.message||"",messageTruncated:displayLog?.messageTruncated,source:firstEvent?.source||"static",domain:row.domain||"",requestMethod:row.requestMethod||"",requestPath:row.requestPath||"",responseStatusCode:row.statusCode||0,environment:row.environment||"production",branch:row.branch,cache:row.cache,cacheReason:row.cacheReason,pprState:row.pprState,traceId:row.traceId,logs:requestLogs}}),pagination:{hasMore:data.hasMoreRows??!1}}}async function*fetchAllRequestLogs(client,options){let page=0,remaining=options.limit??100,hasMore=!0;for(;hasMore&&remaining>0;){let response=await fetchRequestLogs(client,{...options,page});if(!response.logs||response.logs.length===0)break;for(let log of response.logs)if(yield log,remaining--,remaining<=0)return;hasMore=response.pagination?.hasMore??!1,page++}}var LogsTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(v){v&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliOptionDeployment(v){v&&this.trackCliOption({option:"deployment",value:this.redactedValue})}trackCliOptionEnvironment(v){if(v){let allowed=["production","preview"].includes(v)?v:this.redactedValue;this.trackCliOption({option:"environment",value:allowed})}}trackCliOptionLevel(v){if(v&&v.length>0){let allowedLevels=["error","warning","info","fatal"],sanitized=v.every(l=>allowedLevels.includes(l))?v.join(","):this.redactedValue;this.trackCliOption({option:"level",value:sanitized})}}trackCliOptionStatusCode(v){v&&this.trackCliOption({option:"status-code",value:this.redactedValue})}trackCliOptionSource(v){if(v&&v.length>0){let allowedSources=["serverless","edge-function","edge-middleware","static"],sanitized=v.every(s=>allowedSources.includes(s))?v.join(","):this.redactedValue;this.trackCliOption({option:"source",value:sanitized})}}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}trackCliFlagFollow(v){v&&this.trackCliFlag("follow")}trackCliFlagNoFollow(v){v&&this.trackCliFlag("no-follow")}trackCliOptionQuery(v){v&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionRequestId(v){v&&this.trackCliOption({option:"request-id",value:this.redactedValue})}trackCliFlagExpand(v){v&&this.trackCliFlag("expand")}trackCliOptionBranch(v){v&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagNoBranch(v){v&&this.trackCliFlag("no-branch")}};async function getLatestDeployment(client,projectId,filters={}){let query=new URLSearchParams;query.set("projectId",projectId),query.set("limit","1"),query.set("state","READY"),filters.branch&&query.set("branch",filters.branch),filters.userId&&query.set("users",filters.userId),filters.target&&query.set("target",filters.target);let{deployments}=await client.fetch(`/v6/deployments?${query}`);return deployments.length===0?null:{id:deployments[0].uid,url:deployments[0].url}}async function getActiveProductionDeployment(client,projectId){try{let{deployment}=await client.fetch(`/projects/${encodeURIComponent(projectId)}/production-deployment`);return deployment}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function resolveFollowDeployment({branch,client,environment,logsTarget}){let{deployment,orgSlug,projectId,projectSlug}=logsTarget;if(deployment?.id)return{deploymentId:deployment.id,label:"deployment"};if(branch){output_manager_default.spinner(`Finding latest deployment for branch "${branch}"`,1e3);let branchDeployment=await getLatestDeployment(client,projectId,{branch,target:environment});if(output_manager_default.stopSpinner(),branchDeployment)return output_manager_default.debug(`Found deployment ${branchDeployment.id} for branch ${branch}`),{deploymentId:branchDeployment.id,label:`latest deployment on branch "${branch}"`};let environmentLabel=environment?` ${environment}`:"",deployHint=environment?`Deploy that branch to ${environment} first`:"Deploy that branch first";return output_manager_default.error(`No READY${environmentLabel} deployments found for branch "${branch}" in ${formatProject(orgSlug,projectSlug)}. ${deployHint} or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1}}if(environment==="production"){output_manager_default.spinner("Finding production deployment",1e3);let productionDeployment2=await getActiveProductionDeployment(client,projectId);return output_manager_default.stopSpinner(),productionDeployment2?(output_manager_default.debug(`Found production deployment ${productionDeployment2.id} (${productionDeployment2.url})`),{deploymentId:productionDeployment2.id,label:"production deployment"}):(output_manager_default.error(`No active production deployment found for ${formatProject(orgSlug,projectSlug)}. Deploy or promote to production first, or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}if(environment==="preview"){let user2=await getUser(client);output_manager_default.spinner("Finding your latest deployment",1e3);let userDeployment2=await getLatestDeployment(client,projectId,{userId:user2.id,target:"preview"});return output_manager_default.stopSpinner(),userDeployment2?(output_manager_default.debug(`Found latest deployment ${userDeployment2.id} (${userDeployment2.url}) created by current user`),{deploymentId:userDeployment2.id,label:"your latest deployment"}):(output_manager_default.error(`No READY preview deployments found for ${formatProject(orgSlug,projectSlug)}. Deploy a preview first or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}output_manager_default.spinner("Finding production deployment",1e3);let productionDeployment=await getActiveProductionDeployment(client,projectId);if(output_manager_default.stopSpinner(),productionDeployment)return output_manager_default.debug(`Found production deployment ${productionDeployment.id} (${productionDeployment.url})`),{deploymentId:productionDeployment.id,label:"production deployment"};let user=await getUser(client);output_manager_default.spinner("Finding your latest deployment",1e3);let userDeployment=await getLatestDeployment(client,projectId,{userId:user.id});return output_manager_default.stopSpinner(),userDeployment?(output_manager_default.debug(`Found latest deployment ${userDeployment.id} (${userDeployment.url}) created by current user`),{deploymentId:userDeployment.id,label:"your latest deployment"}):(output_manager_default.error(`No READY deployments found for ${formatProject(orgSlug,projectSlug)}. Deploy first or specify a deployment with ${import_chalk237.default.bold("--deployment")}.`),{exitCode:1})}var TIME_ONLY_FORMAT="HH:mm:ss.SS",DATE_TIME_FORMAT="MMM DD HH:mm:ss.SS";function table2({columns,rows,tableWidth,formatHeader,formatRow}){let zeroPad=[0,0],maxWidths=columns.map(col=>{let headerWidth=col.label.length;return Math.max(headerWidth,...rows.map(row=>col.getValue(row).length))}),colPaddings=columns.map(col=>col.padding??zeroPad),finalWidths=[],usedWidth=0,stretchIndex=-1;for(let i=0;i<columns.length;i++){let col=columns[i],padding2=colPaddings[i][0]+colPaddings[i][1];col.width==="stretch"?(stretchIndex=i,finalWidths.push(0)):typeof col.width=="number"?(finalWidths.push(col.width),usedWidth+=col.width+padding2):(finalWidths.push(maxWidths[i]),usedWidth+=maxWidths[i]+padding2)}if(usedWidth+=(columns.length-1)*2,stretchIndex>=0){let stretchPadding=colPaddings[stretchIndex][0]+colPaddings[stretchIndex][1];finalWidths[stretchIndex]=Math.max(10,tableWidth-usedWidth-stretchPadding)}let pad=(value,width)=>value.length>width?value.slice(0,width-1)+"\u2026":value.padEnd(width),headerStr=columns.map((col,i)=>{let padded=pad(col.label,finalWidths[i]);return" ".repeat(colPaddings[i][0])+padded+" ".repeat(colPaddings[i][1])}).join(" "),header=formatHeader?formatHeader(headerStr):headerStr,formattedRows=rows.map(row=>{let rowStr=columns.map((col,i)=>{let value=col.getValue(row),padded=pad(value,finalWidths[i]),formatted=col.format?col.format(padded,row):padded;return" ".repeat(colPaddings[i][0])+formatted+" ".repeat(colPaddings[i][1])}).join(" ");return formatRow?formatRow(rowStr,row):rowStr});return{header,rows:formattedRows}}function logsSpanMultipleDays(logs2){if(logs2.length===0)return!1;let firstDay=new Date(logs2[0].timestamp).toDateString();return logs2.some(log=>new Date(log.timestamp).toDateString()!==firstDay)}function parseLevels(levels){return levels?typeof levels=="string"?[levels]:levels:[]}function parseSources(sources){return sources?typeof sources=="string"?[sources]:sources:[]}function isNonLiveTerminalDeployment(deployment){return deployment.readyState==="ERROR"||deployment.readyState==="CANCELED"}function getInspectCommand(deployment,contextName,{plain=!1}={}){let scopeOption=contextName?` --scope ${contextName}`:"",command2=`inspect https://${deployment.url}${scopeOption}`;return plain?`\`${getCommandNamePlain(command2)}\``:getCommandName(command2)}function printNonLiveDeploymentError(deployment,contextName){let inspectCommand2=getInspectCommand(deployment,contextName);output_manager_default.error(`Logs are unavailable because deployment ${import_chalk237.default.bold(deployment.id)} never reached READY and ended in ${deployment.readyState}.
944
+ Run ${inspectCommand2} for deployment details.`)}async function resolveLogsTarget(client,{contextName,deploymentOption,projectOption}){if(deploymentOption){output_manager_default.spinner(`Resolving deployment "${deploymentOption}"`,1e3);let deployment;try{deployment=await getDeployment(client,contextName,deploymentOption)}catch(err){if(err instanceof DeploymentNotFound)return output_manager_default.error(`Deployment not found: ${deploymentOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(err instanceof InvalidDeploymentId)return output_manager_default.error(`Invalid deployment ID: ${deploymentOption}`),{exitCode:1};throw err}finally{output_manager_default.stopSpinner()}if(!deployment.projectId)return output_manager_default.error("Deployment is not associated with a project."),{exitCode:1};output_manager_default.spinner(`Fetching project "${deployment.projectId}"`,1e3);let project=await getProjectByNameOrId(client,deployment.projectId);if(output_manager_default.stopSpinner(),project instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${deployment.projectId} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(projectOption){output_manager_default.spinner(`Fetching project "${projectOption}"`,1e3);let explicitProject=await getProjectByNameOrId(client,projectOption);if(output_manager_default.stopSpinner(),explicitProject instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${projectOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1};if(explicitProject.id!==project.id)return output_manager_default.error(`The deployment "${deploymentOption}" does not belong to "${projectOption}" project. Remove either the deployment selection or the ${import_chalk237.default.bold("--project")} option.`),{exitCode:1}}return{projectId:project.id,projectSlug:project.name,orgSlug:contextName,ownerId:project.accountId,deployment,targetSource:"deployment"}}if(projectOption){output_manager_default.spinner(`Fetching project "${projectOption}"`,1e3);let project=await getProjectByNameOrId(client,projectOption);return output_manager_default.stopSpinner(),project instanceof ProjectNotFound?(output_manager_default.error(`Project not found: ${projectOption} under ${import_chalk237.default.bold(contextName)}`),{exitCode:1}):{projectId:project.id,projectSlug:project.name,orgSlug:contextName,ownerId:project.accountId,targetSource:"explicit-project"}}let link=await getLinkedProject(client);return link.status==="error"?{exitCode:link.exitCode}:link.status==="not_linked"?(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Run ${getCommandName("link")} to begin, or specify a project with ${import_chalk237.default.bold("--project")}.`),{exitCode:1}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{projectId:link.project.id,projectSlug:link.project.name,orgSlug:link.org.slug,ownerId:link.org.id,targetSource:"linked-project"})}async function logs(client){let parsedArguments,flagsSpecification=getFlagsSpecification(logsCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),output_manager_default.print(help(logsCommand,{columns:client.stderr.columns})),1}let telemetry2=new LogsTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArguments.flags["--help"])return telemetry2.trackCliFlagHelp("logs"),output_manager_default.print(help(logsCommand,{columns:client.stderr.columns})),0;let subArgs=parsedArguments.args.slice(1),[deploymentArgument]=subArgs,projectOption=parsedArguments.flags["--project"],deploymentFlag=parsedArguments.flags["--deployment"],environmentOption=parsedArguments.flags["--environment"],deploymentOption=deploymentFlag;if(deploymentArgument){let deploymentIdOrHost=deploymentArgument;try{deploymentIdOrHost=new URL(deploymentArgument).hostname}catch{}deploymentOption=deploymentIdOrHost}let levelOption=parsedArguments.flags["--level"],statusCodeOption=parsedArguments.flags["--status-code"],sourceOption=parsedArguments.flags["--source"],sinceOption=parsedArguments.flags["--since"],untilOption=parsedArguments.flags["--until"],limitOption=parsedArguments.flags["--limit"],jsonOption2=parsedArguments.flags["--json"],queryOption=parsedArguments.flags["--query"],searchOption=parsedArguments.flags["--search"],requestIdOption=parsedArguments.flags["--request-id"],expandOption=parsedArguments.flags["--expand"],branchFlagValue=parsedArguments.flags["--branch"],noBranchFlagValue=parsedArguments.flags["--no-branch"],noFollowFlagValue=parsedArguments.flags["--no-follow"],followOption=parsedArguments.flags["--follow"];if(telemetry2.trackCliArgumentUrlOrDeploymentId(deploymentArgument),telemetry2.trackCliOptionProject(projectOption),telemetry2.trackCliOptionDeployment(deploymentFlag),telemetry2.trackCliOptionEnvironment(environmentOption),telemetry2.trackCliOptionLevel(levelOption),telemetry2.trackCliOptionStatusCode(statusCodeOption),telemetry2.trackCliOptionSource(sourceOption),telemetry2.trackCliOptionSince(sinceOption),telemetry2.trackCliOptionUntil(untilOption),telemetry2.trackCliOptionLimit(limitOption),telemetry2.trackCliFlagJson(jsonOption2),telemetry2.trackCliFlagFollow(followOption),telemetry2.trackCliFlagNoFollow(noFollowFlagValue),telemetry2.trackCliOptionQuery(queryOption),telemetry2.trackCliOptionSearch(searchOption),telemetry2.trackCliOptionRequestId(requestIdOption),telemetry2.trackCliFlagExpand(expandOption),telemetry2.trackCliOptionBranch(branchFlagValue),telemetry2.trackCliFlagNoBranch(noBranchFlagValue),followOption){let usedIncompatible=[{flag:"--level",value:levelOption},{flag:"--status-code",value:statusCodeOption},{flag:"--source",value:sourceOption},{flag:"--since",value:sinceOption},{flag:"--until",value:untilOption},{flag:"--limit",value:limitOption},{flag:"--query",value:queryOption},{flag:"--search",value:searchOption},{flag:"--request-id",value:requestIdOption}].filter(f=>f.value!==void 0&&f.value!==null).map(f=>import_chalk237.default.bold(f.flag));if(usedIncompatible.length>0)return output_manager_default.error(`The ${import_chalk237.default.bold("--follow")} flag does not support filtering. Remove: ${usedIncompatible.join(", ")}`),1}let contextName;try{({contextName}=await getScope(client))}catch(err){if((0,import_error_utils19.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return output_manager_default.error(err.message),1;throw err}let logsTarget=await resolveLogsTarget(client,{contextName,deploymentOption,projectOption});if("exitCode"in logsTarget)return logsTarget.exitCode;let{projectId,projectSlug,orgSlug,ownerId,deployment}=logsTarget,deploymentId=deployment?.id;if(deployment&&isNonLiveTerminalDeployment(deployment)){let inspectContextName=detectExplicitScope(client)?contextName:void 0,inspectCommand2=getInspectCommand(deployment,inspectContextName,{plain:!0});return jsonOption2?client.stdout.write(`${JSON.stringify({type:"deployment_error",message:`Logs are unavailable because deployment ${deployment.id} never reached READY and ended in ${deployment.readyState}. Run ${inspectCommand2} for deployment details.`})}
945
+ `):printNonLiveDeploymentError(deployment,inspectContextName),1}let branchOption=typeof branchFlagValue=="string"?branchFlagValue:void 0;if(environmentOption&&!["production","preview"].includes(environmentOption))return output_manager_default.error(`Invalid environment: ${environmentOption}. Must be "production" or "preview".`),1;if(followOption){let followDeployment=await resolveFollowDeployment({branch:branchOption,client,environment:environmentOption,logsTarget});if("exitCode"in followDeployment)return followDeployment.exitCode;jsonOption2||output_manager_default.print(`Streaming logs for ${followDeployment.label} ${import_chalk237.default.bold(followDeployment.deploymentId)} starting from ${import_chalk237.default.bold((0,import_format38.default)(Date.now(),TIME_ONLY_FORMAT))}
946
946
 
947
- `);let abortController=new AbortController;return await displayRuntimeLogs(client,{deploymentId:followDeployment.deploymentId,projectId,parse:!jsonOption},abortController)}let validLevels=["error","warning","info","fatal"],levels=parseLevels(levelOption);for(let level of levels)if(!validLevels.includes(level))return output_manager_default.error(`Invalid log level: ${level}. Must be one of: ${validLevels.join(", ")}.`),1;let validSources=["serverless","edge-function","edge-middleware","static"],sources=parseSources(sourceOption);for(let source of sources)if(!validSources.includes(source))return output_manager_default.error(`Invalid source: ${source}. Must be one of: ${validSources.join(", ")}.`),1;let limit=limitOption??100;output_manager_default.spinner("Fetching logs...",1e3);let terminalWidth=client.stderr.isTTY&&client.stderr.columns||120,expand=expandOption||!client.stderr.isTTY,logs2=[];try{for await(let log of fetchAllRequestLogs(client,{projectId,ownerId,deploymentId,environment:environmentOption,level:levels.length>0?levels:void 0,statusCode:statusCodeOption,source:sources.length>0?sources:void 0,since:sinceOption,until:untilOption,limit,search:searchOption??queryOption,requestId:requestIdOption,branch:branchOption}))output_manager_default.stopSpinner(),jsonOption?client.stdout.write(JSON.stringify(log)+`
948
- `):logs2.push(log)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),!jsonOption){let branchSuffix=branchOption?` on branch ${import_chalk237.default.cyan(branchOption)}`:"";if(logs2.length===0)output_manager_default.print(import_chalk237.default.dim(`No logs found for ${formatProject(orgSlug,projectSlug)}${branchSuffix}
947
+ `);let abortController=new AbortController;return await displayRuntimeLogs(client,{deploymentId:followDeployment.deploymentId,projectId,parse:!jsonOption2},abortController)}let validLevels=["error","warning","info","fatal"],levels=parseLevels(levelOption);for(let level of levels)if(!validLevels.includes(level))return output_manager_default.error(`Invalid log level: ${level}. Must be one of: ${validLevels.join(", ")}.`),1;let validSources=["serverless","edge-function","edge-middleware","static"],sources=parseSources(sourceOption);for(let source of sources)if(!validSources.includes(source))return output_manager_default.error(`Invalid source: ${source}. Must be one of: ${validSources.join(", ")}.`),1;let limit=limitOption??100;output_manager_default.spinner("Fetching logs...",1e3);let terminalWidth=client.stderr.isTTY&&client.stderr.columns||120,expand=expandOption||!client.stderr.isTTY,logs2=[];try{for await(let log of fetchAllRequestLogs(client,{projectId,ownerId,deploymentId,environment:environmentOption,level:levels.length>0?levels:void 0,statusCode:statusCodeOption,source:sources.length>0?sources:void 0,since:sinceOption,until:untilOption,limit,search:searchOption??queryOption,requestId:requestIdOption,branch:branchOption}))output_manager_default.stopSpinner(),jsonOption2?client.stdout.write(JSON.stringify(log)+`
948
+ `):logs2.push(log)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),!jsonOption2){let branchSuffix=branchOption?` on branch ${import_chalk237.default.cyan(branchOption)}`:"";if(logs2.length===0)output_manager_default.print(import_chalk237.default.dim(`No logs found for ${formatProject(orgSlug,projectSlug)}${branchSuffix}
949
949
  `));else{let timeFormat=logsSpanMultipleDays(logs2)?DATE_TIME_FORMAT:TIME_ONLY_FORMAT,rowData=logs2.map(log=>{let statusCode=log.responseStatusCode;return{time:(0,import_format38.default)(log.timestamp,timeFormat),host:log.domain||"",level:log.level,path:`${getSourceIcon(log.source)} ${log.requestMethod} ${log.requestPath}`,status:!statusCode||statusCode<=0?"---":String(statusCode),statusCode,message:log.message?.replace(/\n/g," ").trim()||"",messageTruncated:log.messageTruncated,logs:log.logs}}),baseColumns=[{label:"TIME",getValue:row=>row.time,format:padded=>import_chalk237.default.dim(padded)},{label:"HOST",getValue:row=>row.host,format:padded=>import_chalk237.default.dim(padded)},{label:"LEVEL",getValue:row=>row.level,format:(padded,row)=>colorizeLevel(padded,row.level)},{label:"",padding:[0,3],getValue:row=>row.path}],columns=expand?baseColumns:[...baseColumns,{label:"STATUS",getValue:row=>row.status,format:(padded,row)=>row.statusCode<=0?import_chalk237.default.gray(padded):colorizeStatus(padded,row.statusCode)},{label:"MESSAGE",width:"stretch",getValue:row=>row.message||"(no message)",format:(padded,row)=>row.message?colorizeMessage(padded,row.level):import_chalk237.default.dim(padded)}],formatted=table2({columns,rows:rowData,tableWidth:terminalWidth,formatHeader:header=>import_chalk237.default.dim(header),formatRow:expand?(rowStr,row)=>{if(row.logs.length>0){let renderedLogs=row.logs.map(log=>{let safeMessage=log.message.replace(/\n/g," ").trim()||"(no message)",truncatedIndicator=log.messageTruncated?import_chalk237.default.gray("\u2026"):"";return`${colorizeMessage(safeMessage,log.level)}${truncatedIndicator}`}).join(`
950
950
  `);return`${rowStr}
951
951
  ${renderedLogs}
@@ -1087,7 +1087,7 @@ ${tablePrint}
1087
1087
  `),1;output_manager_default.error(humanIntro),output_manager_default.log("Project roles can only be assigned to these team roles:");for(let[teamRole,roles]of pairs)output_manager_default.log(` ${teamRole} \u2192 ${roles.join(", ")}`);return output_manager_default.log(footer),1}return exitWithNonInteractiveError(client,err,1,{variant:"members"}),jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:err instanceof Error?err.message:String(err)},null,2)}
1088
1088
  `),1):(printError(err),1)}}async function members(client,argv){if(argv[0]==="add")return membersAdd(client,argv.slice(1));if(argv[0]==="remove"||argv[0]==="rm")return membersRemove(client,argv.slice(1));let parsedArgs,flagsSpecification=getFlagsSpecification(membersSubcommand.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)},1),printError(error),1}if(parsedArgs.args.length>1)return output_manager_default.error("Invalid number of arguments. Usage: `vercel project members [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,limit=parsedArgs.flags["--limit"];if(typeof limit=="number"&&(limit<1||limit>100))return output_manager_default.error("`--limit` must be a number between 1 and 100."),1;let next=parsedArgs.flags["--next"];if(typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("`--next` must be a number."),1;let result;try{let project=await getProjectByCwdOrLink({client,commandName:"project members",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0}),query=new URLSearchParams;parsedArgs.flags["--search"]&&query.set("search",String(parsedArgs.flags["--search"])),typeof limit=="number"&&query.set("limit",String(limit)),typeof next=="number"&&query.set("until",String(next));let qs=query.toString(),path3=`/v1/projects/${encodeURIComponent(project.id)}/members${qs?`?${qs}`:""}`;result=await client.fetch(path3)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"members"}),printError(err),1}let projectMembers=result.members||[];if(asJson)return client.stdout.write(`${JSON.stringify({members:projectMembers,pagination:result.pagination},null,2)}
1089
1089
  `),0;let rows=[["uid","Identity","Role","Team Role"].map(str=>(0,import_chalk250.gray)(str)),...projectMembers.map(member=>[member.uid,member.username||member.email||"",member.computedProjectRole||member.role||"",member.teamRole||""])];if(client.stderr.write(`${table(rows,{hsep:3})}
1090
- `),result.pagination?.next){let flags=getCommandFlags(parsedArgs.flags,["_","--next","-N","--search"]),projectName=parsedArgs.args[0]?` ${quoteArg(parsedArgs.args[0])}`:"",search2=parsedArgs.flags["--search"],searchFlag=search2?` --search ${quoteArg(String(search2))}`:"",nextCmd=`${packageName} project members${projectName}${flags}${searchFlag} --next ${result.pagination.next}`;output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}return 0}var import_chalk251=__toESM(require_source(),1);async function accessGroups(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(accessGroupsSubcommand.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)},1),printError(error),1}if(parsedArgs.args.length>1)return output_manager_default.error("Invalid number of arguments. Usage: `vercel project access-groups [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,limit=parsedArgs.flags["--limit"];if(typeof limit=="number"&&(limit<1||limit>100))return output_manager_default.error("`--limit` must be a number between 1 and 100."),1;let result;try{let project=await getProjectByCwdOrLink({client,commandName:"project access-groups",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0}),query=new URLSearchParams;query.set("projectId",project.id),parsedArgs.flags["--search"]&&query.set("search",String(parsedArgs.flags["--search"])),typeof limit=="number"&&query.set("limit",String(limit)),typeof parsedArgs.flags["--next"]=="number"&&query.set("next",String(parsedArgs.flags["--next"])),result=await client.fetch(`/v1/access-groups?${query.toString()}`)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"access-groups"}),printError(err),1}if(asJson)return client.stdout.write(`${JSON.stringify(result,null,2)}
1090
+ `),result.pagination?.next){let flags=getCommandFlags(parsedArgs.flags,["_","--next","-N","--search"]),projectName=parsedArgs.args[0]?` ${quoteArg(parsedArgs.args[0])}`:"",search3=parsedArgs.flags["--search"],searchFlag=search3?` --search ${quoteArg(String(search3))}`:"",nextCmd=`${packageName} project members${projectName}${flags}${searchFlag} --next ${result.pagination.next}`;output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}return 0}var import_chalk251=__toESM(require_source(),1);async function accessGroups(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(accessGroupsSubcommand.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)},1),printError(error),1}if(parsedArgs.args.length>1)return output_manager_default.error("Invalid number of arguments. Usage: `vercel project access-groups [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,limit=parsedArgs.flags["--limit"];if(typeof limit=="number"&&(limit<1||limit>100))return output_manager_default.error("`--limit` must be a number between 1 and 100."),1;let result;try{let project=await getProjectByCwdOrLink({client,commandName:"project access-groups",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0}),query=new URLSearchParams;query.set("projectId",project.id),parsedArgs.flags["--search"]&&query.set("search",String(parsedArgs.flags["--search"])),typeof limit=="number"&&query.set("limit",String(limit)),typeof parsedArgs.flags["--next"]=="number"&&query.set("next",String(parsedArgs.flags["--next"])),result=await client.fetch(`/v1/access-groups?${query.toString()}`)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"access-groups"}),printError(err),1}if(asJson)return client.stdout.write(`${JSON.stringify(result,null,2)}
1091
1091
  `),0;let rows=[["id","Name","Role"].map(str=>(0,import_chalk251.gray)(str)),...(result.accessGroups||[]).map(group=>[group.id,group.name,group.role||""])];return client.stderr.write(`${table(rows,{hsep:3})}
1092
1092
  `),0}var import_chalk252=__toESM(require_source(),1),import_ms25=__toESM(require_ms(),1);var ProjectRenameTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliArgumentNewName(newName){newName&&this.trackCliArgument({arg:"new-name",value:this.redactedValue})}};async function rename(client,argv){let telemetryClient=new ProjectRenameTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(renameSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args}=parsedArgs;if(args.length!==2)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk252.default.cyan(`${getCommandName("project rename <name> <new-name>")}`)}`),2;let[projectNameOrId,newName]=args;telemetryClient.trackCliArgumentName(projectNameOrId),telemetryClient.trackCliArgumentNewName(newName);let project=await getProjectByNameOrId(client,projectNameOrId);if(project instanceof ProjectNotFound)return output_manager_default.error("No such project exists"),1;let start=Date.now(),renamedProject;try{renamedProject=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{method:"PATCH",body:{name:newName}})}catch(err){if(isAPIError(err)&&err.status===409)return output_manager_default.error(`A project named "${newName}" already exists`),1;if(isAPIError(err)&&err.status===403)return output_manager_default.error(err.message),1;throw err}let elapsed2=(0,import_ms25.default)(Date.now()-start);return output_manager_default.log(`${import_chalk252.default.cyan("Success!")} Project ${import_chalk252.default.bold(project.name)} renamed to ${import_chalk252.default.bold(renamedProject.name)} ${import_chalk252.default.gray(`[${elapsed2}]`)}`),0}var import_chalk253=__toESM(require_source(),1);var ProjectUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionFramework(framework){framework&&this.trackCliOption({option:"framework",value:this.redactedValue})}trackCliOptionBuildCommand(value){this.trackSettingOption("build-command",value)}trackCliOptionDevCommand(value){this.trackSettingOption("dev-command",value)}trackCliOptionInstallCommand(value){this.trackSettingOption("install-command",value)}trackCliOptionOutputDirectory(value){this.trackSettingOption("output-directory",value)}trackCliOptionRootDirectory(value){this.trackSettingOption("root-directory",value)}trackCliOptionAutoDetect(value){value?.length&&this.trackCliOption({option:"auto-detect",value:this.redactedValue})}trackCliOptionSandboxRegion(value){this.trackSandboxRegionOption("sandbox-region",value)}trackCliOptionSandboxFailoverRegions(value){this.trackSandboxRegionOption("sandbox-failover-regions",value)}trackSandboxRegionOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackSettingOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackCliOptionFluidCompute(value){this.trackChoiceOption("fluid-compute",value,["on","off"])}trackCliOptionFunctionCpu(value){this.trackChoiceOption("function-cpu",value,["standard_legacy","standard","performance","performance_xl"])}trackCliOptionBuildMachine(value){this.trackChoiceOption("build-machine",value,["basic","standard","enhanced","turbo","elastic"])}trackCliOptionElasticConcurrency(value){this.trackChoiceOption("elastic-concurrency",value,["on","off"])}trackCliOptionNodeVersion(value){this.trackChoiceOption("node-version",value,["24.x","22.x","20.x","18.x","16.x","14.x","12.x","10.x"])}trackChoiceOption(option,value,allowed){value!==void 0&&this.trackCliOption({option,value:allowed.includes(value)?value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var import_frameworks2=__toESM(require_frameworks(),1);var OTHER_FRAMEWORK_SLUG="other",MAX_SETTING_LENGTH=256,CONTROL_CHARACTERS=/[\u0000-\u001f\u007f]/,frameworkSlugs=import_frameworks2.frameworkList.map(framework=>framework.slug??OTHER_FRAMEWORK_SLUG),buildSettingDefinitions=[{key:"buildCommand",flag:"--build-command",autoDetect:"build-command",label:"Build Command"},{key:"devCommand",flag:"--dev-command",autoDetect:"dev-command",label:"Dev Command"},{key:"installCommand",flag:"--install-command",autoDetect:"install-command",label:"Install Command"},{key:"outputDirectory",flag:"--output-directory",autoDetect:"output-directory",label:"Output Directory"},{key:"rootDirectory",flag:"--root-directory",autoDetect:"root-directory",label:"Root Directory"}],settingOrder=["framework",...buildSettingDefinitions.map(setting=>setting.key),"sandboxRegion","sandboxFailoverRegions"],autoDetectSettings=buildSettingDefinitions.map(setting=>setting.autoDetect),settingLabels={framework:"Framework",...Object.fromEntries(buildSettingDefinitions.map(setting=>[setting.key,setting.label])),sandboxRegion:"Sandbox Region",sandboxFailoverRegions:"Failover"};function isSandboxSettingKey(key){return key==="sandboxRegion"||key==="sandboxFailoverRegions"}function resolveFramework(input){let slug=input.trim().toLowerCase();return import_frameworks2.frameworkList.find(framework=>(framework.slug??OTHER_FRAMEWORK_SLUG)===slug)}function formatFramework(slug){let framework=import_frameworks2.frameworkList.find(item=>item.slug===slug);return framework?`${framework.name} (${framework.slug??OTHER_FRAMEWORK_SLUG})`:slug??OTHER_FRAMEWORK_SLUG}function formatSettingValue(key,value){return key==="sandboxRegion"?typeof value=="string"?value:"Auto":key==="sandboxFailoverRegions"?formatSandboxRegionList(Array.isArray(value)?value:[]):key==="framework"?formatFramework(typeof value=="string"?value:null):value===null?"Auto":value===""?'""':String(value)}function getCurrentSetting(project,key){return key==="sandboxRegion"?project.sandbox?.region??null:key==="sandboxFailoverRegions"?project.sandbox?.failoverRegions??null:project[key]??null}function isSameSettingValue(a,b){if(Array.isArray(a)||Array.isArray(b)){let left=Array.isArray(a)?a:[],right=Array.isArray(b)?b:[];return left.length===right.length&&left.every((value,index)=>value===right[index])}return a===b}function hasSetting(settings,key){return Object.prototype.hasOwnProperty.call(settings,key)}function validateSettingValue(definition,value){if(value.length>MAX_SETTING_LENGTH)return`${definition.label} must be ${MAX_SETTING_LENGTH} characters or fewer.`;if(CONTROL_CHARACTERS.test(value))return`${definition.label} can't contain control characters.`}function parseAutoDetectSettings(inputs){return inputs.flatMap(input=>input.split(",")).map(input=>input.trim())}var NODE_VERSIONS=["24.x","22.x","20.x","18.x","16.x","14.x","12.x","10.x"],FUNCTION_CPU_TIERS=["standard_legacy","standard","performance","performance_xl"],BUILD_MACHINE_TYPES=["basic","standard","enhanced","turbo","elastic"];function parseOnOff(flag,raw){return raw==="on"||raw==="off"?{ok:!0,value:raw==="on"}:{ok:!1,message:`${flag} must be "on" or "off".`}}function parseEnumValue(label,raw,allowed){return allowed.includes(raw)?{ok:!0,value:raw}:{ok:!1,message:`${label} must be one of: ${allowed.join(", ")}.`}}function displayOnOff(value){return value===!0?"on":value===!1?"off":"Auto"}function displayValue(value){return value==null?"Auto":String(value)}function parseAdvanced(definition,raw){return definition.kind==="toggle"?parseOnOff(definition.flag,raw):parseEnumValue(definition.label,raw,definition.values)}function readAdvanced(definition,project){let fields=project;switch(definition.target){case"resourceConfig":return definition.field==="buildMachineType"&&fields.resourceConfig?.buildMachineSelection==="elastic"?"elastic":fields.resourceConfig?.[definition.field];case"project":return project[definition.field]}}function displayAdvanced(definition,value){return definition.kind==="toggle"?displayOnOff(value):displayValue(value)}var advancedSettingDefinitions=[{key:"fluid",flag:"--fluid-compute",label:"Fluid Compute",kind:"toggle",target:"resourceConfig",field:"fluid"},{key:"functionDefaultMemoryType",flag:"--function-cpu",label:"Function CPU",kind:"enum",values:FUNCTION_CPU_TIERS,target:"resourceConfig",field:"functionDefaultMemoryType",requiresPaidPlan:()=>!0,hasCostImpact:()=>!0},{key:"buildMachineType",flag:"--build-machine",label:"Build Machine",kind:"enum",values:BUILD_MACHINE_TYPES,target:"resourceConfig",field:"buildMachineType",requiresPaidPlan:()=>!0,hasCostImpact:()=>!0},{key:"elasticConcurrencyEnabled",flag:"--elastic-concurrency",label:"Elastic Concurrency",kind:"toggle",target:"resourceConfig",field:"elasticConcurrencyEnabled",requiresPaidPlan:value=>value===!0,hasCostImpact:value=>value===!0},{key:"nodeVersion",flag:"--node-version",label:"Node.js Version",kind:"enum",values:NODE_VERSIONS,target:"project",field:"nodeVersion"}];function ensureResourceConfig(body){return body.resourceConfig??={},body.resourceConfig}function applyAdvanced(definition,body,value){switch(definition.target){case"resourceConfig":ensureResourceConfig(body)[definition.field]=value;break;case"project":body[definition.field]=value;break}}function computeSettingsChanges(project,requestedSettings,providedAdvanced){let previousSettings={},changedSettings=[],body={},mergedSandbox;if(hasSetting(requestedSettings,"sandboxRegion")||hasSetting(requestedSettings,"sandboxFailoverRegions")){if(mergedSandbox={...project.sandbox},hasSetting(requestedSettings,"sandboxRegion")){let region=requestedSettings.sandboxRegion;region==null?delete mergedSandbox.region:mergedSandbox.region=region}hasSetting(requestedSettings,"sandboxFailoverRegions")&&(mergedSandbox.failoverRegions=requestedSettings.sandboxFailoverRegions??[])}for(let key of settingOrder){if(!hasSetting(requestedSettings,key))continue;let previous=getCurrentSetting(project,key),next=requestedSettings[key]??null;Object.assign(previousSettings,{[key]:previous}),isSameSettingValue(previous,next)||(changedSettings.push(key),isSandboxSettingKey(key)||(body[key]=next))}mergedSandbox&&(changedSettings.includes("sandboxRegion")||changedSettings.includes("sandboxFailoverRegions"))&&(body.sandbox=mergedSandbox);let advancedRows=[];for(let{definition,value}of providedAdvanced){let previous=readAdvanced(definition,project),changed=previous!==value;advancedRows.push({key:definition.key,label:definition.label,previous:displayAdvanced(definition,previous),next:displayAdvanced(definition,value),changed}),changed&&(changedSettings.push(definition.key),applyAdvanced(definition,body,value))}return{previousSettings,changedSettings,body,advancedRows}}async function patchProjectSettings(client,project,body){return client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{method:"PATCH",accountId:project.accountId,body})}function getAdvancedResultValue(project,row){let definition=advancedSettingDefinitions.find(candidate=>candidate.key===row.key);return definition?displayAdvanced(definition,readAdvanced(definition,project)):row.next}function printChangePreview({project,previousSettings,requestedSettings,changedSettings,advancedRows}){printAlignedLabel("Project",project.name);for(let key of settingOrder){if(!hasSetting(requestedSettings,key)||!changedSettings.includes(key))continue;let previous=formatSettingValue(key,previousSettings[key]??null),next=formatSettingValue(key,requestedSettings[key]??null);printAlignedLabel(settingLabels[key],`${previous} \u2192 ${next}`)}for(let row of advancedRows)row.changed&&printAlignedLabel(row.label,`${row.previous} \u2192 ${row.next}`)}function writeUpdateResult({changedSettings,project,previousSettings,requestedSettings,advancedRows,asJson,client}){let changed=changedSettings.length>0;if(asJson){let settings={};for(let key of settingOrder)hasSetting(requestedSettings,key)&&(settings[key]=getCurrentSetting(project,key));for(let row of advancedRows){let definition=advancedSettingDefinitions.find(candidate=>candidate.key===row.key);definition&&(settings[row.key]=readAdvanced(definition,project)??null)}client.stdout.write(`${JSON.stringify({changed,changedSettings,projectId:project.id,projectName:project.name,settings},null,2)}
1093
1093
  `);return}printAlignedLabel(changed?"Updated":"Unchanged","Project Settings",{gutter:"\u2713"}),printAlignedLabel("Project",project.name);for(let key of settingOrder){if(!hasSetting(requestedSettings,key))continue;let previous=previousSettings[key]??null,next=getCurrentSetting(project,key),value=changedSettings.includes(key)?`${formatSettingValue(key,previous)} \u2192 ${formatSettingValue(key,next)}`:formatSettingValue(key,next);printAlignedLabel(settingLabels[key],value)}for(let row of advancedRows){let result=getAdvancedResultValue(project,row),value=row.changed?`${row.previous} \u2192 ${result}`:result;printAlignedLabel(row.label,value)}}function getUpdateCommand2(framework="<slug>"){return`project update <name> --framework ${framework}`}function buildUpdateRetryCommand(client,{interactive,withYes}){let args=stripSensitiveAuthArgs(client.argv.slice(2)),nextArgs=[];for(let index=0;index<args.length;index++){let arg=args[index];if(!(arg==="--yes"||arg==="-y")){if(interactive&&(arg==="--non-interactive"||arg.startsWith("--non-interactive="))){arg==="--non-interactive"&&(args[index+1]==="true"||args[index+1]==="false")&&index++;continue}nextArgs.push(arg)}}return withYes&&nextArgs.push("--yes"),getCommandNamePlain(nextArgs.map(quoteArg).join(" "))}function printUsageError(client,message,exitCode2,reason,suggestedCommand=getUpdateCommand2()){return outputAgentError(client,{status:"error",reason,message,next:[{command:buildCommandWithGlobalFlags(client.argv,suggestedCommand),when:"Update project settings"}]},exitCode2),output_manager_default.error(message),exitCode2}function printPlanError(client,message,teamOwned){let nextCommand=teamOwned?"buy pro":"teams switch";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message,userActionRequired:!0,next:[{command:buildCommandWithGlobalFlags(client.argv,nextCommand,void 0,{excludeFlags:["--non-interactive","--yes"]}),when:teamOwned?"Upgrade this team interactively":"Switch to a Pro or Enterprise team"}]},1),output_manager_default.error(message),output_manager_default.log(teamOwned?`Upgrade with ${getCommandName("buy pro")}.`:`Switch teams with ${getCommandName("teams switch")}.`),1}function printConfirmationRequiredError(client,hasCostImpact){let nextCommand=buildUpdateRetryCommand(client,{interactive:hasCostImpact,withYes:!hasCostImpact});return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:hasCostImpact?AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:hasCostImpact?"These project settings may affect charges and require interactive confirmation.":"Updating project settings requires confirmation. Re-run with --yes to apply the changes.",userActionRequired:hasCostImpact,next:[{command:nextCommand,when:hasCostImpact?"Review and confirm the charge-sensitive settings in a terminal":"Apply the requested settings without prompting"}]},1),output_manager_default.error(hasCostImpact?"Confirmation required. These settings may affect charges and must be confirmed in an interactive terminal.":"Confirmation required. Re-run with --yes or in an interactive terminal."),1}function getSandboxValidationError(project,requestedSettings){if(!hasSetting(requestedSettings,"sandboxRegion")&&!hasSetting(requestedSettings,"sandboxFailoverRegions"))return;let mergedSandbox={...project.sandbox};if(hasSetting(requestedSettings,"sandboxRegion")){let region=requestedSettings.sandboxRegion;region==null?delete mergedSandbox.region:mergedSandbox.region=region}return hasSetting(requestedSettings,"sandboxFailoverRegions")&&(mergedSandbox.failoverRegions=requestedSettings.sandboxFailoverRegions??[]),validateSandboxConfig(mergedSandbox)}async function refreshProjectForNestedUpdate(client,project,body){return body.resourceConfig===void 0&&body.sandbox===void 0?project:client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{accountId:project.accountId})}async function update6(client,argv){let telemetry2=new ProjectUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(updateSubcommand8.options))}catch(error){return outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},1),printError(error),1}let{args,flags}=parsedArgs,[projectNameOrId]=args,frameworkInput=flags["--framework"],autoDetectInputs=flags["--auto-detect"]??[];if(telemetry2.trackCliArgumentName(projectNameOrId),telemetry2.trackCliOptionFramework(frameworkInput),telemetry2.trackCliOptionBuildCommand(flags["--build-command"]),telemetry2.trackCliOptionDevCommand(flags["--dev-command"]),telemetry2.trackCliOptionInstallCommand(flags["--install-command"]),telemetry2.trackCliOptionOutputDirectory(flags["--output-directory"]),telemetry2.trackCliOptionRootDirectory(flags["--root-directory"]),telemetry2.trackCliOptionAutoDetect(flags["--auto-detect"]),telemetry2.trackCliOptionSandboxRegion(flags["--sandbox-region"]),telemetry2.trackCliOptionSandboxFailoverRegions(flags["--sandbox-failover-regions"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFluidCompute(flags["--fluid-compute"]),telemetry2.trackCliOptionFunctionCpu(flags["--function-cpu"]),telemetry2.trackCliOptionBuildMachine(flags["--build-machine"]),telemetry2.trackCliOptionElasticConcurrency(flags["--elastic-concurrency"]),telemetry2.trackCliOptionNodeVersion(flags["--node-version"]),args.length>1)return printUsageError(client,`Invalid number of arguments. Usage: ${getCommandNamePlain("project update [name] [options]")}`,2,"invalid_arguments");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return printUsageError(client,formatResult.error,1,"invalid_arguments");let requestedSettings={};if(frameworkInput!==void 0){let framework=resolveFramework(frameworkInput);if(!framework){let normalizedInput=frameworkInput.trim().toLowerCase(),suggestion=normalizedInput?did_you_mean_default(normalizedInput,frameworkSlugs,.7):void 0,message=suggestion?`Unsupported framework preset ${JSON.stringify(frameworkInput)}. Did you mean ${JSON.stringify(suggestion)}?`:`Unsupported framework preset ${JSON.stringify(frameworkInput)}. Use a framework slug such as "nextjs", or "other" to clear the preset.`;return printUsageError(client,message,1,"invalid_arguments",getUpdateCommand2(suggestion))}requestedSettings.framework=framework.slug}let requestedAutoDetect=parseAutoDetectSettings(autoDetectInputs),autoDetectSet=new Set;for(let setting of requestedAutoDetect){if(!autoDetectSettings.includes(setting)){let suggestion=setting?did_you_mean_default(setting,autoDetectSettings,.7):void 0,message=suggestion?`Unknown auto-detect setting ${JSON.stringify(setting)}. Did you mean ${JSON.stringify(suggestion)}?`:`Unknown auto-detect setting ${JSON.stringify(setting)}. Accepted settings: ${autoDetectSettings.join(", ")}.`;return printUsageError(client,message,1,"invalid_arguments",`project update <name> --auto-detect ${suggestion??"<setting>"}`)}autoDetectSet.add(setting)}for(let definition of buildSettingDefinitions){let value=flags[definition.flag];if(value!==void 0&&autoDetectSet.has(definition.autoDetect))return printUsageError(client,`Can't use "${definition.flag}" and "--auto-detect ${definition.autoDetect}" together. Choose one.`,2,"invalid_arguments",`project update <name> ${definition.flag} <value>`);if(value!==void 0){let validationError=validateSettingValue(definition,value);if(validationError)return printUsageError(client,validationError,1,"invalid_arguments",`project update <name> ${definition.flag} <value>`);requestedSettings[definition.key]=value}else autoDetectSet.has(definition.autoDetect)&&(requestedSettings[definition.key]=null)}let sandboxRegionInput=flags["--sandbox-region"];if(sandboxRegionInput!==void 0){let normalizedRegion=sandboxRegionInput.trim().toLowerCase();requestedSettings.sandboxRegion=normalizedRegion===""?null:normalizedRegion}let sandboxFailoverInput=flags["--sandbox-failover-regions"];sandboxFailoverInput!==void 0&&(requestedSettings.sandboxFailoverRegions=parseSandboxRegionList(sandboxFailoverInput));let providedAdvanced=[];for(let definition of advancedSettingDefinitions){let raw=flags[definition.flag];if(raw===void 0)continue;let result=parseAdvanced(definition,raw);if(!result.ok)return printUsageError(client,result.message,1,"invalid_arguments",`project update <name> ${definition.flag} <value>`);providedAdvanced.push({definition,value:result.value})}if(settingOrder.every(key=>!hasSetting(requestedSettings,key))&&providedAdvanced.length===0)return printUsageError(client,'Provide at least one setting option. Run "vercel project update --help" to see every available option.',2,"missing_arguments");let project;try{project=await getProjectByCwdOrLink({client,commandName:"project update",projectNameOrId,forReadOnlyCommand:!0})}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let sandboxError=getSandboxValidationError(project,requestedSettings);if(sandboxError)return printUsageError(client,sandboxError,1,"invalid_arguments");let changes=computeSettingsChanges(project,requestedSettings,providedAdvanced),changeCount=changes.changedSettings.length,gatedProvided=providedAdvanced.filter(({definition,value})=>changes.changedSettings.includes(definition.key)&&definition.requiresPaidPlan?.(value));if(gatedProvided.length>0){let team,user,teamOwned=project.accountId.startsWith("team_");try{projectNameOrId?{team,user}=await getScope(client):{team,user}=await getScope(client,{resolveLocalScope:!0}),teamOwned&&team?.id!==project.accountId&&(team=await getTeamByIdOrSlug(client,project.accountId))}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let plan=(teamOwned?team?.billing:user?.billing)?.plan;if(!(plan==="pro"||plan==="enterprise")){let phrases=gatedProvided.map(({definition,value})=>`${definition.label} "${displayAdvanced(definition,value)}"`),list30=phrases.length===1?phrases[0]:`${phrases.slice(0,-1).join(", ")} and ${phrases[phrases.length-1]}`,verb=phrases.length>1?"require":"requires";return printPlanError(client,`${list30} ${verb} a Pro or Enterprise plan.`,teamOwned)}}let hasCostImpact=providedAdvanced.some(({definition,value})=>changes.changedSettings.includes(definition.key)&&definition.hasCostImpact?.(value));if(changeCount>0&&!(!!flags["--yes"]&&!hasCostImpact)){if(!canPrompt(client))return printConfirmationRequiredError(client,hasCostImpact);if(printChangePreview({project,previousSettings:changes.previousSettings,requestedSettings,changedSettings:changes.changedSettings,advancedRows:changes.advancedRows}),hasCostImpact&&printAlignedLabel("Charges","These settings may affect your Vercel charges.",{gutter:"!"}),!await client.input.confirm(`Update ${changeCount} ${changeCount===1?"setting":"settings"} for ${import_chalk253.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled"),0}if(changeCount>0){try{project=await refreshProjectForNestedUpdate(client,project,changes.body)}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let refreshedSandboxError=getSandboxValidationError(project,requestedSettings);if(refreshedSandboxError)return printUsageError(client,refreshedSandboxError,1,"invalid_arguments");changes=computeSettingsChanges(project,requestedSettings,providedAdvanced)}let updatedProject=project;if(changes.changedSettings.length>0)try{updatedProject=await patchProjectSettings(client,project,changes.body)}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}return writeUpdateResult({changedSettings:changes.changedSettings,project:updatedProject,previousSettings:changes.previousSettings,requestedSettings,advancedRows:changes.advancedRows,asJson:formatResult.jsonOutput||shouldEmitNonInteractiveCommandError(client),client}),0}var import_chalk254=__toESM(require_source(),1),import_ms26=__toESM(require_ms(),1);var ProjectRmTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}};var e=encodeURIComponent;async function rm9(client,argv){let telemetryClient=new ProjectRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand13.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args}=parsedArgs;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk254.default.cyan(`${getCommandName("project rm <name>")}`)}`),1;let name=args[0];telemetryClient.trackCliArgumentName(name);let start=Date.now();if(!await readConfirmation3(client,name))return output_manager_default.log("User abort"),0;try{await client.fetch(`/v2/projects/${e(name)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status===404)return output_manager_default.error("No such project exists"),1;if(isAPIError(err)&&err.status===403)return output_manager_default.error(err.message),1}let elapsed2=(0,import_ms26.default)(Date.now()-start);return output_manager_default.log(`${import_chalk254.default.cyan("Success!")} Project ${import_chalk254.default.bold(name)} removed ${import_chalk254.default.gray(`[${elapsed2}]`)}`),0}async function readConfirmation3(client,projectName){return output_manager_default.print(prependEmoji(`The project ${import_chalk254.default.bold(projectName)} will be removed permanently.
@@ -1116,7 +1116,7 @@ ${err}`),1)}}var import_chalk258=__toESM(require_source(),1);async function setS
1116
1116
  `),0):(output_manager_default.log(`${import_chalk261.default.bold("Deployment protection")} ${action==="enable"?"enabled":"disabled"} for ${import_chalk261.default.cyan(project.name)}`),0)}let raw=project,slice={};for(let key of PROTECTION_KEYS)key in raw&&(slice[key]=raw[key]);if(preferJson)return client.stdout.write(`${JSON.stringify({projectId:project.id,name:project.name,...slice},null,2)}
1117
1117
  `),0;if(output_manager_default.log(`${import_chalk261.default.bold("Protection settings")} for ${import_chalk261.default.cyan(project.name)} (${project.id})`),Object.keys(slice).length===0)return output_manager_default.log("No deployment protection fields returned for this project."),0;for(let[k,v]of Object.entries(slice))output_manager_default.log(`${import_chalk261.default.cyan(`${k}:`)} ${JSON.stringify(v)}`);return 0}var COMMAND_CONFIG52={inspect:getCommandAliases(inspectSubcommand11),list:getCommandAliases(listSubcommand17),members:getCommandAliases(membersSubcommand),accessGroups:getCommandAliases(accessGroupsSubcommand),add:getCommandAliases(addSubcommand8),"access-summary":getCommandAliases(accessSummarySubcommand),checks:getCommandAliases(checksSubcommand),protection:getCommandAliases(protectionSubcommand),update:getCommandAliases(updateSubcommand8),rename:getCommandAliases(renameSubcommand),remove:getCommandAliases(removeSubcommand13),token:getCommandAliases(tokenSubcommand2),speedInsights:getCommandAliases(speedInsightsSubcommand),webAnalytics:getCommandAliases(webAnalyticsSubcommand),pause:getCommandAliases(pauseSubcommand),"dangerously-delete-immutable-static-asset":getCommandAliases(dangerouslyDeleteImmutableStaticAssetSubcommand),observability:getCommandAliases(observabilitySubcommand),resume:getCommandAliases(resumeSubcommand)};async function main28(client){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(projectCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG52),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("project"),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:projectCommand,columns:client.stderr.columns})),0}parsedArgs.args[1]||(subcommand="list");let exitCode2;switch(subcommand){case"inspect":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(inspectSubcommand11);telemetry2.trackCliSubcommandInspect(subcommandOriginal),exitCode2=await inspect16(client,args);break;case"list":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(listSubcommand17);telemetry2.trackCliSubcommandList(subcommandOriginal),exitCode2=await list21(client,args);break;case"add":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(addSubcommand8);telemetry2.trackCliSubcommandAdd(subcommandOriginal),exitCode2=await add11(client,args);break;case"access-summary":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessSummarySubcommand);telemetry2.trackCliSubcommandAccessSummary(subcommandOriginal),exitCode2=await accessSummary(client,args);break;case"checks":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(checksSubcommand);telemetry2.trackCliSubcommandChecks(args[0]==="add"?"checks add":args[0]==="remove"||args[0]==="rm"?"checks remove":subcommandOriginal),exitCode2=await checks(client,args);break;case"members":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(membersSubcommand);telemetry2.trackCliSubcommandMembers(args[0]==="add"?"members add":args[0]==="remove"||args[0]==="rm"?"members remove":subcommandOriginal),exitCode2=await members(client,args);break;case"accessGroups":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessGroupsSubcommand);telemetry2.trackCliSubcommandAccessGroups(subcommandOriginal),exitCode2=await accessGroups(client,args);break;case"protection":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(protectionSubcommand);telemetry2.trackCliSubcommandProtection(args[0]==="enable"?"protection enable":args[0]==="disable"?"protection disable":subcommandOriginal),exitCode2=await protection(client,args);break;case"webAnalytics":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(webAnalyticsSubcommand);telemetry2.trackCliSubcommandWebAnalytics(args[0]==="enable"?"web-analytics enable":args[0]==="disable"?"web-analytics disable":subcommandOriginal),exitCode2=await webAnalytics(client,args);break;case"speedInsights":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(speedInsightsSubcommand);telemetry2.trackCliSubcommandSpeedInsights(args[0]==="enable"?"speed-insights enable":args[0]==="disable"?"speed-insights disable":subcommandOriginal),exitCode2=await speedInsights(client,args);break;case"pause":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(pauseSubcommand);telemetry2.trackCliSubcommandPause(subcommandOriginal),exitCode2=await pause2(client,args);break;case"dangerously-delete-immutable-static-asset":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(dangerouslyDeleteImmutableStaticAssetSubcommand);telemetry2.trackCliSubcommandDangerouslyDeleteImmutableStaticAsset(subcommandOriginal),exitCode2=await dangerouslyDeleteImmutableStaticAsset(client,args);break;case"observability":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(observabilitySubcommand);telemetry2.trackCliSubcommandObservability(args[0]==="enable"?"observability enable":args[0]==="disable"?"observability disable":subcommandOriginal),exitCode2=await observability(client,args);break;case"resume":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(resumeSubcommand);telemetry2.trackCliSubcommandResume(subcommandOriginal),exitCode2=await resume2(client,args);break;case"token":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(tokenSubcommand2);telemetry2.trackCliSubcommandToken(subcommandOriginal),exitCode2=await getOidcToken(client,args);break;case"rename":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(renameSubcommand);telemetry2.trackCliSubcommandRename(subcommandOriginal),exitCode2=await rename(client,args);break;case"update":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(updateSubcommand8);telemetry2.trackCliSubcommandUpdate(subcommandOriginal),exitCode2=await update6(client,args);break;case"remove":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(removeSubcommand13);telemetry2.trackCliSubcommandRemove(subcommandOriginal),exitCode2=await rm9(client,args);break;default:{if(handleCommandTypo({client,command:parsedArgs.args[1],availableCommands:projectCommand.subcommands}))return 2;let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForProjectsCli);if(fallback!==null){exitCode2=fallback;break}return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG52)),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),2}}return exitCode2===0&&await autoInstallVercelPlugin(client),exitCode2}var import_ms29=__toESM(require_ms(),1);var import_error_utils20=__toESM(require_dist(),1);var import_chalk265=__toESM(require_source(),1);var import_chalk262=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,{contextName}=await getScope(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms28=__toESM(require_ms(),1);var import_chalk264=__toESM(require_source(),1);var import_ms27=__toESM(require_ms(),1);var import_chalk263=__toESM(require_source(),1);function renderAliasStatus(status6){return status6==="completed"?import_chalk263.default.green(status6):status6==="failed"?import_chalk263.default.red(status6):status6==="skipped"?import_chalk263.default.gray(status6):import_chalk263.default.yellow(status6)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms27.default)("3m"),promoteTimeout=Date.now()+(0,import_ms27.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;if(projectCheck.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage)return output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),0;continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),0;if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk264.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk264.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk264.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk264.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk265.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),0):timeout!==void 0&&(0,import_ms28.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk265.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),0):await promoteStatus({client,contextName,deployment,project,timeout})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var promote_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{columns:client.stderr.columns})),2;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms29.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand3,{columns:client.stderr.columns,parent:promoteCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout})}return telemetry2.trackCliArgumentUrlOrDeploymentId(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes})}catch(err){if((0,import_error_utils20.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};var import_chalk267=__toESM(require_source(),1),import_client=__toESM(require_dist3(),1);var import_chalk266=__toESM(require_source(),1);async function getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}){let{config}=client;if(!isValidName(deployIdOrUrl))throw new Error(`The provided argument "${deployIdOrUrl}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default.spinner(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployIdOrUrl)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason.message);team=teamResult.value,deployment=deploymentResult.value,output_manager_default.log(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`)}finally{output_manager_default.stopSpinner()}if(deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}return deployment}var import_error_utils21=__toESM(require_dist(),1);var RedeployTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}trackCliOptionTarget(target){target&&this.trackCliArgument({arg:"target",value:this.redactedTargetName(target)})}};async function redeploy(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(redeployCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RedeployTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("redeploy"),output_manager_default.print(help(redeployCommand,{columns:client.stderr.columns})),2;let deployIdOrUrl=parsedArgs.args[1];if(!deployIdOrUrl)return output_manager_default.error(`Missing required deployment id or url: ${getCommandName("redeploy <deployment-id-or-url>")}`),1;telemetry2.trackCliArgumentUrlOrDeploymentId(deployIdOrUrl),telemetry2.trackCliFlagNoWait(parsedArgs.flags["--no-wait"]),telemetry2.trackCliOptionTarget(parsedArgs.flags["--target"]);let{contextName}=await getScope(client),noWait=!!parsedArgs.flags["--no-wait"],targetArgument=parsedArgs.flags["--target"];try{let fromDeployment=await getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}),target,customEnvironmentSlugOrId;targetArgument?targetArgument==="staging"||targetArgument==="production"?target=targetArgument:targetArgument==="preview"?target=void 0:targetArgument?(customEnvironmentSlugOrId=targetArgument,target=void 0):target=fromDeployment.target:(target=fromDeployment.target??void 0,customEnvironmentSlugOrId=fromDeployment.customEnvironment?.id);let customEnvironment;if(fromDeployment?.projectId&&customEnvironmentSlugOrId){let customEnvironments=await getCustomEnvironments(client,fromDeployment.projectId);customEnvironment=pickCustomEnvironment(customEnvironments,customEnvironmentSlugOrId)}if(customEnvironmentSlugOrId&&!customEnvironment)return output_manager_default.error(`The provided argument "${targetArgument}" is not a valid target environment.`),1;let deployStamp=stamp_default();output_manager_default.spinner(`Redeploying project ${fromDeployment.id}`,0);let deployment=await client.fetch("/v13/deployments?forceNew=1",{body:{deploymentId:fromDeployment.id,meta:{action:"redeploy"},name:fromDeployment.name,target,customEnvironmentSlugOrId},method:"POST"});output_manager_default.stopSpinner();let previewUrl=`https://${deployment.url}`,isProdDeployment=target==="production";if(customEnvironmentSlugOrId&&customEnvironment&&(isProdDeployment=customEnvironment.type==="production"),printAlignedLabel("Inspect",import_chalk267.default.cyan(deployment.inspectorUrl)),printAlignedLabel(isProdDeployment?"Production":"Preview",import_chalk267.default.cyan(previewUrl),isProdDeployment&&noWait?{gutter:"\u25B2"}:{}),client.stdout.isTTY||client.stdout.write(`https://${deployment.url}`),!noWait){output_manager_default.spinner(deployment.readyState==="QUEUED"?"Queued\u2026":"Building\u2026",0);let project,rollingRelease2;if(deployment.projectId&&deployment.projectId!=""&&(project=await getProjectByNameOrId(client,deployment.projectId),rollingRelease2=project?.rollingRelease),deployment.readyState==="READY"&&deployment.aliasAssigned&&!rollingRelease2){if(output_manager_default.spinner("Completing\u2026",0),deployment.target==="production"&&deployment.alias&&deployment.alias.length>0){output_manager_default.stopSpinner();let prodUrl=`https://${deployment.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}}else try{let clientOptions={dispatcher:getFetchDispatcher(),apiUrl:client.apiUrl,debug:output_manager_default.debugEnabled,path:"",teamId:fromDeployment.team?.id,token:client.authConfig.token,userAgent:ua_default};for await(let event of(0,import_client.checkDeploymentStatus)(deployment,clientOptions))if(event.type==="building")output_manager_default.spinner("Building\u2026",0);else if(event.type==="ready"&&rollingRelease2){output_manager_default.spinner("Releasing\u2026",0),output_manager_default.stopSpinner(),deployment=event.payload;break}else if(event.type==="ready"&&(!event.payload.checksState||event.payload.checksState==="completed"))output_manager_default.spinner("Completing\u2026",0);else if(event.type==="checks-running")output_manager_default.spinner("Running Checks\u2026",0);else if(event.type==="alias-assigned"||event.type==="checks-conclusion-failed"){if(output_manager_default.stopSpinner(),event.type==="alias-assigned"&&!Array.isArray(event.payload)&&event.payload.target==="production"&&event.payload.alias&&event.payload.alias.length>0){let prodUrl=`https://${event.payload.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}deployment=event.payload;break}else{if(event.type==="canceled")return output_manager_default.stopSpinner(),output_manager_default.print(`The deployment has been canceled.
1118
1118
  `),1;if(event.type==="error")throw output_manager_default.stopSpinner(),await new Now({client,currentTeam:fromDeployment.team?.id}).handleDeploymentError(event.payload,{env:{}})}}catch(err){output_manager_default.prettyError(err),process.exit(1)}}return printDeploymentStatus(client,deployment,deployStamp,noWait,!1)}catch(err){return output_manager_default.prettyError(err),(0,import_error_utils21.isErrnoException)(err)&&err.code==="ERR_INVALID_TEAM"&&output_manager_default.error(`Use ${import_chalk267.default.bold("vc switch")} to change your current team`),1}}var import_chalk268=__toESM(require_source(),1),import_pluralize18=__toESM(require_pluralize(),1);function withGlobalFlags4(client,commandTemplate){return withGlobalFlags(client,commandTemplate,{preserveProject:!0})}async function parseSubcommandArgs3(argv,command2){let parsedArgs;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){return printError(err),1}return parsedArgs}async function confirmAction2(client,skipConfirmation,message,details){return skipConfirmation?!0:(details&&output_manager_default.print(` ${details}
1119
- `),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search:search2,page,perPage=50,versionId,diff:diff2}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId),versionId&&params.set("versionId",versionId),diff2?params.set("diff",diff2===!0?"true":diff2):(params.set("per_page",perPage.toString()),search2&&params.set("q",search2),page&&params.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list22(client,argv){let parsed=await parseSubcommandArgs3(argv,listSubcommand18);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search2=flags["--search"],page=flags["--next"]??flags["--page"],perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--version"],versionId,versionName,useDiff=!1;if(staging){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk268.default.bold(project.name)}. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search2&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --version flags together"),1;output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),version2=versions2.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version2)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=version2.id,versionName=version2.name||version2.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk268.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search2&&(spinnerMessage+=` matching "${search2}"`),output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search:search2,page,perPage,versionId,diff:useDiff});if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk268.default.bold(versionName||"")} ${import_chalk268.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
1119
+ `),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search:search3,page,perPage=50,versionId,diff:diff2}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId),versionId&&params.set("versionId",versionId),diff2?params.set("diff",diff2===!0?"true":diff2):(params.set("per_page",perPage.toString()),search3&&params.set("q",search3),page&&params.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list22(client,argv){let parsed=await parseSubcommandArgs3(argv,listSubcommand18);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],page=flags["--next"]??flags["--page"],perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--version"],versionId,versionName,useDiff=!1;if(staging){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk268.default.bold(project.name)}. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search3&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --version flags together"),1;output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),version2=versions2.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version2)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=version2.id,versionName=version2.name||version2.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk268.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search:search3,page,perPage,versionId,diff:useDiff});if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk268.default.bold(versionName||"")} ${import_chalk268.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
1120
1120
  No changes from production version
1121
1121
  `):(added.length>0&&(output_manager_default.print(`
1122
1122
  ${import_chalk268.default.bold(import_chalk268.default.green(`Added (${added.length}):`))}
@@ -1125,8 +1125,8 @@ ${err}`),1)}}var import_chalk258=__toESM(require_source(),1);async function setS
1125
1125
  `),output_manager_default.print(formatRedirectsTable(removed,"-"))),unchanged.length>0&&output_manager_default.print(`
1126
1126
  ${import_chalk268.default.gray(`${unchanged.length} redirect${unchanged.length===1?"":"s"} unchanged`)}
1127
1127
  `),output_manager_default.print(`
1128
- `))}else{let resultMessage=`${(0,import_pluralize18.default)("Redirect",redirects.length,!0)} found for ${import_chalk268.default.bold(project.name)}`;versionName&&(resultMessage+=` ${import_chalk268.default.gray(`(version: ${versionName})`)}`),search2&&(resultMessage+=` matching "${search2}"`),pagination&&(resultMessage+=` ${import_chalk268.default.gray(`(page ${pagination.page} of ${pagination.numPages})`)}`),resultMessage+=` ${import_chalk268.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),client.nonInteractive&&redirects.length===0&&!staging&&!versionIdFlag&&output_manager_default.log(` ${withGlobalFlags4(client,"redirects list")} shows production redirects only. If you added redirects but do not see them here, they may still be staged only\u2014run ${withGlobalFlags4(client,"redirects list --staging")} to view staged changes.`),redirects.length>0&&(output_manager_default.print(formatRedirectsTable(redirects)),output_manager_default.print(`
1129
- `))}if(pagination&&pagination.page<pagination.numPages){let command2=`redirects list --next ${pagination.page+1}`;search2&&(command2+=` --search "${search2}"`),perPage&&(command2+=` --limit ${perPage}`),output_manager_default.log(`To display the next page, run ${withGlobalFlags4(client,command2)}`)}return 0}function formatRedirectsTable(redirects,actionSymbol){let rows=redirects.map(redirect=>{let status6=redirect.statusCode||(redirect.permanent?308:307),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk268.default.green:actionSymbol==="-"?import_chalk268.default.red:s=>s;return[colorFn(`${prefix} ${redirect.source}`),colorFn(`${redirect.destination}`),colorFn(status6.toString())]});return formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])}var import_chalk269=__toESM(require_source(),1),import_ms30=__toESM(require_ms(),1),import_pluralize19=__toESM(require_pluralize(),1);async function listVersions2(client,argv){let parsed=await parseSubcommandArgs3(argv,listVersionsSubcommand);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,lsStamp=stamp_default();output_manager_default.spinner(`Fetching redirect versions for ${import_chalk269.default.bold(project.name)}`);let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),sortedVersions=sortVersions(versions2).slice(0,20);return output_manager_default.log(`${(0,import_pluralize19.default)("Version",sortedVersions.length,!0)} found for ${import_chalk269.default.bold(project.name)} ${import_chalk269.default.gray(lsStamp())}`),sortedVersions.length>0&&(output_manager_default.print(formatVersionsTable(sortedVersions)),output_manager_default.print(`
1128
+ `))}else{let resultMessage=`${(0,import_pluralize18.default)("Redirect",redirects.length,!0)} found for ${import_chalk268.default.bold(project.name)}`;versionName&&(resultMessage+=` ${import_chalk268.default.gray(`(version: ${versionName})`)}`),search3&&(resultMessage+=` matching "${search3}"`),pagination&&(resultMessage+=` ${import_chalk268.default.gray(`(page ${pagination.page} of ${pagination.numPages})`)}`),resultMessage+=` ${import_chalk268.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),client.nonInteractive&&redirects.length===0&&!staging&&!versionIdFlag&&output_manager_default.log(` ${withGlobalFlags4(client,"redirects list")} shows production redirects only. If you added redirects but do not see them here, they may still be staged only\u2014run ${withGlobalFlags4(client,"redirects list --staging")} to view staged changes.`),redirects.length>0&&(output_manager_default.print(formatRedirectsTable(redirects)),output_manager_default.print(`
1129
+ `))}if(pagination&&pagination.page<pagination.numPages){let command2=`redirects list --next ${pagination.page+1}`;search3&&(command2+=` --search "${search3}"`),perPage&&(command2+=` --limit ${perPage}`),output_manager_default.log(`To display the next page, run ${withGlobalFlags4(client,command2)}`)}return 0}function formatRedirectsTable(redirects,actionSymbol){let rows=redirects.map(redirect=>{let status6=redirect.statusCode||(redirect.permanent?308:307),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk268.default.green:actionSymbol==="-"?import_chalk268.default.red:s=>s;return[colorFn(`${prefix} ${redirect.source}`),colorFn(`${redirect.destination}`),colorFn(status6.toString())]});return formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])}var import_chalk269=__toESM(require_source(),1),import_ms30=__toESM(require_ms(),1),import_pluralize19=__toESM(require_pluralize(),1);async function listVersions2(client,argv){let parsed=await parseSubcommandArgs3(argv,listVersionsSubcommand);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,lsStamp=stamp_default();output_manager_default.spinner(`Fetching redirect versions for ${import_chalk269.default.bold(project.name)}`);let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),sortedVersions=sortVersions(versions2).slice(0,20);return output_manager_default.log(`${(0,import_pluralize19.default)("Version",sortedVersions.length,!0)} found for ${import_chalk269.default.bold(project.name)} ${import_chalk269.default.gray(lsStamp())}`),sortedVersions.length>0&&(output_manager_default.print(formatVersionsTable(sortedVersions)),output_manager_default.print(`
1130
1130
  `)),0}function sortVersions(versions2){return versions2.slice().sort((a,b)=>a.isStaging&&!b.isStaging?-1:!a.isStaging&&b.isStaging?1:a.isLive&&!b.isLive?-1:!a.isLive&&b.isLive?1:b.lastModified-a.lastModified)}function formatVersionsTable(versions2){let now=Date.now(),rows=versions2.map(version2=>{let age=(0,import_ms30.default)(now-version2.lastModified),status6="";version2.isStaging?status6=import_chalk269.default.yellow("Staging"):version2.isLive?status6=import_chalk269.default.green("Live"):status6=import_chalk269.default.gray("Previous");let name=version2.name||import_chalk269.default.gray("(unnamed)"),redirectCountStr=version2.redirectCount!==void 0&&version2.redirectCount!==null?version2.redirectCount.toString():import_chalk269.default.gray("-");return[status6,name,version2.id,redirectCountStr,version2.createdBy||import_chalk269.default.gray("(unknown)"),import_chalk269.default.gray(age+" ago")]});return formatTable(["Status","Name","ID","Redirects","Created By","Age"],["l","l","l","r","l","l"],[{rows}])}var import_chalk270=__toESM(require_source(),1);async function putRedirects(client,projectId,redirects,teamId,name){let url="/v1/bulk-redirects",body={projectId,redirects};return teamId&&(body.teamId=teamId),name&&(body.name=name),await client.fetch(url,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)})}async function updateRedirectVersion(client,projectId,versionId,action,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:versionId,action})})}async function add12(client,argv){let parsed=await parseSubcommandArgs3(argv,addSubcommand9);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{versions:versions2}=await getRedirectVersions(client,project.id,teamId),existingStagingVersion=versions2.find(v=>v.isStaging),{args,flags}=parsed,skipPrompts=flags["--yes"]||client.nonInteractive;if(client.nonInteractive&&(!args[0]||!args[1])){let sourcePart=args[0]||"<source>",destPart=args[1]!==void 0&&args[1]!==""?args[1]:"<destination>",flagParts=buildRedirectsSuggestionFlags(client.argv.slice(2),"add"),cmd2=getCommandNamePlain(`redirects add ${sourcePart} ${destPart} ${flagParts.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`In non-interactive mode source and destination are required. Run: ${cmd2}`,next:[{command:cmd2,when:"to add a redirect"}]},1),1}let source;if(args[0]){if(source=args[0],!isValidUrl(source))return output_manager_default.error("Source must be a relative path (starting with /) or an absolute URL"),1}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),1;output_manager_default.log(`Add a new redirect
1131
1131
  `),source=await client.input.text({message:"What is the source URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Source URL cannot be empty"})}let destination;if(args[1]){if(destination=args[1],!isValidUrl(destination))return output_manager_default.error("Destination must be a relative path (starting with /) or an absolute URL"),1}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),1;args[0]||output_manager_default.log(`Add a new redirect
1132
1132
  `),destination=await client.input.text({message:"What is the destination URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Destination URL cannot be empty"})}let statusCode;if(flags["--status"]){if(statusCode=flags["--status"],![301,302,307,308].includes(statusCode))return output_manager_default.error("Status code must be 301, 302, 307, or 308"),1}else skipPrompts?statusCode=307:statusCode=await client.input.select({message:"Select the status code:",choices:[{name:"307 - Temporary Redirect (preserves request method)",value:307},{name:"308 - Permanent Redirect (preserves request method)",value:308},{name:"301 - Moved Permanently (cached by browsers)",value:301},{name:"302 - Found (temporary redirect, not cached)",value:302}]});let caseSensitive;flags["--case-sensitive"]!==void 0?caseSensitive=flags["--case-sensitive"]:skipPrompts?caseSensitive=!1:caseSensitive=await client.input.confirm("Should the redirect be case sensitive?",!1);let preserveQueryParams;flags["--preserve-query-params"]!==void 0?preserveQueryParams=flags["--preserve-query-params"]:skipPrompts?preserveQueryParams=!1:preserveQueryParams=await client.input.confirm("Should query parameters be preserved?",!1);let versionName;if(flags["--name"]){if(versionName=flags["--name"],versionName&&versionName.length>256)return output_manager_default.error("Name must be 256 characters or less"),1}else skipPrompts?versionName=void 0:await client.input.confirm("Do you want to provide a name for this version?",!1)&&(versionName=await client.input.text({message:"Version name (max 256 characters):",validate:val=>val&&val.length>256?"Name must be 256 characters or less":!0}),versionName||(versionName=void 0));let addStamp=stamp_default();output_manager_default.spinner("Adding redirect");let{alias:alias2,version:version2}=await putRedirects(client,project.id,[{source,destination,statusCode,caseSensitive,preserveQueryParams}],teamId,versionName);if(client.nonInteractive){output_manager_default.stopSpinner();let testUrl=alias2?source.startsWith("/")?`https://${alias2}${source}`:`https://${alias2}`:void 0,fullArgs=client.argv.slice(2),afterAdd=getArgsAfterRedirectsSubcommand(fullArgs,"add"),globalFlags=getRedirectGlobalFlagsOnly(afterAdd),flagsSuffix=globalFlags.length>0?` ${globalFlags.join(" ")}`:"",listStagingCmd=getCommandNamePlain(`redirects list --staging${flagsSuffix}`.trim()),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterAdd),promoteCmd=getCommandNamePlain(`redirects promote ${version2.id} ${promoteFlagParts.join(" ")}`.trim()),jsonOutput={status:AGENT_STATUS.OK,redirect:{source,destination,statusCode,caseSensitive,preserveQueryParams},version:{id:version2.id,name:version2.name||version2.id},...alias2&&{alias:alias2,testUrl},stagingOnly:!0,inProduction:!1,message:`Redirect was added to a staging version only\u2014not live in production yet. \`vercel redirects list\` (without --staging) shows production redirects only, so you may see 0 until you promote. Use ${listStagingCmd} to see staged redirects including this one, then ${promoteCmd} to promote this staging version to production.`,next:[{command:listStagingCmd,when:"To list staged redirects (includes this redirect)"},{command:promoteCmd,when:"To promote this staging version to production"}]};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
@@ -1198,7 +1198,7 @@ ${import_chalk274.default.gray("No changes detected from current production vers
1198
1198
  `)}),0}function readConfirmation4(deployments,projects2){return new Promise(resolve14=>{if(deployments.length>0){output_manager_default.log(`The following ${(0,import_pluralize20.default)("deployment",deployments.length,deployments.length>1)} will be permanently removed:`);let deploymentTable=table(deployments.map(depl=>{let time=import_chalk275.default.gray(`${(0,import_ms31.default)(Date.now()-depl.createdAt)} ago`),url=depl.url?import_chalk275.default.underline(`https://${depl.url}`):"";return[` ${depl.id}`,url,time]}),{align:["l","r","l"],hsep:6});output_manager_default.print(`${deploymentTable}
1199
1199
  `)}for(let depl of deployments)for(let{alias:alias2}of depl.aliases)output_manager_default.warn(`${import_chalk275.default.underline(`https://${alias2}`)} is an alias for ${import_chalk275.default.bold(depl.url)} and will be removed`);if(projects2.length>0){output_manager_default.print(`The following ${(0,import_pluralize20.default)("project",projects2.length,projects2.length>1)} will be permanently removed, including all ${projects2.length>1?"their":"its"} deployments and aliases:
1200
1200
  `);for(let project of projects2)output_manager_default.print(`${import_chalk275.default.gray("-")} ${import_chalk275.default.bold(project.name)}
1201
- `)}output_manager_default.print(`${import_chalk275.default.bold.red("> Are you sure?")} ${import_chalk275.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize20.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize20.default)("project",projects2.length,!0)}`:`${(0,import_pluralize20.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize20.default)("project",projects2.length,!0)}`}var import_error_utils22=__toESM(require_dist(),1),import_ms34=__toESM(require_ms(),1);var import_chalk277=__toESM(require_source(),1);var import_ms33=__toESM(require_ms(),1);var import_chalk276=__toESM(require_source(),1);var import_ms32=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms32.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms32.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk276.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk276.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk276.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk276.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms33.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk277.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),2;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms34.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils22.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms35=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms35.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandFetch(actual){this.trackCliSubcommand({subcommand:"fetch",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG54={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),fetch:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,fetch:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg.startsWith("--cwd=")){let cwdPath=arg.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg.startsWith("--project=")){let projectName=arg.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg);continue}if(arg==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg,args[i+1]),i++);continue}preservedParts.push(arg),listParts.push(arg)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG54),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),2;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),1;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),1;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),1;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),1;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"fetch":{let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk278=__toESM(require_source(),1),import_pluralize21=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand19,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search2=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),1}let versionId,versionName,useDiff=!1;if(production){output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk278.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk278.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search2&&(spinnerMessage+=` matching "${search2}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search2,filter,versionId,diff:useDiff});if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk278.default.bold(versionName||"")} ${import_chalk278.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
1201
+ `)}output_manager_default.print(`${import_chalk275.default.bold.red("> Are you sure?")} ${import_chalk275.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize20.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize20.default)("project",projects2.length,!0)}`:`${(0,import_pluralize20.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize20.default)("project",projects2.length,!0)}`}var import_error_utils22=__toESM(require_dist(),1),import_ms34=__toESM(require_ms(),1);var import_chalk277=__toESM(require_source(),1);var import_ms33=__toESM(require_ms(),1);var import_chalk276=__toESM(require_source(),1);var import_ms32=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms32.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms32.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk276.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk276.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk276.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk276.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms33.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk277.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),2;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms34.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils22.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms35=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms35.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandFetch(actual){this.trackCliSubcommand({subcommand:"fetch",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG54={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),fetch:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,fetch:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg.startsWith("--cwd=")){let cwdPath=arg.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg.startsWith("--project=")){let projectName=arg.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg);continue}if(arg==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg,args[i+1]),i++);continue}preservedParts.push(arg),listParts.push(arg)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG54),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),2;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),1;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),1;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),1;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),1;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"fetch":{let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk278=__toESM(require_source(),1),import_pluralize21=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand19,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),1}let versionId,versionName,useDiff=!1;if(production){output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk278.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk278.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search3,filter,versionId,diff:useDiff});if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk278.default.bold(versionName||"")} ${import_chalk278.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
1202
1202
  No changes from production version
1203
1203
  `):(added.length>0&&(output_manager_default.print(`
1204
1204
  ${import_chalk278.default.bold(import_chalk278.default.green(`Added (${added.length}):`))}
@@ -1209,7 +1209,7 @@ ${import_chalk274.default.gray("No changes detected from current production vers
1209
1209
  `),output_manager_default.print(formatRoutesTable(removed,"-"))),unchanged.length>0&&output_manager_default.print(`
1210
1210
  ${import_chalk278.default.gray(`${unchanged.length} route${unchanged.length===1?"":"s"} unchanged`)}
1211
1211
  `),output_manager_default.print(`
1212
- `)),version2?.alias&&output_manager_default.log(`Test your changes: ${import_chalk278.default.cyan(`https://${version2.alias}`)}`)}else{let resultMessage=`${(0,import_pluralize21.default)("Route",routes2.length,!0)} found for ${import_chalk278.default.bold(project.name)}`;if(versionName&&(resultMessage+=` ${import_chalk278.default.gray(`(version: ${versionName})`)}`),search2&&(resultMessage+=` matching "${search2}"`),filter&&(resultMessage+=` filtered by ${filter}`),resultMessage+=` ${import_chalk278.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),routes2.length>0&&(expand?output_manager_default.print(formatExpandedRoutes(routes2)):output_manager_default.print(formatRoutesTable(routes2)),output_manager_default.print(`
1212
+ `)),version2?.alias&&output_manager_default.log(`Test your changes: ${import_chalk278.default.cyan(`https://${version2.alias}`)}`)}else{let resultMessage=`${(0,import_pluralize21.default)("Route",routes2.length,!0)} found for ${import_chalk278.default.bold(project.name)}`;if(versionName&&(resultMessage+=` ${import_chalk278.default.gray(`(version: ${versionName})`)}`),search3&&(resultMessage+=` matching "${search3}"`),filter&&(resultMessage+=` filtered by ${filter}`),resultMessage+=` ${import_chalk278.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),routes2.length>0&&(expand?output_manager_default.print(formatExpandedRoutes(routes2)):output_manager_default.print(formatRoutesTable(routes2)),output_manager_default.print(`
1213
1213
  `)),limit&&limit.maxRoutes>0){let utilization=limit.currentRoutes/limit.maxRoutes;if(utilization>=.8){let usageColor=utilization>=1?import_chalk278.default.red:import_chalk278.default.yellow;output_manager_default.print(` ${usageColor(`Routes Usage: ${limit.currentRoutes}/${limit.maxRoutes}`)}
1214
1214
 
1215
1215
  `)}}}return 0}function formatRoutesTable(routes2,actionSymbol){let rows=routes2.map((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),status6=rule.enabled===!1?import_chalk278.default.red("Disabled"):import_chalk278.default.green("Enabled"),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk278.default.green:actionSymbol==="-"?import_chalk278.default.red:actionSymbol==="~"?import_chalk278.default.yellow:s=>s,position=actionSymbol?"":`${index+1}`;return[colorFn(`${prefix} ${position}`).trim(),colorFn(truncate(rule.name,30)+(rule.staged?import_chalk278.default.yellow(" (draft)"):"")),colorFn(truncate(rule.route.src,40)),colorFn(typeLabels),status6]});return formatTable(["#","Name","Path Pattern","Actions","Status"],["r","l","l","l","l"],[{rows}])}function truncate(str,maxLength){return str.length<=maxLength?str:str.slice(0,maxLength-3)+"..."}function formatExpandedRoutes(routes2){let lines=[""];return routes2.forEach((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),syntaxLabel=getSrcSyntaxLabel(rule),statusText=rule.enabled===!1?import_chalk278.default.red("Disabled"):import_chalk278.default.green("Enabled"),stagedText=rule.staged?import_chalk278.default.yellow(" (staged)"):"";if(lines.push(` ${import_chalk278.default.bold(`${index+1}. ${rule.name}`)}${stagedText} ${import_chalk278.default.gray(`[${rule.id}]`)}`),lines.push(` ${import_chalk278.default.cyan("Status:")} ${statusText}`),lines.push(` ${import_chalk278.default.cyan("Type:")} ${typeLabels}`),rule.description&&lines.push(` ${import_chalk278.default.cyan("Desc:")} ${rule.description}`),lines.push(` ${import_chalk278.default.cyan("Source:")} ${rule.route.src}`),lines.push(` ${import_chalk278.default.cyan("Syntax:")} ${syntaxLabel}`),rule.route.dest&&lines.push(` ${import_chalk278.default.cyan("Dest:")} ${rule.route.dest}`),rule.route.status&&lines.push(` ${import_chalk278.default.cyan("Code:")} ${rule.route.status}`),rule.route.headers&&Object.keys(rule.route.headers).length>0){lines.push(` ${import_chalk278.default.cyan("Response Headers:")}`);for(let[key,value]of Object.entries(rule.route.headers))lines.push(` ${key}: ${value}`)}if(rule.route.transforms&&rule.route.transforms.length>0){lines.push(` ${import_chalk278.default.cyan("Transforms:")}`);for(let transform of rule.route.transforms)lines.push(` ${formatTransform(transform)}`)}if(rule.route.has&&rule.route.has.length>0){lines.push(` ${import_chalk278.default.cyan("Has conditions:")}`);for(let condition of rule.route.has)lines.push(` ${formatCondition(condition)}`)}if(rule.route.missing&&rule.route.missing.length>0){lines.push(` ${import_chalk278.default.cyan("Does not have conditions:")}`);for(let condition of rule.route.missing)lines.push(` ${formatCondition(condition)}`)}lines.push("")}),lines.join(`
@@ -1254,19 +1254,19 @@ ${import_chalk274.default.gray("No changes detected from current production vers
1254
1254
  `),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_CONFIG55={list:getCommandAliases(listSubcommand19),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand12),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 main30(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),1}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2;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(listSubcommand19),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),2):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand12),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect17(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-VOZ4IKZI.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-MPLEIGYN.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-IJ7UEQ3G.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-WY6N4R7I.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-L4L2V3MZ.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-L4D4GCJI.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-FIHJARRJ.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-OZPJHXTE.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-3VYFSUTH.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),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 arg=args[i],[option,inlineValue]=arg.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.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{trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",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 DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default";function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}request(path3,options={}){let url=new URL(path3,this.baseUrl);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=20}={}){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=20,sort,from,to,executionId}){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})}};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})}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(){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.",retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError():{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(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==="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==="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"||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():{reason:AGENT_REASON.API_ERROR,message:"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):(output_manager_default.fatal(details.message),1)}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."}}}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,usage2),when:"Provide valid schedule arguments"}]}),1):(output_manager_default.fatal(message),1)}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)}
1255
1255
  `)}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.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 link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedulesClient=new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}),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,name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`${action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked"} 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)}
1256
1256
  `)}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})}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.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 link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).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",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})}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.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:"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:buildCommandWithYes(client.argv)}]},1),1;let link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;if(!skipConfirmation&&!await client.input.confirm(`Delete schedule ${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 new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted schedule ${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)}
1257
- `)}else output_manager_default.success(message);return 0}var import_chalk282=__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})}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})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments2(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"}]}),1):(output_manager_default.fatal(message),1)}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function executionTable(executions2){let rows=[["Execution ID","Source","Fired At"].map(header=>import_chalk282.default.dim(header)),...executions2.map(execution=>[import_chalk282.default.bold(execution.executionId),execution.invokeSource?capitalize(execution.invokeSource):import_chalk282.default.gray("-"),execution.firedAt===null?import_chalk282.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
1257
+ `)}else output_manager_default.success(message);return 0}var import_chalk282=__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})}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})}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"}]}),1):(output_manager_default.fatal(message),1)}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function executionTable(executions2){let rows=[["Execution ID","Source","Fired At"].map(header=>import_chalk282.default.dim(header)),...executions2.map(execution=>[import_chalk282.default.bold(execution.executionId),execution.invokeSource?capitalize(execution.invokeSource):import_chalk282.default.gray("-"),execution.firedAt===null?import_chalk282.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
1258
1258
  `).map(line2=>line2.trimEnd()).join(`
1259
- `).replace(/^/gm," ")}function nextPageCommand(client,name,namespace,options){let parts=["schedules executions list",quoteArg(name)];return options.namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),options.limitWasExplicit&&parts.push(`--limit ${options.limit}`),options.sortWasExplicit&&options.sort&&parts.push(`--sort ${options.sort}`),options.from!==void 0&&options.to!==void 0&&parts.push(`--from ${options.from} --to ${options.to}`),options.executionId!==void 0&&parts.push(`--execution-id ${quoteArg(options.executionId)}`),parts.push(`--next ${quoteArg(options.cursor)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function validateTimeRange(from,to){return from===void 0!=(to===void 0)?"`--from` and `--to` must both be provided.":from===void 0||to===void 0?null:!Number.isInteger(from)||from<0?"`--from` must be a non-negative integer (Unix milliseconds).":!Number.isInteger(to)||to<0?"`--to` must be a non-negative integer (Unix milliseconds).":to<=from?"`--to` must be after `--from`.":to-from>MAX_EXECUTION_RANGE_MS?"The time range must be at most 30 days.":null}async function list24(client,argv){let telemetry2=new SchedulesListExecutionsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(executionsListSubcommand.options))}catch(error){return invalidArguments2(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20}),sort=flags["--sort"],from=flags["--from"],to=flags["--to"],executionId=flags["--execution-id"];if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionSort(sort),telemetry2.trackCliOptionFrom(from),telemetry2.trackCliOptionTo(to),telemetry2.trackCliOptionExecutionId(executionId),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments2(client,`A schedule name is required. Usage: ${getCommandName(USAGE15)}`);if(args.length!==1)return invalidArguments2(client,`Expected one schedule name. Usage: ${getCommandName(USAGE15)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments2(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments2(client,namespaceError);if(!limitResult.valid)return invalidArguments2(client,limitResult.message);if(sort!==void 0&&sort!=="asc"&&sort!=="desc")return invalidArguments2(client,"`--sort` must be `asc` or `desc`.");let timeRangeError=validateTimeRange(from,to);if(timeRangeError)return invalidArguments2(client,timeRangeError);if(executionId!==void 0&&!executionId.trim())return invalidArguments2(client,"`--execution-id` cannot be empty.");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments2(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner(`Fetching executions for ${namespace}/${name}\u2026`);let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).listExecutions({name,namespace,cursor:flags["--next"],limit:limitResult.value,...sort!==void 0?{sort}:{},...from!==void 0?{from,to}:{},...executionId!==void 0?{executionId}:{}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list-executions",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} execution${result.data.length===1?"":"s"} for schedule ${namespace}/${name}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1259
+ `).replace(/^/gm," ")}function nextPageCommand(client,name,namespace,options){let parts=["schedules executions list",quoteArg(name)];return options.namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),options.limitWasExplicit&&parts.push(`--limit ${options.limit}`),options.sortWasExplicit&&options.sort&&parts.push(`--sort ${options.sort}`),options.from!==void 0&&options.to!==void 0&&parts.push(`--from ${options.from} --to ${options.to}`),options.executionId!==void 0&&parts.push(`--execution-id ${quoteArg(options.executionId)}`),parts.push(`--next ${quoteArg(options.cursor)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function validateTimeRange(from,to){return from===void 0!=(to===void 0)?"`--from` and `--to` must both be provided.":from===void 0||to===void 0?null:!Number.isInteger(from)||from<0?"`--from` must be a non-negative integer (Unix milliseconds).":!Number.isInteger(to)||to<0?"`--to` must be a non-negative integer (Unix milliseconds).":to<=from?"`--to` must be after `--from`.":to-from>MAX_EXECUTION_RANGE_MS?"The time range must be at most 30 days.":null}async function list24(client,argv){let telemetry2=new SchedulesListExecutionsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(executionsListSubcommand.options))}catch(error){return invalidArguments3(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20}),sort=flags["--sort"],from=flags["--from"],to=flags["--to"],executionId=flags["--execution-id"];if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionSort(sort),telemetry2.trackCliOptionFrom(from),telemetry2.trackCliOptionTo(to),telemetry2.trackCliOptionExecutionId(executionId),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments3(client,`A schedule name is required. Usage: ${getCommandName(USAGE15)}`);if(args.length!==1)return invalidArguments3(client,`Expected one schedule name. Usage: ${getCommandName(USAGE15)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments3(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);if(!limitResult.valid)return invalidArguments3(client,limitResult.message);if(sort!==void 0&&sort!=="asc"&&sort!=="desc")return invalidArguments3(client,"`--sort` must be `asc` or `desc`.");let timeRangeError=validateTimeRange(from,to);if(timeRangeError)return invalidArguments3(client,timeRangeError);if(executionId!==void 0&&!executionId.trim())return invalidArguments3(client,"`--execution-id` cannot be empty.");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments3(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner(`Fetching executions for ${namespace}/${name}\u2026`);let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).listExecutions({name,namespace,cursor:flags["--next"],limit:limitResult.value,...sort!==void 0?{sort}:{},...from!==void 0?{from,to}:{},...executionId!==void 0?{executionId}:{}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list-executions",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} execution${result.data.length===1?"":"s"} for schedule ${namespace}/${name}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1260
1260
  `),0}if(result.data.length===0)return output_manager_default.print(`No executions found for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}.
1261
1261
  `),0;if(output_manager_default.print(`Executions for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}
1262
1262
 
1263
1263
  ${executionTable(result.data)}
1264
1264
  `),result.cursor){let next=nextPageCommand(client,name,namespace,{namespaceWasExplicit:flags["--namespace"]!==void 0,limit:limitResult.value,limitWasExplicit:flags["--limit"]!==void 0,sort,sortWasExplicit:flags["--sort"]!==void 0,from,to,executionId,cursor:result.cursor});output_manager_default.print(`
1265
1265
  More executions are available. Run ${cmd(next)} to continue.
1266
- `)}return 0}var COMMAND_CONFIG56={list:getCommandAliases(executionsListSubcommand)};async function executions(client,args,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(args,getFlagsSpecification(executionsSubcommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];function printHelp(command2,nested){return output_manager_default.print(help(command2,{parent:nested?{...schedulesCommand,name:"schedules executions"}:schedulesCommand,columns:client.stderr.columns})),2}return subcommand?subcommand==="list"?needHelp?(telemetry2.trackCliFlagHelp("schedules",`executions:${subcommandOriginal}`),printHelp(executionsListSubcommand,!0)):(telemetry2.trackCliSubcommandExecutionsList(subcommandOriginal),list24(client,subArgs)):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),printHelp(executionsSubcommand,!1)):needHelp?(telemetry2.trackCliFlagHelp("schedules","executions"),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2)}var import_chalk283=__toESM(require_source(),1);var SchedulesGetTelemetryClient=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})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE16="schedules get <name>";function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE16),when:"Provide a valid schedule name"}]}),1):(output_manager_default.fatal(message),1)}function formatExpression(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget(target){return target.type==="queue"?`${target.topic} ${import_chalk283.default.gray("(Queue)")}`:`${target.function} ${import_chalk283.default.gray("(Function)")}`}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize2(schedule.state)),printAlignedLabel("Source",capitalize2(schedule.source)),printAlignedLabel("Type",capitalize2(schedule.expression.type)),printAlignedLabel("Expression",formatExpression(schedule.expression)),printAlignedLabel("Timezone",schedule.timezone),schedule.jitter!==void 0&&printAlignedLabel("Jitter",`${schedule.jitter} minute${schedule.jitter===1?"":"s"}`),printAlignedLabel("Target",formatTarget(schedule.target)),printAlignedLabel("Schedule ID",schedule.scheduleId),printAlignedLabel("Project ID",schedule.projectId),printAlignedLabel("Owner ID",schedule.ownerId),printAlignedLabel("Created",formatDate(schedule.createdAt)),printAlignedLabel("Updated",formatDate(schedule.updatedAt))}async function get3(client,argv){let telemetry2=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand2.options))}catch(error){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),1):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),1)}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments3(client,"A schedule name is required");if(args.length!==1)return invalidArguments3(client,`Expected one schedule name. Usage: ${getCommandName(USAGE16)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments3(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments3(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message:`Schedule ${namespace}/${name} found.`}:schedule;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1267
- `),0}return printSchedule(schedule),0}var import_chalk284=__toESM(require_source(),1);var SchedulesListTelemetryClient=class extends TelemetryClient{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})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE17="schedules list";function invalidArguments4(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE17),when:"List schedules with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize3(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExpression2(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget2(target){return target.type==="queue"?`Queue: ${target.topic}`:`Function: ${target.function}`}function scheduleTable(schedules){let rows=[["Name","State","Type","Expression","Target"].map(header=>import_chalk284.default.dim(header)),...schedules.map(schedule=>[import_chalk284.default.bold(schedule.name),capitalize3(schedule.state),capitalize3(schedule.expression.type),formatExpression2(schedule.expression),formatTarget2(schedule.target)])];return table(rows,{hsep:3}).split(`
1266
+ `)}return 0}var COMMAND_CONFIG56={list:getCommandAliases(executionsListSubcommand)};async function executions(client,args,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(args,getFlagsSpecification(executionsSubcommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];function printHelp(command2,nested){return output_manager_default.print(help(command2,{parent:nested?{...schedulesCommand,name:"schedules executions"}:schedulesCommand,columns:client.stderr.columns})),2}return subcommand?subcommand==="list"?needHelp?(telemetry2.trackCliFlagHelp("schedules",`executions:${subcommandOriginal}`),printHelp(executionsListSubcommand,!0)):(telemetry2.trackCliSubcommandExecutionsList(subcommandOriginal),list24(client,subArgs)):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),printHelp(executionsSubcommand,!1)):needHelp?(telemetry2.trackCliFlagHelp("schedules","executions"),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2)}var import_chalk283=__toESM(require_source(),1);var SchedulesGetTelemetryClient=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})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE16="schedules get <name>";function invalidArguments4(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE16),when:"Provide a valid schedule name"}]}),1):(output_manager_default.fatal(message),1)}function formatExpression(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget(target){return target.type==="queue"?`${target.topic} ${import_chalk283.default.gray("(Queue)")}`:`${target.function} ${import_chalk283.default.gray("(Function)")}`}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize2(schedule.state)),printAlignedLabel("Source",capitalize2(schedule.source)),printAlignedLabel("Type",capitalize2(schedule.expression.type)),printAlignedLabel("Expression",formatExpression(schedule.expression)),printAlignedLabel("Timezone",schedule.timezone),schedule.jitter!==void 0&&printAlignedLabel("Jitter",`${schedule.jitter} minute${schedule.jitter===1?"":"s"}`),printAlignedLabel("Target",formatTarget(schedule.target)),printAlignedLabel("Schedule ID",schedule.scheduleId),printAlignedLabel("Project ID",schedule.projectId),printAlignedLabel("Owner ID",schedule.ownerId),printAlignedLabel("Created",formatDate(schedule.createdAt)),printAlignedLabel("Updated",formatDate(schedule.updatedAt))}async function get3(client,argv){let telemetry2=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand2.options))}catch(error){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),1):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),1)}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments4(client,"A schedule name is required");if(args.length!==1)return invalidArguments4(client,`Expected one schedule name. Usage: ${getCommandName(USAGE16)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments4(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments4(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments4(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message:`Schedule ${namespace}/${name} found.`}:schedule;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1267
+ `),0}return printSchedule(schedule),0}var import_chalk284=__toESM(require_source(),1);var SchedulesListTelemetryClient=class extends TelemetryClient{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})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE17="schedules list";function invalidArguments5(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE17),when:"List schedules with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize3(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExpression2(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget2(target){return target.type==="queue"?`Queue: ${target.topic}`:`Function: ${target.function}`}function scheduleTable(schedules){let rows=[["Name","State","Type","Expression","Target"].map(header=>import_chalk284.default.dim(header)),...schedules.map(schedule=>[import_chalk284.default.bold(schedule.name),capitalize3(schedule.state),capitalize3(schedule.expression.type),formatExpression2(schedule.expression),formatTarget2(schedule.target)])];return table(rows,{hsep:3}).split(`
1268
1268
  `).map(line2=>line2.trimEnd()).join(`
1269
- `).replace(/^/gm," ")}function nextPageCommand2(client,namespace,namespaceWasExplicit,limit,limitWasExplicit,cursor2){let parts=["schedules list"];return namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),limitWasExplicit&&parts.push(`--limit ${limit}`),parts.push(`--next ${quoteArg(cursor2)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}async function list25(client,argv){let telemetry2=new SchedulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand20.options))}catch(error){return invalidArguments4(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20});if(telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==0)return invalidArguments4(client,`Expected no arguments. Usage: ${getCommandName(USAGE17)}`);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments4(client,namespaceError);if(!limitResult.valid)return invalidArguments4(client,limitResult.message);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments4(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedules\u2026");let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).list({namespace,cursor:flags["--next"],limit:limitResult.value})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list",namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} schedule${result.data.length===1?"":"s"} in namespace ${namespace}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1269
+ `).replace(/^/gm," ")}function nextPageCommand2(client,namespace,namespaceWasExplicit,limit,limitWasExplicit,cursor2){let parts=["schedules list"];return namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),limitWasExplicit&&parts.push(`--limit ${limit}`),parts.push(`--next ${quoteArg(cursor2)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}async function list25(client,argv){let telemetry2=new SchedulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand20.options))}catch(error){return invalidArguments5(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20});if(telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==0)return invalidArguments5(client,`Expected no arguments. Usage: ${getCommandName(USAGE17)}`);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments5(client,namespaceError);if(!limitResult.valid)return invalidArguments5(client,limitResult.message);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments5(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedules\u2026");let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).list({namespace,cursor:flags["--next"],limit:limitResult.value})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list",namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} schedule${result.data.length===1?"":"s"} in namespace ${namespace}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1270
1270
  `),0}if(result.data.length===0)return output_manager_default.print(`No schedules found in namespace ${namespace}.
1271
1271
  `),0;if(output_manager_default.print(`Schedules in namespace ${import_chalk284.default.bold(namespace)}
1272
1272
 
@@ -1334,10 +1334,17 @@ Please select a team scope using ${getCommandName("switch")} or use ${cmd("--sco
1334
1334
  `:""}${err.serverMessage||err.message}`:err.serverMessage||err.message}return(0,import_error_utils24.errorToString)(err)}var VERCEL_ACCOUNT_BILLING_URL="https://vercel.com/account/billing";function createTeamErrorReason(err){if(isAPIError(err)&&err.status===400){let msg=(err.serverMessage||err.message||"").toLowerCase();if(msg.includes("payment"))return"payment_required";if(msg.includes("slug")||msg.includes("cannot be used"))return"slug_unavailable"}return isAPIError(err)&&err.status===429?"rate_limited":(0,import_error_utils24.isError)(err)&&(err.name==="AbortError"||err.message==="Request timed out.")?"timeout":"team_creation_failed"}async function add14(client,argv=[]){let parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand11.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)},1),printError(error),1}let slugFlag=parsedArgs.flags["--slug"],nameFlag=parsedArgs.flags["--name"];if(client.nonInteractive){let missing=[];if((!slugFlag||!slugFlag.trim())&&missing.push("--slug"),(!nameFlag||!nameFlag.trim())&&missing.push("--name"),missing.length>0){let fullArgs=client.argv.slice(2),addIdx=fullArgs.indexOf("add"),afterAdd=addIdx>=0?fullArgs.slice(addIdx+1):[],flagParts=getSameSubcommandSuggestionFlags(afterAdd),cmd2=getCommandNamePlain(`teams add --slug <slug> --name <name> ${flagParts.join(" ")}`.trim()),requiredPlain=missing.join(" and "),verb=missing.length===1?"is":"are";outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`In non-interactive mode ${requiredPlain} ${verb} required. Run: ${cmd2}`,next:[{command:cmd2,when:"to create a team non-interactively"}]},1)}let slug2=slugFlag.trim().toLowerCase(),name2=nameFlag.trim();if(!validateSlug(slug2)){let msg=`Invalid ${param("--slug")}: must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores (e.g. ${param("acme")})`,msgPlain="Invalid --slug: must start with a letter and contain only lowercase letters, numbers, hyphens, and underscores (e.g. acme)";return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_slug",message:msgPlain,next:[{command:getCommandNamePlain("teams add --slug <slug> --name <name>")}]},1),output_manager_default.error(msg),1}if(!validateName(name2)){let msg=`Invalid ${param("--name")}: only letters, numbers, spaces, hyphens, and underscores allowed`,msgPlain="Invalid --name: only letters, numbers, spaces, hyphens, and underscores allowed";return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_name",message:msgPlain},1),output_manager_default.error(msg),1}output_manager_default.spinner(teamUrlPrefix+slug2);let team2;try{team2=await createTeamWithTimeout(client,slug2)}catch(err){if(output_manager_default.stopSpinner(),client.nonInteractive){let message=formatCreateTeamErrorPlain(err,slug2),reason=createTeamErrorReason(err),next=[];reason==="payment_required"&&(message+=` Add a payment method at ${VERCEL_ACCOUNT_BILLING_URL}, then retry.`,next.push({command:openUrlInBrowserCommand(VERCEL_ACCOUNT_BILLING_URL),when:"To open the billing page in your browser"})),outputAgentError(client,{status:"error",reason,message,...next.length>0&&{next}},1)}return output_manager_default.error(formatCreateTeamError(err,slug2)),1}output_manager_default.stopSpinner(),output_manager_default.spinner(teamNamePrefix+name2);try{let res2=await patchTeam(client,team2.id,{name:name2});team2=Object.assign(team2,res2)}catch(err){return output_manager_default.stopSpinner(),client.nonInteractive&&outputAgentError(client,{status:"error",reason:"team_update_failed",message:(0,import_error_utils24.errorToString)(err)},1),output_manager_default.error((0,import_error_utils24.errorToString)(err)),1}return output_manager_default.stopSpinner(),client.config.currentTeam=team2.id,writeToConfigFile(client.config),output_manager_default.success(`Team ${import_chalk302.default.bold(team2.name)} (${import_chalk302.default.cyan(`vercel.com/${slug2}`)}) created.`),0}let slug=slugFlag?.trim().toLowerCase(),team,elapsed2;output_manager_default.log(`Pick a team identifier for its URL (e.g.: ${import_chalk302.default.cyan("`vercel.com/acme`")})`);do{try{slug=await client.input.text({message:`- ${teamUrlPrefix}`,validate:validateSlug,default:slug})}catch(err){if((0,import_error_utils24.isError)(err)&&err.message==="USER_ABORT")return output_manager_default.log("Canceled"),0;throw err}elapsed2=stamp_default(),output_manager_default.spinner(teamUrlPrefix+slug);try{team=await createTeamWithTimeout(client,slug)}catch(err){output_manager_default.stopSpinner(),output_manager_default.print(eraseLines(2)),output_manager_default.error(formatCreateTeamError(err,slug)),slug=void 0}}while(!team);output_manager_default.stopSpinner(),process.stdout.write(eraseLines(2)),output_manager_default.success(`Team created ${elapsed2()}`),output_manager_default.log(`${import_chalk302.default.cyan(`${chars_default.tick} `)+teamUrlPrefix+slug}
1335
1335
  `),output_manager_default.log("Pick a display name for your team");let name=nameFlag?.trim();try{name=await client.input.text({message:`- ${teamNamePrefix}`,validate:validateName,default:name})}catch(err){if((0,import_error_utils24.isError)(err)&&err.message==="USER_ABORT")return output_manager_default.log("No name specified"),2;throw err}elapsed2=stamp_default(),output_manager_default.spinner(teamNamePrefix+name);let res=await patchTeam(client,team.id,{name});return output_manager_default.stopSpinner(),process.stdout.write(eraseLines(2)),team=Object.assign(team,res),output_manager_default.success(`Team name saved ${elapsed2()}`),output_manager_default.log(`${import_chalk302.default.cyan(`${chars_default.tick} `)+teamNamePrefix+team.name}
1336
1336
  `),output_manager_default.spinner("Saving"),client.config.currentTeam=team.id,writeToConfigFile(client.config),output_manager_default.stopSpinner(),await invite(client,[],{introMsg:"Invite your teammates! When done, press enter on an empty field",noopMsg:`You can invite teammates later by running ${getCommandName("teams invite")}`}),0}var import_chalk303=__toESM(require_source(),1);var TeamsSwitchTelemetryClient=class extends TelemetryClient{trackCliArgumentName(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}};var updateCurrentTeam=(config,team)=>{team?config.currentTeam=team.id:delete config.currentTeam,writeToConfigFile(config)};async function warnIfStaleLinkExists(client,newOrgId){let link=null;try{link=await getLinkFromDir(getVercelDirectory(client.cwd))}catch{link=null}!link||link.orgId===newOrgId||output_manager_default.warn("This directory is linked to a project under a different team/scope. Commands like `deploy` will still use the linked project's team. Run `vc link` to re-link.")}async function change(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(switchSubcommand.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)},1),printError(error),1}let{args:[desiredSlug]}=parsedArgs;if(client.nonInteractive&&!desiredSlug){let fullArgs=client.argv.slice(2),switchIdx=fullArgs.findIndex(a=>a==="switch"||a==="change"),afterSwitch=switchIdx>=0?fullArgs.slice(switchIdx+1):fullArgs,afterPositional=afterSwitch.length>0&&!afterSwitch[0].startsWith("-")?afterSwitch.slice(1):afterSwitch,flagTail=getSameSubcommandSuggestionFlags(afterPositional),cmd2=getCommandNamePlain(`teams switch <slug> ${flagTail.join(" ")}`.trim());return outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`In non-interactive mode a team slug (or username for personal scope) is required. Run: ${cmd2}`,next:[{command:cmd2,when:"to switch scope (replace <slug> with team slug)"},{command:withGlobalFlags(client,"teams list"),when:"to list teams and slugs"}]},1),1}let{config,telemetryEventStore}=client;new TeamsSwitchTelemetryClient({opts:{store:telemetryEventStore}}).trackCliArgumentName(desiredSlug),output_manager_default.spinner("Fetching teams information");let[user,teams2]=await Promise.all([getUser(client),getTeams(client)]),defaultTeamId=user.version==="northstar"?user.defaultTeamId:void 0,currentTeamId=config.currentTeam||defaultTeamId,personalScopeSelected=!currentTeamId,currentTeam=currentTeamId?teams2.find(team=>team.id===currentTeamId):void 0;if(!personalScopeSelected&&!currentTeam&&output_manager_default.warn("You are no longer a member of the previously selected team. Choose another scope to continue."),!desiredSlug){let teamChoices=teams2.slice(0).sort((a,b)=>a.name.toLowerCase().localeCompare(b.name.toLowerCase())).map(team=>{let title6=`${team.name} (${team.slug})`,selected=team.id===currentTeam?.id;return selected&&(title6+=` ${import_chalk303.default.bold("(current)")}`),team.limited&&(title6+=` ${emoji("locked")}`),{name:title6,value:team.slug,short:team.slug,selected}}),suffix=personalScopeSelected?` ${import_chalk303.default.bold("(current)")}`:"";user.limited&&(suffix+=` ${emoji("locked")}`);let choices=[...user.version==="northstar"?[]:[{separator:"Personal Account"},{name:`${user.name||user.email} (${user.username})${suffix}`,value:user.username,short:user.username,selected:personalScopeSelected}],{separator:"Teams"},...teamChoices];if(output_manager_default.stopSpinner(),client.nonInteractive){let fullArgs=client.argv.slice(2),switchIdx=fullArgs.findIndex(a=>a==="switch"||a==="change"),afterSwitch=switchIdx>=0?fullArgs.slice(switchIdx+1):fullArgs,afterPositional=afterSwitch.length>0&&!afterSwitch[0].startsWith("-")?afterSwitch.slice(1):afterSwitch,flagTail=getSameSubcommandSuggestionFlags(afterPositional),cmd2=getCommandNamePlain(`teams switch <slug> ${flagTail.join(" ")}`.trim());return outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`In non-interactive mode a team slug (or username for personal scope) is required. Run: ${cmd2}`,next:[{command:cmd2,when:"to switch scope (replace <slug> with team slug)"},{command:withGlobalFlags(client,"teams list"),when:"to list teams and slugs"}]},1),1}desiredSlug=await list(client,{message:"Switch to:",choices,eraseFinalAnswer:!0})}if(!desiredSlug)return output_manager_default.log("No changes made."),0;if(desiredSlug===user.username||desiredSlug===user.email)return user.version==="northstar"?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"personal_scope_not_allowed",message:"You cannot set your Personal Account as the scope in this account type."},1),output_manager_default.error("You cannot set your Personal Account as the scope."),1):personalScopeSelected?(output_manager_default.log("No changes made"),0):(user.limited&&await client.reauthenticate({scope:user.username,teamId:null}),updateCurrentTeam(config),output_manager_default.success(`Your account (${import_chalk303.default.bold(user.username)}) is now active!`),await warnIfStaleLinkExists(client,user.id),0);let newTeam=teams2.find(team=>team.slug===desiredSlug);if(!newTeam)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"scope_not_accessible",message:`You do not have permission to access scope "${desiredSlug}".`,next:[{command:withGlobalFlags(client,"teams list")}]},1),output_manager_default.error(`You do not have permission to access scope ${import_chalk303.default.bold(desiredSlug)}.`),1;if(newTeam.slug===currentTeam?.slug)return output_manager_default.log("No changes made"),0;if(newTeam.limited){let samlEnabled=newTeam.saml?.connection?.state==="active";await client.reauthenticate({teamId:newTeam.id,scope:newTeam.slug,enforced:samlEnabled&&newTeam.saml?.enforced===!0})}return updateCurrentTeam(config,newTeam),output_manager_default.success(`The team ${import_chalk303.default.bold(newTeam.name)} (${newTeam.slug}) is now active!`),await warnIfStaleLinkExists(client,newTeam.id),0}function optionRoot(flagToken){return flagToken.startsWith("--")&&flagToken.includes("=")?`--${flagToken.slice(2).split("=")[0]}`:flagToken}function teamsRequestNextCommand(client){let fullArgs=client.argv.slice(2),reqIdx=fullArgs.findIndex(a=>a==="request"||a==="access-request"),afterRequest=reqIdx>=0?fullArgs.slice(reqIdx+1):[],globalParts=getGlobalFlagsFromArgs(fullArgs),subParts=getSameSubcommandSuggestionFlags(afterRequest),seen=new Set;for(let g of globalParts)seen.add(optionRoot(g));let extras=[];for(let i=0;i<subParts.length;){let a=subParts[i],root=optionRoot(a);if(seen.has(root)){i+=1,!a.includes("=")&&i<subParts.length&&!subParts[i].startsWith("-")&&(i+=1);continue}seen.add(root),extras.push(a),i+=1,!a.includes("=")&&i<subParts.length&&!subParts[i].startsWith("-")&&(extras.push(subParts[i]),i+=1)}let base=withGlobalFlags(client,"teams request [userId]");return extras.length===0?base:getCommandNamePlain(`${base} ${extras.join(" ")}`.trim())}function apiFailureReason(err){return typeof err.code=="string"&&err.code?err.code:typeof err.code=="number"&&Number.isFinite(err.code)?String(err.code):`http_${err.status}`}async function request(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(requestSubcommand.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)},1),printError(error),1}if(parsedArgs.args.length>1){if(client.nonInteractive){let cmdStr=teamsRequestNextCommand(client);outputAgentError(client,{status:"error",reason:"invalid_arguments",message:"Invalid number of arguments. At most one optional userId is allowed.",next:[{command:cmdStr,when:"to check join-request status (omit userId for the current user)"}]},1)}return output_manager_default.error("Invalid number of arguments. Usage: `vercel teams request [userId]`"),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:formatResult.error},1),output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,{currentTeam:teamId}=client.config;if(!teamId){let switchCmd=withGlobalFlags(client,"teams switch <slug>");return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"team_scope_required",message:`Team scope is required for teams request. Run ${switchCmd} or use --scope.`,next:[{command:switchCmd,when:"to select a team scope (replace <slug> with your team slug)"}]},1),output_manager_default.error(`This command requires a team scope. Run ${cmd("teams switch")} first.`),1}let userId=parsedArgs.args[0],path3=userId?`/v1/teams/${encodeURIComponent(teamId)}/request/${encodeURIComponent(userId)}`:`/v1/teams/${encodeURIComponent(teamId)}/request`,data;try{data=await client.fetch(path3)}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:apiFailureReason(err),message:err.serverMessage||err.message,next:[{command:teamsRequestNextCommand(client),when:"to retry after resolving the error (same flags and optional userId)"}]},1),printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify(data,null,2)}
1337
- `),0):(output_manager_default.log(`Team: ${String(data.teamName??"")} (${String(data.teamSlug??"")})`),output_manager_default.log(`Confirmed: ${String(data.confirmed??"")}`),data.accessRequestedAt!=null&&output_manager_default.log(`Access requested at: ${String(data.accessRequestedAt)}`),data.joinedFrom&&typeof data.joinedFrom=="object"&&output_manager_default.log(`Joined from: ${JSON.stringify(data.joinedFrom)}`),0)}var import_chalk304=__toESM(require_source(),1);async function members2(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(membersSubcommand2.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)},1),printError(error),1}let next=parsedArgs.flags["--next"],limit=parsedArgs.flags["--limit"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("Please provide a number for flag `--next`"),1;try{getPaginationOpts(parsedArgs.flags)}catch(error){return output_manager_default.error(error instanceof Error?error.message:String(error)),1}let teamId=client.config.currentTeam;if(!teamId)return output_manager_default.error("Team scope is required. Run `vercel teams switch <slug>` or pass `--scope`."),1;let query=new URLSearchParams({limit:String(limit??20)});next&&query.set("until",String(next));let result=await client.fetch(`/v2/teams/${teamId}/members?${query}`),members3=result.members||[],{pagination}=result;if(asJson)return client.stdout.write(`${JSON.stringify({members:members3,pagination},null,2)}
1337
+ `),0):(output_manager_default.log(`Team: ${String(data.teamName??"")} (${String(data.teamSlug??"")})`),output_manager_default.log(`Confirmed: ${String(data.confirmed??"")}`),data.accessRequestedAt!=null&&output_manager_default.log(`Access requested at: ${String(data.accessRequestedAt)}`),data.joinedFrom&&typeof data.joinedFrom=="object"&&output_manager_default.log(`Joined from: ${JSON.stringify(data.joinedFrom)}`),0)}var import_chalk304=__toESM(require_source(),1);function teamMemberPreviewLabel(member){return member.username&&member.email?`${member.username} (${member.email})`:teamMemberLabel(member)}function matchesEmail(first,second){return!!(first&&second&&first.trim().toLowerCase()===second.trim().toLowerCase())}function invoiceRecipientError(invoiceRecipient,departingMember,currentInvoiceRecipient){if(!email.test(invoiceRecipient))return"Enter a valid invoice recipient email address.";if(matchesEmail(invoiceRecipient,departingMember.email)||matchesEmail(invoiceRecipient,currentInvoiceRecipient))return"Choose a different invoice recipient. That address belongs to the team member being removed."}function buildInteractiveRemoveCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams members remove <member>",void 0,{excludeFlags:["--non-interactive"]})}async function membersRemove2(client,argv){let parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification([formatOption,jsonOption]))}catch(error){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let{jsonOutput}=formatResult;function fail(reason,message,extra){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message,...extra}),1):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
1338
+ `),1):(output_manager_default.fatal(message),1)}if(parsedArgs.args.length!==1)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide exactly 1 team member. Usage: `vercel teams members remove <member>`",{next:[{command:buildInteractiveRemoveCommand(client),when:"Remove a member from the currently scoped team"}]});let teamId=client.config.currentTeam;if(!teamId)return fail("team_scope_required","Select a team. Run `vercel teams switch <slug>` or pass `--scope`.",{next:[{command:buildCommandWithGlobalFlags(client.argv,"teams switch <slug>"),when:"Select the team containing the member"}]});let identifier=parsedArgs.args[0],team,member;try{[team,member]=await Promise.all([getTeamByIdOrSlug(client,teamId),getTeamMemberByIdentifier(client,teamId,identifier)])}catch{return fail(AGENT_REASON.API_ERROR,"Failed to resolve the team member. Try again.")}if(!member){let listCommand=buildCommandWithGlobalFlags(client.argv,"teams members");return fail(AGENT_REASON.NOT_FOUND,`Couldn't find that team member. Run \`${listCommand}\` to list current members.`,{next:[{command:listCommand,when:"List current members to find the right identifier"}]})}let label=teamMemberPreviewLabel(member),teamLabel=`${team.name} (${team.slug})`,currentInvoiceRecipient=team.billing?.email,requiresInvoiceRecipient=matchesEmail(currentInvoiceRecipient,member.email),invoiceRecipient;if(requiresInvoiceRecipient&&currentInvoiceRecipient){if(!canPrompt(client)){let actionRequired={status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_REQUIREMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,userActionRequired:!0,message:"Invoices currently go to this team member. Rerun this command in an interactive terminal to choose where future invoices are sent.",hint:"Run this command in an interactive terminal to choose a new invoice recipient.",missing:["interactive_terminal"],data:{team:{id:team.id,name:team.name,slug:team.slug},member:{uid:member.uid,email:member.email,username:member.username},invoiceRecipient:currentInvoiceRecipient},next:[{command:buildInteractiveRemoveCommand(client),when:"A user reruns this command in an interactive terminal"}]};return outputActionRequired(client,actionRequired,1),client.stdout.write(`${JSON.stringify(actionRequired,null,2)}
1339
+ `),1}output_manager_default.print(`
1340
+ `),output_manager_default.print(`Invoices currently go to ${currentInvoiceRecipient}. Future invoices will be sent to:`),invoiceRecipient=(await client.input.text({message:"New invoice recipient?",validate:value=>!invoiceRecipientError(value.trim(),member,currentInvoiceRecipient)})).trim();let error=invoiceRecipientError(invoiceRecipient,member,currentInvoiceRecipient);if(error)return fail(AGENT_REASON.INVALID_ARGUMENTS,error)}if(!canPrompt(client)){let actionRequired={status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,userActionRequired:!0,message:"To remove this team member, rerun the command in an interactive terminal and confirm the prompt. No team member was removed.",hint:"Run this command in an interactive terminal to review and confirm removal.",data:{team:{id:team.id,name:team.name,slug:team.slug},member:{uid:member.uid,email:member.email,username:member.username}},next:[{command:buildInteractiveRemoveCommand(client),when:"A user runs this command in an interactive terminal"}]};return outputActionRequired(client,actionRequired,1),client.stdout.write(`${JSON.stringify(actionRequired,null,2)}
1341
+ `),1}if(output_manager_default.print(`
1342
+ `),printAlignedLabel("Team",teamLabel),printAlignedLabel("Member",label),requiresInvoiceRecipient&&invoiceRecipient&&currentInvoiceRecipient&&(printAlignedLabel("Invoice To",currentInvoiceRecipient),printAlignedLabel("New Recipient",invoiceRecipient)),output_manager_default.print(`
1343
+ `),!await client.input.confirm(requiresInvoiceRecipient?"Update the invoice recipient and remove this team member?":"Remove this team member?",!1))return output_manager_default.log("Canceled."),0;if(requiresInvoiceRecipient&&invoiceRecipient&&currentInvoiceRecipient)try{await client.fetch(`/stripe/invoices/settings?${new URLSearchParams({teamId}).toString()}`,{method:"PATCH",body:{email:invoiceRecipient}}),printAlignedLabel("Updated","Invoice recipient",{gutter:"\u2713"})}catch{return fail(AGENT_REASON.API_ERROR,"Couldn't update the invoice recipient. Check your billing permissions or try again.")}try{let result=await client.fetch(`/v2/teams/${encodeURIComponent(teamId)}/members/${encodeURIComponent(member.uid)}`,{method:"DELETE"});return jsonOutput?(client.stdout.write(`${JSON.stringify(result,null,2)}
1344
+ `),0):(printAlignedLabel("Removed",label,{gutter:"\u2713"}),printAlignedLabel("Team",teamLabel),0)}catch{return fail(AGENT_REASON.API_ERROR,requiresInvoiceRecipient?"Invoice recipient updated, but the team member was not removed. Try removing them again.":"Failed to remove the team member. Try again.")}}async function members2(client,argv){if(argv[0]==="invite")return invite(client,argv.slice(1));if(argv[0]==="remove"||argv[0]==="rm")return membersRemove2(client,argv.slice(1));let parsedArgs,flagsSpecification=getFlagsSpecification(membersSubcommand2.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)},1),printError(error),1}let next=parsedArgs.flags["--next"],limit=parsedArgs.flags["--limit"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("Please provide a number for flag `--next`"),1;try{getPaginationOpts(parsedArgs.flags)}catch(error){return output_manager_default.error(error instanceof Error?error.message:String(error)),1}let teamId=client.config.currentTeam;if(!teamId)return output_manager_default.error("Team scope is required. Run `vercel teams switch <slug>` or pass `--scope`."),1;let query=new URLSearchParams({limit:String(limit??20)});next&&query.set("until",String(next));let result=await client.fetch(`/v2/teams/${teamId}/members?${query}`),members3=result.members||[],{pagination}=result;if(asJson)return client.stdout.write(`${JSON.stringify({members:members3,pagination},null,2)}
1338
1345
  `),0;let rows=[["uid","Identity","Role"].map(str=>(0,import_chalk304.gray)(str)),...members3.map(member=>[member.uid,member.username||member.email||"",member.role||""])];if(client.stderr.write(`${table(rows,{hsep:3})}
1339
1346
  `),pagination?.next){let flags=getCommandFlags(parsedArgs.flags,["--next","-N"]),nextCmd=`${packageName} teams members${flags} --next ${pagination.next}`;output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}return 0}var import_chalk305=__toESM(require_source(),1);async function sso(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(ssoSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("No team context. Run `vercel switch` or use --scope."),1;try{let full=await client.fetch(`/teams/${encodeURIComponent(team.id)}`),payload={teamId:full.id,slug:full.slug,name:full.name,saml:full.saml??null};return formatResult.jsonOutput?(client.stdout.write(`${JSON.stringify(payload,null,2)}
1340
- `),0):(output_manager_default.log(`${import_chalk305.default.bold("Team")} ${full.name} (${import_chalk305.default.cyan(full.slug)})`),full.saml?(output_manager_default.log(`${import_chalk305.default.cyan("SAML enforced:")} ${String(full.saml.enforced)}`),full.saml.connection?.state&&output_manager_default.log(`${import_chalk305.default.cyan("Connection state:")} ${full.saml.connection.state}`)):output_manager_default.log("No SAML configuration on this team (or not visible to your token)."),0)}catch(err){if(isAPIError(err))return output_manager_default.error(err.serverMessage||`API error (${err.status})`),1;throw err}}var TeamsTelemetryClient=class extends TelemetryClient{trackCliSubcommandInvite(actual){actual&&this.trackCliSubcommand({subcommand:"invite",value:actual})}trackCliSubcommandAdd(actual){actual&&this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandSwitch(actual){actual&&this.trackCliSubcommand({subcommand:"switch",value:actual})}trackCliSubcommandList(actual){actual&&this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRequest(actual){actual&&this.trackCliSubcommand({subcommand:"request",value:actual})}trackCliSubcommandSso(actual){actual&&this.trackCliSubcommand({subcommand:"sso",value:actual})}trackCliSubcommandMembers(actual){actual&&this.trackCliSubcommand({subcommand:"members",value:actual})}};var COMMAND_CONFIG61={list:["ls","list"],switch:["switch","change"],add:["create","add"],invite:["invite"],request:["request","access-request"],sso:["sso"],members:["members","member"]};async function teams(client){let telemetry2=new TeamsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(teamsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},1),printError(error),1}parsedArgs.args[0]==="switch"&&parsedArgs.args.unshift("teams");let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG61),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("teams",subcommand),output_manager_default.print(help(teamsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:teamsCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(listSubcommand23),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list28(client,args));case"switch":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(switchSubcommand),2):(telemetry2.trackCliSubcommandSwitch(subcommandOriginal),change(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(addSubcommand11),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add14(client,args));case"invite":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(inviteSubcommand),2):(telemetry2.trackCliSubcommandInvite(subcommandOriginal),invite(client,args));case"request":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(requestSubcommand),2):(telemetry2.trackCliSubcommandRequest(subcommandOriginal),request(client,args));case"sso":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(ssoSubcommand),2):(telemetry2.trackCliSubcommandSso(subcommandOriginal),sso(client,args));case"members":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(membersSubcommand2),2):(telemetry2.trackCliSubcommandMembers(subcommandOriginal),members2(client,args));default:{let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForTeamsCli);return fallback!==null?fallback:(output_manager_default.error("Please specify a valid subcommand: add | ls | switch | invite | request | sso | members"),output_manager_default.print(help(teamsCommand,{columns:client.stderr.columns})),2)}}}var import_chalk306=__toESM(require_source(),1);async function ls9(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand24.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let validation=validateJsonOutput(parsedArgs.flags);if(!validation.valid)return output_manager_default.error(validation.error),1;let asJson=validation.jsonOutput,limit=parsedArgs.flags["--limit"];if(typeof limit=="number"&&(limit<1||limit>100))return output_manager_default.error("`--limit` must be between 1 and 100."),1;let next=parsedArgs.flags["--next"],params=new URLSearchParams;typeof limit=="number"&&params.set("limit",String(limit)),typeof next=="string"&&params.set("until",next);let qs=params.toString(),path3=`/v6/user/tokens${qs?`?${qs}`:""}`,result=await client.fetch(path3,{useCurrentTeam:!1}),tokens=result.tokens||[];if(asJson)return client.stdout.write(`${JSON.stringify(result,null,2)}
1347
+ `),0):(output_manager_default.log(`${import_chalk305.default.bold("Team")} ${full.name} (${import_chalk305.default.cyan(full.slug)})`),full.saml?(output_manager_default.log(`${import_chalk305.default.cyan("SAML enforced:")} ${String(full.saml.enforced)}`),full.saml.connection?.state&&output_manager_default.log(`${import_chalk305.default.cyan("Connection state:")} ${full.saml.connection.state}`)):output_manager_default.log("No SAML configuration on this team (or not visible to your token)."),0)}catch(err){if(isAPIError(err))return output_manager_default.error(err.serverMessage||`API error (${err.status})`),1;throw err}}var TeamsTelemetryClient=class extends TelemetryClient{trackCliSubcommandInvite(actual){actual&&this.trackCliSubcommand({subcommand:"invite",value:actual})}trackCliSubcommandAdd(actual){actual&&this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandSwitch(actual){actual&&this.trackCliSubcommand({subcommand:"switch",value:actual})}trackCliSubcommandList(actual){actual&&this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRequest(actual){actual&&this.trackCliSubcommand({subcommand:"request",value:actual})}trackCliSubcommandSso(actual){actual&&this.trackCliSubcommand({subcommand:"sso",value:actual})}trackCliSubcommandMembers(actual){actual&&this.trackCliSubcommand({subcommand:"members",value:actual})}};var COMMAND_CONFIG61={list:["ls","list"],switch:["switch","change"],add:["create","add"],invite:["invite"],request:["request","access-request"],sso:["sso"],members:["members","member"]};async function teams(client){let telemetry2=new TeamsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(teamsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},1),printError(error),1}parsedArgs.args[0]==="switch"&&parsedArgs.args.unshift("teams");let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG61),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("teams",subcommand),output_manager_default.print(help(teamsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:teamsCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(listSubcommand23),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list28(client,args));case"switch":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(switchSubcommand),2):(telemetry2.trackCliSubcommandSwitch(subcommandOriginal),change(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(addSubcommand11),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add14(client,args));case"invite":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(inviteSubcommand),2):(telemetry2.trackCliSubcommandInvite(subcommandOriginal),invite(client,args));case"request":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(requestSubcommand),2):(telemetry2.trackCliSubcommandRequest(subcommandOriginal),request(client,args));case"sso":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),printHelp(ssoSubcommand),2):(telemetry2.trackCliSubcommandSso(subcommandOriginal),sso(client,args));case"members":return needHelp?(telemetry2.trackCliFlagHelp("teams",subcommandOriginal),args[0]==="invite"?(printHelp(membersInviteSubcommand),2):args[0]==="remove"||args[0]==="rm"?(printHelp(membersRemoveSubcommand),2):(printHelp(membersSubcommand2),2)):(telemetry2.trackCliSubcommandMembers(args[0]==="invite"?"members invite":args[0]==="remove"||args[0]==="rm"?"members remove":subcommandOriginal),members2(client,args));default:{let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForTeamsCli);return fallback!==null?fallback:(output_manager_default.error("Please specify a valid subcommand: add | ls | switch | invite | request | sso | members"),output_manager_default.print(help(teamsCommand,{columns:client.stderr.columns})),2)}}}var import_chalk306=__toESM(require_source(),1);async function ls9(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand24.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let validation=validateJsonOutput(parsedArgs.flags);if(!validation.valid)return output_manager_default.error(validation.error),1;let asJson=validation.jsonOutput,limit=parsedArgs.flags["--limit"];if(typeof limit=="number"&&(limit<1||limit>100))return output_manager_default.error("`--limit` must be between 1 and 100."),1;let next=parsedArgs.flags["--next"],params=new URLSearchParams;typeof limit=="number"&&params.set("limit",String(limit)),typeof next=="string"&&params.set("until",next);let qs=params.toString(),path3=`/v6/user/tokens${qs?`?${qs}`:""}`,result=await client.fetch(path3,{useCurrentTeam:!1}),tokens=result.tokens||[];if(asJson)return client.stdout.write(`${JSON.stringify(result,null,2)}
1341
1348
  `),0;if(tokens.length===0)return output_manager_default.log("No tokens found."),0;let rows=[["id","name","type","active"].map(h=>(0,import_chalk306.gray)(h)),...tokens.map(t=>[t.id??"",t.name??"",t.type??"",t.active===void 0?"":String(t.active)])];if(client.stderr.write(`${table(rows,{hsep:2})}
1342
1349
  `),result.pagination?.next){let flags=getCommandFlags(parsedArgs.flags,["_","--next","-N"]),nextCmd=`${packageName} tokens ls${flags} --next ${quoteArg(String(result.pagination.next))}`;output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}return 0}var import_open19=__toESM(require_open(),1);import{KNOWN_AGENTS as KNOWN_AGENTS2}from"@vercel/detect-agent";var VERCEL_ACCOUNT_TOKENS_URL="https://vercel.com/account/tokens",CLASSIC_TOKEN_GUIDANCE=`Creating a new token requires a classic personal access token. Sessions from "vercel login" use OAuth and cannot call the create-token API.
1343
1350
 
@@ -1357,7 +1364,7 @@ Common cases:
1357
1364
 
1358
1365
  Learn more: ${import_chalk307.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 join39,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)}
1359
1366
  `,{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)&&currentTime-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 join39(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}=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),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_chalk308=__toESM(require_source(),1);var COMMAND_CONFIG63={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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG63),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})),2;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(statusSubcommand6),2):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status4(client));case"flush":return flush(client,args);case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(enableSubcommand5),2):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable5(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(disableSubcommand5),2):disable5(client);default:{let errorMessage2=parsedArguments.args.length!==2?"Invalid number of arguments":"Invalid subcommand";return output_manager_default.print(`${import_chalk308.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
1360
- `),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),2}}}var TracesTelemetryClient=class extends TelemetryClient{trackCliArgumentRequestId(requestId){requestId&&this.trackCliArgument({arg:"requestId",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})}trackCliOptionView(view){view&&this.trackCliOption({option:"view",value:view})}};var 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}){return fetchQueryEngineTrace({client,teamId,projectId,requestId})}async function fetchQueryEngineTrace({client,teamId,projectId,requestId}){let traceUrl=new URL(`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 timestamp=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(timestamp),...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 timestamp=Date.parse(value);if(!Number.isFinite(timestamp))throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");return timestamp}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&&sections.push(renderErrors(analysis)),analysis.repeatedOps.length>0&&sections.push(renderRepeatedOps(analysis)),sections.push(renderTree(analysis)),`${sections.join(`
1367
+ `),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),2}}}var TracesTelemetryClient=class extends TelemetryClient{trackCliArgumentRequestId(requestId){requestId&&this.trackCliArgument({arg:"requestId",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_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}){return fetchQueryEngineTrace({client,teamId,projectId,requestId})}async function fetchQueryEngineTrace({client,teamId,projectId,requestId}){let traceUrl=new URL(`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 timestamp=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(timestamp),...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 timestamp=Date.parse(value);if(!Number.isFinite(timestamp))throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");return timestamp}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&&sections.push(renderErrors(analysis)),analysis.repeatedOps.length>0&&sections.push(renderRepeatedOps(analysis)),sections.push(renderTree(analysis)),`${sections.join(`
1361
1368
 
1362
1369
  `)}
1363
1370
  `}function renderHeader(analysis,options){let{trace:trace3,root,rootDurationUs,errorSpans}=analysis,attributes=root?.attributes,method=readAttrString(attributes,"http.method"),target=readAttrString(attributes,"http.target"),status6=readAttrString(attributes,"http.status_code"),endpoint=formatEndpoint(method,target,status6),duration=formatDurationUs(rootDurationUs),spans=formatSpansLine(trace3.spans.length,errorSpans.length);return[`# Trace ${ellipsis(trace3.traceId,TRACE_ID_MAX_LEN)}`,"",`- **Trace id:** ${trace3.traceId}`,`- **Request id:** ${options.requestId}`,`- **Endpoint:** ${endpoint}`,`- **Duration:** ${duration}`,`- **Spans:** ${spans}`].join(`
@@ -1366,13 +1373,16 @@ Learn more: ${import_chalk307.default.cyan("https://vercel.com/docs/cli/about-te
1366
1373
  `)}function renderTree(analysis){let lines=["## Span tree",""];if(analysis.treeOrder.length===0&&analysis.orphanOrder.length===0)return lines.push("_No spans._"),lines.join(`
1367
1374
  `);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(`
1368
1375
  `)}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,projectFlag,teamId,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};let projectName;if(projectFlag){let project=await getProjectByNameOrId(client,projectFlag,teamId);if(project instanceof ProjectNotFound)return{error:`Project not found: ${projectFlag}`,reason:AGENT_REASON.NOT_FOUND};projectName=project.name}else if(linkedProject.status==="linked")projectName=linkedProject.project.name;else return{error:"Unable to resolve project name 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),1}let positional=parsedArgs.args.slice(1),requestId=positional[0]===getSubcommand4.name?positional[1]:positional[0],json=parsedArgs.flags["--json"],scopeFlag=parsedArgs.flags["--scope"],projectFlag=parsedArgs.flags["--project"],openFlag2=parsedArgs.flags["--open"],viewFlag=parsedArgs.flags["--view"];if(telemetry2.trackCliArgumentRequestId(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),1}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),1}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),1}view=viewFlag}if(!requestId)return output_manager_default.print(help(getSubcommand4,{parent:tracesCommand,columns:client.stderr.columns})),2;let 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,requestId}))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),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,projectFlag,teamId,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}return json?(client.stdout.write(`${JSON.stringify(trace3,null,2)}
1369
- `),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var COMMAND_CONFIG64={get:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8};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 printError(err),1}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG64),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-2327CWL2.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})),2}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return 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 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),1}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_semver.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),1;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"),1;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),1;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),1;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."),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?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,global=await isGlobal();if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType:global?"global":"local",...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1376
+ `),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var import_chalk309=__toESM(require_source(),1);import{z as z4}from"zod";var import_ms38=__toESM(require_ms(),1);import{z as z3}from"zod";var DEFAULT_LIMIT3=100,MAX_LIMIT3=1e3,SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z3.iso.datetime({offset:!0}),timeInputSchema=z3.union([isoDateTimeSchema,z3.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.";function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms38.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_LIMIT3,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 resolveConfigScope(client,{project});return"exitCode"in scope?scope:{scope:{ownerId:scope.teamId,projectIds:[scope.projectId]},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=z3.array(z3.object({path:z3.string(),message:z3.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=z4.object({span:z4.object({startTime:isoDateTimeSchema,traceId:z4.string(),id:z4.string(),parentSpanId:z4.string().nullable(),isRoot:z4.number(),traceState:z4.string(),name:z4.string(),kind:z4.string(),status:z4.object({code:z4.string(),message:z4.string()}),duration:z4.number(),attributes:z4.record(z4.string(),z4.unknown()),events:z4.array(z4.object({name:z4.string(),timestamp:isoDateTimeSchema,attributes:z4.record(z4.string(),z4.unknown())})).optional(),links:z4.array(z4.object({traceId:z4.string(),spanId:z4.string(),traceState:z4.string(),attributes:z4.record(z4.string(),z4.unknown())})).optional()}).passthrough(),resource:z4.object({attributes:z4.record(z4.string(),z4.unknown())})}),responseSchema=z4.object({events:z4.array(spanSchema),pagination:z4.object({hasMore:z4.boolean(),nextCursor:z4.string().nullable()}),meta:z4.record(z4.string(),z4.unknown())});function formatDuration3(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=>formatDuration3(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_chalk309.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.
1377
+ `);return}client.stdout.write(`${table([columns.map(column=>column.header),...spans.map(span=>columns.map(column=>column.format(span)))])}
1378
+ `)}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)}
1379
+ `);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_CONFIG64={get: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_CONFIG64),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-4FCRR7C5.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)):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 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),1}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_semver.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),1;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"),1;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),1;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),1;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."),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?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,global=await isGlobal();if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType:global?"global":"local",...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1370
1380
  `)}else output_manager_default.print(`Current version: ${pkg_default.version}
1371
1381
  `),output_manager_default.print(`Installation type: ${global?"global":"local"}
1372
1382
  `),updateCommand&&output_manager_default.print(`Upgrade command: ${updateCommand}
1373
1383
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1374
1384
  `),requestedPreference&&output_manager_default.print(`Would ${requestedPreference.enabled?"enable":"disable"} ${requestedPreference.label}. No settings changed.
1375
- `);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableBinary||disableBinary){if(disableBinary&&isNativeBinaryInstall())return output_manager_default.fatal("Can't use `--disable-binary` from the native CLI.\nThis flag only opts the Node.js CLI out of launching the native binary. Install the Node.js CLI with `npm i -g vercel`."),1;let enabled=!!enableBinary;return setUseNativeBinary(client,enabled),output_manager_default.success(`Native Vercel CLI binary ${enabled?"enabled":"disabled"}.`),0}if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var import_chalk311=__toESM(require_source(),1);async function status5(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
1385
+ `);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableBinary||disableBinary){if(disableBinary&&isNativeBinaryInstall())return output_manager_default.fatal("Can't use `--disable-binary` from the native CLI.\nThis flag only opts the Node.js CLI out of launching the native binary. Install the Node.js CLI with `npm i -g vercel`."),1;let enabled=!!enableBinary;return setUseNativeBinary(client,enabled),output_manager_default.success(`Native Vercel CLI binary ${enabled?"enabled":"disabled"}.`),0}if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var import_chalk312=__toESM(require_source(),1);async function status5(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
1376
1386
  `),output_manager_default.print(`Runtime: ${describeRuntime(context)}
1377
1387
  `),output_manager_default.print(`Managed by: ${describeManager(context)}
1378
1388
  `),context.manager==="installer"){if(output_manager_default.print(`Track: ${context.track??"legacy"}
@@ -1385,56 +1395,56 @@ Learn more: ${import_chalk307.default.cyan("https://vercel.com/docs/cli/about-te
1385
1395
  `):output_manager_default.print(`${context.upgradeError.message}
1386
1396
  `),output_manager_default.print(`Tip: the recommended way to manage the Vercel CLI is the installer: ${CURL_INSTALL_COMMAND}
1387
1397
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1388
- `);return 0}var import_chalk309=__toESM(require_source(),1);var DEFAULT_COUNT=20;async function list29(){output_manager_default.spinner("Fetching available versions\u2026",0);let versions2,currentVersion;try{[versions2,{version:currentVersion}]=await Promise.all([listAvailableVersions(packageName),getVersionContext()])}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to list versions: ${error instanceof Error?error.message:String(error)}`),1}if(output_manager_default.stopSpinner(),versions2.length===0)return output_manager_default.log("No versions found"),0;let shown=versions2.slice(0,DEFAULT_COUNT);for(let version2 of shown){let current=version2===currentVersion;output_manager_default.print(current?`${import_chalk309.default.cyan(version2)} ${import_chalk309.default.dim("(current)")}
1398
+ `);return 0}var import_chalk310=__toESM(require_source(),1);var DEFAULT_COUNT=20;async function list29(){output_manager_default.spinner("Fetching available versions\u2026",0);let versions2,currentVersion;try{[versions2,{version:currentVersion}]=await Promise.all([listAvailableVersions(packageName),getVersionContext()])}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to list versions: ${error instanceof Error?error.message:String(error)}`),1}if(output_manager_default.stopSpinner(),versions2.length===0)return output_manager_default.log("No versions found"),0;let shown=versions2.slice(0,DEFAULT_COUNT);for(let version2 of shown){let current=version2===currentVersion;output_manager_default.print(current?`${import_chalk310.default.cyan(version2)} ${import_chalk310.default.dim("(current)")}
1389
1399
  `:`${version2}
1390
- `)}return versions2.length>shown.length&&output_manager_default.print(import_chalk309.default.dim(`\u2026 and ${versions2.length-shown.length} more
1391
- `)),0}var import_chalk310=__toESM(require_source(),1);async function installed(){let context=await getVersionContext();if(context.manager!=="installer"){let manager=context.packageManager===void 0?"an unsupported package-manager installation":context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;return output_manager_default.print(`${context.version} ${import_chalk310.default.dim("(current)")}
1392
- `),output_manager_default.log(`This CLI is managed by ${manager}, so only the current version is available. The recommended way to manage CLI versions is the installer: ${CURL_INSTALL_COMMAND}`),0}let slots=await listNativeTrackSlots(context.installRoot);if(slots.length===0)return output_manager_default.log("No slot-managed versions found"),0;for(let installed2 of slots){let active=installed2.track===context.track&&installed2.slot===context.slot,build=installed2.pr?`PR #${installed2.pr}${installed2.buildSha?` (${installed2.buildSha.slice(0,12)})`:""}`:`v${installed2.version}`;output_manager_default.print(`${installed2.track}/${installed2.slot} ${build}${active?` ${import_chalk310.default.dim("(active)")}`:""}
1400
+ `)}return versions2.length>shown.length&&output_manager_default.print(import_chalk310.default.dim(`\u2026 and ${versions2.length-shown.length} more
1401
+ `)),0}var import_chalk311=__toESM(require_source(),1);async function installed(){let context=await getVersionContext();if(context.manager!=="installer"){let manager=context.packageManager===void 0?"an unsupported package-manager installation":context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;return output_manager_default.print(`${context.version} ${import_chalk311.default.dim("(current)")}
1402
+ `),output_manager_default.log(`This CLI is managed by ${manager}, so only the current version is available. The recommended way to manage CLI versions is the installer: ${CURL_INSTALL_COMMAND}`),0}let slots=await listNativeTrackSlots(context.installRoot);if(slots.length===0)return output_manager_default.log("No slot-managed versions found"),0;for(let installed2 of slots){let active=installed2.track===context.track&&installed2.slot===context.slot,build=installed2.pr?`PR #${installed2.pr}${installed2.buildSha?` (${installed2.buildSha.slice(0,12)})`:""}`:`v${installed2.version}`;output_manager_default.print(`${installed2.track}/${installed2.slot} ${build}${active?` ${import_chalk311.default.dim("(active)")}`:""}
1393
1403
  `)}return 0}var import_semver2=__toESM(require_semver(),1);function printInstallerOnlyError(context,version2){if(output_manager_default.error("Switching versions is only supported for installer-managed CLIs."),output_manager_default.log(`Install the CLI with the installer first: ${CURL_INSTALL_COMMAND}`),version2&&context.manager==="package-manager"){let manager=context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;output_manager_default.log(`Or install this version with ${manager}: ${getPackageManagerInstallCommand(context,version2)}`)}}async function use(args){let target=args[0];if(!target)return output_manager_default.error(`Missing version. Usage: ${getCommandName("version use <version>")}`),1;let context=await getVersionContext();if(context.manager==="package-manager"&&context.upgradeCommand===void 0)return output_manager_default.fatal(context.upgradeError.message),1;if(target==="latest")return context.canSwitchVersions?executeNativeSelfUpdate():(printInstallerOnlyError(context),1);let pr=parsePrTarget(target);if(pr!==void 0){if(!context.canSwitchVersions)return printInstallerOnlyError(context),1;try{let{updated,buildSha,slot}=await installAndActivatePrBinary(pr);return output_manager_default.stopSpinner(),updated?output_manager_default.success(`Activated the Vercel CLI build for PR #${pr} (${buildSha.slice(0,12)}) on pr/${slot}.`):output_manager_default.log(`The latest build for PR #${pr} (${buildSha.slice(0,12)}) is active on pr/${slot}.`),output_manager_default.log("PR builds change on every push \u2014 re-run this command to pick up new builds."),output_manager_default.log(`Return to a release build with ${getCommandName("version use latest")}.`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(error instanceof Error?error.message:String(error)),1}}let version2=import_semver2.default.valid(import_semver2.default.coerce(target)?.version??target)?import_semver2.default.coerce(target)?.version??target:void 0;if(!version2||!import_semver2.default.valid(version2))return output_manager_default.error(`Invalid version: "${target}"`),1;if(!context.canSwitchVersions)return printInstallerOnlyError(context,version2),1;try{if(!(await listAvailableVersions(packageName)).includes(version2))return output_manager_default.error(`Version ${version2} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}catch{}try{return await installAndActivateProductionVersion(version2),output_manager_default.stopSpinner(),output_manager_default.success(`Vercel CLI v${version2} is active`),import_semver2.default.lt(version2,context.version)&&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:
1394
1404
  ${CURL_INSTALL_COMMAND}`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to switch to v${version2}: ${error instanceof Error?error.message:String(error)}`),1}}async function autoupdate(client,args){let action=args[0];if(!action||action==="status"){let enabled=(await getVersionContext()).manager==="installer"?isNativeAutoUpdateEnabled(client.config):isAutoUpdateEnabled(client.config);return output_manager_default.print(`Automatic updates are ${enabled?"enabled":"disabled"}
1395
1405
  `),0}if(action==="enable"||action==="disable"){let enabled=action==="enable";return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return output_manager_default.error(`Invalid argument "${action}". Usage: ${getCommandName("version autoupdate [enable|disable|status]")}`),1}var import_semver3=__toESM(require_semver(),1);import{performance}from"node:perf_hooks";var VersionTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInstalled(actual){this.trackCliSubcommand({subcommand:"installed",value:actual})}trackCliSubcommandUse(actual){this.trackCliSubcommand({subcommand:"use",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandAutoupdate(actual){this.trackCliSubcommand({subcommand:"autoupdate",value:actual})}trackNativeUpdate(event){this.trackCommandOutput({key:"native-update",value:JSON.stringify(event)})}};var NATIVE_UPDATE_CHILD_TIMEOUT_MS=2*60*1e3;async function check3(client,{timeoutMs=NATIVE_UPDATE_CHILD_TIMEOUT_MS}={}){let context=await getVersionContext();if(context.manager!=="installer")return isNativeUpdateChild()?0:(output_manager_default.fatal("Native update checks require an installer-managed CLI."),1);if(isNativeUpdateChild()){let cachedVersion=process.env[NATIVE_UPDATE_VERSION_ENV],source=cachedVersion?"cached":"discovery",controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),startedAt=performance.now(),discoveryMs,stagingMs,outcome="failure";try{let version2=cachedVersion;if(!version2){await cacheNativeUpdateDiscoveryAttempt();let discoveryStartedAt=performance.now();try{version2=await resolveLatestNativeVersion({signal:controller.signal})}finally{discoveryMs=Math.round(performance.now()-discoveryStartedAt)}await cacheNativeUpdateVersion(version2),controller.signal.throwIfAborted()}let selectProduction=process.env[NATIVE_UPDATE_SELECT_PRODUCTION_ENV]==="1";controller.signal.throwIfAborted();let stagingStartedAt=performance.now();try{await stageProductionUpdate(version2,selectProduction,{signal:controller.signal})}finally{stagingMs=Math.round(performance.now()-stagingStartedAt)}return await markNativeUpdateStaged(version2,{selectedProduction:selectProduction}),controller.signal.aborted?(outcome="timeout",1):(outcome="success",0)}catch{if(controller.signal.aborted&&(outcome="timeout"),!cachedVersion)try{await restoreNativeUpdateAfterDiscoveryFailure()}catch{}return 1}finally{clearTimeout(timeout),new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}).trackNativeUpdate({outcome,source,totalMs:Math.round(performance.now()-startedAt),discoveryMs,stagingMs})}}try{output_manager_default.spinner("Resolving latest native version\u2026",0);let latest=await resolveLatestNativeVersion();return output_manager_default.stopSpinner(),output_manager_default.print(`Latest production version: ${latest}
1396
1406
  `),context.track==="production"&&context.activeVersion&&import_semver3.default.valid(context.activeVersion)&&import_semver3.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
1397
1407
  `),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
1398
- `),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_CONFIG65={list:getCommandAliases(listSubcommand26),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG65),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})),2;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand26),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),2):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),2):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),2):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),2):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk311.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1399
- `),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk316=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{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_utils25=__toESM(require_dist(),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 parseBillingDate(dateStr,isEndDate=!1){if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD)`);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_chalk313=__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_chalk312=__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_chalk312.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk312.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk312.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk312.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_chalk312.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_chalk313.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk313.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk313.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk313.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_chalk313.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_chalk313.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk313.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_chalk313.default.bold("Estimated total"),import_chalk313.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1400
- `)}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_chalk313.default.bold(subtotalLabel),"",import_chalk313.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk313.default.bold(import_chalk313.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
1408
+ `),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_CONFIG65={list:getCommandAliases(listSubcommand26),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG65),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})),2;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand26),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),2):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),2):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),2):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),2):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk312.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1409
+ `),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk317=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{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_utils25=__toESM(require_dist(),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 parseBillingDate(dateStr,isEndDate=!1){if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD)`);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_chalk314=__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_chalk313=__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_chalk313.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk313.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk313.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk313.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_chalk313.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_chalk314.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk314.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk314.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk314.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_chalk314.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_chalk314.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk314.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_chalk314.default.bold("Estimated total"),import_chalk314.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1410
+ `)}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_chalk314.default.bold(subtotalLabel),"",import_chalk314.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk314.default.bold(import_chalk314.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
1401
1411
  ${tablePrint}
1402
- `)}var import_chalk314=__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_chalk314.default.bold(import_chalk314.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_chalk314.default.bold(import_chalk314.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1403
- `)}outputHiddenServicesHint(hiddenCount)}var import_chalk315=__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_chalk315.default.bold(import_chalk315.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_chalk315.default.bold(import_chalk315.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1404
- `)}log(""),log(`${import_chalk315.default.gray("Estimated total:")} ${import_chalk315.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)}
1405
- `)}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}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}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),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current billing cycle"),1;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;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(", ")}`),1;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;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_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??extractDatePortion(fromDate),toDisplay=toFlag??extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk316.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"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects2:regions)[id]?.title??id: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})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",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_CONFIG66={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),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(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}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(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-NX3EMRFH.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-V6IX3MOJ.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-D6D2J6ID.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-VZQLRHHA.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-HM7V26WX.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-MQXAAFBP.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PP4JOW2C.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-VN6BPT3B.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-MBJR7IQW.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-ORGBK7MR.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-5LSKNTW7.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG66)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms38=__toESM(require_ms(),1),import_chalk317=__toESM(require_source(),1),import_pluralize22=__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 ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}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),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk317.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 get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1406
- `)}else output_manager_default.log(`${(0,import_pluralize22.default)("Webhook",webhooks.length,!0)} found under ${import_chalk317.default.bold(contextName)} ${import_chalk317.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
1407
-
1408
- `));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms38.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_chalk317.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk318=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&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),1}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 get <id>")}]},1),output_manager_default.error(`${getCommandName("webhooks get <id>")} expects one argument`),1;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk318.default.cyan(`${getCommandName("webhooks get <id>")}`)}`),1;output_manager_default.debug("Fetching webhook info");let{contextName}=await getScope(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk318.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)}
1409
- `)}else{output_manager_default.log(`Webhook ${webhookId} found under ${import_chalk318.default.bold(contextName)} ${import_chalk318.default.gray(getStamp())}`),output_manager_default.print(`
1410
- `),output_manager_default.print(import_chalk318.default.bold(` General
1411
-
1412
- `)),output_manager_default.print(` ${import_chalk318.default.cyan("ID")} ${webhook.id}
1413
- `),output_manager_default.print(` ${import_chalk318.default.cyan("URL")} ${webhook.url}
1414
- `),output_manager_default.print(` ${import_chalk318.default.cyan("Created At")} ${formatDate(webhook.createdAt)}
1415
- `),output_manager_default.print(` ${import_chalk318.default.cyan("Updated At")} ${formatDate(webhook.updatedAt)}
1412
+ `)}var import_chalk315=__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_chalk315.default.bold(import_chalk315.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_chalk315.default.bold(import_chalk315.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1413
+ `)}outputHiddenServicesHint(hiddenCount)}var import_chalk316=__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_chalk316.default.bold(import_chalk316.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_chalk316.default.bold(import_chalk316.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1414
+ `)}log(""),log(`${import_chalk316.default.gray("Estimated total:")} ${import_chalk316.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)}
1415
+ `)}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}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}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),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current billing cycle"),1;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;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(", ")}`),1;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;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_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??extractDatePortion(fromDate),toDisplay=toFlag??extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk317.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"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects2:regions)[id]?.title??id: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})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",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_CONFIG66={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),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(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}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(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-NX3EMRFH.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-V6IX3MOJ.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-D6D2J6ID.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-VZQLRHHA.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-HM7V26WX.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-MQXAAFBP.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PP4JOW2C.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-VN6BPT3B.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-MBJR7IQW.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-ORGBK7MR.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-5LSKNTW7.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG66)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms39=__toESM(require_ms(),1),import_chalk318=__toESM(require_source(),1),import_pluralize22=__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 ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}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),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk318.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 get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1416
+ `)}else output_manager_default.log(`${(0,import_pluralize22.default)("Webhook",webhooks.length,!0)} found under ${import_chalk318.default.bold(contextName)} ${import_chalk318.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
1417
+
1418
+ `));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms39.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_chalk318.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk319=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&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),1}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 get <id>")}]},1),output_manager_default.error(`${getCommandName("webhooks get <id>")} expects one argument`),1;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk319.default.cyan(`${getCommandName("webhooks get <id>")}`)}`),1;output_manager_default.debug("Fetching webhook info");let{contextName}=await getScope(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk319.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)}
1419
+ `)}else{output_manager_default.log(`Webhook ${webhookId} found under ${import_chalk319.default.bold(contextName)} ${import_chalk319.default.gray(getStamp())}`),output_manager_default.print(`
1420
+ `),output_manager_default.print(import_chalk319.default.bold(` General
1421
+
1422
+ `)),output_manager_default.print(` ${import_chalk319.default.cyan("ID")} ${webhook.id}
1423
+ `),output_manager_default.print(` ${import_chalk319.default.cyan("URL")} ${webhook.url}
1424
+ `),output_manager_default.print(` ${import_chalk319.default.cyan("Created At")} ${formatDate(webhook.createdAt)}
1425
+ `),output_manager_default.print(` ${import_chalk319.default.cyan("Updated At")} ${formatDate(webhook.updatedAt)}
1416
1426
  `),output_manager_default.print(`
1417
- `),output_manager_default.print(import_chalk318.default.bold(` Events
1427
+ `),output_manager_default.print(import_chalk319.default.bold(` Events
1418
1428
 
1419
1429
  `));for(let event of webhook.events)output_manager_default.print(` - ${event}
1420
1430
  `);if(webhook.projectIds&&webhook.projectIds.length>0)if(output_manager_default.print(`
1421
- `),output_manager_default.print(import_chalk318.default.bold(` Projects
1431
+ `),output_manager_default.print(import_chalk319.default.bold(` Projects
1422
1432
 
1423
1433
  `)),webhook.projectsMetadata&&webhook.projectsMetadata.length>0)for(let project of webhook.projectsMetadata)output_manager_default.print(` - ${project.name} (${project.id})
1424
1434
  `);else for(let projectId of webhook.projectIds)output_manager_default.print(` - ${projectId}
1425
1435
  `);output_manager_default.print(`
1426
- `)}return 0}var import_chalk319=__toESM(require_source(),1);async function createWebhook(client,payload){return await client.fetch("/v1/webhooks",{method:"POST",body:payload})}var WebhooksCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentUrl(url){url&&this.trackCliArgument({arg:"url",value:this.redactedValue})}trackCliOptionEvent(events){events&&events.length>0&&this.trackCliOption({option:"event",value:String(events.length)})}trackCliOptionProject(projects2){projects2&&projects2.length>0&&this.trackCliOption({option:"project",value:String(projects2.length)})}};var cachedEvents=null;async function getWebhookEvents(){if(cachedEvents)return cachedEvents;let cache=new OpenApiCache;if(!await cache.load())return output_manager_default.debug("Failed to load OpenAPI spec for webhook events"),[];let createWebhookEndpoint=cache.getEndpoints().find(e2=>e2.path==="/v1/webhooks"&&e2.method==="POST");if(!createWebhookEndpoint)return output_manager_default.debug("Could not find POST /v1/webhooks endpoint in OpenAPI spec"),[];let eventsField=cache.getBodyFields(createWebhookEndpoint).find(f=>f.name==="events");return eventsField?.enumValues?(cachedEvents=eventsField.enumValues.filter(v=>typeof v=="string"),cachedEvents):(output_manager_default.debug("Could not find events enum in webhook endpoint"),[])}async function validateWebhookEvents(events){let validEvents=await getWebhookEvents();if(validEvents.length===0)return[];let validSet=new Set(validEvents);return events.filter(e2=>!validSet.has(e2))}var WEBHOOKS_EVENTS_DOCS_URL="https://vercel.com/docs/webhooks/webhooks-api";async function create8(client,argv){let telemetry2=new WebhooksCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand9.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[url]=args;if(url)try{let urlObj=new URL(url);if(!["http:","https:"].includes(urlObj.protocol))return output_manager_default.error("Webhook URL must use http or https protocol"),1}catch{return output_manager_default.error(`Invalid URL: ${url}`),1}else{if(client.nonInteractive){let argv2=client.argv.slice(2),subcommandParts=argv2.slice(0,2),rest=argv2.slice(2),subcommandWithPlaceholder=`${subcommandParts.join(" ")} <url>${rest.length?` ${rest.join(" ")}`:""}`;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_URL,message:"Webhook URL is required. Provide URL as the first argument.",next:[{command:getCommandNamePlain(subcommandWithPlaceholder)}]},1)}url=await client.input.text({message:"Webhook URL:",validate:val=>{if(!val)return"URL is required";try{let urlObj=new URL(val);if(!["http:","https:"].includes(urlObj.protocol))return"Webhook URL must use http or https protocol"}catch{return"Invalid URL"}return!0}})}let projectIds=opts["--project"],eventFlags=opts["--event"],events;if(!eventFlags||eventFlags.length===0){client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_EVENTS,message:"At least one event is required. Use --event <event> (can be repeated).",next:[{command:getCommandNamePlain("webhooks create <url> --event <event>")}]},1);let availableEvents=await getWebhookEvents()??[];if(availableEvents.length===0)return output_manager_default.error("Could not fetch available webhook events. Please specify events using --event flags."),1;events=await client.input.checkbox({message:"Select events:",choices:availableEvents.map(event=>({name:event,value:event})),validate:selected=>selected.length===0?"At least one event is required":!0})}else{let invalidEvents=await validateWebhookEvents(eventFlags);if(invalidEvents.length>0){if(client.nonInteractive){let suggested=buildCreateCommandWithEventPlaceholder(client.argv,url);return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}. Use a valid event name (e.g. deployment.created).`,hint:`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`,next:[{command:suggested,when:"use a valid --event value"}]},1),1}return output_manager_default.error(`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}`),1}events=eventFlags}telemetry2.trackCliArgumentUrl(url),telemetry2.trackCliOptionEvent(events),telemetry2.trackCliOptionProject(projectIds);let{contextName}=await getScope(client),createStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Creating webhook under ${import_chalk319.default.bold(contextName)}`);try{let webhook=await createWebhook(client,{url,events,projectIds});if(client.nonInteractive){let json={status:AGENT_STATUS.OK,webhook:{id:webhook.id,url:webhook.url,events:webhook.events,...webhook.projectIds?.length?{projectIds:webhook.projectIds}:{}},message:`Webhook ${webhook.id} created.`,next:[{command:getCommandNamePlain(`webhooks get ${webhook.id}`),when:"Inspect the webhook"}]};return webhook.secret&&(json.secret=webhook.secret),client.stdout.write(`${JSON.stringify(json,null,2)}
1427
- `),0}return output_manager_default.stopSpinner(),output_manager_default.success(`Webhook created: ${import_chalk319.default.bold(webhook.id)} ${createStamp()}`),output_manager_default.print(`
1428
- `),output_manager_default.print(import_chalk319.default.bold(` Webhook Details
1429
-
1430
- `)),output_manager_default.print(` ${import_chalk319.default.cyan("ID".padEnd(10))}${webhook.id}
1431
- `),output_manager_default.print(` ${import_chalk319.default.cyan("URL".padEnd(10))}${webhook.url}
1432
- `),output_manager_default.print(` ${import_chalk319.default.cyan("Events".padEnd(10))}${webhook.events.join(", ")}
1433
- `),webhook.projectIds&&webhook.projectIds.length>0&&output_manager_default.print(` ${import_chalk319.default.cyan("Projects".padEnd(10))}${webhook.projectIds.join(", ")}
1436
+ `)}return 0}var import_chalk320=__toESM(require_source(),1);async function createWebhook(client,payload){return await client.fetch("/v1/webhooks",{method:"POST",body:payload})}var WebhooksCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentUrl(url){url&&this.trackCliArgument({arg:"url",value:this.redactedValue})}trackCliOptionEvent(events){events&&events.length>0&&this.trackCliOption({option:"event",value:String(events.length)})}trackCliOptionProject(projects2){projects2&&projects2.length>0&&this.trackCliOption({option:"project",value:String(projects2.length)})}};var cachedEvents=null;async function getWebhookEvents(){if(cachedEvents)return cachedEvents;let cache=new OpenApiCache;if(!await cache.load())return output_manager_default.debug("Failed to load OpenAPI spec for webhook events"),[];let createWebhookEndpoint=cache.getEndpoints().find(e2=>e2.path==="/v1/webhooks"&&e2.method==="POST");if(!createWebhookEndpoint)return output_manager_default.debug("Could not find POST /v1/webhooks endpoint in OpenAPI spec"),[];let eventsField=cache.getBodyFields(createWebhookEndpoint).find(f=>f.name==="events");return eventsField?.enumValues?(cachedEvents=eventsField.enumValues.filter(v=>typeof v=="string"),cachedEvents):(output_manager_default.debug("Could not find events enum in webhook endpoint"),[])}async function validateWebhookEvents(events){let validEvents=await getWebhookEvents();if(validEvents.length===0)return[];let validSet=new Set(validEvents);return events.filter(e2=>!validSet.has(e2))}var WEBHOOKS_EVENTS_DOCS_URL="https://vercel.com/docs/webhooks/webhooks-api";async function create8(client,argv){let telemetry2=new WebhooksCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand9.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[url]=args;if(url)try{let urlObj=new URL(url);if(!["http:","https:"].includes(urlObj.protocol))return output_manager_default.error("Webhook URL must use http or https protocol"),1}catch{return output_manager_default.error(`Invalid URL: ${url}`),1}else{if(client.nonInteractive){let argv2=client.argv.slice(2),subcommandParts=argv2.slice(0,2),rest=argv2.slice(2),subcommandWithPlaceholder=`${subcommandParts.join(" ")} <url>${rest.length?` ${rest.join(" ")}`:""}`;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_URL,message:"Webhook URL is required. Provide URL as the first argument.",next:[{command:getCommandNamePlain(subcommandWithPlaceholder)}]},1)}url=await client.input.text({message:"Webhook URL:",validate:val=>{if(!val)return"URL is required";try{let urlObj=new URL(val);if(!["http:","https:"].includes(urlObj.protocol))return"Webhook URL must use http or https protocol"}catch{return"Invalid URL"}return!0}})}let projectIds=opts["--project"],eventFlags=opts["--event"],events;if(!eventFlags||eventFlags.length===0){client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_EVENTS,message:"At least one event is required. Use --event <event> (can be repeated).",next:[{command:getCommandNamePlain("webhooks create <url> --event <event>")}]},1);let availableEvents=await getWebhookEvents()??[];if(availableEvents.length===0)return output_manager_default.error("Could not fetch available webhook events. Please specify events using --event flags."),1;events=await client.input.checkbox({message:"Select events:",choices:availableEvents.map(event=>({name:event,value:event})),validate:selected=>selected.length===0?"At least one event is required":!0})}else{let invalidEvents=await validateWebhookEvents(eventFlags);if(invalidEvents.length>0){if(client.nonInteractive){let suggested=buildCreateCommandWithEventPlaceholder(client.argv,url);return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}. Use a valid event name (e.g. deployment.created).`,hint:`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`,next:[{command:suggested,when:"use a valid --event value"}]},1),1}return output_manager_default.error(`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}`),1}events=eventFlags}telemetry2.trackCliArgumentUrl(url),telemetry2.trackCliOptionEvent(events),telemetry2.trackCliOptionProject(projectIds);let{contextName}=await getScope(client),createStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Creating webhook under ${import_chalk320.default.bold(contextName)}`);try{let webhook=await createWebhook(client,{url,events,projectIds});if(client.nonInteractive){let json={status:AGENT_STATUS.OK,webhook:{id:webhook.id,url:webhook.url,events:webhook.events,...webhook.projectIds?.length?{projectIds:webhook.projectIds}:{}},message:`Webhook ${webhook.id} created.`,next:[{command:getCommandNamePlain(`webhooks get ${webhook.id}`),when:"Inspect the webhook"}]};return webhook.secret&&(json.secret=webhook.secret),client.stdout.write(`${JSON.stringify(json,null,2)}
1437
+ `),0}return output_manager_default.stopSpinner(),output_manager_default.success(`Webhook created: ${import_chalk320.default.bold(webhook.id)} ${createStamp()}`),output_manager_default.print(`
1438
+ `),output_manager_default.print(import_chalk320.default.bold(` Webhook Details
1439
+
1440
+ `)),output_manager_default.print(` ${import_chalk320.default.cyan("ID".padEnd(10))}${webhook.id}
1441
+ `),output_manager_default.print(` ${import_chalk320.default.cyan("URL".padEnd(10))}${webhook.url}
1442
+ `),output_manager_default.print(` ${import_chalk320.default.cyan("Events".padEnd(10))}${webhook.events.join(", ")}
1443
+ `),webhook.projectIds&&webhook.projectIds.length>0&&output_manager_default.print(` ${import_chalk320.default.cyan("Projects".padEnd(10))}${webhook.projectIds.join(", ")}
1434
1444
  `),output_manager_default.print(`
1435
- `),output_manager_default.warn(`Save this secret - it will not be shown again: ${import_chalk319.default.bold(webhook.secret)}`),output_manager_default.print(`
1436
- `),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)){if(client.nonInteractive){let reason=err.code==="invalid_url"?AGENT_REASON.INVALID_URL:err.code==="invalid_event"?AGENT_REASON.INVALID_EVENT:AGENT_REASON.API_ERROR,suggested=reason===AGENT_REASON.INVALID_EVENT?buildCreateCommandWithEventPlaceholder(client.argv,url):void 0;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:err.message,hint:reason===AGENT_REASON.INVALID_EVENT?`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`:void 0,next:suggested!==void 0?[{command:suggested,when:"use a valid --event value"}]:void 0},1),1}return err.code==="invalid_url"?(output_manager_default.error(`Invalid webhook URL: ${url}`),1):err.code==="invalid_event"?(output_manager_default.error("Invalid event type. Please check the event names."),1):(output_manager_default.error(err.message),1)}throw err}}function buildCreateCommandWithEventPlaceholder(fullArgv,url){let argv=fullArgv.slice(2),out=["webhooks","create",url],i=3,hadEvent=!1;for(;i<argv.length;){if(argv[i]==="--event"||argv[i]==="-e"){hadEvent=!0,i+=2;continue}out.push(argv[i]),i++}return hadEvent&&out.push("--event","<event>"),getCommandNamePlain(out.join(" "))}var import_chalk320=__toESM(require_source(),1);async function deleteWebhook(client,webhookId){await client.fetch(`/v1/webhooks/${encodeURIComponent(webhookId)}`,{method:"DELETE"})}var WebhooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function webhookCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm12(client,argv){let telemetry2=new WebhooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand18.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[webhookId]=args;if(telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliFlagYes(opts["--yes"]),!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:webhookCommandWithGlobalFlags("webhooks ls",client.argv)},{command:webhookCommandWithGlobalFlags("webhooks rm <id> --yes",client.argv)}]},1),output_manager_default.error(`${getCommandName("webhooks rm <id>")} expects one argument`),1;let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Removing a webhook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1);let{contextName}=await getScope(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk320.default.cyan(`${getCommandName("webhooks rm <id>")}`)}`),1;client.nonInteractive||output_manager_default.spinner(`Fetching webhook ${webhookId}`);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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},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(output_manager_default.stopSpinner(),!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove webhook ${param(webhookId)} (${webhook.url})?`,!1))return client.nonInteractive||output_manager_default.log("Canceled"),0;let removeStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Removing webhook under ${import_chalk320.default.bold(contextName)}`);try{return await deleteWebhook(client,webhookId),output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:"ok",webhook:{id:webhookId,url:webhook.url},message:`Webhook ${webhookId} removed.`},null,2)}
1437
- `),0):(output_manager_default.success(`Webhook ${import_chalk320.default.bold(webhookId)} removed ${removeStamp()}`),0)}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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),1;throw err}}var WebhooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG67={create:["create","add"],get:["get","inspect"],ls:["ls","list"],rm:["rm","remove","delete"]};async function main35(client){let parsedArgs,flagsSpecification=getFlagsSpecification(webhooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new WebhooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("webhooks"),output_manager_default.print(help(webhooksCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:webhooksCommand,columns:client.stderr.columns})),2}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(createSubcommand9)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create8(client,args));case"get":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(getSubcommand6)):(telemetry2.trackCliSubcommandGet(subcommandOriginal),get6(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(removeSubcommand18)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm12(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(listSubcommand29)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls10(client,args))}}var import_chalk321=__toESM(require_source(),1);var WhoamiTelemetryClient=class extends TelemetryClient{};async function whoami(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(whoamiCommand.options),telemetry2=new WhoamiTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("whoami"),output_manager_default.print(help(whoamiCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),!client.authConfig.token)return asJson?client.stdout.write(`${JSON.stringify({loggedIn:!1},null,2)}
1445
+ `),output_manager_default.warn(`Save this secret - it will not be shown again: ${import_chalk320.default.bold(webhook.secret)}`),output_manager_default.print(`
1446
+ `),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)){if(client.nonInteractive){let reason=err.code==="invalid_url"?AGENT_REASON.INVALID_URL:err.code==="invalid_event"?AGENT_REASON.INVALID_EVENT:AGENT_REASON.API_ERROR,suggested=reason===AGENT_REASON.INVALID_EVENT?buildCreateCommandWithEventPlaceholder(client.argv,url):void 0;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:err.message,hint:reason===AGENT_REASON.INVALID_EVENT?`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`:void 0,next:suggested!==void 0?[{command:suggested,when:"use a valid --event value"}]:void 0},1),1}return err.code==="invalid_url"?(output_manager_default.error(`Invalid webhook URL: ${url}`),1):err.code==="invalid_event"?(output_manager_default.error("Invalid event type. Please check the event names."),1):(output_manager_default.error(err.message),1)}throw err}}function buildCreateCommandWithEventPlaceholder(fullArgv,url){let argv=fullArgv.slice(2),out=["webhooks","create",url],i=3,hadEvent=!1;for(;i<argv.length;){if(argv[i]==="--event"||argv[i]==="-e"){hadEvent=!0,i+=2;continue}out.push(argv[i]),i++}return hadEvent&&out.push("--event","<event>"),getCommandNamePlain(out.join(" "))}var import_chalk321=__toESM(require_source(),1);async function deleteWebhook(client,webhookId){await client.fetch(`/v1/webhooks/${encodeURIComponent(webhookId)}`,{method:"DELETE"})}var WebhooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function webhookCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm12(client,argv){let telemetry2=new WebhooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand18.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[webhookId]=args;if(telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliFlagYes(opts["--yes"]),!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:webhookCommandWithGlobalFlags("webhooks ls",client.argv)},{command:webhookCommandWithGlobalFlags("webhooks rm <id> --yes",client.argv)}]},1),output_manager_default.error(`${getCommandName("webhooks rm <id>")} expects one argument`),1;let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Removing a webhook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1);let{contextName}=await getScope(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk321.default.cyan(`${getCommandName("webhooks rm <id>")}`)}`),1;client.nonInteractive||output_manager_default.spinner(`Fetching webhook ${webhookId}`);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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},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(output_manager_default.stopSpinner(),!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove webhook ${param(webhookId)} (${webhook.url})?`,!1))return client.nonInteractive||output_manager_default.log("Canceled"),0;let removeStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Removing webhook under ${import_chalk321.default.bold(contextName)}`);try{return await deleteWebhook(client,webhookId),output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:"ok",webhook:{id:webhookId,url:webhook.url},message:`Webhook ${webhookId} removed.`},null,2)}
1447
+ `),0):(output_manager_default.success(`Webhook ${import_chalk321.default.bold(webhookId)} removed ${removeStamp()}`),0)}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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),1;throw err}}var WebhooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG67={create:["create","add"],get:["get","inspect"],ls:["ls","list"],rm:["rm","remove","delete"]};async function main35(client){let parsedArgs,flagsSpecification=getFlagsSpecification(webhooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new WebhooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("webhooks"),output_manager_default.print(help(webhooksCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:webhooksCommand,columns:client.stderr.columns})),2}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(createSubcommand9)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create8(client,args));case"get":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(getSubcommand6)):(telemetry2.trackCliSubcommandGet(subcommandOriginal),get6(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(removeSubcommand18)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm12(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(listSubcommand29)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls10(client,args))}}var import_chalk322=__toESM(require_source(),1);var WhoamiTelemetryClient=class extends TelemetryClient{};async function whoami(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(whoamiCommand.options),telemetry2=new WhoamiTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("whoami"),output_manager_default.print(help(whoamiCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),!client.authConfig.token)return asJson?client.stdout.write(`${JSON.stringify({loggedIn:!1},null,2)}
1438
1448
  `):(output_manager_default.log("Logged out."),output_manager_default.log(`Run ${getCommandName("deploy --temporary")} to create a temporary deployment you can claim later, or ${getCommandName("login")} to log in.`)),1;let scope=await getScope(client,{resolveLocalScope:!0}),{user,team,app,globalTeam}=scope,plan=(team?team.billing?.plan:user?.billing?.plan)??null,hasLocalOverride=!scope.explicitScopeProvided&&((team?.id??null)!==(globalTeam?.id??null)||scope.scopeMismatch);if(asJson){let jsonOutput={team:team?{id:team.id,slug:team.slug,name:team.name,plan}:null,plan};user&&(jsonOutput.username=user.username,jsonOutput.email=user.email,jsonOutput.name=user.name),app&&(jsonOutput.app=app),hasLocalOverride&&(jsonOutput.localOverride=!0,jsonOutput.globalTeam=globalTeam?{id:globalTeam.id,slug:globalTeam.slug,name:globalTeam.name}:null),client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1439
- `)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${import_chalk321.default.bold(formatUsername(scope))}`),team?output_manager_default.log(`Active team: ${import_chalk321.default.bold(team.slug)}${team.name&&team.name!==team.slug?` (${team.name})`:""}`):output_manager_default.log(`Active team: ${import_chalk321.default.bold("Personal Account")}`),plan&&output_manager_default.log(`Active team plan: ${import_chalk321.default.bold(formatBillingPlan(plan))}`),hasLocalOverride){let globalLabel=globalTeam?globalTeam.slug:"Personal Account",localLabel=team?team.slug:"Personal Account";output_manager_default.log(`${import_chalk321.default.yellow("Local override:")} scope is set to ${import_chalk321.default.bold(localLabel)} by the linked project in this directory (globally selected: ${import_chalk321.default.bold(globalLabel)}).`)}}else client.stdout.write(`${formatUsername(scope)}
1449
+ `)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${import_chalk322.default.bold(formatUsername(scope))}`),team?output_manager_default.log(`Active team: ${import_chalk322.default.bold(team.slug)}${team.name&&team.name!==team.slug?` (${team.name})`:""}`):output_manager_default.log(`Active team: ${import_chalk322.default.bold("Personal Account")}`),plan&&output_manager_default.log(`Active team plan: ${import_chalk322.default.bold(formatBillingPlan(plan))}`),hasLocalOverride){let globalLabel=globalTeam?globalTeam.slug:"Personal Account",localLabel=team?team.slug:"Personal Account";output_manager_default.log(`${import_chalk322.default.yellow("Local override:")} scope is set to ${import_chalk322.default.bold(localLabel)} by the linked project in this directory (globally selected: ${import_chalk322.default.bold(globalLabel)}).`)}}else client.stdout.write(`${formatUsername(scope)}
1440
1450
  `);return 0}function formatUsername(scope){if(scope.user)return scope.user.username;if(scope.app)return scope.app.id;throw new Error("Could not format principal identity")}function formatBillingPlan(plan){return plan.toLowerCase()==="oss"?"OSS":plan.charAt(0).toUpperCase()+plan.slice(1)}export{activity,agent,agentRuns,main2 as aiGateway,alerts,alias,api,bisect,main3 as blob,budget,builders,main4 as buy,main5 as cache,main6 as certs,changelog,comments,connex,contract,main7 as crons,curl,main8 as deployHooks,dns,main9 as domains,experiments,main18 as firewall,main20 as flags,main21 as git,main19 as globalConfig,guidance,httpstat,main22 as init,inspect13 as inspect,install,main24 as integration,main23 as integrationResource,main25 as kms,login,logout2 as logout,logs,main26 as mcp,metrics,main27 as microfrontends,openCommandHandler as open,main28 as project,promote_default as promote,main as pull,redeploy,main29 as redirects,remove13 as remove,rollback_default as rollback,rollingRelease,main30 as routes,sandbox,main31 as schedules,security,setup,signup,skills,main32 as storage,main33 as target,teams,telemetry,main34 as tokens,traces,upgrade,usage,vcr,version,main35 as webhooks,whoami};