vercel 60.0.0 → 60.0.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 (108) hide show
  1. package/dist/chunks/{add-7OUJAZIH.js → add-D6D2J6ID.js} +1 -1
  2. package/dist/chunks/{add-D4E2N3HU.js → add-JKIDAH7K.js} +1 -1
  3. package/dist/chunks/{add-UG57LDJR.js → add-QBCRXMR3.js} +1 -1
  4. package/dist/chunks/{build-VSV5LVJK.js → build-PP4JOW2C.js} +1 -1
  5. package/dist/chunks/{chunk-MWU4ZPZ4.js → chunk-2ZIWDSUX.js} +1 -1
  6. package/dist/chunks/{chunk-LTFVLQEF.js → chunk-3KQRJYBJ.js} +1 -1
  7. package/dist/chunks/{chunk-TH2WHOUV.js → chunk-42IHNZIE.js} +1 -1
  8. package/dist/chunks/chunk-4OKKSZVX.js +7 -0
  9. package/dist/chunks/{chunk-IAS5LONF.js → chunk-4S6WFNRF.js} +1 -1
  10. package/dist/chunks/{chunk-3YOA3ODU.js → chunk-6A6LV2S2.js} +1 -1
  11. package/dist/chunks/{chunk-EWSS6LUE.js → chunk-77WAICTF.js} +1 -1
  12. package/dist/chunks/{chunk-5JFBDZTI.js → chunk-7JAKGIQ6.js} +1 -1
  13. package/dist/chunks/{chunk-5LH3CZMJ.js → chunk-C6QYMZ3S.js} +1 -1
  14. package/dist/chunks/{chunk-I7PARON4.js → chunk-CD4FLZED.js} +1 -1
  15. package/dist/chunks/{chunk-TUVMXISG.js → chunk-EOIRBY3F.js} +1 -1
  16. package/dist/chunks/{chunk-4JFQYK65.js → chunk-FXZ6TVIP.js} +1 -1
  17. package/dist/chunks/{chunk-WTAM6QXM.js → chunk-G77TCKNI.js} +1 -1
  18. package/dist/chunks/{chunk-PNY65NDD.js → chunk-GK5C5TE5.js} +1 -1
  19. package/dist/chunks/{chunk-KDKSYHTU.js → chunk-GZBSABCA.js} +1 -1
  20. package/dist/chunks/{chunk-XU4ETL7O.js → chunk-HMB4MZOB.js} +1 -1
  21. package/dist/chunks/{chunk-MNR5YQDP.js → chunk-IRM6H42E.js} +1 -1
  22. package/dist/chunks/{chunk-JSVZKMZO.js → chunk-IXN5A5WZ.js} +1 -1
  23. package/dist/chunks/{chunk-FFQ2SDHN.js → chunk-KTB75ID3.js} +1 -1
  24. package/dist/chunks/{chunk-4VFDQB4H.js → chunk-LLXCLOZO.js} +2 -2
  25. package/dist/chunks/{chunk-5B3BHCFE.js → chunk-LNOX5GIA.js} +1 -1
  26. package/dist/chunks/{chunk-TZN45RBM.js → chunk-LUVIR6F2.js} +1 -1
  27. package/dist/chunks/{chunk-ECJKSW62.js → chunk-M6UYGRPW.js} +1 -1
  28. package/dist/chunks/{chunk-MRSU4C5C.js → chunk-Q5VLP2LY.js} +1 -1
  29. package/dist/chunks/{chunk-TQLNWAJY.js → chunk-RB3NPNPD.js} +1 -1
  30. package/dist/chunks/{chunk-4XAIK5CI.js → chunk-RLCFE3MK.js} +2 -2
  31. package/dist/chunks/{chunk-REONGB6P.js → chunk-S74YKDNZ.js} +1 -1
  32. package/dist/chunks/{chunk-JC4FG6EW.js → chunk-SGU7YIY3.js} +1 -1
  33. package/dist/chunks/{chunk-Y4GI6BXT.js → chunk-STO2JRII.js} +1 -1
  34. package/dist/chunks/{chunk-MCZNQE4G.js → chunk-UQW7M4LS.js} +1 -1
  35. package/dist/chunks/{chunk-5WW7LFI6.js → chunk-URI72S7J.js} +1 -1
  36. package/dist/chunks/{chunk-T4LZS75P.js → chunk-WUH5HYCX.js} +1 -1
  37. package/dist/chunks/{chunk-PGHEHRSM.js → chunk-YMLWTVT5.js} +1 -1
  38. package/dist/chunks/{chunk-QXC2G7JY.js → chunk-ZWYU5SBC.js} +1 -1
  39. package/dist/chunks/{clear-NUMBAODD.js → clear-TQFWNYKK.js} +1 -1
  40. package/dist/chunks/{compile-vercel-config-75XN6ZKP.js → compile-vercel-config-YY3CODZP.js} +1 -1
  41. package/dist/chunks/{config-Q6V74NTU.js → config-2327CWL2.js} +1 -1
  42. package/dist/chunks/{config-26RISHPB.js → config-VZQLRHHA.js} +1 -1
  43. package/dist/chunks/{delete-LGIPH2II.js → delete-L45TA4WK.js} +1 -1
  44. package/dist/chunks/{delete-PWVNXN4N.js → delete-MPLEIGYN.js} +1 -1
  45. package/dist/chunks/{detect-services-EX5ZTO5D.js → detect-services-7QL6RPKV.js} +1 -1
  46. package/dist/chunks/{disable-62HLGVJG.js → disable-WY6N4R7I.js} +1 -1
  47. package/dist/chunks/{discard-LYY4AMIA.js → discard-3VYFSUTH.js} +1 -1
  48. package/dist/chunks/{edit-E6AMU6OJ.js → edit-FCPWK252.js} +1 -1
  49. package/dist/chunks/{edit-FEZFLAIJ.js → edit-VOZ4IKZI.js} +1 -1
  50. package/dist/chunks/{enable-QDIH43E3.js → enable-IJ7UEQ3G.js} +1 -1
  51. package/dist/chunks/{export-FO5JCAB4.js → export-L4D4GCJI.js} +1 -1
  52. package/dist/chunks/{generate-cert-for-deploy-FG57HLGC.js → generate-cert-for-deploy-GSWBCLZX.js} +1 -1
  53. package/dist/chunks/{image-LZ32HAQV.js → image-ORGBK7MR.js} +1 -1
  54. package/dist/chunks/{import-builders-SELE5VYE.js → import-builders-N4XIYEW5.js} +1 -1
  55. package/dist/chunks/{inspect-XWT4QQRM.js → inspect-2EMBEQHZ.js} +1 -1
  56. package/dist/chunks/{inspect-BUNQSUCN.js → inspect-377IAEIY.js} +1 -1
  57. package/dist/chunks/{inspect-D2S5CEPW.js → inspect-F4OENUQT.js} +1 -1
  58. package/dist/chunks/{inspect-22LMAKCS.js → inspect-GTALMRKE.js} +1 -1
  59. package/dist/chunks/{inspect-LGQ44GYB.js → inspect-V6IX3MOJ.js} +1 -1
  60. package/dist/chunks/{list-XL4GMICP.js → list-57XWFXDW.js} +1 -1
  61. package/dist/chunks/{list-WRQRFVUL.js → list-5ZBTU324.js} +1 -1
  62. package/dist/chunks/{list-TXJQFAGW.js → list-GKXJQRX6.js} +1 -1
  63. package/dist/chunks/{login-QIPGRGDE.js → login-MQXAAFBP.js} +1 -1
  64. package/dist/chunks/{logs-P4NGHB4I.js → logs-ZYELN5F2.js} +1 -1
  65. package/dist/chunks/{ls-COWL5TXJ.js → ls-AAU7AKS7.js} +1 -1
  66. package/dist/chunks/{ls-TXXVAVMF.js → ls-ADATML6R.js} +1 -1
  67. package/dist/chunks/{ls-OCTMGB6C.js → ls-BVBCVIRX.js} +1 -1
  68. package/dist/chunks/{ls-HTSBFV7C.js → ls-LMHRMNKE.js} +1 -1
  69. package/dist/chunks/{ls-LOXX7YQ2.js → ls-NX3EMRFH.js} +1 -1
  70. package/dist/chunks/{ls-YTZOJEBT.js → ls-POKSXYZU.js} +1 -1
  71. package/dist/chunks/{ls-JGBNPJEW.js → ls-VYEJT272.js} +1 -1
  72. package/dist/chunks/{mutate-BZHBI2PK.js → mutate-QMU5QHF3.js} +1 -1
  73. package/dist/chunks/{notifications-CTNZYZZ2.js → notifications-OYUKYMU7.js} +1 -1
  74. package/dist/chunks/{open-D53RMFUT.js → open-SNN3JPON.js} +1 -1
  75. package/dist/chunks/{permissions-XHGXTFEU.js → permissions-5LSKNTW7.js} +1 -1
  76. package/dist/chunks/{publish-WTIW7W3Z.js → publish-FIHJARRJ.js} +1 -1
  77. package/dist/chunks/{pull-N5VAKGFJ.js → pull-2M2BJYAS.js} +1 -1
  78. package/dist/chunks/{purchase-domain-if-available-ZBXG4E7J.js → purchase-domain-if-available-VKWKDDUD.js} +1 -1
  79. package/dist/chunks/{push-ZQWVBEAJ.js → push-VN6BPT3B.js} +1 -1
  80. package/dist/chunks/{query-NNJNXQZG.js → query-P35ZTMXV.js} +1 -1
  81. package/dist/chunks/{reorder-64FNHY6J.js → reorder-L4L2V3MZ.js} +1 -1
  82. package/dist/chunks/{reply-MIJ6C3KT.js → reply-XIJ54B7U.js} +1 -1
  83. package/dist/chunks/{resolve-5HPYDKB4.js → resolve-W2O6M4GH.js} +1 -1
  84. package/dist/chunks/{restore-KQ5T3MWQ.js → restore-OZPJHXTE.js} +1 -1
  85. package/dist/chunks/{rm-ZLKEDKBI.js → rm-2YDLXDCB.js} +1 -1
  86. package/dist/chunks/{rm-WTUTQK3R.js → rm-4EUHQZ7U.js} +1 -1
  87. package/dist/chunks/{rm-S3TN7REH.js → rm-5W45I3TO.js} +1 -1
  88. package/dist/chunks/{rm-C5GXOG3I.js → rm-HM7V26WX.js} +1 -1
  89. package/dist/chunks/{rm-HZRLQ2FR.js → rm-IM7VAVCG.js} +1 -1
  90. package/dist/chunks/{rule-inspect-G4RGKBOI.js → rule-inspect-75RUPIVB.js} +1 -1
  91. package/dist/chunks/{rules-5ECWTZPP.js → rules-PKOTTFKG.js} +1 -1
  92. package/dist/chunks/{schema-EQCAQVSE.js → schema-EPUGS3PX.js} +1 -1
  93. package/dist/chunks/{schema-NERSRSCG.js → schema-NJC47D5M.js} +1 -1
  94. package/dist/chunks/{set-7HZRIJ6K.js → set-XWOUJJ7R.js} +1 -1
  95. package/dist/chunks/{setup-and-link-G4G4JJ6W.js → setup-and-link-PM46H7GU.js} +1 -1
  96. package/dist/chunks/{tags-JSRGITRJ.js → tags-MBJR7IQW.js} +1 -1
  97. package/dist/chunks/{update-4B5AEB2C.js → update-TNUYPCS3.js} +1 -1
  98. package/dist/commands/build/index.js +1 -1
  99. package/dist/commands/deploy/index.js +3 -3
  100. package/dist/commands/dev/index.js +9 -9
  101. package/dist/commands/env/index.js +1 -1
  102. package/dist/commands/link/index.js +1 -1
  103. package/dist/commands/list/index.js +2 -2
  104. package/dist/commands-bulk.js +131 -121
  105. package/dist/index.js +1 -1
  106. package/dist/version.mjs +1 -1
  107. package/package.json +20 -20
  108. package/dist/chunks/chunk-AH3A52IK.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-MNR5YQDP.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-I7PARON4.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-JC4FG6EW.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-WTAM6QXM.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-TZN45RBM.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-EWSS6LUE.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-TH2WHOUV.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-MWU4ZPZ4.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-MRSU4C5C.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-5B3BHCFE.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-4VFDQB4H.js";import"./chunks/chunk-JSVZKMZO.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-TUVMXISG.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-3YOA3ODU.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-LTFVLQEF.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-ECJKSW62.js";import{resolveProjectContext}from"./chunks/chunk-QXC2G7JY.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-Y4GI6BXT.js";import"./chunks/chunk-PNY65NDD.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-T4LZS75P.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,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-4JFQYK65.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-AH3A52IK.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-4XAIK5CI.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{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
8
8
 
9
9
  These defaults are optimized for AI coding agents (and humans) working on apps that deploy to Vercel.
10
10
 
@@ -55,7 +55,7 @@ ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
55
55
  `),0;let projectList=asArray(data.projects??data.items);if(projectList.length===0)return output_manager_default.log("No projects with Agent Runs activity found."),0;output_manager_default.log(`Projects with Agent Runs under ${import_chalk5.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Project","Runs","Avg Duration"].map(header=>import_chalk5.default.bold(import_chalk5.default.cyan(header))),...projectList.map(project=>[import_chalk5.default.bold(readString(project,"projectName","name","project","projectId","id")??"-"),formatCount(readNumber(project,"runs","runCount","totalRuns")),import_chalk5.default.gray(formatDurationMs(readNumber(project,"avgDurationMs","averageDurationMs","avgDuration")))])];return client.stdout.write(`
56
56
  ${table(rows,{hsep:3}).replace(/^/gm," ")}
57
57
 
58
- `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-UYIFBCCL.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-WRQRFVUL.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},1),output_manager_default.error(message),1}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},1),output_manager_default.error(message),1}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},1),output_manager_default.error(message),1}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
58
+ `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-UYIFBCCL.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-5ZBTU324.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},1),output_manager_default.error(message),1}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},1),output_manager_default.error(message),1}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},1),output_manager_default.error(message),1}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
59
59
  `),output_manager_default.success(`API key ${import_chalk6.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget2!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);async function ensureTeam(client){if(client.config.currentTeam)return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&&notFoundMessage?notFoundMessage:err.message),1;throw err}return output_manager_default.stopSpinner(),json?(client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
60
60
  `),0):isEmpty(data)?(output_manager_default.log(emptyMessage),0):(output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),0)}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&&params.set("projectId",opts.projectId),opts.userId&&params.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}async function list3(client,argv){let telemetry2=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:()=>listApiKeys(client),toJSON:apiKeys2=>({apiKeys:apiKeys2}),isEmpty:apiKeys2=>apiKeys2.length===0,emptyMessage:`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:apiKeys2=>printApiKeysTable(apiKeys2,keyDefault)})}function printApiKeysTable(apiKeys2,keyDefault){return`${table([["id","name","key","budget","spend","refresh","created"].map(header=>import_chalk7.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk7.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk7.default.gray("(default)")}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk7.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk7.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk7.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
61
61
 
@@ -99,10 +99,10 @@ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"
99
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)}
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
- `):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 list29=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list29.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,list29.length),list29.push({name,...settings})):list29[index]={name,...asObject(list29[index]),...settings}}return dump(list29,{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
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
103
103
  `:`
104
104
  `,restOffset:newline<0?length:newline+1}}function codeSpan(value){return`\`${value.replace(/[`\r\n]/g,"")}\``}async function findRollouts(root){let files=[];async function visit(directory){let entries;try{entries=await fs.readdir(directory,{withFileTypes:!0})}catch(error){if(hasCode(error,"ENOENT"))return;throw error}for(let entry2 of entries){let path3=join4(directory,entry2.name);entry2.isDirectory()?await visit(path3):entry2.isFile()&&ROLLOUT_PATTERN.test(entry2.name)&&files.push(path3)}}return await visit(root),files}async function planCopy(path3,root){let metadata=await readMeta(path3),filename=basename(path3);if(!metadata||!filename.toLowerCase().includes(metadata.id.toLowerCase()))return null;let destinationId=uuidv5(`vercel-ai-gateway/codex/${metadata.id.toLowerCase()}/vercel`,uuidv5.URL),destination=join4(dirname2(path3),filename.replace(new RegExp(metadata.id,"i"),destinationId)),item={source:path3,destination,sourceId:metadata.id,destinationId,bytes:(await fs.stat(path3)).size,root};try{return await fs.stat(destination),await validateDestination(item),null}catch(error){if(!hasCode(error,"ENOENT"))throw error}return item}async function bodyHash(path3,start){let hash=createHash("sha256");return await pipeline(createReadStream(path3,{start}),hash),hash.digest("hex")}async function validateDestination(item){let[source,destination]=await Promise.all([readMeta(item.source),readMeta(item.destination,!0)]),bodies=await Promise.all([bodyHash(item.source,source?.restOffset??0),bodyHash(item.destination,destination?.restOffset??0)]);if(!(source&&destination?.id===item.destinationId&&bodies[0]===bodies[1]))throw new Error(`Existing destination ${basename(item.destination)} is invalid`)}async function copySession(item){let metadata=await readMeta(item.source);if(!metadata)throw new Error("Codex session metadata is no longer valid");if(metadata.id!==item.sourceId)throw new Error("Codex session metadata changed after planning");let updated={...metadata.record,payload:{...metadata.payload,id:item.destinationId,session_id:item.destinationId,model_provider:"vercel"}},temporary=`${item.destination}.tmp-${process.pid}-${randomUUID()}`;try{return await fs.writeFile(temporary,`${JSON.stringify(updated)}${metadata.delimiter}`,{flag:"wx",mode:384}),await pipeline(createReadStream(item.source,{start:metadata.restOffset}),createWriteStream(temporary,{flags:"a",mode:384})),await fs.chmod(temporary,384),await publishNoClobber(temporary,item.destination)?!0:(await validateDestination(item),!1)}finally{await fs.unlink(temporary).catch(error=>{if(!hasCode(error,"ENOENT"))throw error})}}async function planCodexSessionMigration(home){let codexHome=process.env.CODEX_HOME||join4(home,".codex"),roots=["sessions","archived_sessions"].map(root=>join4(codexHome,root)),files=[];for(let root of roots)files.push(...(await findRollouts(root)).map(path3=>({path:path3,root})));if(files.some(file=>file.path.endsWith(".jsonl.zst")))throw new Error("Found compressed Codex sessions; decompress them first, or pass --no-session-migration to leave them unchanged");let copies=[];for(let file of files){let copy3=await planCopy(file.path,file.root);copy3&&copies.push(copy3)}if(copies.length===0)return null;let sourceRoots=[...new Set(copies.map(copy3=>copy3.root))];return{label:"Codex Desktop sessions",itemCount:copies.length,totalBytes:copies.reduce((total,copy3)=>total+copy3.bytes,0),sourceRoots,destinationRoots:sourceRoots,prompt:[`Before changing the provider, copy the ${copies.length} top-level Codex Desktop rollout${copies.length===1?"":"s"} with a non-\`vercel\` provider under ${sourceRoots.map(codeSpan).join(", ")}. Do not copy subagent rollouts whose \`session_id\` differs from \`id\`.`,"For each copy, derive a deterministic UUID v5 using the URL namespace `6ba7b811-9dad-11d1-80b4-00c04fd430c8` and name `vercel-ai-gateway/codex/<source-id>/vercel`. Replace the filename UUID and `session_meta.payload.id`/`session_id`, set `model_provider` to `vercel`, and preserve every later JSONL byte.","Use atomic, no-clobber writes with mode 0600; skip an existing deterministic destination only after validating its metadata and body. Never move, edit, delete, or overwrite an original session file."],async apply(){let copied=0,skipped=0,errors=[];for(let item of copies)try{await copySession(item)?copied++:skipped++}catch(error){errors.push(`${basename(item.source)}: ${error instanceof Error?error.message:String(error)}`)}return{copied,skipped,errors}}}}function codexDir(home){let dir=process.env.CODEX_HOME;return dir&&dir.trim()?dir:join5(home,".codex")}var codex={id:"codex",displayName:"Codex",sessionMigration:{plan:({home})=>planCodexSessionMigration(home)},async detect(home){return pathExists(codexDir(home))},configPath(ctx){return ctx.overrides?.codex??join5(codexDir(ctx.home),"config.toml")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"Codex config",format:"toml",transform:current=>mergeToml(current,{model_provider:"vercel",model_providers:{vercel:{name:"Vercel AI Gateway",base_url:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODEX_BASE_URL),env_key:GATEWAY_API_KEY_ENV,wire_api:"responses"}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:["Codex now defaults to the Vercel AI Gateway; pick a model with --model or in config.",`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, or run: export ${GATEWAY_API_KEY_ENV}=<key>`]}}};import{dirname as dirname3,join as join6}from"node:path";function agenticModels(ctx,opts={}){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&(m.tags??[]).includes("tool-use")&&!m.deprecated_at&&(!opts.requireContextWindow||!!m.context_window)&&(!opts.requireMaxTokens||!!m.max_tokens))}function defaultFirst(models3){let rest=models3.filter(m=>m.id!==GATEWAY_DEFAULT_MODEL).sort((a,b)=>a.id.localeCompare(b.id)),preferred=models3.find(m=>m.id===GATEWAY_DEFAULT_MODEL);return preferred?[preferred,...rest]:rest}function shortlistModels(ctx,opts={}){let{creator,creatorLimit=5,overallLimit=10,ensureDefault}=opts,eligible=agenticModels(ctx,opts),byId=new Map(eligible.map(m=>[m.id,m])),picked=[],take=m=>{m&&!picked.includes(m)&&picked.push(m)};if(creator){let rank=new Map((ctx.topModels??[]).map((t,i)=>[t.id,i])),unranked=Number.MAX_SAFE_INTEGER;eligible.filter(m=>m.id.startsWith(`${creator}/`)).sort((a,b)=>(rank.get(a.id)??unranked)-(rank.get(b.id)??unranked)||(b.released??b.created??0)-(a.released??a.created??0)||a.id.localeCompare(b.id)).slice(0,creatorLimit).forEach(take)}let overallStart=picked.length,room=()=>picked.length-overallStart<overallLimit;if(ensureDefault&&take(byId.get(GATEWAY_DEFAULT_MODEL)),ctx.topModels)for(let top of ctx.topModels){if(!room())break;take(byId.get(top.id))}else for(let m of defaultFirst(eligible)){if(!room())break;take(m)}return picked}var FALLBACK_MODELS=[GATEWAY_DEFAULT_MODEL];function chatModelIds(ctx){let ids=shortlistModels(ctx).map(m=>m.id);return ids.length?ids:FALLBACK_MODELS}var ONBOARDING_MARKER=".onboarding_complete",SECRET_REF="${{ secrets.AI_GATEWAY_API_KEY }}";function asObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var continueCli={id:"continue",displayName:"Continue CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join6(home,".continue"))},configPath(ctx){return ctx.overrides?.continue??join6(ctx.home,".continue","config.yaml")},buildPlan(ctx){let apiBase=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,configPath=this.configPath(ctx),modelIds=chatModelIds(ctx);return{fileChanges:[{path:configPath,label:"Continue config",format:"yaml",transform:current=>{let config=asObject2(load(current??"")??{});typeof config.name!="string"&&(config.name="Local Config"),typeof config.version!="string"&&(config.version="1.0.0"),typeof config.schema!="string"&&(config.schema="v1");let models3=Array.isArray(config.models)?[...config.models]:[],writtenIds=new Set(modelIds),kept=models3.filter(entry2=>{let e2=asObject2(entry2);return!(e2.apiKey===SECRET_REF||writtenIds.has(e2.name))}),entries=modelIds.map(id=>({...asObject2(models3.find(m=>asObject2(m).name===id)),name:id,provider:"openai",model:id,apiBase,apiKey:SECRET_REF}));return config.models=[...kept,...entries],dump(config,{lineWidth:120})}},{path:join6(dirname3(configPath),ONBOARDING_MARKER),label:"Continue onboarding marker",format:"text",transform:current=>current??`${new Date().toISOString()}
105
- `}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[modelIds.length>1?`Continue CLI will use the gateway with ${modelIds[0]}; /model lists the top ${modelIds.length} gateway models -- re-run setup to refresh the list.`:`Continue CLI will use the gateway with ${GATEWAY_DEFAULT_MODEL}; the gateway catalogue could not be fetched, so /model lists only that model until setup is re-run.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded, then run \`cn\`.`,`If \`cn\` ever asks for an Anthropic API key, ${ONBOARDING_MARKER} is missing next to the config -- re-run setup rather than answering the prompt, which would overwrite the gateway models.`]}}};import{join as join7}from"node:path";function copilotDir(home){let dir=process.env.COPILOT_HOME;return dir&&dir.trim()?dir:join7(home,".copilot")}var copilot={id:"copilot",needsTopModels:!0,displayName:"GitHub Copilot CLI",async detect(home){return pathExists(copilotDir(home))},configPath(ctx){return ctx.overrides?.copilot??copilotDir(ctx.home)},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[],envExports:[{name:"COPILOT_PROVIDER_BASE_URL",value:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),plain:!0},{name:"COPILOT_PROVIDER_API_KEY",value:ctx.apiKey},{name:"COPILOT_MODEL",value:defaultModel,plain:!0}],notes:[`Copilot CLI will use the gateway with ${defaultModel}; set COPILOT_MODEL (or pass --model) to any gateway model id to switch.`,"Open a new terminal so the COPILOT_* variables are loaded; GitHub sign-in is not required in this mode."]}}};import{isAbsolute,join as join8}from"node:path";var SMALL_MODEL="anthropic/claude-haiku-4.5";function crushConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute(xdg)?xdg:join8(home,".config");return join8(base,"crush")}var crush={id:"crush",needsTopModels:!0,displayName:"Crush",async detect(home){return await pathExists(crushConfigDir(home))||pathExists(join8(home,".local","share","crush"))},configPath(ctx){return ctx.overrides?.crush??join8(crushConfigDir(ctx.home),"crush.json")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,base=ctx.baseUrlOverride?.trim();return{fileChanges:[{path:this.configPath(ctx),label:"Crush config",format:"json",transform:current=>mergeJson(current,{providers:{vercel:{api_key:`$${GATEWAY_API_KEY_ENV}`,...base?{base_url:base}:{}}},models:{large:{provider:"vercel",model:defaultModel},small:{provider:"vercel",model:SMALL_MODEL}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Crush will use its native Vercel AI Gateway provider with ${defaultModel} (${SMALL_MODEL} for small tasks); switch models in-session with ctrl+p.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join9}from"node:path";var cursor={id:"cursor",displayName:"Cursor",async detect(home){return pathExists(join9(home,".cursor"))},configPath(ctx){return ctx.overrides?.cursor??join9(ctx.home,".cursor")},buildPlan(ctx){return{fileChanges:[],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Cursor keeps its API-key settings in the app itself, so finish the setup there:","1. Open Cursor \u2192 Settings (Cmd+Shift+J) \u2192 Models.",`2. Under OpenAI API Key: paste your gateway key, then enable "Override OpenAI Base URL" and set it to ${ctx.baseUrlOverride??GATEWAY_CURSOR_BASE_URL}`,'3. Copy the key from a new terminal without echoing it: printf %s "$AI_GATEWAY_API_KEY" | pbcopy','4. Use "Add model" to add gateway model ids you want in the picker (e.g. anthropic/claude-fable-5, openai/gpt-5.6-sol).',"While the override is on, Cursor's built-in non-OpenAI models stop working \u2014 use gateway model ids for everything, or toggle the override off to go back.","Cursor chats are stored by its backend, so there are no local sessions to migrate.","Cursor limitations: Tab completions never use custom keys, and Agent/Auto modes may bypass the override."]}}};import{join as join10}from"node:path";var PROVIDER_KEY="vercel-ai-gateway";function profiles(models3){let out={};for(let model of models3)out[model.id]={name:model.name,...model.context_window?{max_input_tokens:model.context_window}:{},...model.max_tokens?{max_output_tokens:model.max_tokens}:{}};return out}var deepagents={id:"deepagents",displayName:"Deep Agents CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join10(home,".deepagents"))},configPath(ctx){return ctx.overrides?.deepagents??join10(ctx.home,".deepagents","config.toml")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx),ids=models3.length?models3.map(m=>m.id):[GATEWAY_DEFAULT_MODEL];return{fileChanges:[{path:this.configPath(ctx),label:"Deep Agents config",format:"toml",transform:current=>mergeToml(current,{models:{default:`${PROVIDER_KEY}:${ids[0]}`,providers:{[PROVIDER_KEY]:{display_name:"Vercel AI Gateway",api_key_env:"AI_GATEWAY_API_KEY",base_url:baseUrl,class_path:"langchain_openai:ChatOpenAI",models:ids,...models3.length?{profile:profiles(models3)}:{},params:{use_responses_api:!1}}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Deep Agents (dcode) will default to ${PROVIDER_KEY}:${ids[0]}.`,...models3.length?[`The top ${models3.length} gateway models are in the /model switcher, which filters as you type. Any other gateway id also works directly: /model ${PROVIDER_KEY}:<gateway-model-id>.`]:[],"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{join as join11}from"node:path";var PROVIDER_KEY2="vercel-ai-gateway",DEFAULT_MODEL="deepseek/deepseek-v4-flash";function asObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function dshDir(home){let dir=process.env.DSH_HOME;return dir&&dir.trim()?dir:join11(home,".dsh")}var deepseek={id:"deepseek",displayName:"DeepSeek Harness",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(dshDir(home))},configPath(ctx){return ctx.overrides?.deepseek??join11(dshDir(ctx.home),"settings.yaml")},buildPlan(ctx){let path3=this.configPath(ctx),models3=shortlistModels(ctx,{creator:"deepseek"}).map(m=>({id:m.id,name:m.name})),defaultId=models3[0]?.id??DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"DeepSeek Harness settings",format:"yaml",transform:current=>{let config=asObject3(load(current??"")??{}),llm=asObject3(config["llm-pi-ai"]),providers2=asObject3(llm.providers),entry2=asObject3(providers2[PROVIDER_KEY2]);return delete entry2.api,delete entry2.baseURL,delete entry2.models,providers2[PROVIDER_KEY2]={...entry2,apiKeyEnv:GATEWAY_API_KEY_ENV,...models3.length?{models:models3}:{}},llm.providers=providers2,config["llm-pi-ai"]=llm,config["agent-default-model"]={provider:PROVIDER_KEY2,model:defaultId},dump(config,{lineWidth:120})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[models3.length?`DeepSeek Harness will default to ${PROVIDER_KEY2}/${defaultId}; the shortlist in settings.yaml is the picker \u2014 add any gateway model id there.`:`DeepSeek Harness will default to ${PROVIDER_KEY2}/${DEFAULT_MODEL}; every gateway model pi-ai ships is selectable with /model \u2014 no per-model config needed.`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, then run \`dsh\` \u2014 headless runs use the gateway route too.`]}}};import{join as join12}from"node:path";var API_KEY_REF="${AI_GATEWAY_API_KEY}",PROVIDER="generic-chat-completion-api",FALLBACK_MAX_OUTPUT_TOKENS=64e3;function gatewayEntries(ctx,baseUrl){let models3=shortlistModels(ctx,{requireMaxTokens:!0});return models3.length?models3.map(m=>entry(m.id,baseUrl,m.max_tokens)):[entry(GATEWAY_DEFAULT_MODEL,baseUrl,FALLBACK_MAX_OUTPUT_TOKENS)]}function entry(model,baseUrl,maxOutputTokens){return{model,displayName:model,baseUrl,apiKey:API_KEY_REF,provider:PROVIDER,maxOutputTokens}}function isOurs(value){return value?.apiKey===API_KEY_REF}function mergeCustomModels(current,entries){let existing;try{existing=current?.trim()?JSON.parse(current):{}}catch(err){throw new Error(`existing file is not valid JSON (${err.message})`)}let currentModels=existing.customModels,kept=Array.isArray(currentModels)?currentModels.filter(m=>!isOurs(m)):[];return mergeJson(current,{customModels:[...kept,...entries]})}var droid={id:"droid",displayName:"Factory Droid",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join12(home,".factory"))},configPath(ctx){return ctx.overrides?.droid??join12(ctx.home,".factory","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,entries=gatewayEntries(ctx,baseUrl);return{fileChanges:[{path:this.configPath(ctx),label:"Factory Droid settings",format:"json",transform:current=>mergeCustomModels(current,entries)}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[entries.length>1?`The top ${entries.length} gateway models are in Droid's /model picker, leaderboard order -- re-run setup to refresh the list.`:`Factory Droid gets ${GATEWAY_DEFAULT_MODEL}; pick it with /model in a session or \`droid exec -m ${GATEWAY_DEFAULT_MODEL}\`.`,`\`droid exec\` defaults to a Factory-hosted model this key cannot use -- always pass \`-m ${entries[0]?.model??GATEWAY_DEFAULT_MODEL}\` (or another gateway model above).`]}}};import{dirname as dirname4,join as join13}from"node:path";import{parse as tomlParse,stringify as tomlStringify}from"smol-toml";var PROVIDER_ID="vercel-ai-gateway";function asObject4(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertById(list29,merge){let index=list29.findIndex(item=>asObject4(item).id===PROVIDER_ID),merged={id:PROVIDER_ID,...merge(asObject4(list29[index]))};return index===-1?[...list29,merged]:list29.map((item,i)=>i===index?merged:item)}var forge={id:"forge",needsTopModels:!0,displayName:"ForgeCode",async detect(home){return pathExists(join13(home,".forge"))},configPath(ctx){return ctx.overrides?.forge??join13(ctx.home,".forge",".forge.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:configPath,label:"ForgeCode config",format:"toml",transform:current=>{let config=current?.trim()?tomlParse(current):{},providers2=Array.isArray(config.providers)?config.providers:[];return config.providers=upsertById(providers2,existing=>({...existing,url:`${base}/chat/completions`,models:`${base}/models`,api_key_vars:GATEWAY_API_KEY_ENV,response_type:"OpenAI",auth_methods:["api_key"]})),config.session={...asObject4(config.session),provider_id:PROVIDER_ID,model_id:defaultModel},`${tomlStringify(config)}
105
+ `}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[modelIds.length>1?`Continue CLI will use the gateway with ${modelIds[0]}; /model lists the top ${modelIds.length} gateway models -- re-run setup to refresh the list.`:`Continue CLI will use the gateway with ${GATEWAY_DEFAULT_MODEL}; the gateway catalogue could not be fetched, so /model lists only that model until setup is re-run.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded, then run \`cn\`.`,`If \`cn\` ever asks for an Anthropic API key, ${ONBOARDING_MARKER} is missing next to the config -- re-run setup rather than answering the prompt, which would overwrite the gateway models.`]}}};import{join as join7}from"node:path";function copilotDir(home){let dir=process.env.COPILOT_HOME;return dir&&dir.trim()?dir:join7(home,".copilot")}var copilot={id:"copilot",needsTopModels:!0,displayName:"GitHub Copilot CLI",async detect(home){return pathExists(copilotDir(home))},configPath(ctx){return ctx.overrides?.copilot??copilotDir(ctx.home)},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[],envExports:[{name:"COPILOT_PROVIDER_BASE_URL",value:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),plain:!0},{name:"COPILOT_PROVIDER_API_KEY",value:ctx.apiKey},{name:"COPILOT_MODEL",value:defaultModel,plain:!0}],notes:[`Copilot CLI will use the gateway with ${defaultModel}; set COPILOT_MODEL (or pass --model) to any gateway model id to switch.`,"Open a new terminal so the COPILOT_* variables are loaded; GitHub sign-in is not required in this mode."]}}};import{isAbsolute,join as join8}from"node:path";var SMALL_MODEL="anthropic/claude-haiku-4.5";function crushConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute(xdg)?xdg:join8(home,".config");return join8(base,"crush")}var crush={id:"crush",needsTopModels:!0,displayName:"Crush",async detect(home){return await pathExists(crushConfigDir(home))||pathExists(join8(home,".local","share","crush"))},configPath(ctx){return ctx.overrides?.crush??join8(crushConfigDir(ctx.home),"crush.json")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,base=ctx.baseUrlOverride?.trim();return{fileChanges:[{path:this.configPath(ctx),label:"Crush config",format:"json",transform:current=>mergeJson(current,{providers:{vercel:{api_key:`$${GATEWAY_API_KEY_ENV}`,...base?{base_url:base}:{}}},models:{large:{provider:"vercel",model:defaultModel},small:{provider:"vercel",model:SMALL_MODEL}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Crush will use its native Vercel AI Gateway provider with ${defaultModel} (${SMALL_MODEL} for small tasks); switch models in-session with ctrl+p.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join9}from"node:path";var cursor={id:"cursor",displayName:"Cursor",async detect(home){return pathExists(join9(home,".cursor"))},configPath(ctx){return ctx.overrides?.cursor??join9(ctx.home,".cursor")},buildPlan(ctx){return{fileChanges:[],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Cursor keeps its API-key settings in the app itself, so finish the setup there:","1. Open Cursor \u2192 Settings (Cmd+Shift+J) \u2192 Models.",`2. Under OpenAI API Key: paste your gateway key, then enable "Override OpenAI Base URL" and set it to ${ctx.baseUrlOverride??GATEWAY_CURSOR_BASE_URL}`,'3. Copy the key from a new terminal without echoing it: printf %s "$AI_GATEWAY_API_KEY" | pbcopy','4. Use "Add model" to add gateway model ids you want in the picker (e.g. anthropic/claude-fable-5, openai/gpt-5.6-sol).',"While the override is on, Cursor's built-in non-OpenAI models stop working \u2014 use gateway model ids for everything, or toggle the override off to go back.","Cursor chats are stored by its backend, so there are no local sessions to migrate.","Cursor limitations: Tab completions never use custom keys, and Agent/Auto modes may bypass the override."]}}};import{join as join10}from"node:path";var PROVIDER_KEY="vercel-ai-gateway";function profiles(models3){let out={};for(let model of models3)out[model.id]={name:model.name,...model.context_window?{max_input_tokens:model.context_window}:{},...model.max_tokens?{max_output_tokens:model.max_tokens}:{}};return out}var deepagents={id:"deepagents",displayName:"Deep Agents CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join10(home,".deepagents"))},configPath(ctx){return ctx.overrides?.deepagents??join10(ctx.home,".deepagents","config.toml")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx),ids=models3.length?models3.map(m=>m.id):[GATEWAY_DEFAULT_MODEL];return{fileChanges:[{path:this.configPath(ctx),label:"Deep Agents config",format:"toml",transform:current=>mergeToml(current,{models:{default:`${PROVIDER_KEY}:${ids[0]}`,providers:{[PROVIDER_KEY]:{display_name:"Vercel AI Gateway",api_key_env:"AI_GATEWAY_API_KEY",base_url:baseUrl,class_path:"langchain_openai:ChatOpenAI",models:ids,...models3.length?{profile:profiles(models3)}:{},params:{use_responses_api:!1}}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Deep Agents (dcode) will default to ${PROVIDER_KEY}:${ids[0]}.`,...models3.length?[`The top ${models3.length} gateway models are in the /model switcher, which filters as you type. Any other gateway id also works directly: /model ${PROVIDER_KEY}:<gateway-model-id>.`]:[],"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{join as join11}from"node:path";var PROVIDER_KEY2="vercel-ai-gateway",DEFAULT_MODEL="deepseek/deepseek-v4-flash";function asObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function dshDir(home){let dir=process.env.DSH_HOME;return dir&&dir.trim()?dir:join11(home,".dsh")}var deepseek={id:"deepseek",displayName:"DeepSeek Harness",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(dshDir(home))},configPath(ctx){return ctx.overrides?.deepseek??join11(dshDir(ctx.home),"settings.yaml")},buildPlan(ctx){let path3=this.configPath(ctx),models3=shortlistModels(ctx,{creator:"deepseek"}).map(m=>({id:m.id,name:m.name})),defaultId=models3[0]?.id??DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"DeepSeek Harness settings",format:"yaml",transform:current=>{let config=asObject3(load(current??"")??{}),llm=asObject3(config["llm-pi-ai"]),providers2=asObject3(llm.providers),entry2=asObject3(providers2[PROVIDER_KEY2]);return delete entry2.api,delete entry2.baseURL,delete entry2.models,providers2[PROVIDER_KEY2]={...entry2,apiKeyEnv:GATEWAY_API_KEY_ENV,...models3.length?{models:models3}:{}},llm.providers=providers2,config["llm-pi-ai"]=llm,config["agent-default-model"]={provider:PROVIDER_KEY2,model:defaultId},dump(config,{lineWidth:120})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[models3.length?`DeepSeek Harness will default to ${PROVIDER_KEY2}/${defaultId}; the shortlist in settings.yaml is the picker \u2014 add any gateway model id there.`:`DeepSeek Harness will default to ${PROVIDER_KEY2}/${DEFAULT_MODEL}; every gateway model pi-ai ships is selectable with /model \u2014 no per-model config needed.`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, then run \`dsh\` \u2014 headless runs use the gateway route too.`]}}};import{join as join12}from"node:path";var API_KEY_REF="${AI_GATEWAY_API_KEY}",PROVIDER="generic-chat-completion-api",FALLBACK_MAX_OUTPUT_TOKENS=64e3;function gatewayEntries(ctx,baseUrl){let models3=shortlistModels(ctx,{requireMaxTokens:!0});return models3.length?models3.map(m=>entry(m.id,baseUrl,m.max_tokens)):[entry(GATEWAY_DEFAULT_MODEL,baseUrl,FALLBACK_MAX_OUTPUT_TOKENS)]}function entry(model,baseUrl,maxOutputTokens){return{model,displayName:model,baseUrl,apiKey:API_KEY_REF,provider:PROVIDER,maxOutputTokens}}function isOurs(value){return value?.apiKey===API_KEY_REF}function mergeCustomModels(current,entries){let existing;try{existing=current?.trim()?JSON.parse(current):{}}catch(err){throw new Error(`existing file is not valid JSON (${err.message})`)}let currentModels=existing.customModels,kept=Array.isArray(currentModels)?currentModels.filter(m=>!isOurs(m)):[];return mergeJson(current,{customModels:[...kept,...entries]})}var droid={id:"droid",displayName:"Factory Droid",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join12(home,".factory"))},configPath(ctx){return ctx.overrides?.droid??join12(ctx.home,".factory","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,entries=gatewayEntries(ctx,baseUrl);return{fileChanges:[{path:this.configPath(ctx),label:"Factory Droid settings",format:"json",transform:current=>mergeCustomModels(current,entries)}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[entries.length>1?`The top ${entries.length} gateway models are in Droid's /model picker, leaderboard order -- re-run setup to refresh the list.`:`Factory Droid gets ${GATEWAY_DEFAULT_MODEL}; pick it with /model in a session or \`droid exec -m ${GATEWAY_DEFAULT_MODEL}\`.`,`\`droid exec\` defaults to a Factory-hosted model this key cannot use -- always pass \`-m ${entries[0]?.model??GATEWAY_DEFAULT_MODEL}\` (or another gateway model above).`]}}};import{dirname as dirname4,join as join13}from"node:path";import{parse as tomlParse,stringify as tomlStringify}from"smol-toml";var PROVIDER_ID="vercel-ai-gateway";function asObject4(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertById(list30,merge){let index=list30.findIndex(item=>asObject4(item).id===PROVIDER_ID),merged={id:PROVIDER_ID,...merge(asObject4(list30[index]))};return index===-1?[...list30,merged]:list30.map((item,i)=>i===index?merged:item)}var forge={id:"forge",needsTopModels:!0,displayName:"ForgeCode",async detect(home){return pathExists(join13(home,".forge"))},configPath(ctx){return ctx.overrides?.forge??join13(ctx.home,".forge",".forge.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:configPath,label:"ForgeCode config",format:"toml",transform:current=>{let config=current?.trim()?tomlParse(current):{},providers2=Array.isArray(config.providers)?config.providers:[];return config.providers=upsertById(providers2,existing=>({...existing,url:`${base}/chat/completions`,models:`${base}/models`,api_key_vars:GATEWAY_API_KEY_ENV,response_type:"OpenAI",auth_methods:["api_key"]})),config.session={...asObject4(config.session),provider_id:PROVIDER_ID,model_id:defaultModel},`${tomlStringify(config)}
106
106
  `}},{path:join13(dirname4(configPath),".credentials.json"),label:"ForgeCode credentials",format:"json",mode:384,transform:current=>{let parsed=current?.trim()?JSON.parse(current):[];if(!Array.isArray(parsed))throw new Error("existing file is not a JSON array");return JSON.stringify(upsertById(parsed,existing=>({...existing,auth_details:{...asObject4(existing.auth_details),api_key:ctx.apiKey}})))}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`ForgeCode will use the gateway with ${defaultModel}; switch models in-session with :config-model (the picker fills from the gateway catalog).`,"Current ForgeCode reads the key from ~/.forge/.credentials.json (0600), not the environment, so the key is stored there."]}}};import{join as join14}from"node:path";var fx={id:"fx",displayName:"fx",async detect(home){return pathExists(join14(home,".fx"))},configPath(ctx){return ctx.overrides?.fx??join14(ctx.home,".fx","settings.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"fx settings",format:"json",transform:current=>mergeJson(current,{credential_source:"ai_gateway_api_key"})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`fx will authenticate with ${GATEWAY_API_KEY_ENV}; open a new terminal so it is loaded, then confirm with fx status.`,"Pick a model with /model or browse the catalog with /models \u2014 the whole gateway catalog is available."]}}};import{dirname as dirname5,join as join15}from"node:path";var PROVIDER_ID2="vercel_ai_gateway";function contextLimits(ctx){return defaultFirst(agenticModels(ctx,{requireContextWindow:!0})).map(m=>({name:m.id,context_limit:m.context_window}))}function asObject5(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function gooseConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join15(home,".config");return join15(base,"goose")}var goose={id:"goose",needsTopModels:!0,displayName:"Goose",needsModelCatalogue:!0,async detect(home){return pathExists(gooseConfigDir(home))},configPath(ctx){return ctx.overrides?.goose??join15(gooseConfigDir(ctx.home),"config.yaml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=contextLimits(ctx);return{fileChanges:[{path:configPath,label:"Goose config",format:"yaml",transform:current=>{let config=asObject5(load(current??"")??{});return config.GOOSE_PROVIDER=PROVIDER_ID2,config.GOOSE_MODEL=defaultModel,dump(config,{lineWidth:120})}},{path:join15(dirname5(configPath),"custom_providers",`${PROVIDER_ID2}.json`),label:"Goose provider",format:"json",transform:current=>mergeJson(current,{name:PROVIDER_ID2,engine:"openai",display_name:"Vercel AI Gateway",api_key_env:GATEWAY_API_KEY_ENV,base_url:`${base}/chat/completions`,...models3.length?{models:models3}:{}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Goose will use the gateway with ${defaultModel}; switch models with GOOSE_MODEL in config.yaml or \`goose configure\` (the picker fills from the gateway catalog).`,...models3.length?[`Context limits for ${models3.length} gateway models are recorded in custom_providers/${PROVIDER_ID2}.json; without them Goose sizes most models at 128k. Re-run setup to refresh.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{isAbsolute as isAbsolute2,join as join16}from"node:path";import{isDeepStrictEqual}from"node:util";import{parse as tomlParse2,stringify as tomlStringify2}from"smol-toml";var PROVIDER_NAME="vercel-ai-gateway";function isTable(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function gptmeConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute2(xdg)?xdg:join16(home,".config");return join16(base,"gptme")}var gptme={id:"gptme",needsTopModels:!0,displayName:"gptme",async detect(home){return pathExists(gptmeConfigDir(home))},configPath(ctx){return ctx.overrides?.gptme??join16(gptmeConfigDir(ctx.home),"config.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path:path3,label:"gptme config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse2(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],entry2={name:PROVIDER_NAME,base_url:baseUrl,api_key_env:GATEWAY_API_KEY_ENV,default_model:defaultModel},index=providers2.findIndex(value=>isTable(value)&&value.name===PROVIDER_NAME);index===-1?providers2.push(entry2):providers2[index]={...providers2[index],...entry2};let desired={...doc,providers:providers2,models:{...isTable(doc.models)?doc.models:{},default:`${PROVIDER_NAME}/${defaultModel}`}};return current&&isDeepStrictEqual(doc,desired)?current:`${tomlStringify2(desired)}
107
107
  `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`gptme will default to ${PROVIDER_NAME}/${defaultModel}; run other gateway models with -m ${PROVIDER_NAME}/<gateway-model-id>.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join17}from"node:path";var MODEL_KEY="vercel-ai-gateway",DEFAULT_MODEL2="xai/grok-4.6",GROK_KEY_ENV="GROK_CODE_XAI_API_KEY";function grokDir(home){let dir=process.env.GROK_HOME;return dir&&dir.trim()?dir:join17(home,".grok")}var grok={id:"grok",displayName:"Grok Build",async detect(home){return pathExists(grokDir(home))},configPath(ctx){return ctx.overrides?.grok??join17(grokDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path:path3,label:"Grok Build config",format:"toml",transform:current=>mergeToml(current,{endpoints:{models_base_url:baseUrl},models:{default:MODEL_KEY},model:{[MODEL_KEY]:{model:DEFAULT_MODEL2,base_url:baseUrl,name:"Grok 4.6 (Vercel AI Gateway)",env_key:GATEWAY_API_KEY_ENV,context_window:5e5}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey},{name:GROK_KEY_ENV,value:ctx.apiKey}],notes:[`Grok Build will default to ${DEFAULT_MODEL2} through the gateway; Ctrl+M (or /model) lists the full catalog \u2014 open a new terminal first so ${GROK_KEY_ENV} is loaded for those models.`,"If you previously ran `grok login`, run `grok logout` so the stored xAI session does not shadow the gateway key."]}}};import{join as join18}from"node:path";var PROVIDER_KEY3="vercel-ai-gateway";function asObject6(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var hermes={id:"hermes",displayName:"Hermes",needsTopModels:!0,async detect(home){return pathExists(join18(home,".hermes"))},configPath(ctx){return ctx.overrides?.hermes??join18(ctx.home,".hermes","config.yaml")},buildPlan(ctx){let path3=this.configPath(ctx),api2=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"Hermes config",format:"yaml",transform:current=>{let config=asObject6(load(current??"")??{}),providers2=asObject6(config.providers);return providers2[PROVIDER_KEY3]={...asObject6(providers2[PROVIDER_KEY3]),api:api2,key_env:"AI_GATEWAY_API_KEY",transport:"chat_completions",discover_models:!0},config.providers=providers2,config.model={...asObject6(config.model),provider:`custom:${PROVIDER_KEY3}`,default:defaultModel},dump(config,{lineWidth:120})}}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Hermes will use the gateway with ${defaultModel}; switch models in-session with /model custom:${PROVIDER_KEY3}:<gateway-model-id>.`,"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{isAbsolute as isAbsolute3,join as join19}from"node:path";var PROFILE_NAME="vercel-ai-gateway",MODEL_PROFILE_PREFIX="vercel-",PROVIDER_LABEL="Vercel AI Gateway";function junieHome(home){let env=process.env.JUNIE_HOME;return env&&isAbsolute3(env)?env:join19(home,".junie")}function profileId(modelId){return`${MODEL_PROFILE_PREFIX}${modelId.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}var junie={id:"junie",displayName:"Junie CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(junieHome(home))},configPath(ctx){return ctx.overrides?.junie??join19(junieHome(ctx.home),"models",`${PROFILE_NAME}.json`)},buildPlan(ctx){let baseUrl=`${(ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL).replace(/\/+$/,"")}/chat/completions`,configPath=this.configPath(ctx),models3=shortlistModels(ctx),stableId=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,stableModel=models3.find(m=>m.id===stableId),changes=[{path:configPath,label:"Junie model profile",format:"json",transform:current=>{let isNew=!current||!current.trim();return mergeJson(current,{...isNew?{id:stableId,providerName:PROVIDER_LABEL,...stableModel?{displayName:stableModel.name,...stableModel.context_window?{maxContextLength:stableModel.context_window}:{}}:{}}:{},baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}"})}}];for(let model of models3)changes.push({path:join19(configPath,"..",`${profileId(model.id)}.json`),label:`Junie model profile (${model.id})`,format:"json",transform:current=>mergeJson(current,{id:model.id,displayName:model.name,providerName:PROVIDER_LABEL,baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}",...model.context_window?{maxContextLength:model.context_window}:{}})});return{fileChanges:changes,envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Run \`junie --model custom:${PROFILE_NAME}\` or pick the model with /model in a session; the profile defaults to ${stableId} \u2014 change its \`id\` to any gateway model.`,...models3.length?[`The top ${models3.length} gateway models are also written as their own \`custom:${MODEL_PROFILE_PREFIX}<model-id>\` profiles, grouped under ${PROVIDER_LABEL} in /model after the built-in providers \u2014 re-run setup to refresh the shortlist; profiles from earlier runs stay in place. Junie prices custom profiles at 0; it has no config hook for real rates.`]:[],`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded \u2014 Junie resolves it when the profile loads and errors if it is unset.`]}}};import{join as join20}from"node:path";function kiloConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join20(home,".config");return join20(base,"kilo")}var kilo={id:"kilo",displayName:"Kilo Code",async detect(home){return pathExists(kiloConfigDir(home))},configPath(ctx){return ctx.overrides?.kilo??join20(kiloConfigDir(ctx.home),"kilo.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseURL=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:path3,label:"Kilo Code config",format:"json",transform:current=>mergeJson(current,{provider:{"openai-compatible":{options:{apiKey:"{env:AI_GATEWAY_API_KEY}",baseURL}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Kilo Code lists the gateway catalog automatically \u2014 pick a model with /models in a session (ids look like openai-compatible/anthropic/claude-fable-5).","If you keep your Kilo config in kilo.jsonc instead of kilo.json, merge the new provider block into it manually."]}}};import{join as join21}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";import{parse as tomlParse3,stringify as tomlStringify3}from"smol-toml";var PROVIDER_KEY4="vercel-ai-gateway",PREFERRED_MODEL="moonshotai/kimi-k3";function isTable2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function kimiDir(home){let dir=process.env.KIMI_SHARE_DIR;return dir&&dir.trim()?dir:join21(home,".kimi")}function shortlist(ctx){return shortlistModels(ctx,{creator:"moonshotai",requireContextWindow:!0})}function defaultModelKey(models3){return models3[0]?.id??PREFERRED_MODEL}var kimi={id:"kimi",displayName:"Kimi CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(kimiDir(home))},configPath(ctx){return ctx.overrides?.kimi??join21(kimiDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist(ctx),defaultKey=defaultModelKey(models3);return{fileChanges:[{path:path3,label:"Kimi CLI config",format:"toml",mode:384,transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse3(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=isTable2(doc.providers)?doc.providers:{},keptModels=Object.fromEntries(Object.entries(isTable2(doc.models)?doc.models:{}).filter(([,value])=>!(isTable2(value)&&value.provider===PROVIDER_KEY4))),ours={};for(let model of models3)ours[model.id]={provider:PROVIDER_KEY4,model:model.id,max_context_size:model.context_window,display_name:model.name};models3.length||(ours[defaultKey]={provider:PROVIDER_KEY4,model:defaultKey,max_context_size:128e3});let desired={...doc,default_model:defaultKey,providers:{...providers2,[PROVIDER_KEY4]:{...isTable2(providers2[PROVIDER_KEY4])?providers2[PROVIDER_KEY4]:{},type:"openai_legacy",base_url:baseUrl,api_key:ctx.apiKey}},models:{...keptModels,...ours}};return current&&isDeepStrictEqual2(doc,desired)?current:`${tomlStringify3(desired)}
108
108
  `}}],envExports:[],notes:[`Kimi CLI will use the gateway with ${defaultKey}; switch with /model.`,...models3.length?[`A shortlist of ${models3.length} gateway models is declared in config.toml; re-run setup to refresh it.`]:[],"Kimi CLI lets OPENAI_API_KEY/OPENAI_BASE_URL env vars override this provider \u2014 unset them if requests fail with auth errors."]}}};import{join as join22}from"node:path";function ompDir(home){let dir=process.env.PI_CODING_AGENT_DIR;if(dir&&dir.trim())return dir;let name=process.env.PI_CONFIG_DIR;return join22(home,name&&name.trim()?name.trim():".omp")}var omp={id:"omp",displayName:"omp",async detect(home){return pathExists(ompDir(home))},configPath(ctx){return ctx.overrides?.omp??ompDir(ctx.home)},buildPlan(ctx){return{fileChanges:[],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`omp's native Vercel AI Gateway provider reads ${GATEWAY_API_KEY_ENV} \u2014 pick a gateway model with /model or launch with --model vercel-ai-gateway/<model-id> (the picker lists the gateway catalog).`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, or run: export ${GATEWAY_API_KEY_ENV}=<key>`]}}};import{join as join23}from"node:path";var PROVIDER_KEY5="vercel-ai-gateway",STARTER_MODELS=[{id:"anthropic/claude-fable-5",name:"Claude Fable 5"},{id:"anthropic/claude-opus-4.8",name:"Claude Opus 4.8"},{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"openai/gpt-5.6-sol",name:"GPT-5.6 Sol"},{id:"google/gemini-3.6-flash",name:"Gemini 3.6 Flash"}];function entryFor(model){return{id:model.id,name:`${model.name} (Gateway)`}}function existingModels(current){if(!current?.trim())return[];try{let models3=JSON.parse(current)?.models?.providers?.[PROVIDER_KEY5]?.models;return Array.isArray(models3)?models3.filter(m=>typeof m?.id=="string"&&m.id.length>0):[]}catch{return[]}}function mergeModels(ranked,existing){let merged=[],seen=new Set;for(let model of[...ranked,...existing])seen.has(model.id)||(seen.add(model.id),merged.push(model));return merged}var openclaw={id:"openclaw",displayName:"OpenClaw",needsTopModels:!0,async detect(home){return pathExists(join23(home,".openclaw"))},configPath(ctx){return ctx.overrides?.openclaw??join23(ctx.home,".openclaw","openclaw.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,ranked=(ctx.topModels??STARTER_MODELS).map(entryFor),primaryModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"OpenClaw config",format:"json",transform:current=>mergeJson(current,{models:{providers:{[PROVIDER_KEY5]:{baseUrl,apiKey:"${AI_GATEWAY_API_KEY}",api:"openai-completions",models:mergeModels(ranked,existingModels(current))}}},agents:{defaults:{model:{primary:`${PROVIDER_KEY5}/${primaryModel}`}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`OpenClaw will default to ${PROVIDER_KEY5}/${primaryModel}; the model list is in openclaw.json \u2014 add any gateway model id there.`,"Restart the OpenClaw gateway process so the new provider loads."]}}};import{isAbsolute as isAbsolute4,join as join24}from"node:path";function defaultConfigPath(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute4(xdg)?xdg:join24(home,".config");return join24(base,"opencode","opencode.json")}var opencode={id:"opencode",displayName:"OpenCode",async detect(home){return pathExists(defaultConfigPath(home))},configPath(ctx){return ctx.overrides?.opencode??defaultConfigPath(ctx.home)},buildPlan(ctx){let vercel=ctx.useKeychain?{}:{options:{apiKey:ctx.apiKey}},envExports=ctx.useKeychain?[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}]:[],notes=["OpenCode can now use the Vercel AI Gateway; pick a model like vercel/<creator>/<model>."];return ctx.useKeychain&&notes.push(`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded (Keychain-backed).`),{fileChanges:[{path:this.configPath(ctx),label:"OpenCode config",format:"json",transform:current=>mergeJson(current,{provider:{vercel}})}],envExports,notes}}};import{join as join25}from"node:path";function persistenceDir(home){let dir=process.env.OPENHANDS_PERSISTENCE_DIR;return dir&&dir.trim()?dir:join25(home,".openhands")}function hasCondenserLlm(current){if(!current||!current.trim())return!1;try{return!!JSON.parse(current)?.condenser?.llm}catch{return!1}}function costPerToken2(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelPricing(models3,id){let model=models3?.find(m=>m.id===id),input=costPerToken2(model?.pricing?.input),output=costPerToken2(model?.pricing?.output);return input===void 0||output===void 0?{}:{input_cost_per_token:input,output_cost_per_token:output}}var openhands={id:"openhands",displayName:"OpenHands",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(persistenceDir(home))},configPath(ctx){return ctx.overrides?.openhands??join25(persistenceDir(ctx.home),"agent_settings.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,pinned=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,model=`openai/${pinned}`;return{fileChanges:[{path:path3,label:"OpenHands agent settings",format:"json",mode:384,transform:current=>{let llm={model,api_key:ctx.apiKey,base_url:baseUrl,...modelPricing(ctx.gatewayModels,pinned)};return mergeJson(current,{llm:{...llm,usage_id:"agent"},...hasCondenserLlm(current)?{condenser:{llm}}:{}})}}],envExports:[],notes:[`OpenHands will use the gateway with ${model}; switch models in /settings with openai/<gateway-model-id>.`,"Headless runs pick this up automatically \u2014 no --override-with-envs needed."]}}};import{join as join26}from"node:path";function piAgentDir(home){let dir=process.env.PI_CODING_AGENT_DIR;return dir&&dir.trim()?dir:join26(home,".pi","agent")}var pi={id:"pi",displayName:"Pi",async detect(home){let dir=process.env.PI_CODING_AGENT_DIR;return pathExists(dir&&dir.trim()?dir:join26(home,".pi"))},configPath(ctx){return ctx.overrides?.pi??join26(piAgentDir(ctx.home),"auth.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"Pi auth",format:"json",mode:384,transform:current=>mergeJson(current,{"vercel-ai-gateway":{type:"api_key",key:ctx.apiKey}})}],envExports:[],notes:["Pi will use the Vercel AI Gateway provider; pick a model with /model or --model."]}}};import{join as join27}from"node:path";var PREFERRED_MODEL2="alibaba/qwen3-coder-plus";function defaultModelId(models3){return models3[0]?.id??PREFERRED_MODEL2}function providerEntries(models3,baseUrl){return models3.map(m=>({id:m.id,name:m.name,baseUrl,envKey:GATEWAY_API_KEY_ENV,...m.context_window?{generationConfig:{contextWindowSize:m.context_window}}:{}}))}function isOurs2(value,writtenIds){if(typeof value!="object"||value===null)return!1;let entry2=value;return entry2.envKey===GATEWAY_API_KEY_ENV?!0:typeof entry2.id=="string"&&writtenIds.has(entry2.id)}var qwen={id:"qwen",displayName:"Qwen Code",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join27(home,".qwen"))},configPath(ctx){return ctx.overrides?.qwen??join27(ctx.home,".qwen","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx,{creator:"alibaba"}),defaultId=defaultModelId(models3),entries=models3.length?providerEntries(models3,baseUrl):[{id:defaultId,name:defaultId,baseUrl,envKey:GATEWAY_API_KEY_ENV}];return{fileChanges:[{path:this.configPath(ctx),label:"Qwen Code settings",format:"json",transform:current=>{let writtenIds=new Set(entries.map(e2=>e2.id)),kept=[];try{let existing=JSON.parse(current??"").modelProviders?.openai;Array.isArray(existing)&&(kept=existing.filter(e2=>!isOurs2(e2,writtenIds)))}catch{}return mergeJson(current,{modelProviders:{openai:[...kept,...entries]},security:{auth:{selectedType:"openai"}},model:{name:defaultId}})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Qwen Code will use the gateway with ${defaultId}.`,...models3.length?[`${models3.length} shortlisted gateway models are configured \u2014 the newest Qwen models first, then the gateway's most-used. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join28}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";import{parse as tomlParse4,stringify as tomlStringify4}from"smol-toml";var PROVIDER_KEY6="vercel-ai-gateway";function isTable3(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function vibeDir(home){let dir=process.env.VIBE_HOME;return dir&&dir.trim()?dir:join28(home,".vibe")}function shortlist2(ctx){return shortlistModels(ctx,{creator:"mistral"})}function perMillionTokens(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value*1e6:void 0}function modelEntry(model){let input=perMillionTokens(model.pricing?.input),output=perMillionTokens(model.pricing?.output);return{name:model.id,provider:PROVIDER_KEY6,...model.context_window?{auto_compact_threshold:model.context_window}:{},...input===void 0?{}:{input_price:input},...output===void 0?{}:{output_price:output},supports_images:(model.tags??[]).includes("vision")}}var vibe={id:"vibe",displayName:"Mistral Vibe",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(vibeDir(home))},configPath(ctx){return ctx.overrides?.vibe??join28(vibeDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist2(ctx),activeModel=models3[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"Mistral Vibe config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse4(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],providerEntry={name:PROVIDER_KEY6,api_base:baseUrl,api_key_env_var:GATEWAY_API_KEY_ENV,api_style:"openai",backend:"generic"},at=providers2.findIndex(v=>isTable3(v)&&v.name===PROVIDER_KEY6);at===-1?providers2.push(providerEntry):providers2[at]={...providers2[at],...providerEntry};let kept=(Array.isArray(doc.models)?doc.models:[]).filter(v=>!(isTable3(v)&&v.provider===PROVIDER_KEY6)),ours=models3.length?models3.map(modelEntry):[{name:GATEWAY_DEFAULT_MODEL,provider:PROVIDER_KEY6}],desired={...doc,providers:providers2,models:[...kept,...ours],active_model:activeModel};return current&&isDeepStrictEqual3(doc,desired)?current:`${tomlStringify4(desired)}
@@ -140,7 +140,7 @@ ${preserved.join(`
140
140
  `}function formatBytes(bytes5){return bytes5<1024?`${bytes5} B`:bytes5<1024**2?`${(bytes5/1024).toFixed(1)} KiB`:`${(bytes5/1024**2).toFixed(1)} MiB`}var import_chalk27=__toESM(require_source(),1);async function collectAgentWarnings(agents,ctx){let entries=[];for(let agent2 of agents)for(let warning2 of await agent2.warnings?.(ctx)??[])entries.push({agent:agent2,warning:warning2});return entries}function formatWarningMessage(warning2){return`${warning2.impact} ${warning2.why.join(" ")} To undo, ${warning2.undo}.`}function printAgentWarning(warning2){output_manager_default.print(`
141
141
  `),printWarning(warning2.impact);for(let line2 of warning2.why)output_manager_default.print(import_chalk27.default.dim(` ${line2}
142
142
  `));output_manager_default.print(import_chalk27.default.dim(` To undo: ${warning2.undo}.
143
- `))}function groupWarningsByAgent(entries){let grouped=new Map;for(let{agent:agent2,warning:warning2}of entries){let list29=grouped.get(agent2)??[];list29.push(warning2),grouped.set(agent2,list29)}return grouped}async function promptAgentConsent(client,entries){let declined=new Set;for(let[agent2,warnings]of groupWarningsByAgent(entries)){for(let warning2 of warnings)printAgentWarning(warning2);let confirm=warnings.length===1?warnings[0].confirm:`Configure ${agent2.displayName} anyway?`;await client.input.confirm(`${import_chalk27.default.dim("\u21B3")} ${confirm}`,!1)||declined.add(agent2.id)}return declined}async function runMachine(args){let{client,selected,previewPlan,dryRun,backup,home}=args,errored=previewPlan.changes.filter(c=>c.status==="error"),skipped=errored.map(c=>({target:c.path,reason:"unparseable_config",message:c.error}));for(let id of args.unsupported)skipped.push({target:id,reason:"not_automatable",message:UNSUPPORTED_AGENTS[id]});if(skipped.push(...args.consentSkipped),dryRun)return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"dry_run",message:"Previewing AI Gateway coding-agent setup. No changes applied.",changes:previewPlan.changes.map(c=>({agent:c.owners.join(", "),file:c.path,action:c.status==="create"?"would_create":c.status==="update"?"would_update":c.status,...c.symlink?{symlink:!0}:{}})),migrations:previewPlan.migrations.map(m=>({agent:m.agentId,label:m.label,action:"would_copy",sessions:m.itemCount,bytes:m.totalBytes,sourceRoots:m.sourceRoots,destinationRoots:m.destinationRoots})),skipped,warnings:args.warnings},null,2)}
143
+ `))}function groupWarningsByAgent(entries){let grouped=new Map;for(let{agent:agent2,warning:warning2}of entries){let list30=grouped.get(agent2)??[];list30.push(warning2),grouped.set(agent2,list30)}return grouped}async function promptAgentConsent(client,entries){let declined=new Set;for(let[agent2,warnings]of groupWarningsByAgent(entries)){for(let warning2 of warnings)printAgentWarning(warning2);let confirm=warnings.length===1?warnings[0].confirm:`Configure ${agent2.displayName} anyway?`;await client.input.confirm(`${import_chalk27.default.dim("\u21B3")} ${confirm}`,!1)||declined.add(agent2.id)}return declined}async function runMachine(args){let{client,selected,previewPlan,dryRun,backup,home}=args,errored=previewPlan.changes.filter(c=>c.status==="error"),skipped=errored.map(c=>({target:c.path,reason:"unparseable_config",message:c.error}));for(let id of args.unsupported)skipped.push({target:id,reason:"not_automatable",message:UNSUPPORTED_AGENTS[id]});if(skipped.push(...args.consentSkipped),dryRun)return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"dry_run",message:"Previewing AI Gateway coding-agent setup. No changes applied.",changes:previewPlan.changes.map(c=>({agent:c.owners.join(", "),file:c.path,action:c.status==="create"?"would_create":c.status==="update"?"would_update":c.status,...c.symlink?{symlink:!0}:{}})),migrations:previewPlan.migrations.map(m=>({agent:m.agentId,label:m.label,action:"would_copy",sessions:m.itemCount,bytes:m.totalBytes,sourceRoots:m.sourceRoots,destinationRoots:m.destinationRoots})),skipped,warnings:args.warnings},null,2)}
144
144
  `),{exitCode:0,outcome:"dry_run"};if(args.alreadyConfigured&&!args.reconfigure){args.promptMode||await enforcePlanModes(previewPlan);let consentSkips=args.consentSkipped.length>0,message=selected.length>0?`${consentSkips?"The remaining":"All selected"} agents are already configured for the AI Gateway. Pass --reconfigure to rotate the key.`:"Every selected agent needs explicit consent (see skipped); the existing configuration already uses the AI Gateway.";if(args.useKeychain&&args.keySource){if(!storeKeyInKeychain(args.keySource.key))return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"keychain_error",message:"Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead.",skipped,warnings:args.warnings},null,2)}
145
145
  `),{exitCode:1,outcome:"failed"};message=selected.length>0?`${consentSkips?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`:"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key."}return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"already_configured",message,configured:[],skipped,warnings:args.warnings},null,2)}
146
146
  `),{exitCode:0,outcome:"already_configured"}}if(!args.keySource&&!args.reconfigure&&previewPlan.changes.every(c=>c.status==="unchanged")&&previewPlan.migrations.length>0){if(args.promptMode)return writeJson(client,{status:AGENT_STATUS.OK,reason:"agent_prompt",message:"Generated a Codex Desktop session migration prompt. No changes were applied.",prompt:buildAgentPrompt(previewPlan,""),configured:[],skipped,warnings:args.warnings}),{exitCode:0,outcome:"agent_prompt"};await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return writeJson(client,{status:migrated2.errors.length>0?AGENT_STATUS.ERROR:AGENT_STATUS.OK,reason:migrated2.errors.length>0?"session_migration_failed":"sessions_migrated",message:migrated2.errors.length>0?"One or more Codex Desktop session copies failed. Original sessions were left unchanged.":"Copied existing Codex Desktop sessions into the AI Gateway provider. Original sessions remain unchanged.",configured:[],migrated:migrated2.results,skipped:[...skipped,...migrationSkips(migrated2.errors)],warnings:args.warnings}),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}let applicable=previewPlan.changes.filter(c=>(c.status==="create"||c.status==="update")&&c.format!=="shell");if(applicable.length===0&&errored.length>0&&(args.promptMode||previewPlan.migrations.length===0))return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"unparseable_config",message:"Couldn't write any agent configurations.",skipped,warnings:args.warnings},null,2)}
@@ -160,7 +160,7 @@ ${preserved.join(`
160
160
  `))}function buildConsentCommand(argv,consentFlags){let args=stripSensitiveAuthArgs(argv.slice(2)),redacted=[];for(let i=0;i<args.length;i++){let arg=args[i];if(arg==="--key"){redacted.push(arg,"<key>"),i+1<args.length&&!args[i+1].startsWith("-")&&i++;continue}if(arg.startsWith("--key=")){redacted.push("--key=<key>");continue}redacted.push(arg)}return`${packageName} ${redacted.join(" ")} ${consentFlags}`.trim()}function failConsent(client,machine,warnings,skipped){let consentFlags=skipped.map(s=>`--agent ${s.target}`).join(" "),message=`All selected agents need explicit consent to configure. Pass ${consentFlags} (or --all) to consent, or run interactively without --yes.`;return machine?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:AGENT_REASON.REQUIRES_CONSENT,message,warnings,skipped,next:[{command:buildConsentCommand(client.argv,consentFlags)}]},null,2)}
161
161
  `):output_manager_default.error(message),{exitCode:1,outcome:"failed"}}function isValidBaseUrl(value){try{let{protocol}=new URL(value);return protocol==="http:"||protocol==="https:"}catch{return!1}}function failValidation(client,machine,reason,message){return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}),output_manager_default.error(message),{exitCode:1,outcome:"failed"}}var AiGatewayCodingAgentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}};var COMMAND_CONFIG8={setup:getCommandAliases(setupSubcommand)};async function codingAgents(client){let telemetry2=new AiGatewayCodingAgentsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(codingAgentsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway coding-agents",subcommand),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:codingAgentsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway coding-agents",subcommandOriginal),printHelp(setupSubcommand),2):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG8)),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk29=__toESM(require_source(),1);var AiGatewayModelsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVirtual(virtual){virtual&&this.trackCliFlag("virtual")}trackCliFlagNoVirtual(noVirtual){noVirtual&&this.trackCliFlag("no-virtual")}};async function list8(client,argv){let telemetry2=new AiGatewayModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagVirtual(opts["--virtual"]),telemetry2.trackCliFlagNoVirtual(opts["--no-virtual"]);let onlyVirtual=!!opts["--virtual"],hideVirtual=!!opts["--no-virtual"];if(onlyVirtual&&hideVirtual)return output_manager_default.error("Pass only one of --virtual and --no-virtual."),1;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching models",fetch:()=>fetchModels(client,{onlyVirtual,hideVirtual}),toJSON:models3=>({models:models3}),isEmpty:models3=>models3.length===0,emptyMessage:onlyVirtual?"No virtual models found.":"No models found.",header:()=>"Models",renderTable:printModelsTable}):(output_manager_default.error(formatResult.error),1)}async function fetchModels(client,filter){let fetchVirtual=client.config.currentTeam&&!filter.hideVirtual?filter.onlyVirtual?listVirtualModels(client):listVirtualModels(client).catch(()=>[]):Promise.resolve([]),[catalog,virtualModels2]=await Promise.all([filter.onlyVirtual?Promise.resolve([]):listModels(client),fetchVirtual]);return[...filter.hideVirtual?catalog.filter(model=>!model.id.startsWith("vmc/")):catalog.filter(model=>!virtualModels2.some(vmc=>`vmc/${vmc.virtualModelSlug}`===model.id)),...virtualModels2.map(vmc=>({id:`vmc/${vmc.virtualModelSlug}`,object:"model",owned_by:"you",name:vmc.displayName??vmc.virtualModelSlug,type:"virtual"}))]}function printModelsTable(models3){return`${table([["id","name","owner","type"].map(header=>import_chalk29.default.gray(header)),...models3.map(model=>[model.id,model.name??import_chalk29.default.gray("\u2013"),model.owned_by??import_chalk29.default.gray("\u2013"),model.type??import_chalk29.default.gray("\u2013")])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
162
162
 
163
- `}var import_chalk30=__toESM(require_source(),1);var AiGatewayModelsEndpointsTelemetryClient=class extends TelemetryClient{trackCliArgumentModel(model){model&&this.trackCliArgument({arg:"model",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function endpoints(client,argv){let telemetry2=new AiGatewayModelsEndpointsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsEndpointsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts,args}=parsedArgs,model=args[0];if(telemetry2.trackCliArgumentModel(model),telemetry2.trackCliOptionFormat(opts["--format"]),!model)return output_manager_default.error(`Specify a model. Run ${getCommandName("ai-gateway models ls")} to see available models.`),1;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching endpoints for ${model}`,fetch:()=>listModelEndpoints(client,model),toJSON:data=>data,isEmpty:data=>(data?.endpoints??[]).length===0,emptyMessage:`No endpoints found for ${model}.`,header:data=>`Endpoints for ${data.id}`,renderTable:data=>printEndpointsTable(data.endpoints??[])}):(output_manager_default.error(formatResult.error),1)}var dash=()=>import_chalk30.default.gray("\u2013"),positive=value=>value!=null&&Number(value)>0,count=value=>value!=null&&value>0?String(value):dash();function inputPrice(p){if(positive(p?.prompt))return p?.prompt;if(positive(p?.image))return`${p?.image}/img`;let perSec=p?.video_duration_pricing?.map(v=>v.cost_per_second).filter(positive).sort((a,b)=>Number(a)-Number(b))[0];return perSec?`${perSec}/s`:positive(p?.speech_input_character_cost)?`${p?.speech_input_character_cost}/char`:positive(p?.request)?`${p?.request}/req`:dash()}function outputPrice(p){return positive(p?.completion)?p?.completion:positive(p?.image_output)?`${p?.image_output}/img`:dash()}function printEndpointsTable(list29){return`${table([["provider","context","input","output","p50 ttft","uptime"].map(header=>import_chalk30.default.gray(header)),...list29.map(e2=>[e2.provider_name,count(e2.context_length),inputPrice(e2.pricing),outputPrice(e2.pricing),e2.latency_last_1h?.p50!=null?`${Math.round(e2.latency_last_1h.p50)}ms`:dash(),e2.uptime_last_1h!=null?`${e2.uptime_last_1h.toFixed(1)}%`:dash()])],{align:["l","r","r","r","r","r"],hsep:3}).replace(/^/gm," ")}
163
+ `}var import_chalk30=__toESM(require_source(),1);var AiGatewayModelsEndpointsTelemetryClient=class extends TelemetryClient{trackCliArgumentModel(model){model&&this.trackCliArgument({arg:"model",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function endpoints(client,argv){let telemetry2=new AiGatewayModelsEndpointsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsEndpointsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts,args}=parsedArgs,model=args[0];if(telemetry2.trackCliArgumentModel(model),telemetry2.trackCliOptionFormat(opts["--format"]),!model)return output_manager_default.error(`Specify a model. Run ${getCommandName("ai-gateway models ls")} to see available models.`),1;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching endpoints for ${model}`,fetch:()=>listModelEndpoints(client,model),toJSON:data=>data,isEmpty:data=>(data?.endpoints??[]).length===0,emptyMessage:`No endpoints found for ${model}.`,header:data=>`Endpoints for ${data.id}`,renderTable:data=>printEndpointsTable(data.endpoints??[])}):(output_manager_default.error(formatResult.error),1)}var dash=()=>import_chalk30.default.gray("\u2013"),positive=value=>value!=null&&Number(value)>0,count=value=>value!=null&&value>0?String(value):dash();function inputPrice(p){if(positive(p?.prompt))return p?.prompt;if(positive(p?.image))return`${p?.image}/img`;let perSec=p?.video_duration_pricing?.map(v=>v.cost_per_second).filter(positive).sort((a,b)=>Number(a)-Number(b))[0];return perSec?`${perSec}/s`:positive(p?.speech_input_character_cost)?`${p?.speech_input_character_cost}/char`:positive(p?.request)?`${p?.request}/req`:dash()}function outputPrice(p){return positive(p?.completion)?p?.completion:positive(p?.image_output)?`${p?.image_output}/img`:dash()}function printEndpointsTable(list30){return`${table([["provider","context","input","output","p50 ttft","uptime"].map(header=>import_chalk30.default.gray(header)),...list30.map(e2=>[e2.provider_name,count(e2.context_length),inputPrice(e2.pricing),outputPrice(e2.pricing),e2.latency_last_1h?.p50!=null?`${Math.round(e2.latency_last_1h.p50)}ms`:dash(),e2.uptime_last_1h!=null?`${e2.uptime_last_1h.toFixed(1)}%`:dash()])],{align:["l","r","r","r","r","r"],hsep:3}).replace(/^/gm," ")}
164
164
 
165
165
  `}var AiGatewayModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandEndpoints(actual){this.trackCliSubcommand({subcommand:"endpoints",value:actual})}};var COMMAND_CONFIG9={list:getCommandAliases(modelsListSubcommand),endpoints:getCommandAliases(modelsEndpointsSubcommand)};async function models(client){let telemetry2=new AiGatewayModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(modelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway models",subcommandOriginal),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:modelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsListSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list8(client,args));case"endpoints":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsEndpointsSubcommand),2):(telemetry2.trackCliSubcommandEndpoints(subcommandOriginal),endpoints(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG9)),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk31=__toESM(require_source(),1);import{writeFile as writeFile3}from"node:fs/promises";var dash2=()=>import_chalk31.default.gray("\u2013");function resolveFormat(client,flags){let raw=flags["--format"],out=flags["--out"];if(raw!==void 0){let format3=raw.toLowerCase();return format3!=="table"&&format3!=="json"&&format3!=="csv"?{error:`Invalid format: "${raw}". Valid formats: table, json, csv`}:format3==="table"&&out!==void 0?{error:"Cannot write the table view to a file. Use --format json or --format csv with --out."}:{format:format3}}return out!==void 0?{format:"json"}:{format:!!client.stdout.isTTY&&!client.nonInteractive?"table":"json"}}function parseEnum(value,allowed,label){if(value===void 0)return{value:void 0};let normalized=value.toLowerCase(),match=allowed.find(member=>member.toLowerCase()===normalized);return match===void 0?{error:`Invalid ${label}: "${value}". Valid values: ${allowed.join(", ")}`}:{value:match}}async function fetchWithSpinner(fetch3,spinnerText){output_manager_default.spinner(spinnerText);try{let data=await fetch3();return output_manager_default.stopSpinner(),{data}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1};throw err}}async function writeToFile(client,out,content,label){let writeStamp=stamp_default();try{await writeFile3(out,content)}catch(err){return output_manager_default.error(`Failed to write ${out}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Wrote ${label} to ${import_chalk31.default.bold(out)} ${writeStamp()}`),0}async function runTimeseriesLeaderboard(client,flags,telemetry2,config){telemetry2.trackCliOptionModality(flags["--modality"]),telemetry2.trackCliOptionMetric(flags["--metric"]),telemetry2.trackCliOptionDate(flags["--date"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format:format3}=formatResult,modalityResult=parseEnum(flags["--modality"],LEADERBOARD_MODALITIES,"modality");if("error"in modalityResult)return output_manager_default.error(modalityResult.error),1;let metricResult=parseEnum(flags["--metric"],LEADERBOARD_METRICS,"metric");if("error"in metricResult)return output_manager_default.error(metricResult.error),1;let modality=modalityResult.value,metric=metricResult.value;format3==="table"&&canPrompt(client)&&(modality===void 0&&(modality=await client.input.select({message:"Modality",choices:LEADERBOARD_MODALITIES.map(value=>({name:value,value})),default:"all"})),metric===void 0&&(metric=await client.input.select({message:"Metric",choices:LEADERBOARD_METRICS.map(value=>({name:value,value})),default:"requests"})));let resolvedModality=modality??"all",resolvedMetric=metric??"requests";if(format3==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format3==="json"){let content=`${JSON.stringify(data,null,2)}
166
166
  `;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderTimeseriesTable(client,data,{metric:resolvedMetric,modality:resolvedModality,date:flags["--date"],entityLabel:config.entityLabel,label:config.label})}function renderTimeseriesTable(client,data,options){let rows=data.rows??[];if(options.date!==void 0&&!rows.some(r=>r.date===options.date)){let dates=availableDates(rows);return output_manager_default.error(`No data for ${options.date}.${dates.length?` Available dates: ${dates.slice(0,5).join(", ")}${dates.length>5?", \u2026":""}`:""}`),1}let filtered=filterTimeseries(rows,{metric:options.metric,date:options.date});if(filtered.length===0)return output_manager_default.log(`No ${options.label} data for ${options.metric}.`),0;let day=options.date??latestDate(rows);return output_manager_default.log(`${options.label} \xB7 ${import_chalk31.default.bold(options.metric)} \xB7 ${options.modality} \xB7 ${day}`),client.stdout.write(`${table([["#",options.entityLabel,"share"].map(header=>import_chalk31.default.gray(header)),...filtered.map((row,index)=>[String(index+1),row.name,`${row.share_percent.toFixed(2)}%`])],{align:["r","l","r"],hsep:3}).replace(/^/gm," ")}
@@ -169,7 +169,7 @@ ${preserved.join(`
169
169
  `),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),2):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),2):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),2):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),2):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),2):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),1)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var builtInBody={type:"built-in",name:"Production server errors",triggers:{mode:"selected",items:[{type:"error_anomaly",filter:"statusGroup:5xx AND route:/api/*"}]},matchMinimumSeverityLevel:"high"};function getRulesAddBodyExamplesHelp(){return["Scope",""," Provide ruleScope in the body or use a scope flag, not both."," --project maps to one included project."," --all maps to every project in the team.","","Built-in body (rule.json)","",indent_default(JSON.stringify(builtInBody,null,2),2),""," vercel alerts rules add --project my-app --body ./rule.json","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
170
170
  `)}function getRulesUpdateBodyExamplesHelp(){return["Update body",""," Include only the fields to change. type is optional and inferred from the stored rule."," Use --project or --all to change scope with or without --body."," Do not combine a ruleScope field in the body with --project or --all."," --all moves the rule to team-wide scope.","","Partial body (patch.json)","",indent_default(JSON.stringify({name:"Critical production errors",matchMinimumSeverityLevel:"critical"},null,2),2),""," vercel alerts rules update ar_abc123 --body ./patch.json"," vercel alerts rules update ar_abc123 --project my-app","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
171
171
  `)}var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg=>arg==="-help"?"--help":arg)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},1),printError(err),1}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"],rulesHelpParent={...rulesAggregateCommand,name:`${alertsCommand.name} ${rulesAggregateCommand.name}`},notificationsHelpParent={...rulesNotificationsAggregateCommand,name:`${rulesHelpParent.name} ${rulesNotificationsAggregateCommand.name}`};function printHelp(command2,parent=alertsCommand,extra){let helpOutput=help(command2,{parent,columns:client.stderr.columns});output_manager_default.print(extra?`${helpOutput}
172
- ${extra}`:helpOutput)}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-22LMAKCS.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-5ECWTZPP.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-XL4GMICP.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let{contextName}=await getScope(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
172
+ ${extra}`:helpOutput)}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-GTALMRKE.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-PKOTTFKG.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-57XWFXDW.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let{contextName}=await getScope(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
173
173
  `)}else if(output_manager_default.log(`aliases found under ${import_chalk32.default.bold(contextName)} ${lsStamp()}`),client.stdout.write(printAliasTable(aliases2)),pagination.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page run ${getCommandName(`alias ls${flags} --next ${pagination.next}`)}`)}return 0}function printAliasTable(aliases2){return`${table([["source","url","age"].map(header=>import_chalk32.default.gray(header)),...aliases2.map(a=>[a.deployment?.url?a.deployment.url:import_chalk32.default.gray("\u2013"),a.alias,(0,import_ms2.default)(Date.now()-a.createdAt)])],{align:["l","l","r"],hsep:4}).replace(/^/gm," ")}
174
174
 
175
175
  `}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id){return client.fetch(`/now/aliases/${id}`,{method:"DELETE"})}async function findAliasByAliasOrId(client,aliasOrId){return client.fetch(`/now/aliases/${encodeURIComponent(getSafeAlias(aliasOrId))}`)}function getSafeAlias(alias2){return alias2.replace(/^https:\/\//i,"").replace(/^\.+/,"").replace(/\.+$/,"").toLowerCase()}var AliasRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentAlias(alias2){alias2&&this.trackCliArgument({arg:"alias",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,{contextName}=await getScope(client),telemetryClient=new AliasRemoveTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagYes(opts["--yes"]);let[aliasOrId]=args;if(telemetryClient.trackCliArgumentAlias(aliasOrId),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("alias rm <alias>")}`)}`),1;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),1;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),1;let alias2=await findAliasByAliasOrId(client,aliasOrId);if(!alias2)return output_manager_default.error(`Alias not found by "${aliasOrId}" under ${import_chalk33.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("alias ls")} to see your aliases.`),1;let removeStamp=stamp_default();return!opts["--yes"]&&!await confirmAliasRemove(client,alias2)?(output_manager_default.log("Canceled"),0):(await removeAliasById(client,alias2.uid),output_manager_default.success(`Alias ${import_chalk33.default.bold(alias2.alias)} removed ${removeStamp()}`),0)}async function confirmAliasRemove(client,alias2){let srcUrl=alias2.deployment?import_chalk33.default.underline(alias2.deployment.url):null,tbl=table([[...srcUrl?[srcUrl]:[],import_chalk33.default.underline(alias2.alias),import_chalk33.default.gray(`${(0,import_ms3.default)(Date.now()-alias2.createdAt)} ago`)]],{hsep:4});return output_manager_default.log("The following alias will be removed permanently"),output_manager_default.print(` ${tbl}
@@ -197,10 +197,10 @@ ${list_item_default(`Pass the read-write token as an option: ${getCommandName("b
197
197
  ${list_item_default(`Pass OIDC credentials as options: ${getCommandName("blob list --oidc-token VERCEL_OIDC_TOKEN --store-id BLOB_STORE_ID")}`,2)}
198
198
  ${list_item_default(`Set OIDC credentials as environment variables: ${cmd(`VERCEL_OIDC_TOKEN=... BLOB_STORE_ID=... ${packageName} blob list`)}`,3)}
199
199
  ${list_item_default(`Set the read-write token as an environment variable: ${cmd(`BLOB_READ_WRITE_TOKEN=BLOB_READ_WRITE_TOKEN ${packageName} blob list`)}`,4)}
200
- ${list_item_default("Link your current folder to a Vercel Project that has a Vercel Blob store connected",5)}`,PartialOidcFlagsErrorMessage="--oidc-token and --store-id must be passed together. Pass both flags, or omit them and rely on environment variables / linked project credentials.",PartialOidcEnvErrorMessage="VERCEL_OIDC_TOKEN and BLOB_STORE_ID must both be set, or both be unset. Set both to use OIDC, unset both to use the read-write token, or pass --rw-token / --oidc-token + --store-id explicitly.";async function getBlobRWToken(client,argv){let rwToken=findFlagValue(argv,"--rw-token");if(rwToken)return{success:!0,kind:"rw",token:rwToken};let oidcTokenFlag=findFlagValue(argv,"--oidc-token"),storeIdFlag=findFlagValue(argv,"--store-id");if(oidcTokenFlag||storeIdFlag)return!oidcTokenFlag||!storeIdFlag?{success:!1,error:PartialOidcFlagsErrorMessage}:{success:!0,kind:"oidc",oidcToken:oidcTokenFlag,storeId:storeIdFlag};let fromProcess=resolveFromEnv({VERCEL_OIDC_TOKEN:process.env.VERCEL_OIDC_TOKEN,BLOB_STORE_ID:process.env.BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN:process.env.BLOB_READ_WRITE_TOKEN});if(fromProcess)return fromProcess;let envFile={};try{envFile=await createEnvObject(resolve4(client.cwd,".env.local"))??{}}catch{}let fromFile=resolveFromEnv({VERCEL_OIDC_TOKEN:envFile.VERCEL_OIDC_TOKEN,BLOB_STORE_ID:envFile.BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN:envFile.BLOB_READ_WRITE_TOKEN});return fromFile||{success:!1,error:ErrorMessage}}function resolveFromEnv(env){let{VERCEL_OIDC_TOKEN,BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN}=env;return!!VERCEL_OIDC_TOKEN!=!!BLOB_STORE_ID?{success:!1,error:PartialOidcEnvErrorMessage}:VERCEL_OIDC_TOKEN&&BLOB_STORE_ID?{success:!0,kind:"oidc",oidcToken:VERCEL_OIDC_TOKEN,storeId:BLOB_STORE_ID}:BLOB_READ_WRITE_TOKEN?{success:!0,kind:"rw",token:BLOB_READ_WRITE_TOKEN}:null}function blobOpts(auth){return auth.success&&auth.kind==="rw"?{token:auth.token}:auth.success&&auth.kind==="oidc"?{oidcToken:auth.oidcToken,storeId:auth.storeId}:{}}function getStoreIdFromAuth(auth){if(!auth.success)return null;if(auth.kind==="oidc")return auth.storeId.startsWith("store_")?auth.storeId:`store_${auth.storeId}`;let[,,,id]=auth.token.split("_");return id?`store_${id}`:null}function isMode(mode){return mode==="folded"||mode==="expanded"}async function list10(client,argv,auth){let telemetryClient=new BlobListTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(listSubcommand27.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,validationResult=validateLsArgs({commandName:"blob list",args});if(validationResult!==0)return validationResult;let{"--limit":limit,"--next":next,"--cursor":legacyCursor,"--prefix":prefix,"--mode":modeFlag}=flags,cursor2=next??legacyCursor;telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionCursor(legacyCursor),telemetryClient.trackCliOptionPrefix(prefix),telemetryClient.trackCliOptionMode(modeFlag);let mode=modeFlag??"expanded";if(!isMode(mode))return output_manager_default.error(`Invalid mode: ${mode} has to be either 'folded' or 'expanded'`),1;let list29;try{output_manager_default.debug("Fetching blobs"),output_manager_default.spinner("Fetching blobs"),list29=await blob.list({...blobOpts(auth),limit:limit??10,cursor:cursor2,mode,prefix})}catch(err){return printError(err),1}output_manager_default.stopSpinner();let headers=["Uploaded At","Size","Pathname","URL"],urls=[],tablePrint=table([headers.map(header=>import_chalk40.default.dim(header)),...list29.blobs.map(blob10=>(urls.push(blob10.url),[(0,import_ms5.default)(Date.now()-new Date(blob10.uploadedAt).getTime()),String(blob10.size),blob10.pathname,blob10.url]))],{hsep:5}).replace(/^/gm," ");if(list29.blobs.length>0?output_manager_default.print(`
200
+ ${list_item_default("Link your current folder to a Vercel Project that has a Vercel Blob store connected",5)}`,PartialOidcFlagsErrorMessage="--oidc-token and --store-id must be passed together. Pass both flags, or omit them and rely on environment variables / linked project credentials.",PartialOidcEnvErrorMessage="VERCEL_OIDC_TOKEN and BLOB_STORE_ID must both be set, or both be unset. Set both to use OIDC, unset both to use the read-write token, or pass --rw-token / --oidc-token + --store-id explicitly.";async function getBlobRWToken(client,argv){let rwToken=findFlagValue(argv,"--rw-token");if(rwToken)return{success:!0,kind:"rw",token:rwToken};let oidcTokenFlag=findFlagValue(argv,"--oidc-token"),storeIdFlag=findFlagValue(argv,"--store-id");if(oidcTokenFlag||storeIdFlag)return!oidcTokenFlag||!storeIdFlag?{success:!1,error:PartialOidcFlagsErrorMessage}:{success:!0,kind:"oidc",oidcToken:oidcTokenFlag,storeId:storeIdFlag};let fromProcess=resolveFromEnv({VERCEL_OIDC_TOKEN:process.env.VERCEL_OIDC_TOKEN,BLOB_STORE_ID:process.env.BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN:process.env.BLOB_READ_WRITE_TOKEN});if(fromProcess)return fromProcess;let envFile={};try{envFile=await createEnvObject(resolve4(client.cwd,".env.local"))??{}}catch{}let fromFile=resolveFromEnv({VERCEL_OIDC_TOKEN:envFile.VERCEL_OIDC_TOKEN,BLOB_STORE_ID:envFile.BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN:envFile.BLOB_READ_WRITE_TOKEN});return fromFile||{success:!1,error:ErrorMessage}}function resolveFromEnv(env){let{VERCEL_OIDC_TOKEN,BLOB_STORE_ID,BLOB_READ_WRITE_TOKEN}=env;return!!VERCEL_OIDC_TOKEN!=!!BLOB_STORE_ID?{success:!1,error:PartialOidcEnvErrorMessage}:VERCEL_OIDC_TOKEN&&BLOB_STORE_ID?{success:!0,kind:"oidc",oidcToken:VERCEL_OIDC_TOKEN,storeId:BLOB_STORE_ID}:BLOB_READ_WRITE_TOKEN?{success:!0,kind:"rw",token:BLOB_READ_WRITE_TOKEN}:null}function blobOpts(auth){return auth.success&&auth.kind==="rw"?{token:auth.token}:auth.success&&auth.kind==="oidc"?{oidcToken:auth.oidcToken,storeId:auth.storeId}:{}}function getStoreIdFromAuth(auth){if(!auth.success)return null;if(auth.kind==="oidc")return auth.storeId.startsWith("store_")?auth.storeId:`store_${auth.storeId}`;let[,,,id]=auth.token.split("_");return id?`store_${id}`:null}function isMode(mode){return mode==="folded"||mode==="expanded"}async function list10(client,argv,auth){let telemetryClient=new BlobListTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(listSubcommand27.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,validationResult=validateLsArgs({commandName:"blob list",args});if(validationResult!==0)return validationResult;let{"--limit":limit,"--next":next,"--cursor":legacyCursor,"--prefix":prefix,"--mode":modeFlag}=flags,cursor2=next??legacyCursor;telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionCursor(legacyCursor),telemetryClient.trackCliOptionPrefix(prefix),telemetryClient.trackCliOptionMode(modeFlag);let mode=modeFlag??"expanded";if(!isMode(mode))return output_manager_default.error(`Invalid mode: ${mode} has to be either 'folded' or 'expanded'`),1;let list30;try{output_manager_default.debug("Fetching blobs"),output_manager_default.spinner("Fetching blobs"),list30=await blob.list({...blobOpts(auth),limit:limit??10,cursor:cursor2,mode,prefix})}catch(err){return printError(err),1}output_manager_default.stopSpinner();let headers=["Uploaded At","Size","Pathname","URL"],urls=[],tablePrint=table([headers.map(header=>import_chalk40.default.dim(header)),...list30.blobs.map(blob10=>(urls.push(blob10.url),[(0,import_ms5.default)(Date.now()-new Date(blob10.uploadedAt).getTime()),String(blob10.size),blob10.pathname,blob10.url]))],{hsep:5}).replace(/^/gm," ");if(list30.blobs.length>0?output_manager_default.print(`
201
201
  ${tablePrint}
202
202
 
203
- `):output_manager_default.log("No blobs in this store"),list29.cursor){let nextFlags=getCommandFlags(flags,["_","--next","--cursor"]);output_manager_default.log(`To display the next page run ${getCommandName(`blob list${nextFlags} --next ${list29.cursor}`)}`)}return 0}var BlobPresignTelemetryClient=class extends TelemetryClient{trackCliArgumentPathname(value){value&&this.trackCliArgument({arg:"pathname",value:this.redactedValue})}trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliOptionOperation(value){value&&this.trackCliOption({option:"operation",value})}trackCliOptionDelegationToken(value){value&&this.trackCliOption({option:"delegation-token",value:this.redactedValue})}trackCliOptionClientSigningToken(value){value&&this.trackCliOption({option:"client-signing-token",value:this.redactedValue})}trackCliOptionValidUntil(value){value!==void 0&&this.trackCliOption({option:"valid-until",value:String(value)})}trackCliOptionValidFor(value){value&&this.trackCliOption({option:"valid-for",value})}trackCliOptionIfMatch(value){value&&this.trackCliOption({option:"if-match",value:this.redactedValue})}trackCliFlagAllowOverwrite(value){value&&this.trackCliFlag("allow-overwrite")}trackCliFlagAddRandomSuffix(value){value&&this.trackCliFlag("add-random-suffix")}trackCliOptionCacheControlMaxAge(value){value!==void 0&&this.trackCliOption({option:"cache-control-max-age",value:String(value)})}trackCliOptionAllowedContentType(value){value&&value.length>0&&this.trackCliOption({option:"allowed-content-type",value:value.join(",")})}trackCliOptionMaximumSizeInBytes(value){value!==void 0&&this.trackCliOption({option:"maximum-size-in-bytes",value:String(value)})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var BlobSignedTokenTelemetryClient=class extends TelemetryClient{trackCliOptionPathname(value){value&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliOptionOperation(value){value&&value.length>0&&this.trackCliOption({option:"operation",value:value.join(",")})}trackCliOptionValidUntil(value){value!==void 0&&this.trackCliOption({option:"valid-until",value:String(value)})}trackCliOptionValidFor(value){value&&this.trackCliOption({option:"valid-for",value})}trackCliOptionAllowedContentType(value){value&&value.length>0&&this.trackCliOption({option:"allowed-content-type",value:value.join(",")})}trackCliOptionMaximumSizeInBytes(value){value!==void 0&&this.trackCliOption({option:"maximum-size-in-bytes",value:String(value)})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var BlobTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandPut(actual){this.trackCliSubcommand({subcommand:"put",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDel(actual){this.trackCliSubcommand({subcommand:"del",value:actual})}trackCliSubcommandCopy(actual){this.trackCliSubcommand({subcommand:"copy",value:actual})}trackCliSubcommandPutImage(actual){this.trackCliSubcommand({subcommand:"put-image",value:actual})}trackCliSubcommandSignedToken(actual){this.trackCliSubcommand({subcommand:"signed-token",value:actual})}trackCliSubcommandPresign(actual){this.trackCliSubcommand({subcommand:"presign",value:actual})}trackCliSubcommandCreateStore(actual){this.trackCliSubcommand({subcommand:"create-store",value:actual})}trackCliSubcommandDeleteStore(actual){this.trackCliSubcommand({subcommand:"delete-store",value:actual})}trackCliSubcommandGetStore(actual){this.trackCliSubcommand({subcommand:"get-store",value:actual})}trackCliSubcommandListStores(actual){this.trackCliSubcommand({subcommand:"list-stores",value:actual})}trackCliSubcommandEmptyStore(actual){this.trackCliSubcommand({subcommand:"empty-store",value:actual})}trackCliOptionRwToken(value){value&&this.trackCliOption({option:"--rw-token",value:this.redactedValue})}trackCliOptionOidcToken(value){value&&this.trackCliOption({option:"--oidc-token",value:this.redactedValue})}trackCliOptionStoreId(value){value&&this.trackCliOption({option:"--store-id",value:this.redactedValue})}};import*as blob2 from"@vercel/blob";var import_error_utils=__toESM(require_dist(),1);import{statSync}from"node:fs";import{open as open3}from"node:fs/promises";import{basename as basename2}from"node:path";var import_chalk41=__toESM(require_source(),1);var BlobPutTelemetryClient=class extends TelemetryClient{trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliArgumentPathToFile(pathToFile){pathToFile&&this.trackCliArgument({arg:"pathToFile",value:this.redactedValue})}trackCliInputSourceStdin(){this.trackCliArgument({arg:"pathToFile",value:"__vercel_stdin__"})}trackCliFlagAddRandomSuffix(addRandomSuffix){addRandomSuffix&&this.trackCliFlag("add-random-suffix")}trackCliOptionPathname(pathname){pathname&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliFlagMultipart(multipart){multipart&&this.trackCliFlag("multipart")}trackCliOptionContentType(contentType){contentType&&this.trackCliOption({option:"content-type",value:contentType})}trackCliOptionCacheControlMaxAge(cacheControlMaxAge){cacheControlMaxAge&&this.trackCliOption({option:"cache-control-max-age",value:String(cacheControlMaxAge)})}trackCliFlagAllowOverwrite(allowOverwrite){allowOverwrite&&this.trackCliFlag("allow-overwrite")}trackCliOptionIfMatch(ifMatch){ifMatch&&this.trackCliOption({option:"if-match",value:this.redactedValue})}};var VALID_ACCESS_VALUES=["public","private"];function isAccess(value){return VALID_ACCESS_VALUES.includes(value)}function parseAccessFlag(accessFlag){return accessFlag===void 0?(output_manager_default.error("Missing required --access flag. Must be 'public' or 'private'."),null):isAccess(accessFlag)?accessFlag:(output_manager_default.error(`Invalid access value: '${accessFlag}'. Must be 'public' or 'private'.`),null)}async function put2(client,argv,auth){let telemetryClient=new BlobPutTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(putSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{flags,args:[filePath]}=parsedArgs,{"--access":accessFlag,"--add-random-suffix":addRandomSuffix,"--pathname":pathnameFlag,"--multipart":multipart,"--content-type":contentType,"--cache-control-max-age":cacheControlMaxAge,"--allow-overwrite":allowOverwrite,"--if-match":ifMatch}=flags,access3=parseAccessFlag(accessFlag);if(!access3)return 1;filePath&&telemetryClient.trackCliArgumentPathToFile(filePath),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliFlagAddRandomSuffix(addRandomSuffix),telemetryClient.trackCliOptionPathname(pathnameFlag),telemetryClient.trackCliFlagMultipart(multipart),telemetryClient.trackCliOptionContentType(contentType),telemetryClient.trackCliOptionCacheControlMaxAge(cacheControlMaxAge),telemetryClient.trackCliFlagAllowOverwrite(allowOverwrite),telemetryClient.trackCliOptionIfMatch(ifMatch);let putBody,pathname;if(filePath)try{if(statSync(filePath).isFile())putBody=(await open3(filePath,"r")).createReadStream(),pathname=pathnameFlag??basename2(filePath);else return output_manager_default.error("Path to upload is not a file"),1}catch(err){return output_manager_default.debug(`Error reading file: ${err}`),(0,import_error_utils.isErrnoException)(err)?(output_manager_default.error(`File doesn't exist at '${filePath}'`),1):(output_manager_default.error("Error while reading file"),1)}else{if(client.stdin.isTTY)return output_manager_default.error(`Missing input. Usage: ${import_chalk41.default.cyan(`${getCommandName("blob put <file>")}`)} or pipe data: ${import_chalk41.default.cyan("cat file.txt | vercel blob put --pathname <pathname>")}`),1;if(!pathnameFlag)return output_manager_default.error(`Missing pathname. When reading from stdin, you must specify --pathname. Usage: ${import_chalk41.default.cyan("cat file.txt | vercel blob put --pathname <pathname>")}`),1;putBody=process.stdin,pathname=pathnameFlag,telemetryClient.trackCliInputSourceStdin()}if(!pathname||!putBody)return output_manager_default.error(`Missing pathname or input. Usage: ${import_chalk41.default.cyan(`${getCommandName("blob put <file>")}`)} or ${import_chalk41.default.cyan(`cat file.txt | ${getCommandName("blob put --pathname <pathname>")}`)}`),1;let result;try{output_manager_default.debug("Uploading blob"),output_manager_default.spinner("Uploading blob"),result=await blob2.put(pathname,putBody,{...blobOpts(auth),access:access3,addRandomSuffix:addRandomSuffix??!1,multipart:multipart??!0,contentType,cacheControlMaxAge,allowOverwrite:allowOverwrite??!1,ifMatch})}catch(err){return printError(err),1}return output_manager_default.stopSpinner(),output_manager_default.success(result.url),0}import*as blob3 from"@vercel/blob";var import_error_utils2=__toESM(require_dist(),1);import{statSync as statSync2}from"node:fs";import{open as open4}from"node:fs/promises";var BlobPutImageTelemetryClient=class extends TelemetryClient{trackCliArgumentPathToFileOrUrl(pathToFileOrUrl){pathToFileOrUrl&&this.trackCliArgument({arg:"pathToFileOrUrl",value:this.redactedValue})}trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliOptionWidth(width){width!==void 0&&this.trackCliOption({option:"width",value:String(width)})}trackCliOptionQuality(quality){quality!==void 0&&this.trackCliOption({option:"quality",value:String(quality)})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliOptionPathname(pathname){pathname&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliFlagAddRandomSuffix(addRandomSuffix){addRandomSuffix&&this.trackCliFlag("add-random-suffix")}trackCliFlagAllowOverwrite(allowOverwrite){allowOverwrite&&this.trackCliFlag("allow-overwrite")}trackCliOptionCacheControlMaxAge(cacheControlMaxAge){cacheControlMaxAge&&this.trackCliOption({option:"cache-control-max-age",value:String(cacheControlMaxAge)})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function putImage2(client,argv,auth){let telemetryClient=new BlobPutImageTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(putImageSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{flags,args:[source]}=parsedArgs,{"--access":accessFlag,"--width":width,"--quality":quality,"--format":formatFlag,"--pathname":pathnameFlag,"--add-random-suffix":addRandomSuffix,"--allow-overwrite":allowOverwrite,"--cache-control-max-age":cacheControlMaxAge,"--json":asJson}=flags;if(!source)return output_manager_default.error(`Missing required argument. Usage: ${getCommandName("blob put-image <file-or-url> --pathname <pathname> --width <pixels> --access <public|private>")}`),1;let isUrl=/^https?:\/\//i.test(source),access3=parseAccessFlag(accessFlag);if(!access3)return 1;let optimizeImage={width,quality,format:formatFlag},format3=optimizeImage.format;if(!pathnameFlag)return output_manager_default.error("Missing required --pathname flag. Set the pathname to store the optimized image at in the Blob store."),1;let pathname=pathnameFlag;if(telemetryClient.trackCliArgumentPathToFileOrUrl(source),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliOptionWidth(width),telemetryClient.trackCliOptionQuality(quality),telemetryClient.trackCliOptionFormat(formatFlag),telemetryClient.trackCliOptionPathname(pathnameFlag),telemetryClient.trackCliFlagAddRandomSuffix(addRandomSuffix),telemetryClient.trackCliFlagAllowOverwrite(allowOverwrite),telemetryClient.trackCliOptionCacheControlMaxAge(cacheControlMaxAge),telemetryClient.trackCliFlagJson(asJson),!auth.success||auth.kind!=="oidc")return output_manager_default.error(`Image optimization requires OIDC credentials. Pass --oidc-token and --store-id, or set the VERCEL_OIDC_TOKEN and BLOB_STORE_ID environment variables (available in .env.local after ${getCommandName("env pull")}).`),1;let commonOptions={...blobOpts(auth),access:access3,optimizeImage,addRandomSuffix:addRandomSuffix??!1,allowOverwrite:allowOverwrite??!1,cacheControlMaxAge},result;try{if(output_manager_default.debug("Optimizing and uploading image"),output_manager_default.spinner("Optimizing and uploading image"),isUrl)result=await blob3.putImage(pathname,new URL(source),commonOptions);else{let putBody;try{if(!statSync2(source).isFile())return output_manager_default.stopSpinner(),output_manager_default.error("Path to optimize is not a file"),1;putBody=(await open4(source,"r")).createReadStream()}catch(err){return output_manager_default.stopSpinner(),output_manager_default.debug(`Error reading file: ${err}`),(0,import_error_utils2.isErrnoException)(err)?(output_manager_default.error(`File doesn't exist at '${source}'`),1):(output_manager_default.error("Error while reading file"),1)}result=await blob3.putImage(pathname,putBody,commonOptions)}}catch(err){return output_manager_default.stopSpinner(),printError(err),1}output_manager_default.stopSpinner();let storedMimeType=result.contentType.split(";")[0].trim().toLowerCase();return format3&&storedMimeType!==`image/${format3}`&&output_manager_default.warn(`The image was not converted to ${format3}: it was stored unchanged as ${storedMimeType}. This usually means the optimized output would have been larger than the source image. Try a lower --quality.`),asJson?client.stdout.write(`${JSON.stringify({url:result.url,downloadUrl:result.downloadUrl,pathname:result.pathname,contentType:result.contentType},null,2)}
203
+ `):output_manager_default.log("No blobs in this store"),list30.cursor){let nextFlags=getCommandFlags(flags,["_","--next","--cursor"]);output_manager_default.log(`To display the next page run ${getCommandName(`blob list${nextFlags} --next ${list30.cursor}`)}`)}return 0}var BlobPresignTelemetryClient=class extends TelemetryClient{trackCliArgumentPathname(value){value&&this.trackCliArgument({arg:"pathname",value:this.redactedValue})}trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliOptionOperation(value){value&&this.trackCliOption({option:"operation",value})}trackCliOptionDelegationToken(value){value&&this.trackCliOption({option:"delegation-token",value:this.redactedValue})}trackCliOptionClientSigningToken(value){value&&this.trackCliOption({option:"client-signing-token",value:this.redactedValue})}trackCliOptionValidUntil(value){value!==void 0&&this.trackCliOption({option:"valid-until",value:String(value)})}trackCliOptionValidFor(value){value&&this.trackCliOption({option:"valid-for",value})}trackCliOptionIfMatch(value){value&&this.trackCliOption({option:"if-match",value:this.redactedValue})}trackCliFlagAllowOverwrite(value){value&&this.trackCliFlag("allow-overwrite")}trackCliFlagAddRandomSuffix(value){value&&this.trackCliFlag("add-random-suffix")}trackCliOptionCacheControlMaxAge(value){value!==void 0&&this.trackCliOption({option:"cache-control-max-age",value:String(value)})}trackCliOptionAllowedContentType(value){value&&value.length>0&&this.trackCliOption({option:"allowed-content-type",value:value.join(",")})}trackCliOptionMaximumSizeInBytes(value){value!==void 0&&this.trackCliOption({option:"maximum-size-in-bytes",value:String(value)})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var BlobSignedTokenTelemetryClient=class extends TelemetryClient{trackCliOptionPathname(value){value&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliOptionOperation(value){value&&value.length>0&&this.trackCliOption({option:"operation",value:value.join(",")})}trackCliOptionValidUntil(value){value!==void 0&&this.trackCliOption({option:"valid-until",value:String(value)})}trackCliOptionValidFor(value){value&&this.trackCliOption({option:"valid-for",value})}trackCliOptionAllowedContentType(value){value&&value.length>0&&this.trackCliOption({option:"allowed-content-type",value:value.join(",")})}trackCliOptionMaximumSizeInBytes(value){value!==void 0&&this.trackCliOption({option:"maximum-size-in-bytes",value:String(value)})}trackCliFlagJson(value){value&&this.trackCliFlag("json")}};var BlobTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandPut(actual){this.trackCliSubcommand({subcommand:"put",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDel(actual){this.trackCliSubcommand({subcommand:"del",value:actual})}trackCliSubcommandCopy(actual){this.trackCliSubcommand({subcommand:"copy",value:actual})}trackCliSubcommandPutImage(actual){this.trackCliSubcommand({subcommand:"put-image",value:actual})}trackCliSubcommandSignedToken(actual){this.trackCliSubcommand({subcommand:"signed-token",value:actual})}trackCliSubcommandPresign(actual){this.trackCliSubcommand({subcommand:"presign",value:actual})}trackCliSubcommandCreateStore(actual){this.trackCliSubcommand({subcommand:"create-store",value:actual})}trackCliSubcommandDeleteStore(actual){this.trackCliSubcommand({subcommand:"delete-store",value:actual})}trackCliSubcommandGetStore(actual){this.trackCliSubcommand({subcommand:"get-store",value:actual})}trackCliSubcommandListStores(actual){this.trackCliSubcommand({subcommand:"list-stores",value:actual})}trackCliSubcommandEmptyStore(actual){this.trackCliSubcommand({subcommand:"empty-store",value:actual})}trackCliOptionRwToken(value){value&&this.trackCliOption({option:"--rw-token",value:this.redactedValue})}trackCliOptionOidcToken(value){value&&this.trackCliOption({option:"--oidc-token",value:this.redactedValue})}trackCliOptionStoreId(value){value&&this.trackCliOption({option:"--store-id",value:this.redactedValue})}};import*as blob2 from"@vercel/blob";var import_error_utils=__toESM(require_dist(),1);import{statSync}from"node:fs";import{open as open3}from"node:fs/promises";import{basename as basename2}from"node:path";var import_chalk41=__toESM(require_source(),1);var BlobPutTelemetryClient=class extends TelemetryClient{trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliArgumentPathToFile(pathToFile){pathToFile&&this.trackCliArgument({arg:"pathToFile",value:this.redactedValue})}trackCliInputSourceStdin(){this.trackCliArgument({arg:"pathToFile",value:"__vercel_stdin__"})}trackCliFlagAddRandomSuffix(addRandomSuffix){addRandomSuffix&&this.trackCliFlag("add-random-suffix")}trackCliOptionPathname(pathname){pathname&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliFlagMultipart(multipart){multipart&&this.trackCliFlag("multipart")}trackCliOptionContentType(contentType){contentType&&this.trackCliOption({option:"content-type",value:contentType})}trackCliOptionCacheControlMaxAge(cacheControlMaxAge){cacheControlMaxAge&&this.trackCliOption({option:"cache-control-max-age",value:String(cacheControlMaxAge)})}trackCliFlagAllowOverwrite(allowOverwrite){allowOverwrite&&this.trackCliFlag("allow-overwrite")}trackCliOptionIfMatch(ifMatch){ifMatch&&this.trackCliOption({option:"if-match",value:this.redactedValue})}};var VALID_ACCESS_VALUES=["public","private"];function isAccess(value){return VALID_ACCESS_VALUES.includes(value)}function parseAccessFlag(accessFlag){return accessFlag===void 0?(output_manager_default.error("Missing required --access flag. Must be 'public' or 'private'."),null):isAccess(accessFlag)?accessFlag:(output_manager_default.error(`Invalid access value: '${accessFlag}'. Must be 'public' or 'private'.`),null)}async function put2(client,argv,auth){let telemetryClient=new BlobPutTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(putSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{flags,args:[filePath]}=parsedArgs,{"--access":accessFlag,"--add-random-suffix":addRandomSuffix,"--pathname":pathnameFlag,"--multipart":multipart,"--content-type":contentType,"--cache-control-max-age":cacheControlMaxAge,"--allow-overwrite":allowOverwrite,"--if-match":ifMatch}=flags,access3=parseAccessFlag(accessFlag);if(!access3)return 1;filePath&&telemetryClient.trackCliArgumentPathToFile(filePath),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliFlagAddRandomSuffix(addRandomSuffix),telemetryClient.trackCliOptionPathname(pathnameFlag),telemetryClient.trackCliFlagMultipart(multipart),telemetryClient.trackCliOptionContentType(contentType),telemetryClient.trackCliOptionCacheControlMaxAge(cacheControlMaxAge),telemetryClient.trackCliFlagAllowOverwrite(allowOverwrite),telemetryClient.trackCliOptionIfMatch(ifMatch);let putBody,pathname;if(filePath)try{if(statSync(filePath).isFile())putBody=(await open3(filePath,"r")).createReadStream(),pathname=pathnameFlag??basename2(filePath);else return output_manager_default.error("Path to upload is not a file"),1}catch(err){return output_manager_default.debug(`Error reading file: ${err}`),(0,import_error_utils.isErrnoException)(err)?(output_manager_default.error(`File doesn't exist at '${filePath}'`),1):(output_manager_default.error("Error while reading file"),1)}else{if(client.stdin.isTTY)return output_manager_default.error(`Missing input. Usage: ${import_chalk41.default.cyan(`${getCommandName("blob put <file>")}`)} or pipe data: ${import_chalk41.default.cyan("cat file.txt | vercel blob put --pathname <pathname>")}`),1;if(!pathnameFlag)return output_manager_default.error(`Missing pathname. When reading from stdin, you must specify --pathname. Usage: ${import_chalk41.default.cyan("cat file.txt | vercel blob put --pathname <pathname>")}`),1;putBody=process.stdin,pathname=pathnameFlag,telemetryClient.trackCliInputSourceStdin()}if(!pathname||!putBody)return output_manager_default.error(`Missing pathname or input. Usage: ${import_chalk41.default.cyan(`${getCommandName("blob put <file>")}`)} or ${import_chalk41.default.cyan(`cat file.txt | ${getCommandName("blob put --pathname <pathname>")}`)}`),1;let result;try{output_manager_default.debug("Uploading blob"),output_manager_default.spinner("Uploading blob"),result=await blob2.put(pathname,putBody,{...blobOpts(auth),access:access3,addRandomSuffix:addRandomSuffix??!1,multipart:multipart??!0,contentType,cacheControlMaxAge,allowOverwrite:allowOverwrite??!1,ifMatch})}catch(err){return printError(err),1}return output_manager_default.stopSpinner(),output_manager_default.success(result.url),0}import*as blob3 from"@vercel/blob";var import_error_utils2=__toESM(require_dist(),1);import{statSync as statSync2}from"node:fs";import{open as open4}from"node:fs/promises";var BlobPutImageTelemetryClient=class extends TelemetryClient{trackCliArgumentPathToFileOrUrl(pathToFileOrUrl){pathToFileOrUrl&&this.trackCliArgument({arg:"pathToFileOrUrl",value:this.redactedValue})}trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliOptionWidth(width){width!==void 0&&this.trackCliOption({option:"width",value:String(width)})}trackCliOptionQuality(quality){quality!==void 0&&this.trackCliOption({option:"quality",value:String(quality)})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliOptionPathname(pathname){pathname&&this.trackCliOption({option:"pathname",value:this.redactedValue})}trackCliFlagAddRandomSuffix(addRandomSuffix){addRandomSuffix&&this.trackCliFlag("add-random-suffix")}trackCliFlagAllowOverwrite(allowOverwrite){allowOverwrite&&this.trackCliFlag("allow-overwrite")}trackCliOptionCacheControlMaxAge(cacheControlMaxAge){cacheControlMaxAge&&this.trackCliOption({option:"cache-control-max-age",value:String(cacheControlMaxAge)})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function putImage2(client,argv,auth){let telemetryClient=new BlobPutImageTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(putImageSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{flags,args:[source]}=parsedArgs,{"--access":accessFlag,"--width":width,"--quality":quality,"--format":formatFlag,"--pathname":pathnameFlag,"--add-random-suffix":addRandomSuffix,"--allow-overwrite":allowOverwrite,"--cache-control-max-age":cacheControlMaxAge,"--json":asJson}=flags;if(!source)return output_manager_default.error(`Missing required argument. Usage: ${getCommandName("blob put-image <file-or-url> --pathname <pathname> --width <pixels> --access <public|private>")}`),1;let isUrl=/^https?:\/\//i.test(source),access3=parseAccessFlag(accessFlag);if(!access3)return 1;let optimizeImage={width,quality,format:formatFlag},format3=optimizeImage.format;if(!pathnameFlag)return output_manager_default.error("Missing required --pathname flag. Set the pathname to store the optimized image at in the Blob store."),1;let pathname=pathnameFlag;if(telemetryClient.trackCliArgumentPathToFileOrUrl(source),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliOptionWidth(width),telemetryClient.trackCliOptionQuality(quality),telemetryClient.trackCliOptionFormat(formatFlag),telemetryClient.trackCliOptionPathname(pathnameFlag),telemetryClient.trackCliFlagAddRandomSuffix(addRandomSuffix),telemetryClient.trackCliFlagAllowOverwrite(allowOverwrite),telemetryClient.trackCliOptionCacheControlMaxAge(cacheControlMaxAge),telemetryClient.trackCliFlagJson(asJson),!auth.success||auth.kind!=="oidc")return output_manager_default.error(`Image optimization requires OIDC credentials. Pass --oidc-token and --store-id, or set the VERCEL_OIDC_TOKEN and BLOB_STORE_ID environment variables (available in .env.local after ${getCommandName("env pull")}).`),1;let commonOptions={...blobOpts(auth),access:access3,optimizeImage,addRandomSuffix:addRandomSuffix??!1,allowOverwrite:allowOverwrite??!1,cacheControlMaxAge},result;try{if(output_manager_default.debug("Optimizing and uploading image"),output_manager_default.spinner("Optimizing and uploading image"),isUrl)result=await blob3.putImage(pathname,new URL(source),commonOptions);else{let putBody;try{if(!statSync2(source).isFile())return output_manager_default.stopSpinner(),output_manager_default.error("Path to optimize is not a file"),1;putBody=(await open4(source,"r")).createReadStream()}catch(err){return output_manager_default.stopSpinner(),output_manager_default.debug(`Error reading file: ${err}`),(0,import_error_utils2.isErrnoException)(err)?(output_manager_default.error(`File doesn't exist at '${source}'`),1):(output_manager_default.error("Error while reading file"),1)}result=await blob3.putImage(pathname,putBody,commonOptions)}}catch(err){return output_manager_default.stopSpinner(),printError(err),1}output_manager_default.stopSpinner();let storedMimeType=result.contentType.split(";")[0].trim().toLowerCase();return format3&&storedMimeType!==`image/${format3}`&&output_manager_default.warn(`The image was not converted to ${format3}: it was stored unchanged as ${storedMimeType}. This usually means the optimized output would have been larger than the source image. Try a lower --quality.`),asJson?client.stdout.write(`${JSON.stringify({url:result.url,downloadUrl:result.downloadUrl,pathname:result.pathname,contentType:result.contentType},null,2)}
204
204
  `):client.stdout.write(`${result.url}
205
205
  `),0}import*as blob4 from"@vercel/blob";var BlobGetTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrPathname(value){value&&this.trackCliArgument({arg:"urlOrPathname",value:this.redactedValue})}trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliOptionOutput(value){value&&this.trackCliOption({option:"output",value:this.redactedValue})}trackCliOptionIfNoneMatch(ifNoneMatch){ifNoneMatch&&this.trackCliOption({option:"if-none-match",value:this.redactedValue})}};var import_bytes=__toESM(require_bytes(),1);import{createWriteStream as createWriteStream2}from"node:fs";import{Readable}from"node:stream";import{pipeline as pipeline2}from"node:stream/promises";async function get2(client,argv,auth){let telemetryClient=new BlobGetTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(getSubcommand5.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{flags,args:[urlOrPathname]}=parsedArgs,{"--access":accessFlag,"--output":outputPath,"--if-none-match":ifNoneMatch}=flags;if(!urlOrPathname)return output_manager_default.error(`Missing required argument. Usage: ${getCommandName("blob get <urlOrPathname>")}`),1;let access3=parseAccessFlag(accessFlag);if(!access3)return 1;telemetryClient.trackCliArgumentUrlOrPathname(urlOrPathname),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliOptionOutput(outputPath),telemetryClient.trackCliOptionIfNoneMatch(ifNoneMatch);try{output_manager_default.debug("Downloading blob"),outputPath&&output_manager_default.spinner("Downloading blob");let result=await blob4.get(urlOrPathname,{...blobOpts(auth),access:access3,ifNoneMatch});if(result&&result.statusCode===304)return output_manager_default.log("Not modified (304)"),0;if(!result||!result.stream)return output_manager_default.error(`Blob not found: ${urlOrPathname}`),1;let nodeStream=Readable.fromWeb(result.stream);if(outputPath){let writeStream=createWriteStream2(outputPath);await pipeline2(nodeStream,writeStream),output_manager_default.stopSpinner();let sizeInfo=result.blob.size?` (${(0,import_bytes.default)(result.blob.size)})`:"",typeInfo=result.blob.contentType?`, ${result.blob.contentType}`:"";output_manager_default.success(`Saved to ${outputPath}${sizeInfo}${typeInfo}`)}else await pipeline2(nodeStream,client.stdout,{end:!1})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}import*as blob5 from"@vercel/blob";var BlobDelTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlsOrPathnames(urlsOrPathnames){urlsOrPathnames&&this.trackCliArgument({arg:"urlsOrPathnames",value:this.redactedValue})}trackCliOptionIfMatch(ifMatch){ifMatch&&this.trackCliOption({option:"if-match",value:this.redactedValue})}};async function del2(client,argv,auth){let telemetryClient=new BlobDelTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(delSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}if(!parsedArgs.args.length)return printError(`Missing required arguments: ${getCommandName("blob del urlOrPathname")}`),1;let{args}=parsedArgs,{"--if-match":ifMatch}=parsedArgs.flags;telemetryClient.trackCliArgumentUrlsOrPathnames(args[0]),telemetryClient.trackCliOptionIfMatch(ifMatch);try{output_manager_default.debug("Deleting blob"),output_manager_default.spinner("Deleting blob"),await blob5.del(args,{...blobOpts(auth),ifMatch})}catch(err){return output_manager_default.error(`Error deleting blob: ${err}`),1}return output_manager_default.stopSpinner(),output_manager_default.success("Blob deleted"),0}import*as blob6 from"@vercel/blob";var BlobCopyTelemetryClient=class extends TelemetryClient{trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliArgumentFromUrlOrPathname(value){value&&this.trackCliArgument({arg:"fromUrlOrPathname",value:this.redactedValue})}trackCliArgumentToPathname(value){value&&this.trackCliArgument({arg:"toPathname",value:this.redactedValue})}trackCliFlagAddRandomSuffix(value){value&&this.trackCliFlag("add-random-suffix")}trackCliOptionContentType(value){value&&this.trackCliOption({option:"content-type",value})}trackCliOptionCacheControlMaxAge(value){value&&this.trackCliOption({option:"cache-control-max-age",value:String(value)})}trackCliOptionIfMatch(ifMatch){ifMatch&&this.trackCliOption({option:"if-match",value:this.redactedValue})}};async function copy2(client,argv,auth){let telemetryClient=new BlobCopyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(copySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}if(!parsedArgs.args||parsedArgs.args.length<2)return printError(`Missing required arguments: ${getCommandName("blob copy fromUrlOrPathname toPathname")}`),1;let{args:[fromUrl,toPathname],flags:{"--access":accessFlag,"--add-random-suffix":addRandomSuffix,"--content-type":contentType,"--cache-control-max-age":cacheControlMaxAge,"--if-match":ifMatch}}=parsedArgs,access3=parseAccessFlag(accessFlag);if(!access3)return 1;telemetryClient.trackCliArgumentFromUrlOrPathname(fromUrl),telemetryClient.trackCliArgumentToPathname(toPathname),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliFlagAddRandomSuffix(addRandomSuffix),telemetryClient.trackCliOptionContentType(contentType),telemetryClient.trackCliOptionCacheControlMaxAge(cacheControlMaxAge),telemetryClient.trackCliOptionIfMatch(ifMatch);let result;try{output_manager_default.debug("Copying blob"),output_manager_default.spinner("Copying blob"),result=await blob6.copy(fromUrl,toPathname,{...blobOpts(auth),access:access3,addRandomSuffix:addRandomSuffix??!1,contentType,cacheControlMaxAge,ifMatch})}catch(err){return printError(err),1}return output_manager_default.stopSpinner(),output_manager_default.success(result.url),0}async function connectResourceToProject(client,projectId,storeId,environments,options){return client.fetch(`/v1/storage/stores/${storeId}/connections`,{json:!0,method:"POST",body:{envVarEnvironments:environments,projectId,type:"integration",...options?.envVarPrefix!==void 0?{envVarPrefix:options.envVarPrefix}:{}},accountId:options?.accountId})}var import_chalk43=__toESM(require_source(),1);var BlobAddStoreTelemetryClient=class extends TelemetryClient{trackCliOptionAccess(value){value&&this.trackCliOption({option:"access",value})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionRegion(value){value&&this.trackCliOption({option:"region",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliOptionEnvironment(value){value&&this.trackCliOption({option:"environment",value:value.join(",")})}};var import_chalk42=__toESM(require_source(),1);var VALID_ENVIRONMENTS=["production","preview","development"],ENV_PULL_FAILED_MESSAGE="Failed to pull environment variables. You can run `vercel env pull` manually.";function validateEnvironments(environments){let invalid=environments.filter(env=>!VALID_ENVIRONMENTS.includes(env));return invalid.length>0?{valid:!1,invalid}:{valid:!0}}async function postProvisionSetup(client,resourceName,resourceId,contextName,options={}){let dashboardUrl=options.integrationSlug&&options.installationId?`https://vercel.com/d/dashboard/integrations/${options.integrationSlug}/${options.installationId}/resources/${resourceId}`:`https://vercel.com/${contextName}/~/stores/integration/${resourceId}`;output_manager_default.log(indent_default(`Dashboard: ${output_manager_default.link(dashboardUrl,dashboardUrl,{fallback:!1})}`,4));let baseResult={exitCode:0,dashboardUrl,connected:!1,environments:[],envPulled:!1};if(options.noConnect)return baseResult;let linkedProject=await getLinkedProject(client);if(linkedProject.status==="error")return{...baseResult,exitCode:linkedProject.exitCode};if(linkedProject.status==="not_linked")return baseResult;let{project}=linkedProject,environments=[...new Set(options.environments&&options.environments.length>0?options.environments:[...VALID_ENVIRONMENTS])];output_manager_default.debug(`Selected environments: ${JSON.stringify(environments)}`),output_manager_default.spinner(`Connecting ${import_chalk42.default.bold(resourceName)} to ${import_chalk42.default.bold(project.name)}...`),output_manager_default.debug(`Connecting resource ${resourceId} to project ${project.id}`);try{await connectResourceToProject(client,project.id,resourceId,environments,options.prefix?{envVarPrefix:options.prefix}:void 0)}catch(error){return output_manager_default.stopSpinner(),options.onProjectConnectFailed?.(project.id,error),output_manager_default.error(`Failed to connect: ${error.message}`),{...baseResult,exitCode:1,project:{id:project.id,name:project.name},environments,connectError:error.message}}output_manager_default.stopSpinner(),output_manager_default.log(`${import_chalk42.default.bold(resourceName)} successfully connected to ${import_chalk42.default.bold(project.name)}`),options.onProjectConnected?.(project.id);let envPulled=!1;return options.noEnvPull||(await pull(client,["--yes"],"vercel-cli:integration:add")!==0?output_manager_default.warn(ENV_PULL_FAILED_MESSAGE):envPulled=!0),{...baseResult,project:{id:project.id,name:project.name},connected:!0,environments,envPulled}}async function getLinkedProjectField(client,noConnect,field="name"){if(noConnect)return{value:void 0};let linkedProject=await getLinkedProject(client);return linkedProject.status==="error"?{value:void 0,exitCode:linkedProject.exitCode}:linkedProject.status==="linked"?{value:linkedProject.project[field]}:{value:void 0}}async function addStore(client,argv){let telemetryClient=new BlobAddStoreTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(createStoreSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args:[nameArg],flags}=parsedArgs,interactive=client.stdin.isTTY&&!client.nonInteractive,yes=flags["--yes"]??!1,environmentFlags=flags["--environment"];if(environmentFlags?.length){let envValidation=validateEnvironments(environmentFlags);if(!envValidation.valid){let message=`Invalid environment value: ${envValidation.invalid.map(e2=>`"${e2}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}`;return outputAgentError(client,{status:"error",reason:"invalid_arguments",message}),output_manager_default.error(message),1}}let accessFlag=flags["--access"];!accessFlag&&interactive&&(accessFlag=await client.input.select({message:"Choose the access type for the blob store",choices:[{name:"Private",value:"private",description:"For sensitive documents, user content, and apps with custom auth. https://vercel.com/docs/vercel-blob/private-storage"},{name:"Public",value:"public",description:"For images, videos, large media, and public assets. https://vercel.com/docs/vercel-blob/public-storage"}]})),accessFlag||outputAgentError(client,{status:"error",reason:"missing_arguments",message:"Missing required --access flag. Must be 'public' or 'private'.",next:[{command:buildCommandWithGlobalFlags(client.argv,"blob create-store <name> --access private --yes"),when:"create a private blob store and link it to the project"}]});let access3=parseAccessFlag(accessFlag);if(!access3)return 1;let region=flags["--region"]||"iad1",name=nameArg;if(!name)if(interactive)name=await client.input.text({message:"Enter a name for your blob store",validate:value=>value.length<5?"Name must be at least 5 characters long":!0});else return outputAgentError(client,{status:"error",reason:"missing_arguments",message:"Missing required argument: name.",next:[{command:buildCommandWithGlobalFlags(client.argv,`blob create-store <name> --access ${access3} --yes`),when:"create the blob store and link it to the project"}]}),output_manager_default.error("Missing required argument: name"),1;telemetryClient.trackCliArgumentName(name),telemetryClient.trackCliOptionAccess(accessFlag),telemetryClient.trackCliOptionRegion(flags["--region"]);let link=await getLinkedProject(client);if(link.status==="linked"&&client.nonInteractive&&!yes&&!environmentFlags?.length)return outputAgentError(client,{status:"error",reason:"confirmation_required",message:`Creating a blob store and linking it to ${link.project.name} requires confirmation. Re-run with --yes to create the store and link it to all environments, or pass --environment to choose which ones.`,next:[{command:buildCommandWithYes(client.argv),when:"create the store and link it to all environments"}]}),1;let storeId,storeRegion;try{output_manager_default.debug("Creating new blob store"),output_manager_default.spinner("Creating new blob store");let res=await client.fetch("/v1/storage/stores/blob",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name,region,access:access3}),accountId:link.status==="linked"?link.org.id:void 0});storeId=res.store.id,storeRegion=res.store.region}catch(err){return printError(err),1}output_manager_default.stopSpinner();let regionInfo=storeRegion?` in ${storeRegion}`:"";output_manager_default.success(`Blob store created: ${name} (${storeId})${regionInfo}`);let docsUrl=access3==="public"?"https://vercel.com/docs/vercel-blob/public-storage":"https://vercel.com/docs/vercel-blob/private-storage";if(output_manager_default.log(`Access: ${access3}. Learn more: ${output_manager_default.link(docsUrl,docsUrl)}`),link.status==="linked"){let shouldLink=yes||!!environmentFlags?.length;if(!shouldLink&&interactive&&(shouldLink=await client.input.confirm(`Would you like to link this blob store to ${link.project.name}?`,!0)),!shouldLink&&!interactive&&output_manager_default.log(`Not linked to ${import_chalk43.default.bold(link.project.name)}. Pass --yes when creating to link the store to your project automatically.`),shouldLink){let environments;environmentFlags?.length?environments=environmentFlags:interactive&&!yes?environments=await client.input.checkbox({message:"Select environments",choices:[{name:"Production",value:"production",checked:!0},{name:"Preview",value:"preview",checked:!0},{name:"Development",value:"development",checked:!0}]}):environments=[...VALID_ENVIRONMENTS],output_manager_default.spinner(`Connecting ${import_chalk43.default.bold(name)} to ${import_chalk43.default.bold(link.project.name)}...`),await connectResourceToProject(client,link.project.id,storeId,environments,{accountId:link.org.id}),output_manager_default.success(`Blob store ${import_chalk43.default.bold(name)} linked to ${import_chalk43.default.bold(link.project.name)}`),client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,await envPullCommandLogic(client,".env.local",!0,"development",link,void 0,client.cwd,"vercel-cli:blob:store-add")}}return 0}function formatStoreLabel(name,id){return`${name} (${id})`}function formatConnectedProjects(connections){if(connections.length===0)return"";let MAX_SHOWN=2,shown=connections.slice(0,MAX_SHOWN).map(c=>c.project.name).join(", "),remaining=connections.length-MAX_SHOWN;return remaining>0?` This store is connected to ${shown} and ${remaining} other project${remaining>1?"s":""}.`:` This store is connected to ${shown}.`}async function removeStore(client,argv,rwToken){let flagsSpecification=getFlagsSpecification(deleteStoreSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args:[storeIdArg]}=parsedArgs;if(!(client.stdin.isTTY&&!client.nonInteractive))return outputAgentError(client,{status:"error",reason:"dangerous_operation_requires_user",message:"Deleting a blob store cannot be undone and cannot be performed non-interactively. Agents must not make this change on behalf of a user. The user must run this command interactively in a terminal to review the impact and confirm.",next:[{command:buildCommandWithGlobalFlags(client.argv,"blob delete-store <storeId>"),when:"user runs this command interactively"}]}),output_manager_default.error("Deleting a blob store requires interactive confirmation. Run this command in an interactive terminal."),1;let storeId=storeIdArg;storeId||(storeId=getStoreIdFromAuth(rwToken)??void 0),storeId||(storeId=await client.input.text({message:"Enter the ID of the blob store you want to remove",validate:value=>value.length!==22?"ID must be 22 characters long":!0}));let link=await getLinkedProject(client),accountId=link.status==="linked"?link.org.id:void 0;try{let[store,connectionsResponse]=await Promise.all([client.fetch(`/v1/storage/stores/${storeId}`,{method:"GET",accountId}),client.fetch(`/v1/storage/stores/${storeId}/connections`,{method:"GET",accountId})]),label=formatStoreLabel(store.store.name,store.store.id),projectsInfo=formatConnectedProjects(connectionsResponse.connections);if(!await client.input.confirm(`Are you sure you want to remove ${label}?${projectsInfo} This action cannot be undone.`,!1))return output_manager_default.success("Blob store not removed"),0;output_manager_default.debug("Deleting blob store"),output_manager_default.spinner("Deleting blob store"),await client.fetch(`/v1/storage/stores/${storeId}/connections`,{method:"DELETE",accountId}),await client.fetch(`/v1/storage/stores/blob/${storeId}`,{method:"DELETE",accountId})}catch(err){return printError(err),1}return output_manager_default.stopSpinner(),output_manager_default.success("Blob store deleted"),link.status==="linked"&&(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,await envPullCommandLogic(client,".env.local",!0,"development",link,void 0,client.cwd,"vercel-cli:blob:store-remove")),0}var BlobGetStoreTelemetryClient=class extends TelemetryClient{trackCliArgumentStoreId(value){value&&this.trackCliArgument({arg:"storeId",value})}};var import_bytes2=__toESM(require_bytes(),1),import_chalk44=__toESM(require_source(),1),import_format5=__toESM(require_format(),1);function formatStoreDetails(store,teamSlug){let dateTimeFormat="MM/DD/YYYY HH:mm:ss.SS",isPublic=store.access!=="private",storeIdSuffix=store.id.replace("store_","").toLowerCase(),accessDomain=isPublic?"public":"private",billingState=store.billingState==="active"?import_chalk44.default.green("Active"):import_chalk44.default.red("Inactive"),lines=[`Blob Store: ${import_chalk44.default.bold(store.name)} (${import_chalk44.default.dim(store.id)})`,`Billing State: ${billingState}`];if(store.count!==void 0&&lines.push(`Blob Count: ${store.count.toLocaleString()}`),lines.push(`Size: ${(0,import_bytes2.default)(store.size)}`),store.region&&lines.push(`Region: ${store.region}`),lines.push(`Access: ${isPublic?"Public":"Private"}`),lines.push(`Base URL: ${storeIdSuffix}.${accessDomain}.blob.vercel-storage.com`),teamSlug){let dashboardUrl=`https://vercel.com/${teamSlug}/~/stores/blob/${store.id}`,link=output_manager_default.link(dashboardUrl,dashboardUrl);lines.push(`Dashboard: ${link||dashboardUrl}`)}return lines.push(`Created At: ${(0,import_format5.default)(new Date(store.createdAt),dateTimeFormat)}`),lines.push(`Updated At: ${(0,import_format5.default)(new Date(store.updatedAt),dateTimeFormat)}`),lines.join(`
206
206
  `)+`
@@ -238,7 +238,7 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
238
238
 
239
239
  `)}
240
240
  `)}async function fetchEntries(query,limit){let url=new URL(query?`${CHANGELOG_API_URL}/search`:CHANGELOG_API_URL);url.searchParams.set("limit",String(limit)),query?url.searchParams.set("q",query):url.searchParams.set("include","content");try{let response=await fetch2(url,{headers:{accept:"application/json","user-agent":ua_default}});if(!response.ok){response.status===429?output_manager_default.error("Too many changelog requests. Try again shortly."):output_manager_default.error("Failed to fetch changelog entries.");return}let data=await response.json();if(!data||typeof data!="object")throw new Error("Invalid changelog response");let items=data.items;if(!Array.isArray(items)||!items.every(isChangelogItem))throw new Error("Invalid changelog response");return items}catch{output_manager_default.error("Failed to fetch changelog entries. Check your connection and try again.");return}}function printCommandHelp(client,command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:command2===changelogCommand?void 0:changelogCommand}))}async function changelog(client){let telemetry2=new ChangelogTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(changelogCommand.options),rawArgs=client.argv.slice(2).filter(arg=>arg!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),1}let commandOffset=parsedArgs.args[0]===changelogCommand.name?1:0,{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(commandOffset),COMMAND_CONFIG19);if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp(changelogCommand.name,subcommand==="search"?subcommandOriginal:void 0),printCommandHelp(client,subcommand==="search"?searchSubcommand:changelogCommand),0;if(!subcommand&&args.length>0)return output_manager_default.error(`Unknown changelog command: ${args[0]}`),printCommandHelp(client,changelogCommand),1;let limit=parsedArgs.flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT}.`),1;telemetry2.trackCliOptionLimit(parsedArgs.flags["--limit"]),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let jsonOutput=formatResult.jsonOutput,query;if(subcommand==="search"&&(telemetry2.trackCliSubcommandSearch(subcommandOriginal),query=args.join(" ").trim(),!query))return output_manager_default.error("Search query is required."),printCommandHelp(client,searchSubcommand),1;jsonOutput||output_manager_default.spinner(query?"Searching the changelog\u2026":"Fetching the changelog\u2026");let items=await fetchEntries(query,limit);return jsonOutput||output_manager_default.stopSpinner(),items?jsonOutput?(client.stdout.write(`${JSON.stringify({items},null,2)}
241
- `),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-XWT4QQRM.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-D53RMFUT.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-MIJ6C3KT.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-5HPYDKB4.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-5HPYDKB4.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-E6AMU6OJ.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-LGIPH2II.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-TXJQFAGW.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk53.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk53.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
241
+ `),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-2EMBEQHZ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-SNN3JPON.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-XIJ54B7U.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-W2O6M4GH.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-W2O6M4GH.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-FCPWK252.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-L45TA4WK.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-GKXJQRX6.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk53.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk53.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
242
242
 
243
243
  Expected --data schema for connection method "${method.connectionMethod}":
244
244
  ${JSON.stringify(schema,null,2)}`:"";throw new ConnexMethodError(`Connection method "${method.connectionMethod}" needs credentials passed with --data. Pass --data @<path> to read from a file.${hint}`)}return data}async function promptCredential(client,method,opts){let validate=opts.required?value=>value.trim().length>0||`${opts.key} is required.`:void 0;return(isSecretInputKey(method,opts.key)?await client.input.password({message:opts.message,mask:!0,validate}):await client.input.text({message:opts.message,validate})).trim()}function missingCredentialsError(method){let fields=describeCredentialFields(method),withFields=fields?` with: ${fields}`:"";return new ConnexMethodError(`Missing credentials. Provide --data${withFields}. Pass --data @<path> to read from a file.`)}async function resolveConnexConnectionMethod(client,opts){let{methods,targets,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets,opts.service):void 0;if(connectionMethodFlag){let method2=methods.find(candidate=>candidate.connectionMethod===connectionMethodFlag);if(!method2)throw new ConnexMethodError(`Unknown connection method "${connectionMethodFlag}" for "${opts.service}". Available: ${formatMethodOptions(methods)}.`);if(explicitTarget&&!servesTarget(method2,explicitTarget))throw new ConnexMethodError(`Connection method "${method2.connectionMethod}" doesn't connect to target "${explicitTarget}".`);return{method:method2,target:explicitTarget??soleTargetOf(method2)}}if(opts.resolvedConnectionMethod){let method2=methods.find(candidate=>candidate.connectionMethod===opts.resolvedConnectionMethod);if(method2&&(!explicitTarget||servesTarget(method2,explicitTarget)))return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method2),{method:method2,target:explicitTarget??soleTargetOf(method2)}}let width=choiceWidth(client),chosenTarget=explicitTarget;!chosenTarget&&targets&&targets.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets.map(target2=>({label:target2.label,description:target2.description,docsUrl:target2.docsUrl})),width),chosenTarget=await client.input.select({message:"What do you want to connect to?",choices:targets.map(target2=>({name:choiceLabel(target2.label,width),value:target2.target}))}));let candidates=chosenTarget?methods.filter(method2=>servesTarget(method2,chosenTarget)):methods;if(candidates.length===0)throw new ConnexMethodError(`No connection method for "${opts.service}" connects to target "${chosenTarget}".`);if(candidates.length>1){if(!opts.interactive)throw new ConnexMethodError(`Missing --connection-method. "${opts.service}" supports: ${formatMethodOptions(candidates)}. Re-run with --connection-method <value>.`);printOptionCatalog(`Connection methods for ${opts.serviceName}:`,candidates.map(method3=>({label:method3.label,badge:createPathBadge(method3),description:method3.description,docsUrl:method3.docUrl})),width);let slug=await client.input.select({message:`How do you want to connect to ${opts.serviceName}?`,choices:candidates.map(method3=>({name:choiceLabel(method3.label,width),value:method3.connectionMethod}))}),method2=candidates.find(candidate=>candidate.connectionMethod===slug);if(!method2)throw new ConnexMethodError(`Unknown connection method "${slug}".`);return{method:method2,target:chosenTarget??soleTargetOf(method2)}}let method=candidates[0],target=chosenTarget??soleTargetOf(method);return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method),{method,target}}async function confirmMethodSelection(client,serviceName,method){let badge=createPathBadge(method),suffix=badge?` (${badge})`:"";if(!await client.input.confirm(`Connect to ${serviceName} with ${method.label}${suffix}?`,!0))throw new ConnexMethodError("Canceled.")}async function collectTemplateParams(client,method,suppliedParams,interactive){let fields=method.templateFields??[];if(fields.length===0){if(Object.keys(suppliedParams).length>0)throw new ConnexMethodError(`Connection method "${method.connectionMethod}" takes no --param values.`);return{}}let known=new Set(fields.map(field=>field.key));for(let key of Object.keys(suppliedParams))if(!known.has(key))throw new ConnexMethodError(`Unknown --param "${key}" for connection method "${method.connectionMethod}". Valid keys: ${fields.map(field=>field.key).join(", ")}.`);let params={};for(let field of fields){let supplied=(suppliedParams[field.key]??"").trim();if(supplied){let problem=templateValueProblem(field,supplied);if(problem)throw new ConnexMethodError(`Invalid --param ${field.key}="${supplied}". ${problem}`);params[field.key]=supplied;continue}if(interactive){let answer=await client.input.text({message:promptMessage(field),default:field.default,validate:value=>{let trimmed=value.trim();return trimmed?templateValueProblem(field,trimmed)??!0:`${field.label} is required.`}});params[field.key]=answer.trim();continue}if(field.default!==void 0){params[field.key]=field.default;continue}throw new ConnexMethodError(`Missing --param ${field.key}=<value> (${describeField(field)}) for connection method "${method.connectionMethod}".`)}return params}function promptMessage(field){let hints=[];return field.placeholder&&hints.push(`e.g. ${field.placeholder}`),field.help&&hints.push(field.help),hints.length>0?`${field.label} ${import_chalk53.default.dim(hints.join(" \xB7 "))}`:field.label}function describeField(field){return field.placeholder?`"${field.label}", e.g. ${field.placeholder}`:`"${field.label}"`}var HOSTNAME_RE=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;function templateValueProblem(field,value){let sample=field.default??field.placeholder;if(!(!sample||!HOSTNAME_RE.test(sample)||HOSTNAME_RE.test(value)))return`Enter a hostname like ${sample}, without the https:// prefix.`}function printOptionCatalog(heading,entries,width){if(entries.some(entry2=>entry2.description||entry2.docsUrl)){output_manager_default.print(`
@@ -324,7 +324,7 @@ ${import_chalk77.default.dim("Anyone with the URL can trigger a deployment. Stor
324
324
  `}var import_chalk85=__toESM(require_source(),1),import_ms10=__toESM(require_ms(),1);async function getDomainDNSRecords(client,domain2,apiVersion=3,nextTimestamp,limit=20){output_manager_default.debug(`Fetching for DNS records of domain ${domain2}`);try{let url=`/v${apiVersion}/domains/${encodeURIComponent(domain2)}/records?limit=${limit}`;return nextTimestamp&&(url+=`&until=${nextTimestamp}`),await client.fetch(url)}catch(err){if(isAPIError(err)&&err.code==="not_found")return new DomainNotFound(domain2);throw err}}async function getDomains(client,next,limit=20){let domainUrl=`/v5/domains?limit=${limit}`;return next&&(domainUrl+=`&until=${next}`),await client.fetch(domainUrl)}var import_chalk84=__toESM(require_source(),1);async function getDNSRecords(client,contextName,next){let{domainNames,pagination}=await getDomainNames(client,contextName,next);return{records:(await Promise.all(domainNames.map(createGetDomainRecords(client)))).map(item=>item instanceof DomainNotFound?[]:item).reduce(getAddDomainName(domainNames),[]),pagination}}function createGetDomainRecords(client){return async domainName=>{let data=await getDomainDNSRecords(client,domainName);return data instanceof DomainNotFound?[]:data.records}}function getAddDomainName(domainNames){return(prev,item,idx)=>[...prev,{domainName:domainNames[idx],records:item}]}async function getDomainNames(client,contextName,next){output_manager_default.spinner(`Fetching domains under ${import_chalk84.default.bold(contextName)}`);let{domains:domains2,pagination}=await getDomains(client,next);return{domainNames:domains2.map(domain2=>domain2.name),pagination}}var DnsLsTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand10.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},1),printError(err),1}let{args,flags:opts}=parsedArgs;if(client.nonInteractive&&args.length>1){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`dns ls <domain> ${flags.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to list DNS records (optional single domain)"}]},1),1}let validationResult=validateLsArgs({commandName:"dns ls <domain>",args,maxArgs:1,exitCode:1});if(validationResult!==0)return validationResult;let{telemetryEventStore}=client,telemetry2=new DnsLsTelemetryClient({opts:{store:telemetryEventStore}}),[domainName]=args;telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,{contextName}=await getScope(client),lsStamp=stamp_default(),paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}if(domainName){let data=await getDomainDNSRecords(client,domainName,5,...paginationOptions);if(data instanceof DomainNotFound){if(client.nonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`dns ls ${flags.join(" ")}`.trim());outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domainName} can't be found under ${contextName}.`,next:[{command:cmd2,when:"to list available DNS records"}]},1)}return output_manager_default.error(`The domain ${domainName} can't be found under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(lsStamp())}`),1}let{records,pagination:pagination2}=data,dnsRecords2=[{domainName,records}];if(asJson)return outputDnsRecordsJson(client,dnsRecords2,pagination2),0;if(output_manager_default.log(`${records.length>0?"Records":"No records"} found under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(lsStamp())}`),client.stdout.write(getDNSRecordsTable(dnsRecords2)),pagination2?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`dns ls ${domainName}${flags} --next ${pagination2.next}`)}`)}return 0}let{records:dnsRecords,pagination}=await getDNSRecords(client,contextName,...paginationOptions);if(asJson)return outputDnsRecordsJson(client,dnsRecords,pagination),0;let nRecords=dnsRecords.reduce((p,r)=>r.records.length+p,0);if(output_manager_default.log(`${nRecords>0?"Records":"No records"} found under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(lsStamp())}`),output_manager_default.log(getDNSRecordsTable(dnsRecords)),pagination?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`dns ls${flags} --next ${pagination.next}`)}`)}return 0}function getDNSRecordsTable(dnsRecords){return formatTable(["","id","name","type","value","created"],["l","r","l","l","l","l"],dnsRecords.map(({domainName,records})=>({name:import_chalk85.default.bold(domainName),rows:records.map(getDNSRecordRow)})))}function getDNSRecordRow(record){let isSystemRecord=record.creator==="system",createdAt=`${(0,import_ms10.default)(Date.now()-new Date(Number(record.createdAt)).getTime())} ago`,priority=record.mxPriority||record.priority||null;return["",isSystemRecord?"":record.id,record.name,record.type,priority?`${priority} ${record.value}`:record.value,import_chalk85.default.gray(isSystemRecord?"default":createdAt)]}function outputDnsRecordsJson(client,records,pagination){output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({records,pagination},null,2)}
325
325
  `)}var import_chalk86=__toESM(require_source(),1),import_ms11=__toESM(require_ms(),1);async function deleteDNSRecordById(client,domain2,recordId){return client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records/${recordId}`,{method:"DELETE"})}var DnsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"recordId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},1),printError(err),1}let{args,flags}=parsedArgs,{telemetryEventStore}=client,telemetry2=new DnsRmTelemetryClient({opts:{store:telemetryEventStore}});await getScope(client);let[recordId]=args;if(args.length!==1){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns rm <id> --yes");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to remove a DNS record by id (use dns ls to find ids)"}]},1)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk86.default.cyan(`${getCommandName("dns rm <id>")}`)}`),1}telemetry2.trackCliArgumentId(recordId),telemetry2.trackCliFlagYes(flags["--yes"]);let record=await getDNSRecordById(client,recordId);if(!record)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DNS_RECORD_NOT_FOUND,message:"DNS record not found.",next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records and ids"}]},1),output_manager_default.error("DNS record not found"),1;let{domain:domainName}=record,skipConfirmation=flags["--yes"];if(client.nonInteractive&&!skipConfirmation)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"In non-interactive mode --yes is required to remove a DNS record.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;if(!(skipConfirmation||await readConfirmation2(client,"The following record will be removed permanently",domainName,record)))return output_manager_default.error("User canceled."),0;let rmStamp=stamp_default();return await deleteDNSRecordById(client,domainName,record.id),output_manager_default.success(`Record ${import_chalk86.default.gray(`${record.id}`)} removed ${import_chalk86.default.gray(rmStamp())}`),0}function readConfirmation2(client,msg,domainName,record){return new Promise(resolve14=>{output_manager_default.log(msg),output_manager_default.print(`${table([getDeleteTableRow(domainName,record)],{align:["l","r","l"],hsep:6}).replace(/^(.*)/gm," $1")}
326
326
  `),output_manager_default.print(`${import_chalk86.default.bold.red("> Are you sure?")} ${import_chalk86.default.gray("(y/N) ")}`),client.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim().toLowerCase()==="y")}).resume()})}function getDeleteTableRow(domainName,record){let recordName=`${record.name.length>0?`${record.name}.`:""}${domainName}`;return[record.id,import_chalk86.default.bold(`${recordName} ${record.type} ${record.value} ${record.mxPriority||""}`),import_chalk86.default.gray(`${(0,import_ms11.default)(Date.now()-new Date(Number(record.createdAt)).getTime())} ago`)]}var import_chalk87=__toESM(require_source(),1);async function updateDNSRecord(client,recordId,data){return client.fetch(`/v1/domains/records/${encodeURIComponent(recordId)}`,{method:"PATCH",body:data})}var ALLOWED_RECORD_TYPES2=["A","AAAA","ALIAS","CAA","CNAME","MX","SRV","TXT"],DnsUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionName(name){name!==void 0&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionType(type){if(type){let allowedType=ALLOWED_RECORD_TYPES2.includes(type)?type:this.redactedValue;this.trackCliOption({option:"type",value:allowedType})}}trackCliOptionValue(value){value&&this.trackCliOption({option:"value",value:this.redactedValue})}trackCliOptionTtl(ttl){ttl!==void 0&&this.trackCliOption({option:"ttl",value:this.redactedValue})}trackCliOptionMxPriority(mxPriority){mxPriority!==void 0&&this.trackCliOption({option:"mx-priority",value:this.redactedValue})}trackCliOptionSrvPriority(srvPriority){srvPriority!==void 0&&this.trackCliOption({option:"srv-priority",value:this.redactedValue})}trackCliOptionSrvWeight(srvWeight){srvWeight!==void 0&&this.trackCliOption({option:"srv-weight",value:this.redactedValue})}trackCliOptionSrvPort(srvPort){srvPort!==void 0&&this.trackCliOption({option:"srv-port",value:this.redactedValue})}trackCliOptionSrvTarget(srvTarget){srvTarget&&this.trackCliOption({option:"srv-target",value:this.redactedValue})}trackCliOptionComment(comment){comment!==void 0&&this.trackCliOption({option:"comment",value:this.redactedValue})}};var SRV_FLAGS=["--srv-priority","--srv-weight","--srv-port","--srv-target"];async function update2(client,argv){let telemetry2=new DnsUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(updateSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},1),printError(err),1}let{args,flags}=parsedArgs;if(args.length!==1){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns update <id> [options]");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to update a DNS record by id (use dns ls to find ids)"}]},1)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk87.default.cyan(`${getCommandName("dns update <id> [options]")}`)}`),1}let[recordId]=args;telemetry2.trackCliArgumentId(recordId),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionType(flags["--type"]),telemetry2.trackCliOptionValue(flags["--value"]),telemetry2.trackCliOptionTtl(flags["--ttl"]),telemetry2.trackCliOptionMxPriority(flags["--mx-priority"]),telemetry2.trackCliOptionSrvPriority(flags["--srv-priority"]),telemetry2.trackCliOptionSrvWeight(flags["--srv-weight"]),telemetry2.trackCliOptionSrvPort(flags["--srv-port"]),telemetry2.trackCliOptionSrvTarget(flags["--srv-target"]),telemetry2.trackCliOptionComment(flags["--comment"]);let numericFlags=["--ttl","--mx-priority","--srv-priority","--srv-weight","--srv-port"];for(let flagName2 of numericFlags){let value=flags[flagName2];if(value!==void 0&&Number.isNaN(value))return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The ${flagName2} option must be a number.`},1),output_manager_default.error(`The ${flagName2} option must be a number.`),1}let data={},name=flags["--name"];name!==void 0&&(data.name=name==="@"?"":name),flags["--type"]!==void 0&&(data.type=flags["--type"]),flags["--value"]!==void 0&&(data.value=flags["--value"]),flags["--ttl"]!==void 0&&(data.ttl=flags["--ttl"]),flags["--mx-priority"]!==void 0&&(data.mxPriority=flags["--mx-priority"]),flags["--comment"]!==void 0&&(data.comment=flags["--comment"]);let srvFlagsProvided=SRV_FLAGS.filter(flagName2=>flags[flagName2]!==void 0);if(srvFlagsProvided.length>0){if(srvFlagsProvided.length!==SRV_FLAGS.length)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Updating an SRV record requires all of ${SRV_FLAGS.join(", ")}.`},1),output_manager_default.error(`Updating an SRV record requires all of ${SRV_FLAGS.join(", ")}.`),1;data.srv={priority:flags["--srv-priority"],weight:flags["--srv-weight"],port:flags["--srv-port"],target:flags["--srv-target"]}}if(Object.keys(data).length===0){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns update <id> [options]");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.NO_CHANGES_REQUESTED,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Provide at least one field to update. Run: ${cmd2}`,next:[{command:cmd2,when:"to update a DNS record (e.g. --value, --ttl, --comment)"},{command:withGlobalFlags(client,"dns update --help"),when:"for available options"}]},1)}return output_manager_default.error(`Provide at least one field to update. See ${import_chalk87.default.cyan(`${getCommandName("dns update --help")}`)} for available options.`),1}let changeSummary=Object.entries(data).map(([field,value])=>`${field}=${value===""?"@":value}`).join(", ");if(!canPrompt(client)){let rerun=getCommandNamePlain(stripSensitiveAuthArgs(client.argv.slice(2)).filter(arg=>arg!=="--non-interactive"&&!arg.startsWith("--non-interactive=")).join(" "));return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Updating DNS record ${recordId} (${changeSummary}) overwrites a live record. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.`,userActionRequired:!0,hint:"Surface this to the user; the confirmation cannot be automated.",next:[{command:rerun,when:"user runs this command in an interactive terminal to confirm"}]},1),output_manager_default.error("This command must be run interactively to confirm overwriting the DNS record."),1}if(output_manager_default.print(prependEmoji(`Updating DNS record ${import_chalk87.default.gray(recordId)} will overwrite: ${import_chalk87.default.bold(changeSummary)}
327
- `,emoji("warning"))),!await client.input.confirm(`Update DNS record ${recordId}?`,!1))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default(),record;try{record=await updateDNSRecord(client,recordId,data)}catch(err){if(isAPIError(err)){if(err.status===404)return output_manager_default.error("DNS record not found"),1;if(err.status===403)return output_manager_default.error("You don't have permission to access this DNS record."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}let{contextName}=await getScope(client);return output_manager_default.success(`DNS record ${import_chalk87.default.gray(`${record.id}`)} of domain ${import_chalk87.default.bold(record.domain)} updated under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(updateStamp())}`),0}var DnsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG26={add:getCommandAliases(addSubcommand3),import:getCommandAliases(importSubcommand),inspect:getCommandAliases(inspectSubcommand5),ls:getCommandAliases(listSubcommand10),rm:getCommandAliases(removeSubcommand6),update:getCommandAliases(updateSubcommand2)};async function dns(client){let{telemetryEventStore}=client,parsedArgs,flagsSpecification=getFlagsSpecification(dnsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let telemetry2=new DnsTelemetryClient({opts:{store:telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG26),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("dns",subcommand),output_manager_default.print(help(dnsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:dnsCommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(addSubcommand3),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add5(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(importSubcommand),2):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importZone(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(inspectSubcommand5),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(removeSubcommand6),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm5(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(updateSubcommand2),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update2(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(listSubcommand10),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls5(client,args))}}var import_chalk90=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts5=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts5.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk88=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Adding domain ${domain2} to project ${import_chalk88.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain:domain2})})).find(aliasTarget2=>aliasTarget2.domain===domain2);return aliasTarget||new Error(`Adding domain '${domain2}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain2} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain2}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init2){try{return await client.fetch(url,init2)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk89=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Removing domain ${domain2} from project ${import_chalk89.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils11=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status6=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status6===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status6===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"user must run interactively in a terminal\u2014agents must not purchase; purchase also available in dashboard"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add6(client,argv){let telemetry2=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand4.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,flags:opts}=parsedArgs,force=opts["--force"];telemetry2.trackCliFlagForce(force);let{contextName}=await getScope(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd2}`,next:[{command:cmd2,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},1)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),1}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd2=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd2}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd2,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status6=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk90.default.bold(domainName)} added to ${import_chalk90.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk90.default.bold(domainName)} is already assigned to project ${import_chalk90.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils11.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;aliasTarget=await addDomainToProject(client,projectName,domainName)}}}if(aliasTarget instanceof Error){if(client.nonInteractive){let status6=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk90.default.bold(domainName)} added to project ${import_chalk90.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk91=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArgs,domains2=args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),1;if(domains2.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains2.filter(domain2=>!isRootDomain(domain2));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain2=>param(domain2)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains2.length===1?[{domain:domains2[0],available:(await getDomainStatus(client,domains2[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains:domains2}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
327
+ `,emoji("warning"))),!await client.input.confirm(`Update DNS record ${recordId}?`,!1))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default(),record;try{record=await updateDNSRecord(client,recordId,data)}catch(err){if(isAPIError(err)){if(err.status===404)return output_manager_default.error("DNS record not found"),1;if(err.status===403)return output_manager_default.error("You don't have permission to access this DNS record."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}let{contextName}=await getScope(client);return output_manager_default.success(`DNS record ${import_chalk87.default.gray(`${record.id}`)} of domain ${import_chalk87.default.bold(record.domain)} updated under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(updateStamp())}`),0}var DnsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG26={add:getCommandAliases(addSubcommand3),import:getCommandAliases(importSubcommand),inspect:getCommandAliases(inspectSubcommand5),ls:getCommandAliases(listSubcommand10),rm:getCommandAliases(removeSubcommand6),update:getCommandAliases(updateSubcommand2)};async function dns(client){let{telemetryEventStore}=client,parsedArgs,flagsSpecification=getFlagsSpecification(dnsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let telemetry2=new DnsTelemetryClient({opts:{store:telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG26),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("dns",subcommand),output_manager_default.print(help(dnsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:dnsCommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(addSubcommand3),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add5(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(importSubcommand),2):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importZone(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(inspectSubcommand5),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(removeSubcommand6),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm5(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(updateSubcommand2),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update2(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(listSubcommand10),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls5(client,args))}}var import_chalk90=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts5=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts5.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk88=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Adding domain ${domain2} to project ${import_chalk88.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain:domain2})})).find(aliasTarget2=>aliasTarget2.domain===domain2);return aliasTarget||new Error(`Adding domain '${domain2}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain2} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain2}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init2){try{return await client.fetch(url,init2)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk89=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Removing domain ${domain2} from project ${import_chalk89.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils11=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status6=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status6===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status6===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"user must run interactively in a terminal\u2014agents must not purchase; purchase also available in dashboard"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add6(client,argv){let telemetry2=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand4.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,flags:opts}=parsedArgs,force=opts["--force"];telemetry2.trackCliFlagForce(force);let{contextName}=await getScope(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd2}`,next:[{command:cmd2,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},1)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),1}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd2=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd2}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd2,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status6=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk90.default.bold(domainName)} added to ${import_chalk90.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk90.default.bold(domainName)} is already assigned to project ${import_chalk90.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils11.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils11.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status6=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk90.default.bold(domainName)} added to project ${import_chalk90.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk91=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArgs,domains2=args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),1;if(domains2.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains2.filter(domain2=>!isRootDomain(domain2));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain2=>param(domain2)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains2.length===1?[{domain:domains2[0],available:(await getDomainStatus(client,domains2[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains:domains2}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
328
328
  `):client.stdout.write(`${JSON.stringify({results:results.map(result=>({domain:result.domain,available:!!result.available}))},null,2)}
329
329
  `),0;for(let result of results)output_manager_default.log(`The domain ${param(result.domain)} is ${import_chalk91.default.underline(result.available?"available":"unavailable")}.`);return 0}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
330
330
  `):output_manager_default.error(message),1}return printError(error),1}}var import_chalk92=__toESM(require_source(),1);async function transferInDomain(client,name,authCode,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";try{let{orderId}=await client.fetch(`/v1/registrar/domains/${name}/transfer${teamParam}`,{body:{authCode,autoRenew:!0,years,expectedPrice,contactInformation:{firstName:"Vercel",lastName:"Whois",email:"domains@registrar.vercel.com",phone:"+14153985463",address1:"100 First Street, Suite 2400",city:"San Fransisco",state:"CA",zip:"94105",country:"US",companyName:"Vercel Inc."}},method:"POST"}),order=await pollForOrder(client,orderId);return order===null?new UnexpectedDomainTransferError(name):order.status==="completed"&&order.domains.find(domain3=>domain3.domainName===name)?.status==="completed"?{ok:!0}:order.error?.code==="payment-failed"?new DomainPaymentError:new UnexpectedDomainTransferError(name)}catch(err){if(isAPIError(err)){if(err.code==="invalid_name")return new InvalidDomain(name);if(err.code==="tld_not_supported")return new UnsupportedTLD(name);if(err.code==="domain_not_available")return new DomainNotAvailable(name)}throw err}}async function getAuthCode(client,code2){return isValidAuthCode(code2)?code2:client.input.text({message:"- Transfer auth code: ",validate:isValidAuthCode})}function isValidAuthCode(code2){return!!(code2&&code2.length>0)}var DomainsTransferInTelemetryClient=class extends TelemetryClient{trackCliOptionCode(code2){code2&&this.trackCliOption({option:"code",value:this.redactedValue})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}};async function transferIn(client,argv){let telemetry2=new DomainsTransferInTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(transferInSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs;telemetry2.trackCliOptionCode(opts["--code"]);let[domainName]=args;if(!domainName)return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),1;if(telemetry2.trackCliArgumentDomain(domainName),!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name ${param(domainName)}. Run ${getCommandName("domains --help")}`),1;let availableStamp=stamp_default(),domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return output_manager_default.prettyError(domainPrice),1;let{transferPrice,years}=domainPrice;if(transferPrice===null)return output_manager_default.error(`The domain ${param(domainName)} is not transferable.`),1;let{contextName}=await getScope(client);output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk92.default.underline("available")} to transfer under ${import_chalk92.default.bold(contextName)}! ${availableStamp()}`);let authCode=await getAuthCode(client,opts["--code"]);if(!await client.input.confirm(`Transfer now with 1yr renewal for ${import_chalk92.default.bold(`$${transferPrice}`)}?`,!1))return 0;let transferStamp=stamp_default();output_manager_default.spinner(`Initiating transfer for domain ${domainName}`);let transferInResult=await transferInDomain(client,domainName,authCode,transferPrice,years);return transferInResult instanceof InvalidDomain?(output_manager_default.error(`The domain ${transferInResult.meta.domain} is not valid.`),1):transferInResult instanceof DomainNotAvailable?(output_manager_default.error(`The domain "${transferInResult.meta.domain}" is not transferable.`),1):transferInResult instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${transferInResult.meta.domain} is not supported.`),1):transferInResult instanceof DomainPaymentError?(output_manager_default.error("Your card was declined."),1):transferInResult instanceof UnexpectedDomainTransferError?(output_manager_default.error("An unexpected error happened while initiating the transfer."),1):(output_manager_default.success(`Domain ${param(domainName)} transfer started ${transferStamp()}`),output_manager_default.print(` To finalize the transfer, we are waiting for approval from your current registrar.
@@ -423,10 +423,10 @@ ${import_chalk102.default.yellow("!")} No exposures or metric events in this win
423
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(`
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
- `).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(list29,filtered){let lines=[` ${import_chalk106.default.bold(list29.title)}`];return list29.unavailable?(lines.push(import_chalk106.default.dim(` ${list29.message??unavailableLine(list29.unavailable,list29.retrySeconds)}`)),lines):list29.rows.length===0?(lines.push(emptyLine(filtered)),lines):(lines.push(...indent2(table(list29.rows.map(row=>[ellipsizeMiddle(row.label??row.value,MAX_VALUE_WIDTH),formatCount3(row.total)]),{align:["l","r"],hsep:3}))),lines)}function formatTrafficTopList(list29,filtered=!1){return formatTopList(list29,filtered).join(`
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(`
427
427
  `)}function formatGroupedTrendTable(opts){let{axis}=opts.result,needsDate=windowNeedsDate(new Date(opts.result.startTime).getTime(),new Date(opts.result.endTime).getTime()),rows=[[opts.labelHeader,"Trend","Total","Peak","Peak at"].map(h=>import_chalk106.default.bold(import_chalk106.default.cyan(h)))];for(let group of opts.result.groups){let{peak,peakTs}=peakOf(group.series,axis);rows.push([ellipsizeMiddle(group.values[opts.field]||NOT_SET,MAX_TREND_LABEL_WIDTH),generateSparkline(group.series),formatCount3(group.total),peak>0?formatCount3(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return indent2(table(rows,{align:["l","l","r","r","r"],hsep:3}))}function formatTrafficList(opts){let startMs=new Date(opts.startTime).getTime(),endMs=new Date(opts.endTime).getTime(),axis=axisOf(opts.series),lines=[` ${import_chalk106.default.bold("Firewall traffic")} ${import_chalk106.default.dim(windowLabel({startMs,endMs,points:axis.length,granularity:opts.granularity}))}`,"",` ${import_chalk106.default.bold("Requests by Action")}`,formatActionTrendTable(opts.series)],shared=sharedUnavailable(opts.topLists);if(shared)return lines.push(""),lines.push(` ${import_chalk106.default.dim(shared.message??unavailableLine(shared.reason,shared.retrySeconds))}`),lines.push(import_chalk106.default.dim(` No top lists: ${opts.topLists.map(l=>l.title).join(", ")}.`)),lines.push(""),lines.join(`
428
- `);for(let list29 of opts.topLists)lines.push(""),lines.push(...formatTopList(list29,opts.filtered));return lines.push(""),lines.join(`
429
- `)}function allTopListsUnavailable(lists){return lists.length>0&&lists.every(list29=>!!list29.unavailable)}function sharedUnavailable(lists){if(lists.length<2)return;let first=lists[0].unavailable;if(first&&lists.every(l=>l.unavailable===first))return{reason:first,message:lists.find(l=>l.message)?.message,retrySeconds:lists.map(l=>l.retrySeconds).filter(s=>typeof s=="number").sort((a,b)=>a-b)[0]}}function formatTrafficInspect(opts){let lines=[` ${import_chalk106.default.bold(opts.value)} ${import_chalk106.default.dim(opts.dimensionLabel)}`];for(let row of opts.detail)row.value&&lines.push(formatAlignedLabel(fieldLabel(row.field),ellipsizeMiddle(row.value,MAX_VALUE_WIDTH)));return lines.push(formatAlignedLabel("Requests",formatCount3(opts.total))),lines.push(""),lines.push(` ${import_chalk106.default.bold("Requests by Action")} ${import_chalk106.default.dim(windowLabel({startMs:new Date(opts.startTime).getTime(),endMs:new Date(opts.endTime).getTime(),points:axisOf(opts.series).length,granularity:opts.granularity}))}`),lines.push(formatActionTrendTable(opts.series)),lines.push(""),lines.push(` ${import_chalk106.default.bold(`Breakdown by ${opts.breakdownLabel}`)} ${import_chalk106.default.dim(`(top ${opts.top})`)}`),opts.breakdown.groups.length===0?lines.push(emptyLine(opts.filtered)):lines.push(...formatGroupedTrendTable({labelHeader:opts.breakdownLabel,field:opts.breakdownField,result:opts.breakdown})),lines.push(""),lines.join(`
428
+ `);for(let list30 of opts.topLists)lines.push(""),lines.push(...formatTopList(list30,opts.filtered));return lines.push(""),lines.join(`
429
+ `)}function allTopListsUnavailable(lists){return lists.length>0&&lists.every(list30=>!!list30.unavailable)}function sharedUnavailable(lists){if(lists.length<2)return;let first=lists[0].unavailable;if(first&&lists.every(l=>l.unavailable===first))return{reason:first,message:lists.find(l=>l.message)?.message,retrySeconds:lists.map(l=>l.retrySeconds).filter(s=>typeof s=="number").sort((a,b)=>a-b)[0]}}function formatTrafficInspect(opts){let lines=[` ${import_chalk106.default.bold(opts.value)} ${import_chalk106.default.dim(opts.dimensionLabel)}`];for(let row of opts.detail)row.value&&lines.push(formatAlignedLabel(fieldLabel(row.field),ellipsizeMiddle(row.value,MAX_VALUE_WIDTH)));return lines.push(formatAlignedLabel("Requests",formatCount3(opts.total))),lines.push(""),lines.push(` ${import_chalk106.default.bold("Requests by Action")} ${import_chalk106.default.dim(windowLabel({startMs:new Date(opts.startTime).getTime(),endMs:new Date(opts.endTime).getTime(),points:axisOf(opts.series).length,granularity:opts.granularity}))}`),lines.push(formatActionTrendTable(opts.series)),lines.push(""),lines.push(` ${import_chalk106.default.bold(`Breakdown by ${opts.breakdownLabel}`)} ${import_chalk106.default.dim(`(top ${opts.top})`)}`),opts.breakdown.groups.length===0?lines.push(emptyLine(opts.filtered)):lines.push(...formatGroupedTrendTable({labelHeader:opts.breakdownLabel,field:opts.breakdownField,result:opts.breakdown})),lines.push(""),lines.join(`
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(`
@@ -591,7 +591,7 @@ ${formatPersistentActionsList({actions:shown,total:actions.length,summary,from,t
591
591
  `),0)}catch(e2){return isAPIError(e2)&&e2.status===402?failFirewall(client,{message:FIREWALL_ACTIVITY_PLAN_MESSAGE,reason:AGENT_REASON.API_ERROR}):failFirewallApi(client,e2,{fallback:"Failed to fetch persistent firewall actions",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent actions"})}}var import_chalk141=__toESM(require_source(),1);import{isIP as isIP3}from"node:net";var TOP_PATHS=8,MIN_TRAFFIC_WINDOW_MS=6e4;function isActivityUnavailable3(error){return isAPIError(error)&&error.status===402}function inspectGranularity(from,to){let hours=(to.getTime()-from.getTime())/36e5;return hours<=3?{minutes:1}:hours<=24?{minutes:5}:{hours:1}}function matchesInspectFilters(action,opts){return!(action.public_ip!==opts.ip||opts.host&&action.host!==opts.host||opts.action&&action.action!==opts.action)}async function inspect10(client,argv){let startedAt=Date.now(),parsed=await parseSubcommandArgs2(argv,persistentActionsInspectSubcommand,client,"persistent-actions inspect");if(typeof parsed=="number")return parsed;let ip=parsed.args[0];if(!ip)return failFirewall(client,{message:`IP is required. Usage: ${withGlobalFlags3(client,"firewall persistent-actions inspect <ip>")}`,nextCommand:"firewall persistent-actions inspect <ip>",reason:AGENT_REASON.MISSING_ARGUMENTS});if(!isIP3(ip))return failFirewall(client,{message:"Please enter a valid IP address.",reason:AGENT_REASON.INVALID_ARGUMENTS});let sinceResult=validateTimeBound(parsed.flags["--since"]);if(!sinceResult.valid)return failFirewall(client,{message:sinceResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let untilResult=validateTimeBound(parsed.flags["--until"]);if(!untilResult.valid)return failFirewall(client,{message:untilResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return failFirewall(client,{message:order.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let requested=persistentActionWindow(sinceResult.value,untilResult.value),host=parsed.flags["--host"],actionFilter=parsed.flags["--action"],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 persistent actions 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 persistent-actions inspect ${ip}${asJson?" --json":""}`,{isEnterprise,known}=await fetchPlanInfo(client),window=clampPersistentActionWindow({...requested,isEnterprise,planKnown:known,now:startedAt}),{from,to}=window;if(window.empty)return failFirewall(client,{message:`This plan keeps ${retentionLabel(isEnterprise)} of persistent-action history, and the requested window is entirely older than that. Narrow it with --since and --until.`,reason:AGENT_REASON.INVALID_ARGUMENTS});output_manager_default.spinner(`Fetching persistent action ${import_chalk141.default.bold(ip)}`);try{let matches=(await fetchFirewallPersistentActions(client,{projectId:project.id,teamId,startTime:from,endTime:to,host})).filter(action=>matchesInspectFilters(action,{ip,host,action:actionFilter})),selected=matches[0];if(!selected)return failFirewall(client,{message:`No persistent action found for "${ip}". Run ${withGlobalFlags3(client,"firewall persistent-actions list")} to view recent actions.`,nextCommand:"firewall persistent-actions list",reason:AGENT_REASON.NOT_FOUND});output_manager_default.spinner(`Fetching traffic for ${import_chalk141.default.bold(ip)}`);let requestedStart=new Date(apiTimestampMs(selected.startTime)),requestedEnd=new Date(Math.max(Math.min(apiTimestampMs(selected.endTime),Date.now()),requestedStart.getTime()+MIN_TRAFFIC_WINDOW_MS)),wantPaths=!!parsed.flags["--paths"],filter=persistentActionFilter({ip:selected.public_ip,host:selected.host}),pathsFilter=persistentActionFilter({ip:selected.public_ip,host:selected.host,withPath:!0}),scopable=!isRedacted(selected.public_ip),granularity=inspectGranularity(requestedStart,requestedEnd),{startTime:actionStart,endTime:actionEnd}=alignQueryWindow(requestedStart,requestedEnd,granularity),[metrics2,paths]=await Promise.all([scopable?getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime:actionStart,endTime:actionEnd,granularity,filter}).catch(err=>{if(isActivityUnavailable3(err))return null;throw err}):Promise.resolve(null),wantPaths&&scopable?getTopList(client,{projectId:project.id,ownerId:teamId,startTime:actionStart,endTime:actionEnd,groupBy:[PATH_DIMENSION],filter:pathsFilter,top:TOP_PATHS}).catch(err=>{if(isActivityUnavailable3(err))return null;throw err}):Promise.resolve(null)]),pathRows=paths?.map(row=>({name:row.values[PATH_DIMENSION]||"/",count:row.total}));return asJson?(outputJson2(client,{action:toPersistentAction(selected),matchCount:matches.length,series:metrics2?.series??null,...wantPaths?{paths:pathRows??null}:{},...metrics2?{}:{activityUnavailable:{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}}}),0):(output_manager_default.print(`
592
592
  ${formatPersistentActionInspect({action:selected,matchCount:matches.length,series:metrics2?.series,paths:pathRows,pathsAvailable:!wantPaths})}`),metrics2||output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
593
593
  `),output_manager_default.print(`
594
- `),0)}catch(e2){return isActivityUnavailable3(e2)?failFirewall(client,{message:FIREWALL_ACTIVITY_PLAN_MESSAGE,fix:observabilityPlusPurchaseFix(),reason:AGENT_REASON.API_ERROR}):failFirewallApi(client,e2,{fallback:"Failed to fetch persistent firewall action",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent action"})}}var COMMAND_CONFIG35={list:getCommandAliases(persistentActionsListSubcommand),inspect:getCommandAliases(persistentActionsInspectSubcommand)};async function main16(client,args,telemetry2){let flagsSpecification=getFlagsSpecification(persistentActionsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(args,flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG35),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("firewall","persistent-actions"),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsListSubcommand),2):(telemetry2.trackCliSubcommandPersistentActionsList(subcommandOriginal),list18(client,subArgs));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsInspectSubcommand),2):(telemetry2.trackCliSubcommandPersistentActionsInspect(subcommandOriginal),inspect10(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG35)),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2}}var import_chalk142=__toESM(require_source(),1);var DEFAULT_TRAFFIC_WINDOW_MS=24*60*60*1e3;function requireTrafficTeam(client,org,what){return org.type==="team"?org.id:failFirewall(client,{message:`${what} needs a team. Run \`vercel switch\` to select a team or pass --scope <team>.`,reason:AGENT_REASON.MISSING_SCOPE})}function resolveTrafficWindow(since,until,scope){let sinceResult=validateTimeBound(since);if(!sinceResult.valid)return{valid:!1,message:sinceResult.message};let untilResult=validateTimeBound(until);if(!untilResult.valid)return{valid:!1,message:untilResult.message};let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return{valid:!1,message:order.message};if(!sinceResult.value&&!untilResult.value&&scope)return{valid:!0,startTime:scope.startTime,endTime:scope.endTime};let endTime=untilResult.value??new Date,startTime=sinceResult.value??scope?.startTime??new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);return startTime.getTime()>endTime.getTime()?{valid:!1,message:sinceResult.value?"`--since` is in the future. Pass a past time, such as `24h` or an earlier date.":"The alert began after `--until`. Widen the window with `--since`, or drop `--until`."}:{valid:!0,startTime,endTime}}function buildTrafficFilter(flags){let parts=[];for(let dimension of TRAFFIC_DIMENSIONS){let value=flags[`--${dimension.alias}`];typeof value=="string"&&value.length>0&&parts.push(eqFilter(dimension.field,value))}let raw=flags["--filter"],rawExpressions=[];if(Array.isArray(raw))for(let expression of raw)typeof expression=="string"&&expression.length>0&&(rawExpressions.push(expression),parts.push(expression));return usesODataSyntax(rawExpressions)&&output_manager_default.warn(FILTER_DEPRECATION_WARNING),andFilters(...parts)}function unknownDimensionMessage(flag,value){return`Unknown ${flag} "${value}". Dimensions: ${dimensionAliases().join(", ")}.`}var WAF_ONLY_ALIASES=new Set(["action","rule"]);function hasStringFlag(flags,flag){let value=flags[flag];return typeof value=="string"&&value.length>0}function requestCountFilterFlags(flags){return TRAFFIC_DIMENSIONS.filter(d=>d.metric&&hasStringFlag(flags,`--${d.alias}`)).map(d=>`--${d.alias}`)}function mixedTrafficMetricError(opts){let requestFilters=requestCountFilterFlags(opts.flags),queryingRequestCount=!!opts.dimension?.metric;if(!queryingRequestCount&&requestFilters.length>0)return`Can't combine ${requestFilters.join(", ")} with firewall-action data. Inspect unknown-bot <category> instead.`;if(!queryingRequestCount||!opts.dimension)return;let unsupported=[];if(hasStringFlag(opts.flags,"--action")&&unsupported.push("--action"),hasStringFlag(opts.flags,"--rule")&&unsupported.push("--rule"),opts.groupBy&&WAF_ONLY_ALIASES.has(opts.groupBy.alias)&&unsupported.push(`--group-by ${opts.groupBy.alias}`),unsupported.length!==0)return`${opts.dimension.label} uses request-count data and cannot be combined with ${unsupported.join(", ")}. Use a request dimension such as path, ip, host, country, asn, ja4, or user-agent instead.`}var TOP_LIMITS={min:1,max:100};function trendBuckets(client){let columns=client.stderr.columns||80;return Math.max(12,Math.min(96,columns-56))}async function runWithConcurrency(tasks,limit){let results=new Array(tasks.length),next=0,workers=Array.from({length:Math.min(limit,tasks.length)},async()=>{for(;next<tasks.length;){let index=next++;results[index]=await tasks[index]()}});return await Promise.all(workers),results}var AlertNotFoundError=class extends Error{constructor(alertId){super(`No firewall alert found for "${alertId}". Run \`vercel firewall alerts list\` to view recent alerts.`),this.name="AlertNotFoundError"}};async function resolveAlertScope(client,opts){let resolved=await findFirewallAlert(client,opts);if(!resolved)throw new AlertNotFoundError(opts.alertId);let{alert}=resolved;return{alert,startTime:new Date(alert.startedAt),endTime:new Date(alert.resolvedAt??Date.now()),filter:alert.ruleId?eqFilter(RULE_ID_DIMENSION,alert.ruleId):void 0}}var DEFAULT_TOP=5,DEFAULT_DIMENSIONS=["ip","ja4","asn","user-agent","path","rule","host","bot"],LIST_CONCURRENCY=8;function isActivityUnavailable4(error){return isAPIError(error)&&error.status===402}async function list19(client,argv){let parsed=await parseSubcommandArgs2(argv,trafficListSubcommand,client,"traffic list");if(typeof parsed=="number")return parsed;let topResult=validateIntegerRangeWithDefault(parsed.flags["--top"],{flag:"--top",...TOP_LIMITS,defaultValue:DEFAULT_TOP});if(!topResult.valid)return failFirewall(client,{message:topResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let top=topResult.value,requested=normalizeRepeatableStringFilters(parsed.flags["--dimension"]),dimensions=[];for(let alias2 of requested.length>0?requested:DEFAULT_DIMENSIONS){let dimension=getDimension(alias2);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("--dimension",alias2),reason:AGENT_REASON.INVALID_ARGUMENTS});dimensions.includes(dimension)||dimensions.push(dimension)}let mixedMetricError=mixedTrafficMetricError({flags:parsed.flags});if(mixedMetricError)return failFirewall(client,{message:mixedMetricError,nextCommand:"firewall traffic inspect unknown-bot <category>",reason:AGENT_REASON.INVALID_ARGUMENTS});let link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=requireTrafficTeam(client,org,"Firewall traffic");if(typeof teamId=="number")return teamId;let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall traffic list${asJson?" --json":""}`,alertScope,alertId=parsed.flags["--alert"];if(alertId){output_manager_default.spinner(`Fetching alert ${import_chalk142.default.bold(alertId)}`);try{alertScope=await resolveAlertScope(client,{alertId,projectId:project.id,teamId})}catch(e2){return e2 instanceof AlertNotFoundError?failFirewall(client,{message:e2.message,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND}):failFirewallApi(client,e2,{fallback:"Failed to fetch firewall alert",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alert"})}}let window=resolveTrafficWindow(parsed.flags["--since"],parsed.flags["--until"],alertScope);if(!window.valid)return failFirewall(client,{message:window.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let filter=andFilters(alertScope?.filter,buildTrafficFilter(parsed.flags)),filtered=!!filter;output_manager_default.spinner(`Fetching firewall traffic for ${import_chalk142.default.bold(project.name)}`);let granularity=pickGranularity(window.endTime.getTime()-window.startTime.getTime(),asJson?DEFAULT_MAX_BUCKETS:trendBuckets(client)),{startTime,endTime}=alignQueryWindow(window.startTime,window.endTime,granularity),activeConfig=dimensions.some(d=>d.alias==="rule")?listFirewallConfigs(client,projectScope(project,teamId)).then(configs=>configs.active).catch(()=>null):Promise.resolve(null);try{let[metrics2,topLists,config]=await Promise.all([getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter}),runWithConcurrency(dimensions.map(dimension=>async()=>{let title6=dimension.widgetTitle;try{let groupBy=dimension.groupBy??[dimension.field],rows=await getTopList(client,{projectId:project.id,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy,filter:andFilters(filter,dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(top,groupBy)});return{dimension:dimension.alias,title:title6,rows:toTopListRows(rows,dimension.field,dimension.labelFields).slice(0,top)}}catch(e2){return{dimension:dimension.alias,title:title6,rows:[],unavailable:isActivityUnavailable4(e2)?"plan":isUnsupportedDimension(e2)?"filter":isRateLimited(e2)?"rate-limit":isActivityTimeout(e2)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(e2),message:isRateLimited(e2)?apiServerMessage(e2):void 0}}}),LIST_CONCURRENCY),activeConfig]);for(let list29 of topLists)list29.dimension==="rule"&&(list29.rows=list29.rows.map(row=>({...row,label:resolveRuleDisplayName(row.value,config)})));let allFailed=allTopListsUnavailable(topLists);return asJson?(outputJson2(client,{period:{start:metrics2.startTime,end:metrics2.endTime,granularity:metrics2.granularity},filter:filter??null,...alertScope?{alert:{id:alertScope.alert.id,title:alertScope.alert.title,startedAt:alertScope.alert.startedAt,resolvedAt:alertScope.alert.resolvedAt??null}}:{},stats:metrics2.totals,series:metrics2.series.map(({action,timeseries})=>({action,timeseries})),topLists:topLists.map(list29=>({dimension:list29.dimension,rows:list29.rows,...list29.unavailable?{unavailable:list29.unavailable}:{},...list29.retrySeconds?{retrySeconds:list29.retrySeconds}:{}}))}),allFailed?1:0):(output_manager_default.print(`
594
+ `),0)}catch(e2){return isActivityUnavailable3(e2)?failFirewall(client,{message:FIREWALL_ACTIVITY_PLAN_MESSAGE,fix:observabilityPlusPurchaseFix(),reason:AGENT_REASON.API_ERROR}):failFirewallApi(client,e2,{fallback:"Failed to fetch persistent firewall action",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent action"})}}var COMMAND_CONFIG35={list:getCommandAliases(persistentActionsListSubcommand),inspect:getCommandAliases(persistentActionsInspectSubcommand)};async function main16(client,args,telemetry2){let flagsSpecification=getFlagsSpecification(persistentActionsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(args,flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG35),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("firewall","persistent-actions"),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsListSubcommand),2):(telemetry2.trackCliSubcommandPersistentActionsList(subcommandOriginal),list18(client,subArgs));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsInspectSubcommand),2):(telemetry2.trackCliSubcommandPersistentActionsInspect(subcommandOriginal),inspect10(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG35)),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2}}var import_chalk142=__toESM(require_source(),1);var DEFAULT_TRAFFIC_WINDOW_MS=24*60*60*1e3;function requireTrafficTeam(client,org,what){return org.type==="team"?org.id:failFirewall(client,{message:`${what} needs a team. Run \`vercel switch\` to select a team or pass --scope <team>.`,reason:AGENT_REASON.MISSING_SCOPE})}function resolveTrafficWindow(since,until,scope){let sinceResult=validateTimeBound(since);if(!sinceResult.valid)return{valid:!1,message:sinceResult.message};let untilResult=validateTimeBound(until);if(!untilResult.valid)return{valid:!1,message:untilResult.message};let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return{valid:!1,message:order.message};if(!sinceResult.value&&!untilResult.value&&scope)return{valid:!0,startTime:scope.startTime,endTime:scope.endTime};let endTime=untilResult.value??new Date,startTime=sinceResult.value??scope?.startTime??new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);return startTime.getTime()>endTime.getTime()?{valid:!1,message:sinceResult.value?"`--since` is in the future. Pass a past time, such as `24h` or an earlier date.":"The alert began after `--until`. Widen the window with `--since`, or drop `--until`."}:{valid:!0,startTime,endTime}}function buildTrafficFilter(flags){let parts=[];for(let dimension of TRAFFIC_DIMENSIONS){let value=flags[`--${dimension.alias}`];typeof value=="string"&&value.length>0&&parts.push(eqFilter(dimension.field,value))}let raw=flags["--filter"],rawExpressions=[];if(Array.isArray(raw))for(let expression of raw)typeof expression=="string"&&expression.length>0&&(rawExpressions.push(expression),parts.push(expression));return usesODataSyntax(rawExpressions)&&output_manager_default.warn(FILTER_DEPRECATION_WARNING),andFilters(...parts)}function unknownDimensionMessage(flag,value){return`Unknown ${flag} "${value}". Dimensions: ${dimensionAliases().join(", ")}.`}var WAF_ONLY_ALIASES=new Set(["action","rule"]);function hasStringFlag(flags,flag){let value=flags[flag];return typeof value=="string"&&value.length>0}function requestCountFilterFlags(flags){return TRAFFIC_DIMENSIONS.filter(d=>d.metric&&hasStringFlag(flags,`--${d.alias}`)).map(d=>`--${d.alias}`)}function mixedTrafficMetricError(opts){let requestFilters=requestCountFilterFlags(opts.flags),queryingRequestCount=!!opts.dimension?.metric;if(!queryingRequestCount&&requestFilters.length>0)return`Can't combine ${requestFilters.join(", ")} with firewall-action data. Inspect unknown-bot <category> instead.`;if(!queryingRequestCount||!opts.dimension)return;let unsupported=[];if(hasStringFlag(opts.flags,"--action")&&unsupported.push("--action"),hasStringFlag(opts.flags,"--rule")&&unsupported.push("--rule"),opts.groupBy&&WAF_ONLY_ALIASES.has(opts.groupBy.alias)&&unsupported.push(`--group-by ${opts.groupBy.alias}`),unsupported.length!==0)return`${opts.dimension.label} uses request-count data and cannot be combined with ${unsupported.join(", ")}. Use a request dimension such as path, ip, host, country, asn, ja4, or user-agent instead.`}var TOP_LIMITS={min:1,max:100};function trendBuckets(client){let columns=client.stderr.columns||80;return Math.max(12,Math.min(96,columns-56))}async function runWithConcurrency(tasks,limit){let results=new Array(tasks.length),next=0,workers=Array.from({length:Math.min(limit,tasks.length)},async()=>{for(;next<tasks.length;){let index=next++;results[index]=await tasks[index]()}});return await Promise.all(workers),results}var AlertNotFoundError=class extends Error{constructor(alertId){super(`No firewall alert found for "${alertId}". Run \`vercel firewall alerts list\` to view recent alerts.`),this.name="AlertNotFoundError"}};async function resolveAlertScope(client,opts){let resolved=await findFirewallAlert(client,opts);if(!resolved)throw new AlertNotFoundError(opts.alertId);let{alert}=resolved;return{alert,startTime:new Date(alert.startedAt),endTime:new Date(alert.resolvedAt??Date.now()),filter:alert.ruleId?eqFilter(RULE_ID_DIMENSION,alert.ruleId):void 0}}var DEFAULT_TOP=5,DEFAULT_DIMENSIONS=["ip","ja4","asn","user-agent","path","rule","host","bot"],LIST_CONCURRENCY=8;function isActivityUnavailable4(error){return isAPIError(error)&&error.status===402}async function list19(client,argv){let parsed=await parseSubcommandArgs2(argv,trafficListSubcommand,client,"traffic list");if(typeof parsed=="number")return parsed;let topResult=validateIntegerRangeWithDefault(parsed.flags["--top"],{flag:"--top",...TOP_LIMITS,defaultValue:DEFAULT_TOP});if(!topResult.valid)return failFirewall(client,{message:topResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let top=topResult.value,requested=normalizeRepeatableStringFilters(parsed.flags["--dimension"]),dimensions=[];for(let alias2 of requested.length>0?requested:DEFAULT_DIMENSIONS){let dimension=getDimension(alias2);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("--dimension",alias2),reason:AGENT_REASON.INVALID_ARGUMENTS});dimensions.includes(dimension)||dimensions.push(dimension)}let mixedMetricError=mixedTrafficMetricError({flags:parsed.flags});if(mixedMetricError)return failFirewall(client,{message:mixedMetricError,nextCommand:"firewall traffic inspect unknown-bot <category>",reason:AGENT_REASON.INVALID_ARGUMENTS});let link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=requireTrafficTeam(client,org,"Firewall traffic");if(typeof teamId=="number")return teamId;let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall traffic list${asJson?" --json":""}`,alertScope,alertId=parsed.flags["--alert"];if(alertId){output_manager_default.spinner(`Fetching alert ${import_chalk142.default.bold(alertId)}`);try{alertScope=await resolveAlertScope(client,{alertId,projectId:project.id,teamId})}catch(e2){return e2 instanceof AlertNotFoundError?failFirewall(client,{message:e2.message,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND}):failFirewallApi(client,e2,{fallback:"Failed to fetch firewall alert",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alert"})}}let window=resolveTrafficWindow(parsed.flags["--since"],parsed.flags["--until"],alertScope);if(!window.valid)return failFirewall(client,{message:window.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let filter=andFilters(alertScope?.filter,buildTrafficFilter(parsed.flags)),filtered=!!filter;output_manager_default.spinner(`Fetching firewall traffic for ${import_chalk142.default.bold(project.name)}`);let granularity=pickGranularity(window.endTime.getTime()-window.startTime.getTime(),asJson?DEFAULT_MAX_BUCKETS:trendBuckets(client)),{startTime,endTime}=alignQueryWindow(window.startTime,window.endTime,granularity),activeConfig=dimensions.some(d=>d.alias==="rule")?listFirewallConfigs(client,projectScope(project,teamId)).then(configs=>configs.active).catch(()=>null):Promise.resolve(null);try{let[metrics2,topLists,config]=await Promise.all([getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter}),runWithConcurrency(dimensions.map(dimension=>async()=>{let title6=dimension.widgetTitle;try{let groupBy=dimension.groupBy??[dimension.field],rows=await getTopList(client,{projectId:project.id,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy,filter:andFilters(filter,dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(top,groupBy)});return{dimension:dimension.alias,title:title6,rows:toTopListRows(rows,dimension.field,dimension.labelFields).slice(0,top)}}catch(e2){return{dimension:dimension.alias,title:title6,rows:[],unavailable:isActivityUnavailable4(e2)?"plan":isUnsupportedDimension(e2)?"filter":isRateLimited(e2)?"rate-limit":isActivityTimeout(e2)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(e2),message:isRateLimited(e2)?apiServerMessage(e2):void 0}}}),LIST_CONCURRENCY),activeConfig]);for(let list30 of topLists)list30.dimension==="rule"&&(list30.rows=list30.rows.map(row=>({...row,label:resolveRuleDisplayName(row.value,config)})));let allFailed=allTopListsUnavailable(topLists);return asJson?(outputJson2(client,{period:{start:metrics2.startTime,end:metrics2.endTime,granularity:metrics2.granularity},filter:filter??null,...alertScope?{alert:{id:alertScope.alert.id,title:alertScope.alert.title,startedAt:alertScope.alert.startedAt,resolvedAt:alertScope.alert.resolvedAt??null}}:{},stats:metrics2.totals,series:metrics2.series.map(({action,timeseries})=>({action,timeseries})),topLists:topLists.map(list30=>({dimension:list30.dimension,rows:list30.rows,...list30.unavailable?{unavailable:list30.unavailable}:{},...list30.retrySeconds?{retrySeconds:list30.retrySeconds}:{}}))}),allFailed?1:0):(output_manager_default.print(`
595
595
  `),output_manager_default.print(formatTrafficList({series:metrics2.series,topLists,startTime:metrics2.startTime,endTime:metrics2.endTime,granularity:metrics2.granularity,filtered})),allFailed||output_manager_default.print(`
596
596
  ${import_chalk142.default.dim(" Break any of these values down further:")}
597
597
  ${withGlobalFlags3(client,"firewall traffic inspect <dimension> <value>")}
@@ -767,8 +767,8 @@ ${table3}
767
767
  `)}function fail(message){if(json){let status6=reason===AGENT_REASON.MISSING_ARGUMENTS||reason===AGENT_REASON.NOT_LINKED?AGENT_STATUS.ACTION_REQUIRED:AGENT_STATUS.ERROR;client.stdout.write(`${JSON.stringify({status:status6,reason,message,next:next()},null,2)}
768
768
  `)}else output_manager_default.fatal(message),printRecovery();return 1}try{let printNextPage2=function(cursor2){if(!json&&cursor2&&pageOptions){let globalArgs=getGlobalFlagsFromArgs(client.argv.slice(2));globalArgs.some(arg=>arg==="--scope"||arg==="-S"||arg.startsWith("--scope="))||globalArgs.push("--scope",org.slug);let command3=getCommandNamePlain(["flags","labels","ls",...target===void 0?[]:[target],"--project",project.name,"--limit",String(pageOptions.limit),"--next",cursor2,...globalArgs].map(quoteArg).join(" "));output_manager_default.print(` Next page:
769
769
  ${command3}
770
- `)}};var printNextPage=printNextPage2;let parsed=parseArguments(argv,getFlagsSpecification(labelsListSubcommand.options),{permissive:!0}),aliases2=Object.fromEntries(labelsSubcommand.subcommands.map(command3=>[command3.name,getCommandAliases(command3)])),{subcommand,subcommandOriginal}=getSubcommand7(parsed.args,aliases2),command2=labelsSubcommand.subcommands.find(command3=>command3.name===subcommand);if(parsed.flags["--help"])return telemetry2.trackCliFlagHelp("flags labels",command2?subcommandOriginal:void 0),output_manager_default.print(help(command2??labelsSubcommand,{parent:command2?{...labelsSubcommand,name:"flags labels"}:flagsCommand,columns:client.stderr.columns})),2;if(!command2)return reason=parsed.args.length?AGENT_REASON.INVALID_ARGUMENTS:AGENT_REASON.MISSING_ARGUMENTS,fail(getInvalidSubcommand(aliases2));telemetry2.trackSubcommand(command2.name,subcommandOriginal);let{args:positional,flags}=parseArguments(argv,getFlagsSpecification(command2.options)),[target,...args]=positional.slice(1);if(telemetry2.trackArguments(positional.slice(1),flags),json=!!flags["--json"]||client.nonInteractive,target===void 0&&command2.name!=="ls")return reason=AGENT_REASON.MISSING_ARGUMENTS,fail('Provide an attribute as ENTITY.ATTRIBUTE. Example: vercel flags labels set user.plan pro "Pro Plan".');let[kind,attributeKey]=target?.split(".")??[];if(target!==void 0){if(target.split(".").length!==2)return fail("Use an attribute as ENTITY.ATTRIBUTE, for example user.plan.");validateEntityKind(kind),validateAttributeKey(attributeKey)}let pageOptions=command2.name==="ls"?parseLabelPagination(flags["--limit"],flags["--next"],target??null):void 0;if(args.length!==command2.arguments.length-1)return args.length<command2.arguments.length-1&&(reason=AGENT_REASON.MISSING_ARGUMENTS),fail(command2.name==="set"?'Provide a value and a label. Example: vercel flags labels set user.plan pro "Pro Plan".':command2.name==="rm"?"Provide one value. Example: vercel flags labels rm user.plan pro.":`The ${command2.name} command accepts only one attribute as ENTITY.ATTRIBUTE.`);let operations=command2.name==="set"?validateEntityLabelOperations([{operation:"upsert",value:args[0],label:args[1]}]):command2.name==="rm"?validateEntityLabelOperations([{operation:"delete",value:args[0]}]):parseEntityLabelOperations({set:flags["--set"]??[],remove:flags["--remove"]??[],data:flags["--data"]});if(command2.name==="apply"&&operations.length===0)return reason=AGENT_REASON.MISSING_ARGUMENTS,fail("Provide --set VALUE=LABEL, --remove VALUE, or --data JSON.");reason=AGENT_REASON.API_ERROR;let projectName=getProjectNameFromFlags(flags),context=await getLinkedFlagsProject(client,projectName,{projectNotFoundHandling:"return"});if(context.status==="error")return inspectCommand2="project ls",recovery="Check the project and team context before retrying",fail("Failed to resolve the project. Check the project and team settings.");if(context.status==="not_linked")return reason=projectName?AGENT_REASON.PROJECT_NOT_FOUND:AGENT_REASON.NOT_LINKED,inspectCommand2=projectName?"project ls":"link",recovery=projectName?"Select an accessible project before retrying":"Link a project before retrying",fail(projectName?`Project ${JSON.stringify(projectName)} was not found or is not accessible. Check --project and your team scope.`:"Your codebase isn't linked to a project. Pass --project <name>, or run vercel link to link it.");let{project,org}=context;if(client.config.currentTeam=org.type==="team"?org.id:void 0,pageOptions?.cursor&&pageOptions.cursor.projectId!==project.id)return reason=AGENT_REASON.INVALID_ARGUMENTS,fail("The --next cursor belongs to a different project. Omit --next to restart the list.");let projectSlugLink=formatProject(org.slug,project.name);output_manager_default.spinner("Fetching attribute labels\u2026");let settings=await getFlagSettings(client,project.id);if(output_manager_default.stopSpinner(),pageOptions&&target===void 0){let available=settings.entities.flatMap(entity2=>entity2.attributes.filter(attribute2=>attribute2.labels?.length).map(attribute2=>({id:null,attributes:[{entityKind:entity2.kind,attributeKey:attribute2.key}],labelCount:attribute2.labels.length}))),{items:lists,pagination}=paginateLabelItems(available,pageOptions,project.id,null,list29=>`${list29.attributes[0].entityKind}.${list29.attributes[0].attributeKey}`);if(json)client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,lists,pagination},null,2)}
771
- `);else if(printAlignedLabel("Project",projectSlugLink),lists.length===0)output_manager_default.log(pageOptions.cursor?"No more label lists found.":"No label lists found.");else{let rows=lists.map(list29=>[`${list29.attributes[0].entityKind}.${list29.attributes[0].attributeKey}`,String(list29.labelCount)]);output_manager_default.print(`
770
+ `)}};var printNextPage=printNextPage2;let parsed=parseArguments(argv,getFlagsSpecification(labelsListSubcommand.options),{permissive:!0}),aliases2=Object.fromEntries(labelsSubcommand.subcommands.map(command3=>[command3.name,getCommandAliases(command3)])),{subcommand,subcommandOriginal}=getSubcommand7(parsed.args,aliases2),command2=labelsSubcommand.subcommands.find(command3=>command3.name===subcommand);if(parsed.flags["--help"])return telemetry2.trackCliFlagHelp("flags labels",command2?subcommandOriginal:void 0),output_manager_default.print(help(command2??labelsSubcommand,{parent:command2?{...labelsSubcommand,name:"flags labels"}:flagsCommand,columns:client.stderr.columns})),2;if(!command2)return reason=parsed.args.length?AGENT_REASON.INVALID_ARGUMENTS:AGENT_REASON.MISSING_ARGUMENTS,fail(getInvalidSubcommand(aliases2));telemetry2.trackSubcommand(command2.name,subcommandOriginal);let{args:positional,flags}=parseArguments(argv,getFlagsSpecification(command2.options)),[target,...args]=positional.slice(1);if(telemetry2.trackArguments(positional.slice(1),flags),json=!!flags["--json"]||client.nonInteractive,target===void 0&&command2.name!=="ls")return reason=AGENT_REASON.MISSING_ARGUMENTS,fail('Provide an attribute as ENTITY.ATTRIBUTE. Example: vercel flags labels set user.plan pro "Pro Plan".');let[kind,attributeKey]=target?.split(".")??[];if(target!==void 0){if(target.split(".").length!==2)return fail("Use an attribute as ENTITY.ATTRIBUTE, for example user.plan.");validateEntityKind(kind),validateAttributeKey(attributeKey)}let pageOptions=command2.name==="ls"?parseLabelPagination(flags["--limit"],flags["--next"],target??null):void 0;if(args.length!==command2.arguments.length-1)return args.length<command2.arguments.length-1&&(reason=AGENT_REASON.MISSING_ARGUMENTS),fail(command2.name==="set"?'Provide a value and a label. Example: vercel flags labels set user.plan pro "Pro Plan".':command2.name==="rm"?"Provide one value. Example: vercel flags labels rm user.plan pro.":`The ${command2.name} command accepts only one attribute as ENTITY.ATTRIBUTE.`);let operations=command2.name==="set"?validateEntityLabelOperations([{operation:"upsert",value:args[0],label:args[1]}]):command2.name==="rm"?validateEntityLabelOperations([{operation:"delete",value:args[0]}]):parseEntityLabelOperations({set:flags["--set"]??[],remove:flags["--remove"]??[],data:flags["--data"]});if(command2.name==="apply"&&operations.length===0)return reason=AGENT_REASON.MISSING_ARGUMENTS,fail("Provide --set VALUE=LABEL, --remove VALUE, or --data JSON.");reason=AGENT_REASON.API_ERROR;let projectName=getProjectNameFromFlags(flags),context=await getLinkedFlagsProject(client,projectName,{projectNotFoundHandling:"return"});if(context.status==="error")return inspectCommand2="project ls",recovery="Check the project and team context before retrying",fail("Failed to resolve the project. Check the project and team settings.");if(context.status==="not_linked")return reason=projectName?AGENT_REASON.PROJECT_NOT_FOUND:AGENT_REASON.NOT_LINKED,inspectCommand2=projectName?"project ls":"link",recovery=projectName?"Select an accessible project before retrying":"Link a project before retrying",fail(projectName?`Project ${JSON.stringify(projectName)} was not found or is not accessible. Check --project and your team scope.`:"Your codebase isn't linked to a project. Pass --project <name>, or run vercel link to link it.");let{project,org}=context;if(client.config.currentTeam=org.type==="team"?org.id:void 0,pageOptions?.cursor&&pageOptions.cursor.projectId!==project.id)return reason=AGENT_REASON.INVALID_ARGUMENTS,fail("The --next cursor belongs to a different project. Omit --next to restart the list.");let projectSlugLink=formatProject(org.slug,project.name);output_manager_default.spinner("Fetching attribute labels\u2026");let settings=await getFlagSettings(client,project.id);if(output_manager_default.stopSpinner(),pageOptions&&target===void 0){let available=settings.entities.flatMap(entity2=>entity2.attributes.filter(attribute2=>attribute2.labels?.length).map(attribute2=>({id:null,attributes:[{entityKind:entity2.kind,attributeKey:attribute2.key}],labelCount:attribute2.labels.length}))),{items:lists,pagination}=paginateLabelItems(available,pageOptions,project.id,null,list30=>`${list30.attributes[0].entityKind}.${list30.attributes[0].attributeKey}`);if(json)client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,lists,pagination},null,2)}
771
+ `);else if(printAlignedLabel("Project",projectSlugLink),lists.length===0)output_manager_default.log(pageOptions.cursor?"No more label lists found.":"No label lists found.");else{let rows=lists.map(list30=>[`${list30.attributes[0].entityKind}.${list30.attributes[0].attributeKey}`,String(list30.labelCount)]);output_manager_default.print(`
772
772
  ${formatTable(["Attribute","Labels"],["l","r"],[{name:"",rows}])}
773
773
  `)}return printNextPage2(pagination.next),0}let entity=findEntity(settings.entities,kind),attribute=entity&&findAttribute(entity,attributeKey);if(!attribute)return reason=AGENT_REASON.NOT_FOUND,fail(entity?`Attribute ${kind}.${attributeKey} was not found in this project.`:`Entity ${kind} was not found in this project.`);if(inspectCommand2=`flags labels ls ${quoteArg(`${kind}.${attributeKey}`)} --json`,pageOptions){let{items:labels2,pagination}=paginateLabelItems(attribute.labels??[],pageOptions,project.id,`${kind}.${attributeKey}`,label=>label.value);if(json)client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,entityKind:kind,attributeKey,labels:labels2,pagination},null,2)}
774
774
  `);else if(printAlignedLabel("Project",projectSlugLink),printAlignedLabel("Attribute",`${kind}.${attributeKey}`),labels2.length===0)output_manager_default.log(pageOptions.cursor?"No more value labels found.":"No value labels found.");else{let rows=labels2.map(({value,label})=>[formatLabelCell(value),formatLabelCell(label)]);output_manager_default.print(`
@@ -799,7 +799,7 @@ ${deployHint}`),0}).catch(e2=>{throw output_manager_default.stopSpinner(),e2})}f
799
799
  `,finalSrc=import_chalk201.default.cyan(src.padEnd(longestSrc+padding2)),finalDest=dest?`${arrow}${space}${dest}`:` ${space}${destSpace}`,finalStatus=status6?import_chalk201.default.grey(`[${status6}]`):"",finalHeaders=null;if(headers){finalHeaders=`
800
800
  `;let headerKeys=Object.keys(headers);for(let header of headerKeys){let value=headers[header],last2=headerKeys.indexOf(header)===headerKeys.length-1,suffix2=last2?"":`
801
801
  `,prefix2=import_chalk201.default.grey(last2?"\u2514\u2500\u2500":"\u251C\u2500\u2500");finalHeaders+=`${prefix2} ${header}: ${value}${suffix2}`}}let prefix=import_chalk201.default.grey(finalHeaders?"\u250C":"\u2576"),fill=`${finalSrc}${finalDest}${space}${finalStatus}`;toPrint+=`${prefix} ${fill}${finalHeaders||""}${suffix}`}return toPrint}import{URL as URL2}from"url";function parseDeploymentUrl(input){let url;try{url=new URL2(input)}catch{return normalizeDeploymentId(input)}return url.hostname==="vercel.com"||url.hostname==="www.vercel.com"?parseVercelDashboardUrl(url):{deploymentIdOrHost:url.hostname}}function parseVercelDashboardUrl(url){let pathParts=url.pathname.split("/").filter(Boolean);if(pathParts.length>=3){let[scope,,deploymentId]=pathParts;return{deploymentIdOrHost:normalizeDeploymentId(deploymentId).deploymentIdOrHost,scope}}return{deploymentIdOrHost:url.hostname}}function normalizeDeploymentId(input){return input.includes(".")?{deploymentIdOrHost:input}:input.startsWith("dpl_")?{deploymentIdOrHost:input}:{deploymentIdOrHost:`dpl_${input}`}}var InspectTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(idOrHost){idOrHost&&this.trackCliArgument({arg:"deploymentIdOrHost",value:this.redactedValue})}trackCliOptionTimeout(timeout){timeout&&this.trackCliOption({option:"timeout",value:this.redactedValue})}trackCliFlagLogs(logs2){logs2&&this.trackCliFlag("logs")}trackCliFlagWait(wait){wait&&this.trackCliFlag("wait")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect13(client){let{print,error,warn}=output_manager_default,telemetry2=new InspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(inspectCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}if(parsedArguments.flags["--help"])return telemetry2.trackCliFlagHelp("inspect"),print(help(inspectCommand,{columns:client.stderr.columns})),2;parsedArguments.args[0]===inspectCommand.name&&parsedArguments.args.shift();let[deploymentIdOrHost]=parsedArguments.args;if(!deploymentIdOrHost){let stdInput=await readStandardInput(client.stdin);stdInput&&(deploymentIdOrHost=stdInput)}if(!deploymentIdOrHost)return error(`${getCommandName("inspect <url>")} expects exactly one argument`),print(help(inspectCommand,{columns:client.stderr.columns})),1;telemetry2.trackCliArgumentUrlOrDeploymentId(deploymentIdOrHost),telemetry2.trackCliOptionTimeout(parsedArguments.flags["--timeout"]),telemetry2.trackCliFlagLogs(parsedArguments.flags["--logs"]),telemetry2.trackCliFlagWait(parsedArguments.flags["--wait"]),telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),telemetry2.trackCliFlagJson(parsedArguments.flags["--json"]);let timeout=(0,import_ms19.default)(parsedArguments.flags["--timeout"]??"3m");if(timeout===void 0)return error(`Invalid timeout "${parsedArguments.flags["--timeout"]}"`),1;let contextName=null,parsed=parseDeploymentUrl(deploymentIdOrHost);if(deploymentIdOrHost=parsed.deploymentIdOrHost,parsed.scope&&!detectExplicitScope(client)){let team=(await getTeams(client)).find(t=>t.slug===parsed.scope);team&&(client.config.currentTeam=team.id)}try{({contextName}=await getScope(client))}catch(err){if((0,import_error_utils15.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let until=Date.now()+timeout,wait=parsedArguments.flags["--wait"]??!1,withLogs=parsedArguments.flags["--logs"],formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return error(formatResult.error),1;let asJson=formatResult.jsonOutput,startTimestamp=Date.now();asJson&&withLogs||output_manager_default.spinner(`Fetching deployment "${deploymentIdOrHost}" in ${import_chalk202.default.bold(contextName)}`);let deployment=await getDeployment(client,contextName,deploymentIdOrHost),abortController,buildLogsPromise;if(withLogs)if(asJson){let promise;({abortController,promise}=collectBuildLogs(client,deployment,wait)),buildLogsPromise=promise.catch(error2=>(warn(`Failed to read build logs: ${error2}`),[]))}else{let promise;({abortController,promise}=displayBuildLogs(client,deployment,wait)),wait?promise.catch(error2=>warn(`Failed to read build logs: ${error2}`)):await promise}for(;wait;){if(await sleep(250),deployment=await getDeployment(client,contextName,deploymentIdOrHost),!isDeploying(deployment.readyState)){abortController?.abort();break}if(Date.now()>until){warn(`stopped waiting after ${(0,import_ms19.default)(timeout,{long:!0})}`),abortController?.abort();break}}return asJson?(output_manager_default.stopSpinner(),withLogs?printLogsJson(client,await buildLogsPromise??[]):await printJson({deployment,contextName,client})):withLogs?print(`${import_chalk202.default.cyan("status")} ${stateString(deployment.readyState)}
802
- `):await printDetails({deployment,contextName,client,startTimestamp}),exitCode(deployment.readyState)}function stateString(s){let CIRCLE="\u25CF ",sTitle=s&&(0,import_title3.default)(s);switch(s){case"INITIALIZING":case"BUILDING":return import_chalk202.default.yellow(CIRCLE)+sTitle;case"ERROR":return import_chalk202.default.red(CIRCLE)+sTitle;case"READY":return import_chalk202.default.green(CIRCLE)+sTitle;case"QUEUED":return import_chalk202.default.gray(CIRCLE)+sTitle;case"CANCELED":return import_chalk202.default.gray(CIRCLE)+sTitle;default:return import_chalk202.default.gray("UNKNOWN")}}async function printDetails({deployment,contextName,client,startTimestamp}){output_manager_default.log(`Fetched deployment "${import_chalk202.default.bold(deployment.url)}" in ${import_chalk202.default.bold(contextName)} ${elapsed(Date.now()-startTimestamp)}`);let{id,name,url,createdAt,routes:routes2,readyState,alias:aliases2}=deployment,{print,link}=output_manager_default,{builds}=deployment.version===2?await client.fetch(`/v11/deployments/${id}/builds`):{builds:[]};print(`
802
+ `):await printDetails({deployment,contextName,client,startTimestamp}),exitCode(deployment.readyState)}function stateString(s){let CIRCLE="\u25CF ",sTitle=s&&(0,import_title3.default)(s);switch(s){case"INITIALIZING":case"BUILDING":return import_chalk202.default.yellow(CIRCLE)+sTitle;case"ERROR":case"BLOCKED":return import_chalk202.default.red(CIRCLE)+sTitle;case"READY":return import_chalk202.default.green(CIRCLE)+sTitle;case"QUEUED":return import_chalk202.default.gray(CIRCLE)+sTitle;case"CANCELED":return import_chalk202.default.gray(CIRCLE)+sTitle;default:return import_chalk202.default.gray("UNKNOWN")}}async function printDetails({deployment,contextName,client,startTimestamp}){output_manager_default.log(`Fetched deployment "${import_chalk202.default.bold(deployment.url)}" in ${import_chalk202.default.bold(contextName)} ${elapsed(Date.now()-startTimestamp)}`);let{id,name,url,createdAt,routes:routes2,readyState,readyStateReason,alias:aliases2}=deployment,{print,link}=output_manager_default,{builds}=deployment.version===2?await client.fetch(`/v11/deployments/${id}/builds`):{builds:[]};print(`
803
803
  `),print(import_chalk202.default.bold(` General
804
804
 
805
805
  `)),print(` ${import_chalk202.default.cyan("id")} ${id}
@@ -807,6 +807,7 @@ ${deployHint}`),0}).catch(e2=>{throw output_manager_default.stopSpinner(),e2})}f
807
807
  `);let target=deployment.customEnvironment?.slug??deployment.target??"preview";print(` ${import_chalk202.default.cyan("target")} `),print(deployment.customEnvironment&&deployment.team?.slug?`${link(`${target}`,`https://vercel.com/${deployment.team.slug}/${name}/settings/environments/${deployment.customEnvironment.id}`,{fallback:()=>target,color:!1})}
808
808
  `:`${target}
809
809
  `),print(` ${import_chalk202.default.cyan("status")} ${stateString(readyState)}
810
+ `),readyStateReason&&print(` ${import_chalk202.default.cyan("reason")} ${readyStateReason}
810
811
  `),print(` ${import_chalk202.default.cyan("url")} https://${url}
811
812
  `),createdAt&&print(` ${import_chalk202.default.cyan("created")} ${new Date(createdAt)} ${elapsed(Date.now()-createdAt,!0)}
812
813
  `),print(`
@@ -837,7 +838,7 @@ ${deployHint}`),0}).catch(e2=>{throw output_manager_default.stopSpinner(),e2})}f
837
838
 
838
839
  `)),print(indent_default(routes(routes2),4)),print(`
839
840
 
840
- `))}async function printJson({deployment,contextName,client}){let{id,name,url,createdAt,routes:routes2,readyState,alias:aliases2,target,customEnvironment}=deployment,{builds}=deployment.version===2?await client.fetch(`/v11/deployments/${id}/builds`):{builds:[]},buildMachine=getBuildMachineResourceConfig(deployment),jsonOutput={id,name,url,target:customEnvironment?.slug??target??"preview",readyState,createdAt,...deployment.duration&&{duration:deployment.duration},...buildMachine&&{buildMachine},...aliases2&&aliases2.length>0&&{aliases:aliases2},...builds.length>0&&{builds},...Array.isArray(routes2)&&routes2.length>0&&{routes:routes2},...contextName&&{contextName}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
841
+ `))}async function printJson({deployment,contextName,client}){let{id,name,url,createdAt,routes:routes2,readyState,readyStateReason,alias:aliases2,target,customEnvironment}=deployment,{builds}=deployment.version===2?await client.fetch(`/v11/deployments/${id}/builds`):{builds:[]},buildMachine=getBuildMachineResourceConfig(deployment),jsonOutput={id,name,url,target:customEnvironment?.slug??target??"preview",readyState,...readyStateReason&&{readyStateReason},createdAt,...deployment.duration&&{duration:deployment.duration},...buildMachine&&{buildMachine},...aliases2&&aliases2.length>0&&{aliases:aliases2},...builds.length>0&&{builds},...Array.isArray(routes2)&&routes2.length>0&&{routes:routes2},...contextName&&{contextName}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
841
842
  `)}function getPostBuildDuration(duration){if(duration?.timeToReady===void 0||duration.timeToContainerExit===void 0)return;let postBuildDuration=duration.timeToContainerExit-duration.timeToReady;return postBuildDuration>=0?postBuildDuration:void 0}function formatDuration2(durationMs){if(durationMs===void 0)return"unavailable";if(durationMs<1e3)return`${durationMs}ms`;let totalSeconds=Math.round(durationMs/1e3),minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60;return minutes===0?`${seconds}s`:seconds===0?`${minutes}m`:`${minutes}m ${seconds}s`}function formatCpuMinutes(billedBuildCpuMs,billableDurationMs,assignedCpuCores){if(billedBuildCpuMs===void 0)return"unavailable";let minutes=billedBuildCpuMs/6e4,calculation=billableDurationMs!==void 0&&assignedCpuCores!==void 0?` (${formatDuration2(billableDurationMs)} x ${assignedCpuCores}vCPU)`:"";return`${minutes} minutes${calculation}`}function printLogsJson(client,logs2){client.stdout.write(`${JSON.stringify(logs2,null,2)}
842
843
  `)}function exitCode(state){return state==="ERROR"||state==="CANCELED"?1:0}var import_chalk207=__toESM(require_source(),1),import_execa2=__toESM(require_execa(),1),import_error_utils16=__toESM(require_dist(),1),import_open14=__toESM(require_open(),1);function isAutoProvisionFallback(error){return typeof error=="object"&&error!==null&&"kind"in error&&error.kind!=="provisioned"&&"url"in error&&"integration"in error&&"product"in error}async function autoProvisionResource(client,integrationSlug,productSlug,name,metadata,acceptedPolicies,billingPlanId,installationId,installationMetadata){let endpoint=`/v1/integrations/integration/${encodeURIComponent(integrationSlug)}/marketplace/auto-provision/${encodeURIComponent(productSlug)}`,body={name,metadata,acceptedPolicies,source:"cli",...billingPlanId?{billingPlanId}:{},...installationId?{installationId}:{},...installationMetadata&&Object.keys(installationMetadata).length>0?{installationMetadata}:{}};output_manager_default.debug(`Auto-provision request: POST ${endpoint}`),output_manager_default.debug(`Auto-provision body: ${JSON.stringify(body,null,2)}`);try{let res=await client.fetch(endpoint,{method:"POST",json:!1,body});if(res.ok)return res.json();throw new Error(`Auto-provision failed: ${res.status}`)}catch(error){if(error instanceof APIError&&error.status===422&&isAutoProvisionFallback(error))return output_manager_default.debug("Auto-provision returned 422 fallback response"),error;throw output_manager_default.debug(`Auto-provision error: ${error}`),error}}var import_chalk203=__toESM(require_source(),1);async function fetchMarketplaceIntegrationsList(client,categories2){let params=new URLSearchParams({integrationType:"marketplace"});if(categories2?.length)for(let category of categories2)params.append("category",category);return client.fetch(`/v2/integrations/integrations?${params.toString()}`,{json:!0})}async function fetchIntegration(client,slug){return client.fetch(`/v2/integrations/integration/${slug}`,{json:!0})}function toDiscoverEntries(integrations){let entries=[];for(let integration of integrations){if(!integration.isMarketplace||!integration.canInstall)continue;let integrationTags=integration.tagIds??[],products=integration.products??[];if(products.length===0){entries.push({name:integration.name,slug:integration.slug,provider:integration.name,description:integration.shortDescription??"",tags:integrationTags});continue}for(let product of products){let needsCompoundSlug=products.length>1||product.slug!==integration.slug;entries.push({name:product.name,slug:needsCompoundSlug?`${integration.slug}/${product.slug}`:integration.slug,provider:integration.name,description:product.shortDescription??integration.shortDescription??"",tags:[...integrationTags,...product.tags??[]]})}}return entries}function matchesSearchTerm(entry2,term){let lower=term.toLowerCase();return entry2.name.toLowerCase().includes(lower)||entry2.slug.toLowerCase().includes(lower)||entry2.provider.toLowerCase().includes(lower)||entry2.description.toLowerCase().includes(lower)||entry2.tags.some(tag=>tag.toLowerCase().includes(lower))}async function resolveAndFetchIntegration(client,slug,telemetry2){let directError;try{let integration=await fetchIntegration(client,slug);return telemetry2.trackCliArgumentIntegration(slug,!0),integration}catch(error){directError=error}output_manager_default.spinner("Searching marketplace integrations...",500);let entries;try{let integrations=await fetchMarketplaceIntegrationsList(client);entries=toDiscoverEntries(integrations)}catch(discoverError){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to get integration "${slug}": ${directError?.message??discoverError.message}`),telemetry2.trackCliArgumentIntegration(slug,!1),null}output_manager_default.stopSpinner();let matches=entries.filter(entry2=>matchesSearchTerm(entry2,slug));if(!matches.length)return output_manager_default.error(`No integration found matching "${slug}". Run ${import_chalk203.default.cyan("vercel integration discover")} to browse available integrations.`),telemetry2.trackCliArgumentIntegration(slug,!1),null;if(matches.length===1){let match=matches[0];if(client.stdin.isTTY===!0&&!await client.input.confirm(`Install ${import_chalk203.default.bold(match.name)} (${match.slug})?`,!0))return telemetry2.trackCliArgumentIntegration(slug,!1),null;slug=match.slug}else{if(client.stdin.isTTY!==!0)return output_manager_default.error(`Found ${matches.length} integrations matching "${slug}". Available integrations:
843
844
  ${matches.map(m=>`- ${m.slug}: ${m.description}`).join(`
@@ -885,7 +886,7 @@ ${table([["Name","Status","Product","Integration","Projects"].map(header=>import
885
886
  `);else if(client.stdout.isTTY){let label=isResource?`Opening the ${import_chalk219.default.bold(name)} resource dashboard...`:`Opening the ${import_chalk219.default.bold(name)} dashboard...`;output_manager_default.print(label),(0,import_open15.default)(link)}else client.stdout.write(`${link}
886
887
  `)}var import_chalk220=__toESM(require_source(),1);async function removeIntegration(client,configuration){return client.fetch(`/v2/integrations/installations/${configuration.id}/uninstall`,{json:!0,body:{},method:"POST"})}var IntegrationRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove11(client,argv){let telemetry2=new IntegrationRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(removeSubcommand11.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"];if(telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;if(client.config.currentTeam=team.id,parsedArguments.args.length<1){let message="You must specify an integration. See `--help` for details.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message,hint:"Put global flags (`--cwd`, `--non-interactive`, etc.) first, then `integration remove <slug> --yes`. Replace `<slug>` with your integration; non-interactive removal requires `--yes`.",next:[{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"List integration slugs for this team"},{command:buildCommandWithGlobalFlags(client.argv,"integration remove <slug> --yes",packageName,{prependGlobalFlags:!0}),when:"Substitute your integration slug for <slug> (angle brackets are not part of the command)"}]},1),output_manager_default.error(message),1}if(parsedArguments.args.length>1){let message="Cannot specify more than one integration at a time.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,hint:`Use one slug only: \`${packageName} [global flags] integration remove <slug> --yes\`. Global flags belong before \`integration\`.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration remove <slug> --yes",packageName,{prependGlobalFlags:!0}),when:"Single slug in place of <slug>; keep one integration remove invocation"}]},1),output_manager_default.error(message),1}let integrationName=parsedArguments.args[0];output_manager_default.spinner("Retrieving integration\u2026",500);let integrationConfiguration=await getFirstConfiguration(client,integrationName);if(output_manager_default.stopSpinner(),!integrationConfiguration)return output_manager_default.error(`No integration ${import_chalk220.default.bold(integrationName)} found.`),telemetry2.trackCliArgumentIntegration(integrationName,!1),1;if(telemetry2.trackCliArgumentIntegration(integrationName,!0),!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!await confirmIntegrationRemoval(client,integrationConfiguration.slug,team))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Uninstalling integration\u2026",1e3),await removeIntegration(client,integrationConfiguration)}catch(error){if(isAPIError(error)&&error.status===403&&error.serverMessage.includes("resources")){let resourceNames=[];try{let searchParams=new URLSearchParams;searchParams.set("teamId",team.id),searchParams.set("integrationConfigurationId",integrationConfiguration.id),searchParams.set("skip-metadata","true");let{stores}=await client.fetch(`/v1/storage/stores?${searchParams}`,{json:!0});resourceNames=stores.map(s=>s.name)}catch{}if(asJson||shouldEmitNonInteractiveCommandError(client)){output_manager_default.stopSpinner();let approvalHint="Remove each resource with --disconnect-all (non-interactive: include --yes). Get user approval before destructive resource removal.",resourceTail=asJson?"--disconnect-all --yes --json":"--disconnect-all --yes",integrationRemoveTail=asJson?"--yes --json":"--yes",suggestNextOpts={prependGlobalFlags:!0,excludeFlags:["--yes","-y"]},payload={status:"error",reason:AGENT_REASON.HAS_RESOURCES,integration:integrationName,removed:!1,error:"has_resources",message:`Cannot uninstall ${integrationName} because it still has resources.`,resources:resourceNames,hint:client.isAgent?`${approvalHint} Agents must obtain explicit user approval before running integration resource remove.`:approvalHint,userActionRequired:client.isAgent?!0:void 0,next:resourceNames.map(name=>({command:buildCommandWithGlobalFlags(client.argv,`integration resource remove ${name} ${resourceTail}`,packageName,suggestNextOpts),when:`Disconnect and remove resource ${name}; substitute the real resource name if different`})),retry:buildCommandWithGlobalFlags(client.argv,`integration remove ${integrationName} ${integrationRemoveTail}`,packageName,suggestNextOpts)};return client.stdout.write(`${JSON.stringify(payload,null,2)}
887
888
  `),1}if(output_manager_default.error(`Cannot uninstall ${import_chalk220.default.bold(integrationName)} because it still has resources.`),resourceNames.length>0){output_manager_default.log(""),output_manager_default.log("Resources that must be removed first:");for(let name of resourceNames)output_manager_default.log(` ${import_chalk220.default.gray("-")} ${name}`);output_manager_default.log("")}return client.isAgent&&output_manager_default.log("AGENT: You must get user approval before running any resource removal commands."),output_manager_default.log(`Remove and disconnect all resources first with: ${import_chalk220.default.cyan(`${packageName} integration resource remove <resource-name> --disconnect-all`)}`),output_manager_default.log(`Then retry: ${import_chalk220.default.cyan(`${packageName} integration remove ${integrationName}`)}`),1}return output_manager_default.error(import_chalk220.default.red(`Failed to remove ${import_chalk220.default.bold(integrationName)}: ${error.message}`)),1}return asJson?(output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({integration:integrationName,removed:!0},null,2)}
888
- `),0):(output_manager_default.success(`${import_chalk220.default.bold(integrationName)} successfully removed.`),0)}async function confirmIntegrationRemoval(client,integration,team){return output_manager_default.log(`The ${import_chalk220.default.bold(integration)} integration will be removed permanently from team ${import_chalk220.default.bold(team.name)}.`),client.input.confirm(`${import_chalk220.default.red("Are you sure?")}`,!1)}var import_chalk221=__toESM(require_source(),1);async function patchIntegrationConfiguration(client,configurationId,body){return client.fetch(`/v1/integrations/configuration/${encodeURIComponent(configurationId)}`,{method:"PATCH",body,json:!0})}var IntegrationUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliOptionAuthorizationId(v){v&&this.trackCliOption({option:"authorization-id",value:this.redactedValue})}trackCliOptionProjects(v){v?.length&&this.trackCliOption({option:"projects",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function selectConfiguration(configurations,integrationSlug,installationId){if(configurations.length===0)return{ok:!1,reason:AGENT_REASON.NOT_FOUND,message:`No integration "${integrationSlug}" found.`};if(installationId){let found=configurations.find(c=>c.id===installationId);if(!found){let known=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`No installation matching --installation-id ${installationId}. Known configuration IDs: ${known}`}}return{ok:!0,configuration:found}}if(configurations.length>1){let list29=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Multiple installations found for "${integrationSlug}": ${list29}. Re-run with --installation-id <id> to select one. Run \`${packageName} integration installations\` to list installation IDs for this team.`}}return{ok:!0,configuration:configurations[0]}}function buildProjectsBody(raw){return!raw||raw.length===0?{error:'Expected at least one --projects value (use "all" or project IDs).'}:raw.length===1&&raw[0]==="all"?{projects:"all"}:raw.includes("all")?{error:'Cannot mix "all" with specific project IDs. Use only --projects all, or repeat --projects for each project ID.'}:{projects:raw}}function emitUpdateCliError(client,message,reason,exitCode2,extra){outputAgentError(client,{status:"error",reason,message,...extra},exitCode2),output_manager_default.error(message)}async function update4(client,argv){let telemetry2=new IntegrationUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(updateSubcommand6.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){let msg=error instanceof Error?error.message:String(error);return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg},1),printError(error),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return emitUpdateCliError(client,formatResult.error,AGENT_REASON.INVALID_ARGUMENTS,1),1;let preferJson=formatResult.jsonOutput||!!client.nonInteractive,plan=parsedArguments.flags["--plan"],projectsRaw=parsedArguments.flags["--projects"],authorizationId=parsedArguments.flags["--authorization-id"],installationId=parsedArguments.flags["--installation-id"];if(parsedArguments.args.length<1){let hadSubcommandOptsFirst=projectsRaw!==void 0&&projectsRaw.length>0||plan!==void 0,msg=hadSubcommandOptsFirst?`Put the integration slug immediately after \`update\`, before \`--projects\`, \`--plan\`, or other subcommand options. Example: \`${packageName} integration update neon --projects all\`.`:`You must specify an integration slug after \`update\`. Example: \`${packageName} integration update neon --projects all\` or \`${packageName} integration update neon --plan <plan-id>\`.`;return emitUpdateCliError(client,msg,AGENT_REASON.MISSING_ARGUMENTS,1,{hint:hadSubcommandOptsFirst?`You used \`--projects\` or \`--plan\` without a preceding integration name. Use \`${packageName} integration update <integration> --projects \u2026\`. Global flags such as \`--cwd\` may appear anywhere.`:`Run \`${packageName} integration installations\` to list slugs and installation IDs for your team.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration update neon --projects all",packageName,{prependGlobalFlags:!0}),when:"Correct order: integration slug first, then --projects (replace neon)"},{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"Discover which integration slug to use"}]}),1}if(parsedArguments.args.length>1)return emitUpdateCliError(client,"Cannot specify more than one integration at a time.",AGENT_REASON.INVALID_ARGUMENTS,2),2;let integrationSlug=parsedArguments.args[0],hasPlan=plan!==void 0,projectsOutcome=projectsRaw!==void 0?buildProjectsBody(projectsRaw):null;if(hasPlan&&projectsRaw!==void 0&&projectsRaw.length>0)return emitUpdateCliError(client,"Pass either --plan or --projects, not both. See `vercel integration update --help`.",AGENT_REASON.INVALID_ARGUMENTS,1),1;if(!hasPlan&&!projectsOutcome)return emitUpdateCliError(client,"Nothing to update. Pass --plan to change billing plan, or --projects to change project access.",AGENT_REASON.MISSING_ARGUMENTS,1,{hint:`Example: \`${packageName} integration update ${integrationSlug} --projects all\``}),1;if(projectsOutcome&&"error"in projectsOutcome)return emitUpdateCliError(client,projectsOutcome.error,AGENT_REASON.INVALID_ARGUMENTS,1),1;let hasProjects=!!(projectsOutcome&&!("error"in projectsOutcome));telemetry2.trackCliOptionPlan(plan),telemetry2.trackCliOptionAuthorizationId(authorizationId),telemetry2.trackCliOptionProjects(projectsRaw),telemetry2.trackCliOptionInstallationId(installationId),telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]);let{team}=await getScope(client);if(!team)return emitUpdateCliError(client,"Team not found.",AGENT_REASON.MISSING_SCOPE,1,{next:[{command:buildCommandWithGlobalFlags(client.argv,"teams switch",packageName,{prependGlobalFlags:!0}),when:"Switch to a team that has this integration"}]}),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving integration\u2026",500);let configurations=await fetchMarketplaceIntegrations(client,integrationSlug);output_manager_default.stopSpinner();let selected=selectConfiguration(configurations,integrationSlug,installationId);if(!selected.ok)return emitUpdateCliError(client,selected.message,selected.reason,1),telemetry2.trackCliArgumentIntegration(integrationSlug,!1),1;telemetry2.trackCliArgumentIntegration(integrationSlug,!0);let body=hasPlan?{billingPlanId:plan,...authorizationId?{authorizationId}:{}}:projectsOutcome;try{output_manager_default.spinner("Updating integration\u2026",1e3),await patchIntegrationConfiguration(client,selected.configuration.id,body),output_manager_default.stopSpinner()}catch(error){output_manager_default.stopSpinner();let apiMsg=isAPIError(error)&&error.serverMessage||error.message;return emitUpdateCliError(client,`Failed to update ${integrationSlug}: ${apiMsg}`,AGENT_REASON.API_ERROR,1),1}return preferJson?(client.stdout.write(`${JSON.stringify({integration:integrationSlug,configurationId:selected.configuration.id,updated:!0,...hasPlan?{billingPlanId:plan}:{},...hasProjects?{projects:body.projects}:{}},null,2)}
889
+ `),0):(output_manager_default.success(`${import_chalk220.default.bold(integrationName)} successfully removed.`),0)}async function confirmIntegrationRemoval(client,integration,team){return output_manager_default.log(`The ${import_chalk220.default.bold(integration)} integration will be removed permanently from team ${import_chalk220.default.bold(team.name)}.`),client.input.confirm(`${import_chalk220.default.red("Are you sure?")}`,!1)}var import_chalk221=__toESM(require_source(),1);async function patchIntegrationConfiguration(client,configurationId,body){return client.fetch(`/v1/integrations/configuration/${encodeURIComponent(configurationId)}`,{method:"PATCH",body,json:!0})}var IntegrationUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliOptionAuthorizationId(v){v&&this.trackCliOption({option:"authorization-id",value:this.redactedValue})}trackCliOptionProjects(v){v?.length&&this.trackCliOption({option:"projects",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function selectConfiguration(configurations,integrationSlug,installationId){if(configurations.length===0)return{ok:!1,reason:AGENT_REASON.NOT_FOUND,message:`No integration "${integrationSlug}" found.`};if(installationId){let found=configurations.find(c=>c.id===installationId);if(!found){let known=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`No installation matching --installation-id ${installationId}. Known configuration IDs: ${known}`}}return{ok:!0,configuration:found}}if(configurations.length>1){let list30=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Multiple installations found for "${integrationSlug}": ${list30}. Re-run with --installation-id <id> to select one. Run \`${packageName} integration installations\` to list installation IDs for this team.`}}return{ok:!0,configuration:configurations[0]}}function buildProjectsBody(raw){return!raw||raw.length===0?{error:'Expected at least one --projects value (use "all" or project IDs).'}:raw.length===1&&raw[0]==="all"?{projects:"all"}:raw.includes("all")?{error:'Cannot mix "all" with specific project IDs. Use only --projects all, or repeat --projects for each project ID.'}:{projects:raw}}function emitUpdateCliError(client,message,reason,exitCode2,extra){outputAgentError(client,{status:"error",reason,message,...extra},exitCode2),output_manager_default.error(message)}async function update4(client,argv){let telemetry2=new IntegrationUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(updateSubcommand6.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){let msg=error instanceof Error?error.message:String(error);return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg},1),printError(error),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return emitUpdateCliError(client,formatResult.error,AGENT_REASON.INVALID_ARGUMENTS,1),1;let preferJson=formatResult.jsonOutput||!!client.nonInteractive,plan=parsedArguments.flags["--plan"],projectsRaw=parsedArguments.flags["--projects"],authorizationId=parsedArguments.flags["--authorization-id"],installationId=parsedArguments.flags["--installation-id"];if(parsedArguments.args.length<1){let hadSubcommandOptsFirst=projectsRaw!==void 0&&projectsRaw.length>0||plan!==void 0,msg=hadSubcommandOptsFirst?`Put the integration slug immediately after \`update\`, before \`--projects\`, \`--plan\`, or other subcommand options. Example: \`${packageName} integration update neon --projects all\`.`:`You must specify an integration slug after \`update\`. Example: \`${packageName} integration update neon --projects all\` or \`${packageName} integration update neon --plan <plan-id>\`.`;return emitUpdateCliError(client,msg,AGENT_REASON.MISSING_ARGUMENTS,1,{hint:hadSubcommandOptsFirst?`You used \`--projects\` or \`--plan\` without a preceding integration name. Use \`${packageName} integration update <integration> --projects \u2026\`. Global flags such as \`--cwd\` may appear anywhere.`:`Run \`${packageName} integration installations\` to list slugs and installation IDs for your team.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration update neon --projects all",packageName,{prependGlobalFlags:!0}),when:"Correct order: integration slug first, then --projects (replace neon)"},{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"Discover which integration slug to use"}]}),1}if(parsedArguments.args.length>1)return emitUpdateCliError(client,"Cannot specify more than one integration at a time.",AGENT_REASON.INVALID_ARGUMENTS,2),2;let integrationSlug=parsedArguments.args[0],hasPlan=plan!==void 0,projectsOutcome=projectsRaw!==void 0?buildProjectsBody(projectsRaw):null;if(hasPlan&&projectsRaw!==void 0&&projectsRaw.length>0)return emitUpdateCliError(client,"Pass either --plan or --projects, not both. See `vercel integration update --help`.",AGENT_REASON.INVALID_ARGUMENTS,1),1;if(!hasPlan&&!projectsOutcome)return emitUpdateCliError(client,"Nothing to update. Pass --plan to change billing plan, or --projects to change project access.",AGENT_REASON.MISSING_ARGUMENTS,1,{hint:`Example: \`${packageName} integration update ${integrationSlug} --projects all\``}),1;if(projectsOutcome&&"error"in projectsOutcome)return emitUpdateCliError(client,projectsOutcome.error,AGENT_REASON.INVALID_ARGUMENTS,1),1;let hasProjects=!!(projectsOutcome&&!("error"in projectsOutcome));telemetry2.trackCliOptionPlan(plan),telemetry2.trackCliOptionAuthorizationId(authorizationId),telemetry2.trackCliOptionProjects(projectsRaw),telemetry2.trackCliOptionInstallationId(installationId),telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]);let{team}=await getScope(client);if(!team)return emitUpdateCliError(client,"Team not found.",AGENT_REASON.MISSING_SCOPE,1,{next:[{command:buildCommandWithGlobalFlags(client.argv,"teams switch",packageName,{prependGlobalFlags:!0}),when:"Switch to a team that has this integration"}]}),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving integration\u2026",500);let configurations=await fetchMarketplaceIntegrations(client,integrationSlug);output_manager_default.stopSpinner();let selected=selectConfiguration(configurations,integrationSlug,installationId);if(!selected.ok)return emitUpdateCliError(client,selected.message,selected.reason,1),telemetry2.trackCliArgumentIntegration(integrationSlug,!1),1;telemetry2.trackCliArgumentIntegration(integrationSlug,!0);let body=hasPlan?{billingPlanId:plan,...authorizationId?{authorizationId}:{}}:projectsOutcome;try{output_manager_default.spinner("Updating integration\u2026",1e3),await patchIntegrationConfiguration(client,selected.configuration.id,body),output_manager_default.stopSpinner()}catch(error){output_manager_default.stopSpinner();let apiMsg=isAPIError(error)&&error.serverMessage||error.message;return emitUpdateCliError(client,`Failed to update ${integrationSlug}: ${apiMsg}`,AGENT_REASON.API_ERROR,1),1}return preferJson?(client.stdout.write(`${JSON.stringify({integration:integrationSlug,configurationId:selected.configuration.id,updated:!0,...hasPlan?{billingPlanId:plan}:{},...hasProjects?{projects:body.projects}:{}},null,2)}
889
890
  `),0):(output_manager_default.success(`${import_chalk221.default.bold(integrationSlug)} installation updated successfully.`),0)}var import_chalk222=__toESM(require_source(),1);async function fetchIntegrationCategories(client){return client.fetch("/v2/integrations/categories",{json:!0})}async function categories(client,args){let parsedArguments=null,flagsSpecification=getFlagsSpecification(categoriesSubcommand.options);try{parsedArguments=parseArguments(args,flagsSpecification)}catch(error){return printError(error),1}if(parsedArguments.args.length>0)return output_manager_default.error("Invalid number of arguments. Usage: `vercel integration categories`"),1;let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;output_manager_default.spinner("Fetching integration categories...",500);let fetched;try{fetched=await fetchIntegrationCategories(client)}catch(error){return output_manager_default.error(`Failed to fetch integration categories: ${error.message}`),1}output_manager_default.stopSpinner();let projected=fetched.map(({slug,title:title6})=>({slug,title:title6}));if(asJson)return client.stdout.write(`${JSON.stringify({categories:projected},null,2)}
890
891
  `),0;if(projected.length===0)return output_manager_default.log("No integration categories found."),0;let formattedOutput=client.stderr.columns>0&&client.stderr.columns<80?formatCompactList(projected):formatTable2(projected);return output_manager_default.log(`Available marketplace categories:
891
892
  `+formattedOutput),0}function formatTable2(items){return table([["Slug","Title"].map(header=>import_chalk222.default.bold(import_chalk222.default.cyan(header))),...items.map(item=>[item.slug,item.title])],{hsep:4})}function formatCompactList(items){return items.map(item=>`${import_chalk222.default.bold(item.slug)} ${item.title}`).join(`
@@ -1026,12 +1027,12 @@ Starting setup...
1026
1027
  `),output_manager_default.print(` 7. Click Add
1027
1028
  `),output_manager_default.print(` 8. Follow the authorization steps
1028
1029
  `),output_manager_default.print("\u2500".repeat(50)+`
1029
- `))}}if(client.nonInteractive){let jsonOutput={status:"ok",summary,hint:"Restart your MCP client(s) to apply changes.",next:[{command:`${packageName} link`,when:"To link a project for project-specific MCP (optional)"}]};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1030
+ `))}}if(client.nonInteractive){let jsonOutput={status:"ok",summary,hint:"Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.",next:[{command:`${packageName} link`,when:"To link a project for project-specific MCP (optional)"}]};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1030
1031
  `),0}return output_manager_default.print(`\u{1F4CA} Setup Summary
1031
1032
  `),output_manager_default.print("\u2500".repeat(50)+`
1032
1033
  `),summary.forEach(line2=>output_manager_default.print(`${line2}
1033
- `)),output_manager_default.print(`\u2728 Setup complete! Restart your clients if needed.
1034
- `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG50={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-EQCAQVSE.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-NNJNXQZG.js")).default;return queryFn(client,telemetry2)}}}var import_chalk238=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let{contextName}=await getScope(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk238.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk238.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk238.default.gray(microfrontendsStamp())}`,emoji("success"))}
1034
+ `)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
1035
+ `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG50={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-EPUGS3PX.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-P35ZTMXV.js")).default;return queryFn(client,telemetry2)}}}var import_chalk238=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let{contextName}=await getScope(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk238.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk238.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk238.default.gray(microfrontendsStamp())}`,emoji("success"))}
1035
1036
  `),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk239=__toESM(require_source(),1);import{writeFile as writeFile6}from"fs/promises";import{existsSync as existsSync3}from"fs";import{join as join36}from"path";async function ensureMicrofrontendsContext(client,options){let link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm:options?.autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link;if(org.type!=="team")return output_manager_default.error("Microfrontends are only available for teams."),1;client.config.currentTeam=org.id;let{team}=await getScope(client);return team?{project,org,team,repoRoot}:(output_manager_default.error("Microfrontends are only available for teams."),1)}async function fetchMicrofrontendsGroups(client,teamId){output_manager_default.spinner("Fetching microfrontends groups\u2026");let response=await client.fetch(`/v1/microfrontends/groups?teamId=${teamId}`,{method:"GET"});return output_manager_default.stopSpinner(),response}function validateDefaultRoute(path3){if(!path3||!path3.startsWith("/"))return"Route must start with /";if(/\s/.test(path3))return"Route must not contain spaces";if(path3.includes("?")||path3.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path3,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path3){return!path3||!path3.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path3)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk239.default.bold(teamSlug)}.`),output_manager_default.log("");let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsGroupsPerTeam,maxMicrofrontendsPerGroup}=groupsResponse,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(groups.length>=maxMicrofrontendsGroupsPerTeam){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends group limit for ${planName}. Upgrade to Pro to create more groups.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Maximum number of microfrontends groups (${maxMicrofrontendsGroupsPerTeam}) reached.`),1}let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),1;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),1;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),1}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),1;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route;if(routeFromFlag)route=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),1;route=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk239.default.bold("Billing")),output_manager_default.log(` ${import_chalk239.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk239.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk239.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk239.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk239.default.green(`${freeRemaining} free`)+", "+import_chalk239.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk239.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk239.default.bold("Request fee:")} ${import_chalk239.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects)output_manager_default.log(`This group is within the free tier, so no project fee will be charged to ${import_chalk239.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`);else{let newPaidProjects=Math.min(newProjectCount,totalAfter-freeProjects);output_manager_default.log(`By proceeding, ${import_chalk239.default.bold(teamSlug)} will be charged for ${newPaidProjects} additional paid project${newPaidProjects>1?"s":""} on the team's monthly bill.`)}if(output_manager_default.log(""),!autoConfirm&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to confirm group creation in non-interactive mode."),1;if(!(autoConfirm||await client.input.confirm("Create microfrontends group?",!0)))return output_manager_default.log("Aborted."),0;let createStamp=stamp_default();output_manager_default.spinner("Creating microfrontends group\u2026");try{await client.fetch(`/v1/microfrontends/group?teamId=${team.id}`,{method:"POST",body:{groupName,defaultApp:{projectId:defaultApp.id,defaultRoute},otherApplications}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${defaultApp.name}/settings/microfrontends`;output_manager_default.success(`Microfrontends group "${groupName}" created ${import_chalk239.default.gray(createStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`);let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0;if(linkedProject&&linkedProject.id===defaultApp.id){let repoRoot=link.status==="linked"?link.repoRoot:void 0,projectDir=repoRoot?join36(repoRoot,linkedProject.rootDirectory||""):client.cwd,configPath=join36(projectDir,"microfrontends.json");if(!existsSync3(configPath)&&(output_manager_default.log(""),output_manager_default.log(`No changes to production traffic will take effect until a ${import_chalk239.default.bold("microfrontends.json")} is added to the default app. This configuration file specifies the path routing for the microfrontends group.`),client.stdin.isTTY&&!isNonInteractive&&await client.input.confirm("Create a microfrontends.json now?",!0))){let routingPaths={};for(let project of otherProjects){output_manager_default.log(`Enter routing paths for ${import_chalk239.default.bold(project.name)} (comma-separated, e.g. /docs, /docs/*)`);let pathsInput=await client.input.text({message:`Paths for ${project.name}:`,validate:val=>{if(!val.trim())return"At least one path is required";let paths=val.split(",").map(p=>p.trim());for(let p of paths){let result=validateRoutingPath(p);if(result!==!0)return`Invalid path "${p}": ${result}`}return!0}});routingPaths[project.name]=pathsInput.split(",").map(p=>p.trim())}let productionAlias=defaultApp.targets?.production?.alias?.[0],config=generateMicrofrontendsConfig(defaultApp.name,routingPaths,productionAlias);await writeFile6(configPath,config+`
1036
1037
  `,"utf-8"),output_manager_default.success(`Created ${import_chalk239.default.bold("microfrontends.json")}`),output_manager_default.log("Create a preview deployment to test microfrontends before deploying to production.")}}else output_manager_default.log(`Next step: Add a ${import_chalk239.default.bold("microfrontends.json")} to your default app. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`);return 0}function generateMicrofrontendsConfig(defaultAppName,routingPaths,productionAlias){let fallback=productionAlias||"...your-production-domain.vercel.app",applications={[defaultAppName]:{development:{fallback}}};for(let[name,paths]of Object.entries(routingPaths))applications[name]={routing:[{paths}]};return JSON.stringify({$schema:"https://openapi.vercel.sh/microfrontends.json",applications},null,2)}function validateGroupName(name,existingGroups){return!name||name.trim().length===0?"Group name cannot be empty.":name.length>MAX_GROUP_NAME_LENGTH?`Group name must be ${MAX_GROUP_NAME_LENGTH} characters or less.`:existingGroups.some(g=>g.group.name===name)?`A group named "${name}" already exists.`:!0}function isProjectInMicrofrontendsGroup(project,groups){return groups.some(g=>g.projects.some(p=>p.id===project.id))}function parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp){let routeByProjectId=new Map;if(!projectDefaultRouteFlags||projectDefaultRouteFlags.length===0)return routeByProjectId;for(let entry2 of projectDefaultRouteFlags){let separatorIndex=entry2.indexOf("=");if(separatorIndex<=0||separatorIndex===entry2.length-1)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let projectIdentifier=entry2.slice(0,separatorIndex).trim(),route=entry2.slice(separatorIndex+1).trim();if(!projectIdentifier||!route)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let project=selectedProjects.find(p=>p.name===projectIdentifier||p.id===projectIdentifier);if(!project)return`Invalid --project-default-route value "${entry2}". Project "${projectIdentifier}" is not one of the selected projects.`;if(project.id===defaultApp.id)return`Invalid --project-default-route value "${entry2}". Use --default-route for the default app "${defaultApp.name}".`;let routeValidation=validateDefaultRoute(route);if(routeValidation!==!0)return`Invalid --project-default-route value "${entry2}": ${routeValidation}`;if(routeByProjectId.has(project.id))return`Duplicate --project-default-route for project "${project.name}".`;routeByProjectId.set(project.id,route)}return routeByProjectId}var import_chalk240=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2,totalAfter=existingMfeProjectCount+1,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(isLimitedPlan&&totalAfter>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}output_manager_default.log(`Adding project ${import_chalk240.default.bold(project.name)} to a microfrontends group on ${import_chalk240.default.bold(teamSlug)}.`),output_manager_default.log("");let groupFlag=parsedArgs.flags["--group"],defaultRouteFlag=parsedArgs.flags["--default-route"];if(totalAfter>freeProjects){if(client.nonInteractive){let settingsUrl2=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`,flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends add-to-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Adding a project to a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:openUrlInBrowserCommand(settingsUrl2),when:"user opens Microfrontends settings in the browser"},{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1)}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}if(selectedGroup.projects.length>=maxMicrofrontendsPerGroup){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Group "${selectedGroup.group.name}" has reached the maximum number of projects (${maxMicrofrontendsPerGroup}).`),1}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else client.stdin.isTTY&&(output_manager_default.log("Specify a default route for the project. This path will be used for deployment screenshots and the default link to the project."),defaultRoute=await client.input.text({message:"Default route (e.g. /docs):",validate:validateDefaultRoute}));output_manager_default.log(""),output_manager_default.log(import_chalk240.default.bold("Billing")),output_manager_default.log(` ${import_chalk240.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk240.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk240.default.yellow("$250.00/month"):projectFee=import_chalk240.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk240.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk240.default.bold("Request fee:")} ${import_chalk240.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects?output_manager_default.log(`Adding "${project.name}" is within the free tier, so no project fee will be charged to ${import_chalk240.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk240.default.bold(teamSlug)} will be charged for this project on the team's monthly bill.`),output_manager_default.log(""),!await client.input.confirm(`Add "${project.name}" to "${selectedGroup.group.name}"?`,!0))return output_manager_default.log("Aborted."),0;let addStamp=stamp_default();output_manager_default.spinner("Adding project to microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{microfrontendsGroupId:selectedGroup.group.id,isDefaultApp:!1,defaultRoute,enabled:!0}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`;return output_manager_default.success(`Project "${project.name}" added to group "${selectedGroup.group.name}" ${import_chalk240.default.gray(addStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`),output_manager_default.log(`Next step: Add routing paths for this project in your microfrontends.json configuration. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`),0}var import_chalk241=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk241.default.bold(project.name)} from microfrontends group ${import_chalk241.default.bold(projectGroup.group.name)} on ${import_chalk241.default.bold(teamSlug)}.`),output_manager_default.log(`After removal, "${project.name}" will no longer be a child app in the group and will not be part of the composed application.`);let isReferencedInConfig=!!projectGroup.config?.applications?.[project.name];if(isReferencedInConfig&&(output_manager_default.log(""),output_manager_default.warn(`The microfrontends.json configuration still contains an entry for "${project.name}".`),output_manager_default.warn("Removing this project will cause other microfrontends projects in the group to fail deploying until the configuration is updated."),!autoConfirm)){if(!client.stdin.isTTY)return output_manager_default.error("Cannot remove a project that is still referenced in microfrontends.json in non-interactive mode."),1;if(output_manager_default.log(""),!await client.input.confirm(`Remove "${project.name}" even though it is still referenced in microfrontends.json?`,!1))return output_manager_default.log("Aborted."),0}if(output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm removal."),1;if(!await client.input.confirm(`Remove "${project.name}" from "${projectGroup.group.name}"?`,!1))return output_manager_default.log("Aborted."),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing project from microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{enabled:!1}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Project "${project.name}" removed from group "${projectGroup.group.name}" ${import_chalk241.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk242=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),1;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk242.default.bold(linkedProject.name)})?`,!0))selectedGroup=linkedGroup;else{if(groups.length===1)return output_manager_default.log("Aborted."),0;{let remaining=groups.filter(g=>g.group.id!==linkedGroup.group.id),groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:remaining.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}else{let groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}let groupName=selectedGroup.group.name,projectCount=selectedGroup.projects.length;if(output_manager_default.log(""),output_manager_default.log(`This will delete the microfrontends group ${import_chalk242.default.bold(groupName)} and all of its settings.`),projectCount>0&&output_manager_default.log(`${projectCount} project${projectCount>1?"s":""} will be removed from the group.`),output_manager_default.log(import_chalk242.default.red("This action is not reversible.")),output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm deletion."),1;if(await client.input.text({message:`Type ${import_chalk242.default.bold(groupName)} to confirm deletion:`,validate:val=>val!==groupName?`You must type "${groupName}" to confirm.`:!0})!==groupName)return output_manager_default.log("Aborted."),0}let deleteStamp=stamp_default();output_manager_default.spinner("Deleting microfrontends group\u2026");try{await client.fetch(`/v2/teams/${team.id}/microfrontends/${selectedGroup.group.id}?teamId=${team.id}`,{method:"DELETE"})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Microfrontends group "${groupName}" deleted ${import_chalk242.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk243=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),1;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},1),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),1;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects2=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects2.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),1;let configFile=resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects2.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects:projects2};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
1037
1038
  `),0;let groupTable=table([["Group",json.group.name],["ID",json.group.id],["Slug",json.group.slug],["Projects",String(json.projectCount)],["Default app",json.defaultApp??"(none)"],["Fallback environment",json.group.fallbackEnvironment??"(none)"],["Local config file",json.configFile??"(not found)"],["Config applications",json.config.applications.length>0?json.config.applications.join(", "):"(none)"]]);output_manager_default.log(""),output_manager_default.log(groupTable),output_manager_default.log(""),output_manager_default.log("Projects"),output_manager_default.log("");for(let project of projects2){let rows=[["Project",project.isDefaultApp?`${project.name} (default app)`:project.name],["Default route",project.defaultRoute??"(none)"],["Production domain",project.productionDomain??"(none)"],["Framework",project.framework??"(unknown)"],["Git org/repo",`${project.git.org??"(unknown)"}/${project.git.repo??"(unknown)"}`],["Root directory",project.git.rootDirectory??"(unknown)"]];project.packageName&&rows.push(["Package name",project.packageName]),project.inGroupConfig||rows.push(["In config",(0,import_chalk243.red)("no")]);let projectTable=table(rows);output_manager_default.log(projectTable),output_manager_default.log("")}for(let project of projects2)project.projectFetchStatus!=="ok"&&output_manager_default.warn(`Project metadata for "${project.id}" is incomplete (status: ${project.projectFetchStatus}).`);return 0}async function enrichGroupProject(client,teamId,group,groupProject,localRepoContext){let fullProject,projectFetchStatus="ok";try{let maybeProject=await getProjectByNameOrId(client,groupProject.id,teamId);maybeProject instanceof ProjectNotFound?projectFetchStatus="not_found":fullProject=maybeProject}catch{projectFetchStatus="error"}let name=groupProject.name??fullProject?.name??groupProject.id,inGroupConfig=Object.prototype.hasOwnProperty.call(group.config?.applications??{},name),rootDirectory=fullProject?.rootDirectory??null,gitRepo=fullProject?.link?.repo??null,gitOrg=fullProject?.link?.org??null,productionDomain=fullProject?.targets?.production?.alias?.[0]??fullProject?.targets?.production?.url??null,framework=fullProject?.framework??null,packageName2=await resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory);return{id:groupProject.id,name,isDefaultApp:!!groupProject.microfrontends?.isDefaultApp,enabled:!!groupProject.microfrontends?.enabled,defaultRoute:groupProject.microfrontends?.defaultRoute??null,productionDomain,framework,git:{org:gitOrg,repo:gitRepo,rootDirectory},packageName:packageName2,inGroupConfig,projectFetchStatus}}async function getLocalRepoContext(client){try{let link=await getLinkedProject(client,{cwd:client.cwd});return link.status!=="linked"?{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}:{repoRoot:link.repoRoot??null,linkedProjectId:link.project.id,linkedRepoOrg:link.project.link?.org??null,linkedRepoName:link.project.link?.repo??null}}catch{return{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}}}function isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo){return!localRepoContext.repoRoot||!localRepoContext.linkedRepoOrg||!localRepoContext.linkedRepoName?!1:localRepoContext.linkedRepoOrg===gitOrg&&localRepoContext.linkedRepoName===gitRepo}async function resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory){if(!isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo))return null;let projectDir=join37(localRepoContext.repoRoot,rootDirectory||""),packageJsonPath=join37(projectDir,"package.json"),pkg=await readJSONFile(packageJsonPath);return!pkg||pkg instanceof Error?null:typeof pkg.name=="string"?pkg.name:null}function resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName){let defaultProject=projects2.find(project=>project.isDefaultApp);if(!defaultProject||!isProjectInLocalRepo(localRepoContext,defaultProject.git.org,defaultProject.git.repo))return null;let projectDir=join37(localRepoContext.repoRoot,defaultProject.git.rootDirectory||""),configuredName=configuredConfigFileName??null;if(configuredName){let configuredPath=join37(projectDir,configuredName);if(existsSync4(configuredPath))return configuredPath}let jsonPath=join37(projectDir,"microfrontends.json"),jsoncPath=join37(projectDir,"microfrontends.jsonc");return existsSync4(jsonPath)?jsonPath:existsSync4(jsoncPath)?jsoncPath:null}function resolveConfiguredMicrofrontendsConfigFileName(configured){if(!configured)return null;let normalized=configured.trim();return!normalized.endsWith(".json")&&!normalized.endsWith(".jsonc")?null:normalized.replace(/^\/+/,"")}var MicrofrontendsTelemetryClient=class extends TelemetryClient{trackCliSubcommandPull(actual){this.trackCliSubcommand({subcommand:"pull",value:actual})}trackCliSubcommandCreateGroup(actual){this.trackCliSubcommand({subcommand:"create-group",value:actual})}trackCliSubcommandAddToGroup(actual){this.trackCliSubcommand({subcommand:"add-to-group",value:actual})}trackCliSubcommandRemoveFromGroup(actual){this.trackCliSubcommand({subcommand:"remove-from-group",value:actual})}trackCliSubcommandDeleteGroup(actual){this.trackCliSubcommand({subcommand:"delete-group",value:actual})}trackCliSubcommandInspectGroup(actual){this.trackCliSubcommand({subcommand:"inspect-group",value:actual})}};var COMMAND_CONFIG51={"create-group":getCommandAliases(createGroupSubcommand),"add-to-group":getCommandAliases(addToGroupSubcommand),"remove-from-group":getCommandAliases(removeFromGroupSubcommand),"delete-group":getCommandAliases(deleteGroupSubcommand),"inspect-group":getCommandAliases(inspectGroupSubcommand),pull:getCommandAliases(pullSubcommand)};async function main27(client){let telemetry2=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG51),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"create-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry2.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry2.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry2.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry2.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry2.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry2.trackCliSubcommandPull(subcommandOriginal),pull2(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG51)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_open17=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
@@ -1042,9 +1043,9 @@ Starting setup...
1042
1043
  `):client.stdout.write(`${JSON.stringify(result,null,2)}
1043
1044
  `),0}let id=String(result.id??"");return output_manager_default.log(id?`Created deployment check ${id} on ${project.name}.`:`Created deployment check on ${project.name}.`),0}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}}async function checksRemove(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification([...checksRemoveFlags]);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},1),printError(error),1}if(parsedArgs.args.length<1||parsedArgs.args.length>2)return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Check id is required. Example: `vercel project checks remove chk_abc123`",hint:"Run `project checks` to list check ids, then pass the id to `project checks remove` (optional project name as second argument).",next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks"),when:"List deployment checks and their ids"},{command:buildCommandWithGlobalFlags(client.argv,"project checks remove <check_id>"),when:"Remove a check after replacing <check_id> with an id from the list"}]},1),output_manager_default.error("Invalid number of arguments. Usage: `vercel project checks remove <checkId> [project-name]`"),1;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error},1),output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||!!client.nonInteractive,checkId=parsedArgs.args[0]?.trim();if(!checkId)return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Check id is required (from `vercel project checks`). Example: `vercel project checks remove chk_abc123`",next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks"),when:"List deployment checks and their ids"},{command:buildCommandWithGlobalFlags(client.argv,"project checks remove <check_id>"),when:"Remove a check after replacing <check_id>"}]},1),output_manager_default.error("A check id is required (from `vercel project checks`)."),1;let projectNameOrId=parsedArgs.args[1];try{let project=await getProjectByCwdOrLink({client,commandName:"project checks remove",projectNameOrId,forReadOnlyCommand:!0}),result=await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/checks/${encodeURIComponent(checkId)}`,{method:"DELETE"});return asJson?(client.nonInteractive?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,checkId,projectId:project.id,projectName:project.name,result,message:`Removed check ${checkId} from ${project.name}.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks"),when:"List remaining checks"}]},null,2)}
1044
1045
  `):client.stdout.write(`${JSON.stringify(result,null,2)}
1045
- `),0):(output_manager_default.log(`Removed check ${checkId} from ${project.name}.`),0)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}}var BLOCKING_STAGES2=["build-start","deployment-start","deployment-alias","deployment-promotion","none"];async function checks(client,argv){if(argv[0]==="add")return checksAdd(client,argv.slice(1));if(argv[0]==="remove"||argv[0]==="rm")return checksRemove(client,argv.slice(1));let parsedArgs,flagsSpecification=getFlagsSpecification(checksSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},1),printError(error),1}if(typeof parsedArgs.flags["--file"]=="string"||typeof parsedArgs.flags["--check-name"]=="string"||typeof parsedArgs.flags["--requires"]=="string")return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"To create a check, run `vercel project checks add [name]` with `--file` or `--check-name` / `--requires`.",hint:"Use `project checks add`, not `project checks`, when passing create flags.",next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks add <name>"),when:"Create a check (replace <name> or omit if linked)"}]},2),output_manager_default.error("To create a check, run `vercel project checks add [name]` with `--file` or `--check-name` / `--requires`. See `vercel project checks --help`."),2;if(parsedArgs.args.length>1)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Invalid number of arguments. Usage: `vercel project checks [name]`"},2),output_manager_default.error("Invalid number of arguments. Usage: `vercel project checks [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error},1),output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||!!client.nonInteractive,blocksFlag=parsedArgs.flags["--blocks"];if(typeof blocksFlag=="string"&&!BLOCKING_STAGES2.includes(blocksFlag))return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:`\`--blocks\` must be one of: ${BLOCKING_STAGES2.join(", ")}`},1),output_manager_default.error(`\`--blocks\` must be one of: ${BLOCKING_STAGES2.join(", ")}`),1;let result;try{let project=await getProjectByCwdOrLink({client,commandName:"project checks",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0}),query=new URLSearchParams;typeof blocksFlag=="string"&&query.set("blocks",blocksFlag);let qs=query.toString();result=await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/checks${qs?`?${qs}`:""}`)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}let list29=result.checks??[];if(asJson){if(client.nonInteractive){let payload={status:AGENT_STATUS.OK,checks:list29,pagination:result.pagination,message:list29.length===0?"No checks configured for this project.":`${list29.length} deployment check(s) configured.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks add <name>"),when:"Add a deployment check (replace <name> or omit if linked)"},{command:buildCommandWithGlobalFlags(client.argv,"project checks remove <check_id>"),when:"Remove a check after replacing <check_id> with an id from checks"}]};client.stdout.write(`${JSON.stringify(payload,null,2)}
1046
+ `),0):(output_manager_default.log(`Removed check ${checkId} from ${project.name}.`),0)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}}var BLOCKING_STAGES2=["build-start","deployment-start","deployment-alias","deployment-promotion","none"];async function checks(client,argv){if(argv[0]==="add")return checksAdd(client,argv.slice(1));if(argv[0]==="remove"||argv[0]==="rm")return checksRemove(client,argv.slice(1));let parsedArgs,flagsSpecification=getFlagsSpecification(checksSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},1),printError(error),1}if(typeof parsedArgs.flags["--file"]=="string"||typeof parsedArgs.flags["--check-name"]=="string"||typeof parsedArgs.flags["--requires"]=="string")return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"To create a check, run `vercel project checks add [name]` with `--file` or `--check-name` / `--requires`.",hint:"Use `project checks add`, not `project checks`, when passing create flags.",next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks add <name>"),when:"Create a check (replace <name> or omit if linked)"}]},2),output_manager_default.error("To create a check, run `vercel project checks add [name]` with `--file` or `--check-name` / `--requires`. See `vercel project checks --help`."),2;if(parsedArgs.args.length>1)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Invalid number of arguments. Usage: `vercel project checks [name]`"},2),output_manager_default.error("Invalid number of arguments. Usage: `vercel project checks [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error},1),output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||!!client.nonInteractive,blocksFlag=parsedArgs.flags["--blocks"];if(typeof blocksFlag=="string"&&!BLOCKING_STAGES2.includes(blocksFlag))return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:`\`--blocks\` must be one of: ${BLOCKING_STAGES2.join(", ")}`},1),output_manager_default.error(`\`--blocks\` must be one of: ${BLOCKING_STAGES2.join(", ")}`),1;let result;try{let project=await getProjectByCwdOrLink({client,commandName:"project checks",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0}),query=new URLSearchParams;typeof blocksFlag=="string"&&query.set("blocks",blocksFlag);let qs=query.toString();result=await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/checks${qs?`?${qs}`:""}`)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}let list30=result.checks??[];if(asJson){if(client.nonInteractive){let payload={status:AGENT_STATUS.OK,checks:list30,pagination:result.pagination,message:list30.length===0?"No checks configured for this project.":`${list30.length} deployment check(s) configured.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"project checks add <name>"),when:"Add a deployment check (replace <name> or omit if linked)"},{command:buildCommandWithGlobalFlags(client.argv,"project checks remove <check_id>"),when:"Remove a check after replacing <check_id> with an id from checks"}]};client.stdout.write(`${JSON.stringify(payload,null,2)}
1046
1047
  `)}else client.stdout.write(`${JSON.stringify(result,null,2)}
1047
- `);return 0}if(list29.length===0)return output_manager_default.log("No checks configured for this project."),0;let rows=[["ID","Name","Blocking","Target"].map(h=>(0,import_chalk246.gray)(h)),...list29.map(c=>[String(c.id??c.checkId??""),String(c.name??""),String(c.blocks??""),String(Array.isArray(c.environments)?c.environments.join(","):c.target??"")])];return client.stderr.write(`${table(rows,{hsep:3})}
1048
+ `);return 0}if(list30.length===0)return output_manager_default.log("No checks configured for this project."),0;let rows=[["ID","Name","Blocking","Target"].map(h=>(0,import_chalk246.gray)(h)),...list30.map(c=>[String(c.id??c.checkId??""),String(c.name??""),String(c.blocks??""),String(Array.isArray(c.environments)?c.environments.join(","):c.target??"")])];return client.stderr.write(`${table(rows,{hsep:3})}
1048
1049
  `),0}var import_chalk247=__toESM(require_source(),1),import_frameworks=__toESM(require_frameworks(),1);var ProjectInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function parseSandboxRegionList(input){let regions=input.split(",").map(region=>region.trim().toLowerCase()).filter(region=>region.length>0);return Array.from(new Set(regions))}function formatSandboxRegionList(regions){return regions.length>0?regions.join(", "):"None"}function validateSandboxConfig(config){if(config.failoverRegions?.length){if(!config.region)return"Sandbox region is required when failover regions are specified. Set one with --sandbox-region.";if(config.failoverRegions.includes(config.region))return"Sandbox failover regions must not include the primary region."}}function toProjectInspectJson(project,owner){return{id:project.id,name:project.name,owner:{name:owner.name,slug:owner.slug},createdAt:project.createdAt,rootDirectory:project.rootDirectory??null,nodeVersion:project.nodeVersion??null,framework:project.framework??null,buildCommand:project.buildCommand??null,outputDirectory:project.outputDirectory??null,installCommand:project.installCommand??null,sandbox:project.sandbox?{region:project.sandbox.region??null,failoverRegions:project.sandbox.failoverRegions??[]}:null}}var getProjectForInspect=async(client,projectNameOrId,autoConfirm)=>{try{return await getProjectByCwdOrLink({autoConfirm,client,commandName:"project inspect",projectNameOrId,forReadOnlyCommand:!0})}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"inspect"}),printError(error,client),null}};async function inspect16(client,argv){let telemetry2=new ProjectInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand11.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),1}let{args,flags}=parsedArgs,name=args[0];if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==0&&args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk247.default.cyan(`${getCommandName("project inspect <name>")}`)}`),2;let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let inspectStamp=stamp_default(),project=await getProjectForInspect(client,name,flags["--yes"]);if(!project)return 1;let org=await getTeamByIdOrSlug(client,project.accountId);if(formatResult.jsonOutput)return client.stdout.write(`${JSON.stringify(toProjectInspectJson(project,org),null,2)}
1049
1050
  `),0;let projectSlugLink=formatProject(org.slug,project.name);output_manager_default.log(`Found Project ${projectSlugLink} ${import_chalk247.default.gray(inspectStamp())}`),output_manager_default.print(`
1050
1051
  `),output_manager_default.print(import_chalk247.default.bold(` General
@@ -1089,7 +1090,7 @@ ${tablePrint}
1089
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
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})}
1091
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)}
1092
- `);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)}"`),list29=phrases.length===1?phrases[0]:`${phrases.slice(0,-1).join(", ")} and ${phrases[phrases.length-1]}`,verb=phrases.length>1?"require":"requires";return printPlanError(client,`${list29} ${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.
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.
1093
1094
  It will also delete everything under the project including deployments.
1094
1095
  `,emoji("warning"))),await client.input.confirm(`${import_chalk254.default.bold.red("Are you sure?")}`,!1)}var ProjectDangerouslyDeleteImmutableStaticAssetTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){path3&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function dangerouslyDeleteImmutableStaticAsset(client,argv){let telemetry2=new ProjectDangerouslyDeleteImmutableStaticAssetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(dangerouslyDeleteImmutableStaticAssetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let[path3]=parsedArgs.args;if(!path3)return output_manager_default.error(`Missing required argument. Usage: ${getCommandName("project dangerously-delete-immutable-static-asset <path>")}`),1;telemetry2.trackCliArgumentPath(path3);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>!flag.startsWith("--non-interactive")),interactiveCommand=getCommandNamePlain(`project dangerously-delete-immutable-static-asset ${quoteArg(path3)} --project ${quoteArg(project.id)} ${globalFlags.map(quoteArg).join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting an immutable static asset permanently removes it from storage and cannot be undone. This cannot be confirmed non-interactively. The user must run this command in a terminal and type the asset path to confirm.",userActionRequired:!0,hint:"This action can not be automated so it should be surfaced to the user.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error("This command must be run interactively because it permanently deletes the asset from storage."),1}if(output_manager_default.print(prependEmoji(`Deleting immutable static asset ${path3} for project ${project.name} permanently removes it from storage for the production and preview environments. This cannot be undone. Requests to this URL will serve 410 for 7 days and then 404.
1095
1096
  `,emoji("warning"))),await client.input.text({message:`Type ${path3} to confirm the permanent deletion:`})!==path3)return output_manager_default.log("Canceled"),0;try{await client.fetch(`/v1/edge-cache/dangerously-delete-immutable-static?projectIdOrName=${project.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:path3}),retry:{retries:0}})}catch(err){if(isAPIError(err)){if(err.code==="challenge_required")return output_manager_default.error(`This action requires a recent authentication. Run ${getCommandName("login")} and retry.`),1;if(err.status===404)return output_manager_default.error(err.code==="asset_not_found"&&err.serverMessage?err.serverMessage:"Project or asset not found."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"Invalid request."),1;if(err.status===403)return output_manager_default.error(err.serverMessage||"You do not have permission to delete this asset."),1}return printError(err),output_manager_default.log("The deletion outcome is unknown. Re-run to verify: a not-found response on re-run means this attempt succeeded and the URL now serves 410."),1}return output_manager_default.print(prependEmoji(`Successfully deleted immutable static asset ${path3}; its URL now serves 410`,emoji("success"))+`
@@ -1250,85 +1251,94 @@ ${import_chalk274.default.gray("No changes detected from current production vers
1250
1251
  `),output_manager_default.print(` ${import_chalk281.default.gray("ID:")} ${route.id}
1251
1252
  `),output_manager_default.print(`
1252
1253
  ${import_chalk281.default.bold("Staging version:")} ${version2.id}
1253
- `),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-FEZFLAIJ.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-PWVNXN4N.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-QDIH43E3.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-62HLGVJG.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-64FNHY6J.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-FO5JCAB4.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-WTIW7W3Z.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-KQ5T3MWQ.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-LYY4AMIA.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})}};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}})}};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} 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==="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.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 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 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)}
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)}
1254
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)}
1255
- `)}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 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)}
1256
- `)}else output_manager_default.success(message);return 0}var import_chalk282=__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 USAGE15="schedules get <name>";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:"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_chalk282.default.gray("(Queue)")}`:`${target.function} ${import_chalk282.default.gray("(Function)")}`}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize(schedule.state)),printAlignedLabel("Source",capitalize(schedule.source)),printAlignedLabel("Type",capitalize(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 invalidArguments2(client,"A schedule name is required");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);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 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)}
1257
- `),0}return printSchedule(schedule),0}var import_chalk283=__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 USAGE16="schedules list";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:"List schedules with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize2(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_chalk283.default.dim(header)),...schedules.map(schedule=>[import_chalk283.default.bold(schedule.name),capitalize2(schedule.state),capitalize2(schedule.expression.type),formatExpression2(schedule.expression),formatTarget2(schedule.target)])];return table(rows,{hsep:3}).split(`
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(`
1258
1258
  `).map(line2=>line2.trimEnd()).join(`
1259
- `).replace(/^/gm," ")}function nextPageCommand(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 list24(client,argv){let telemetry2=new SchedulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand20.options))}catch(error){return invalidArguments3(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 invalidArguments3(client,`Expected no arguments. Usage: ${getCommandName(USAGE16)}`);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);if(!limitResult.valid)return invalidArguments3(client,limitResult.message);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 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)}
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)}
1260
+ `),0}if(result.data.length===0)return output_manager_default.print(`No executions found for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}.
1261
+ `),0;if(output_manager_default.print(`Executions for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}
1262
+
1263
+ ${executionTable(result.data)}
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
+ 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(`
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)}
1260
1270
  `),0}if(result.data.length===0)return output_manager_default.print(`No schedules found in namespace ${namespace}.
1261
- `),0;if(output_manager_default.print(`Schedules in namespace ${import_chalk283.default.bold(namespace)}
1271
+ `),0;if(output_manager_default.print(`Schedules in namespace ${import_chalk284.default.bold(namespace)}
1262
1272
 
1263
1273
  ${scheduleTable(result.data)}
1264
- `),result.cursor){let next=nextPageCommand(client,namespace,flags["--namespace"]!==void 0,limitResult.value,flags["--limit"]!==void 0,result.cursor);output_manager_default.print(`
1274
+ `),result.cursor){let next=nextPageCommand2(client,namespace,flags["--namespace"]!==void 0,limitResult.value,flags["--limit"]!==void 0,result.cursor);output_manager_default.print(`
1265
1275
  More schedules are available. Run ${cmd(next)} to continue.
1266
- `)}return 0}var SchedulesUpdateTelemetryClient=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: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 USAGE17="schedules update <name> [options]";async function update7(client,argv){let telemetry2=new SchedulesUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(updateSubcommand9.options))}catch(error){return invalidScheduleArguments(client,USAGE17,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"],USAGE17);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!1);if(!expression.valid)return invalidScheduleArguments(client,USAGE17,expression.error);let jitter=parseUpdateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE17,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE17,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE17,payload.error);if(!(expression.value!==void 0||flags["--timezone"]!==void 0||flags["--jitter"]!==void 0||flags["--topic"]!==void 0||flags["--payload"]!==void 0))return invalidScheduleArguments(client,USAGE17,"At least one update option is required.");if(flags["--topic"]!==void 0&&!flags["--topic"].trim())return invalidScheduleArguments(client,USAGE17,"`--topic` cannot be empty.");let outputMode=parseScheduleOutput(client,USAGE17,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("Updating schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).update({name:identifier.name,namespace:identifier.namespace,...expression.value!==void 0&&{expression:expression.value},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...flags["--jitter"]!==void 0&&{jitter:jitter.value},...flags["--topic"]!==void 0&&{target:{topic:flags["--topic"]}},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"update",name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Updated schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var COMMAND_CONFIG56={create:getCommandAliases(createSubcommand6),delete:getCommandAliases(deleteSubcommand4),disable:getCommandAliases(disableSubcommand4),enable:getCommandAliases(enableSubcommand4),get:getCommandAliases(getSubcommand2),invoke:getCommandAliases(invokeSubcommand),list:getCommandAliases(listSubcommand20),update:getCommandAliases(updateSubcommand9)};async function main31(client){let parsedArgs,flagsSpecification=getFlagsSpecification(schedulesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new SchedulesTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:command2===schedulesCommand?void 0:schedulesCommand,columns:client.stderr.columns})),2}return subcommand?needHelp?(telemetry2.trackCliFlagHelp("schedules",subcommandOriginal),printHelp(subcommand==="create"?createSubcommand6:subcommand==="delete"?deleteSubcommand4:subcommand==="disable"?disableSubcommand4:subcommand==="enable"?enableSubcommand4:subcommand==="get"?getSubcommand2:subcommand==="invoke"?invokeSubcommand:subcommand==="update"?updateSubcommand9:listSubcommand20)):subcommand==="get"?(telemetry2.trackCliSubcommandGet(subcommandOriginal),get3(client,args)):subcommand==="list"?(telemetry2.trackCliSubcommandList(subcommandOriginal),list24(client,args)):subcommand==="create"?(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create6(client,args)):subcommand==="delete"?(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteSchedule(client,args)):subcommand==="update"?(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update7(client,args)):subcommand==="enable"?(telemetry2.trackCliSubcommandEnable(subcommandOriginal),runScheduleAction(client,args,"enable")):subcommand==="disable"?(telemetry2.trackCliSubcommandDisable(subcommandOriginal),runScheduleAction(client,args,"disable")):(telemetry2.trackCliSubcommandInvoke(subcommandOriginal),runScheduleAction(client,args,"invoke")):(parsedArgs.args.length>1&&output_manager_default.fatal(getInvalidSubcommand(COMMAND_CONFIG56)),needHelp&&telemetry2.trackCliFlagHelp("schedules"),printHelp(schedulesCommand))}var SecurityTelemetryClient=class extends TelemetryClient{trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}};var import_chalk284=__toESM(require_source(),1);var SecurityCheckTelemetryClient=class extends TelemetryClient{trackCliArgumentCheck(checks2){checks2.length>0&&this.trackCliArgument({arg:"check",value:checks2.join(",")})}trackCliFlagFindings(findings){findings&&this.trackCliFlag("findings")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SECURITY_CHECKS=[{slug:"members-no-mfa",description:"Team members without multi-factor authentication",risk:"high"},{slug:"members-too-many-owners",description:"Team owners to review",risk:"high"},{slug:"pats-no-expiration",description:"PATs that never expire",risk:"high"},{slug:"env-vars-creds-instead-of-oidc",description:"Long-lived credentials where OIDC is available",risk:"high"},{slug:"depl-no-git-fork-protection",description:"Projects without Git fork deploy prevention",risk:"high"},{slug:"proj-no-preview-depl-protection",description:"Projects without preview deployment protection",risk:"high"},{slug:"env-vars-non-sensitive",description:"Environment variables not marked Sensitive",risk:"medium"},{slug:"env-vars-non-sensitive-stale",description:"Environment variables older than 90 days",risk:"medium"},{slug:"env-vars-exposed-web-app-fwk",description:"Environment variables exposed via web application framework",risk:"medium"}];function isKnownCheck(slug){return SECURITY_CHECKS.some(check4=>check4.slug===slug)}async function check2(client,argv){let telemetry2=new SecurityCheckTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args:checks2,flags:opts}=parsedArgs,unknown=checks2.filter(slug=>!isKnownCheck(slug));if(unknown.length>0){let message=`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs: ${SECURITY_CHECKS.map(check4=>check4.slug).join(", ")}`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,"security check <slug>"),when:"Re-run with a valid check slug (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"security check --help"),when:"See all flags and examples"}]}),output_manager_default.error(`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs:
1276
+ `)}return 0}var SchedulesUpdateTelemetryClient=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: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 USAGE18="schedules update <name> [options]";async function update7(client,argv){let telemetry2=new SchedulesUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(updateSubcommand9.options))}catch(error){return invalidScheduleArguments(client,USAGE18,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"],USAGE18);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!1);if(!expression.valid)return invalidScheduleArguments(client,USAGE18,expression.error);let jitter=parseUpdateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE18,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE18,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE18,payload.error);if(!(expression.value!==void 0||flags["--timezone"]!==void 0||flags["--jitter"]!==void 0||flags["--topic"]!==void 0||flags["--payload"]!==void 0))return invalidScheduleArguments(client,USAGE18,"At least one update option is required.");if(flags["--topic"]!==void 0&&!flags["--topic"].trim())return invalidScheduleArguments(client,USAGE18,"`--topic` cannot be empty.");if(flags["--topic"]!==void 0){let topicError=validateScheduleQueueTopic(flags["--topic"]);if(topicError)return invalidScheduleArguments(client,USAGE18,topicError)}let outputMode=parseScheduleOutput(client,USAGE18,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("Updating schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).update({name:identifier.name,namespace:identifier.namespace,...expression.value!==void 0&&{expression:expression.value},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...flags["--jitter"]!==void 0&&{jitter:jitter.value},...flags["--topic"]!==void 0&&{target:{topic:flags["--topic"]}},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"update",name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Updated schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var COMMAND_CONFIG57={create:getCommandAliases(createSubcommand6),delete:getCommandAliases(deleteSubcommand4),disable:getCommandAliases(disableSubcommand4),enable:getCommandAliases(enableSubcommand4),executions:getCommandAliases(executionsSubcommand),get:getCommandAliases(getSubcommand2),invoke:getCommandAliases(invokeSubcommand),list:getCommandAliases(listSubcommand20),update:getCommandAliases(updateSubcommand9)};async function main31(client){let parsedArgs,flagsSpecification=getFlagsSpecification(schedulesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new SchedulesTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG57),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent){return output_manager_default.print(help(command2,{parent:parent??(command2===schedulesCommand?void 0:schedulesCommand),columns:client.stderr.columns})),2}if(!subcommand)return parsedArgs.args.length>1&&output_manager_default.fatal(getInvalidSubcommand(COMMAND_CONFIG57)),needHelp&&telemetry2.trackCliFlagHelp("schedules"),printHelp(schedulesCommand);if(needHelp&&subcommand!=="executions")return telemetry2.trackCliFlagHelp("schedules",subcommandOriginal),printHelp(subcommand==="create"?createSubcommand6:subcommand==="delete"?deleteSubcommand4:subcommand==="disable"?disableSubcommand4:subcommand==="enable"?enableSubcommand4:subcommand==="get"?getSubcommand2:subcommand==="invoke"?invokeSubcommand:subcommand==="update"?updateSubcommand9:listSubcommand20);if(subcommand==="get")return telemetry2.trackCliSubcommandGet(subcommandOriginal),get3(client,args);if(subcommand==="list")return telemetry2.trackCliSubcommandList(subcommandOriginal),list25(client,args);if(subcommand==="executions"){telemetry2.trackCliSubcommandExecutions(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return executions(client,nestedArgs,telemetry2)}return subcommand==="create"?(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create6(client,args)):subcommand==="delete"?(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteSchedule(client,args)):subcommand==="update"?(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update7(client,args)):subcommand==="enable"?(telemetry2.trackCliSubcommandEnable(subcommandOriginal),runScheduleAction(client,args,"enable")):subcommand==="disable"?(telemetry2.trackCliSubcommandDisable(subcommandOriginal),runScheduleAction(client,args,"disable")):(telemetry2.trackCliSubcommandInvoke(subcommandOriginal),runScheduleAction(client,args,"invoke"))}var SecurityTelemetryClient=class extends TelemetryClient{trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}};var import_chalk285=__toESM(require_source(),1);var SecurityCheckTelemetryClient=class extends TelemetryClient{trackCliArgumentCheck(checks2){checks2.length>0&&this.trackCliArgument({arg:"check",value:checks2.join(",")})}trackCliFlagFindings(findings){findings&&this.trackCliFlag("findings")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SECURITY_CHECKS=[{slug:"members-no-mfa",description:"Team members without multi-factor authentication",risk:"high"},{slug:"members-too-many-owners",description:"Team owners to review",risk:"high"},{slug:"pats-no-expiration",description:"PATs that never expire",risk:"high"},{slug:"env-vars-creds-instead-of-oidc",description:"Long-lived credentials where OIDC is available",risk:"high"},{slug:"depl-no-git-fork-protection",description:"Projects without Git fork deploy prevention",risk:"high"},{slug:"proj-no-preview-depl-protection",description:"Projects without preview deployment protection",risk:"high"},{slug:"env-vars-non-sensitive",description:"Environment variables not marked Sensitive",risk:"medium"},{slug:"env-vars-non-sensitive-stale",description:"Environment variables older than 90 days",risk:"medium"},{slug:"env-vars-exposed-web-app-fwk",description:"Environment variables exposed via web application framework",risk:"medium"}];function isKnownCheck(slug){return SECURITY_CHECKS.some(check4=>check4.slug===slug)}async function check2(client,argv){let telemetry2=new SecurityCheckTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args:checks2,flags:opts}=parsedArgs,unknown=checks2.filter(slug=>!isKnownCheck(slug));if(unknown.length>0){let message=`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs: ${SECURITY_CHECKS.map(check4=>check4.slug).join(", ")}`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,"security check <slug>"),when:"Re-run with a valid check slug (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"security check --help"),when:"See all flags and examples"}]}),output_manager_default.error(`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs:
1267
1277
  ${SECURITY_CHECKS.map(check4=>check4.slug).join(`
1268
1278
  `)}`),1}let limit=opts["--limit"];if(limit!==void 0&&(!Number.isInteger(limit)||limit<1))return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"`--limit` must be a positive integer.",next:[{command:buildCommandWithGlobalFlags(client.argv,"security check --limit <N>"),when:"Re-run with a positive integer (replace placeholder)"}]}),output_manager_default.error("`--limit` must be a positive integer."),1;let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive;telemetry2.trackCliArgumentCheck(checks2),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagFindings(opts["--findings"]),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagJson(opts["--json"]);let{team,contextName}=await getScope(client);if(!team)return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_SCOPE,message:"Security checks require a team scope. Run `vercel switch` to select a team.",next:[{command:buildCommandWithGlobalFlags(client.argv,"whoami"),when:"See current user and team"},{command:buildCommandWithGlobalFlags(client.argv,"teams switch"),when:"Switch to a team"}]}),output_manager_default.error(`Security checks require a team scope. Run ${getCommandName("switch")} to select a team.`),1;let params=new URLSearchParams({teamId:team.id,maxSamples:String(limit??100)});for(let slug of checks2)params.append("facets",slug);let project=opts["--project"];project&&params.set("projectIdOrName",project);let dashStamp=stamp_default();output_manager_default.spinner(checks2.length>0?"Computing security checks\u2026":"Computing security report\u2026");let data;try{data=await client.fetch(`/dashboard/security-dashboard?${params}`)}catch(error){output_manager_default.stopSpinner();let status6=isAPIError(error)?error.status:void 0;return outputAgentError(client,{status:"error",reason:status6===401||status6===403?"not_authorized":status6===429?"rate_limited":AGENT_REASON.API_ERROR,message:isAPIError(error)&&error.serverMessage||"The security report request failed.",next:[{command:buildCommandWithGlobalFlags(client.argv,"whoami"),when:"Verify the authenticated user and team"}]}),printError(error),1}if(output_manager_default.stopSpinner(),asJson)return client.stdout.write(`${JSON.stringify(data,null,2)}
1269
- `),0;let rows=SECURITY_CHECKS.filter(check4=>checks2.length===0||checks2.includes(check4.slug)).map(check4=>({check:check4,posture:data.report[check4.slug]})),counts={failing:0,passing:0,muted:0,unavailable:0};for(let{posture}of rows)counts[statusOf(posture)]++;let summary=[`${rows.length} ${rows.length===1?"check":"checks"}`,counts.failing>0&&import_chalk284.default.red(`${counts.failing} failing`),counts.muted>0&&import_chalk284.default.yellow(`${counts.muted} muted`),counts.unavailable>0&&import_chalk284.default.gray(`${counts.unavailable} unavailable`),counts.passing>0&&import_chalk284.default.green(`${counts.passing} passing`)].filter(Boolean).join(" \xB7 ");if(output_manager_default.log(`${summary} under ${import_chalk284.default.bold(contextName)} ${import_chalk284.default.gray(dashStamp())}`),output_manager_default.print(formatSummaryTable(rows).replace(/^(.*)/gm," $1")),output_manager_default.print(`
1270
- `),!!opts["--findings"]||checks2.length>0)for(let{check:check4,posture}of rows){let allFindings=!project&&posture?.computedAt!==void 0&&!posture.unavailable&&posture.violationsCount>0?await fetchAllFindingLabels(client,team.id,check4.slug,limit):null;printFindings(check4.slug,posture,data.mutes,allFindings??void 0)}else counts.failing>0&&output_manager_default.log("Run with --findings to list individual findings.");return 0}function statusOf(posture){return posture?posture.unavailableReason==="muted"?"muted":posture.unavailable?"unavailable":posture.violationsCount>0?"failing":"passing":"unavailable"}function statusLabel(posture){let status6=statusOf(posture);return status6==="unavailable"&&posture?.unavailableReason?posture.unavailableReason==="insufficient-permissions"?import_chalk284.default.gray("no access"):import_chalk284.default.gray("error"):{failing:import_chalk284.default.red("failing"),passing:import_chalk284.default.green("passing"),muted:import_chalk284.default.yellow("muted"),unavailable:import_chalk284.default.gray("unavailable")}[status6]}function violationsLabel(posture){return!posture||posture.unavailable?import_chalk284.default.gray("\u2013"):posture.truncated?`${posture.violationsCount}+`:String(posture.violationsCount)}function formatSummaryTable(rows){return formatTable(["Check","Risk","Status","Violations","Muted","Description"],["l","l","l","r","r","l"],[{rows:rows.map(({check:check4,posture})=>[import_chalk284.default.bold(check4.slug),check4.risk==="high"?import_chalk284.default.red("high"):import_chalk284.default.yellow("medium"),statusLabel(posture),violationsLabel(posture),posture?.mutedCount?String(posture.mutedCount):import_chalk284.default.gray("\u2013"),import_chalk284.default.gray(truncateEnd(check4.description,60))])}])}async function fetchAllFindingLabels(client,teamId,facet,limit){let labels2=[],cursor2;try{do{let params=new URLSearchParams({teamId,facet,limit:"1000"});cursor2&&params.set("cursor",cursor2);let page=await client.fetch(`/dashboard/security-dashboard/findings?${params}`);for(let finding of page.findings)if(!finding.muted&&(labels2.push(finding.groupLabel?`${finding.groupLabel} / ${finding.label}`:finding.label),limit!==void 0&&labels2.length>=limit))return labels2;cursor2=page.cursor??void 0}while(cursor2)}catch{return null}return labels2}function flattenSamples(samples){return samples.flatMap(sample=>sample.samples?sample.samples.map(sub=>`${sample.label} / ${sub.label}`):[sample.label])}function printFindings(slug,posture,mutes,allFindings){let findings=allFindings??(posture&&!posture.unavailable?flattenSamples(posture.samples):[]),mutedFindings=(mutes??[]).filter(mute=>mute.facet===slug&&mute.entityId).map(mute=>{let label=mute.labelSnapshot?.label??mute.entityId??"",group=mute.labelSnapshot?.groupLabel;return group?`${group} / ${label}`:label});if(!(findings.length===0&&mutedFindings.length===0)){output_manager_default.print(`
1271
- ${import_chalk284.default.bold(slug)}
1279
+ `),0;let rows=SECURITY_CHECKS.filter(check4=>checks2.length===0||checks2.includes(check4.slug)).map(check4=>({check:check4,posture:data.report[check4.slug]})),counts={failing:0,passing:0,muted:0,unavailable:0};for(let{posture}of rows)counts[statusOf(posture)]++;let summary=[`${rows.length} ${rows.length===1?"check":"checks"}`,counts.failing>0&&import_chalk285.default.red(`${counts.failing} failing`),counts.muted>0&&import_chalk285.default.yellow(`${counts.muted} muted`),counts.unavailable>0&&import_chalk285.default.gray(`${counts.unavailable} unavailable`),counts.passing>0&&import_chalk285.default.green(`${counts.passing} passing`)].filter(Boolean).join(" \xB7 ");if(output_manager_default.log(`${summary} under ${import_chalk285.default.bold(contextName)} ${import_chalk285.default.gray(dashStamp())}`),output_manager_default.print(formatSummaryTable(rows).replace(/^(.*)/gm," $1")),output_manager_default.print(`
1280
+ `),!!opts["--findings"]||checks2.length>0)for(let{check:check4,posture}of rows){let allFindings=!project&&posture?.computedAt!==void 0&&!posture.unavailable&&posture.violationsCount>0?await fetchAllFindingLabels(client,team.id,check4.slug,limit):null;printFindings(check4.slug,posture,data.mutes,allFindings??void 0)}else counts.failing>0&&output_manager_default.log("Run with --findings to list individual findings.");return 0}function statusOf(posture){return posture?posture.unavailableReason==="muted"?"muted":posture.unavailable?"unavailable":posture.violationsCount>0?"failing":"passing":"unavailable"}function statusLabel(posture){let status6=statusOf(posture);return status6==="unavailable"&&posture?.unavailableReason?posture.unavailableReason==="insufficient-permissions"?import_chalk285.default.gray("no access"):import_chalk285.default.gray("error"):{failing:import_chalk285.default.red("failing"),passing:import_chalk285.default.green("passing"),muted:import_chalk285.default.yellow("muted"),unavailable:import_chalk285.default.gray("unavailable")}[status6]}function violationsLabel(posture){return!posture||posture.unavailable?import_chalk285.default.gray("\u2013"):posture.truncated?`${posture.violationsCount}+`:String(posture.violationsCount)}function formatSummaryTable(rows){return formatTable(["Check","Risk","Status","Violations","Muted","Description"],["l","l","l","r","r","l"],[{rows:rows.map(({check:check4,posture})=>[import_chalk285.default.bold(check4.slug),check4.risk==="high"?import_chalk285.default.red("high"):import_chalk285.default.yellow("medium"),statusLabel(posture),violationsLabel(posture),posture?.mutedCount?String(posture.mutedCount):import_chalk285.default.gray("\u2013"),import_chalk285.default.gray(truncateEnd(check4.description,60))])}])}async function fetchAllFindingLabels(client,teamId,facet,limit){let labels2=[],cursor2;try{do{let params=new URLSearchParams({teamId,facet,limit:"1000"});cursor2&&params.set("cursor",cursor2);let page=await client.fetch(`/dashboard/security-dashboard/findings?${params}`);for(let finding of page.findings)if(!finding.muted&&(labels2.push(finding.groupLabel?`${finding.groupLabel} / ${finding.label}`:finding.label),limit!==void 0&&labels2.length>=limit))return labels2;cursor2=page.cursor??void 0}while(cursor2)}catch{return null}return labels2}function flattenSamples(samples){return samples.flatMap(sample=>sample.samples?sample.samples.map(sub=>`${sample.label} / ${sub.label}`):[sample.label])}function printFindings(slug,posture,mutes,allFindings){let findings=allFindings??(posture&&!posture.unavailable?flattenSamples(posture.samples):[]),mutedFindings=(mutes??[]).filter(mute=>mute.facet===slug&&mute.entityId).map(mute=>{let label=mute.labelSnapshot?.label??mute.entityId??"",group=mute.labelSnapshot?.groupLabel;return group?`${group} / ${label}`:label});if(!(findings.length===0&&mutedFindings.length===0)){output_manager_default.print(`
1281
+ ${import_chalk285.default.bold(slug)}
1272
1282
  `);for(let finding of findings)output_manager_default.print(` ${finding}
1273
- `);for(let finding of mutedFindings.sort())output_manager_default.print(` ${import_chalk284.default.dim(`${finding} (muted)`)}
1274
- `);posture&&posture.violationsCount>findings.length&&output_manager_default.print(` ${import_chalk284.default.gray(`Showing ${findings.length} of ${posture.violationsCount}${posture.truncated?"+":""} findings (raise with --limit)`)}
1275
- `)}}var COMMAND_CONFIG57={check:["check"]};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG57);return parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand2,{parent:securityCommand,columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var import_chalk285=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa3=__toESM(require_execa(),1);import{z as z2}from"zod";var MARKETPLACE="openai-curated-remote",PLUGIN_ID=`vercel@${MARKETPLACE}`,INSTALL_COMMAND=`codex plugin add ${PLUGIN_ID}`,pluginListSchema=z2.object({installed:z2.array(z2.object({pluginId:z2.string(),enabled:z2.boolean(),version:z2.string().nullable().optional()}))});async function runCodex(args){let{stdout}=await(0,import_execa3.default)("codex",args,{encoding:"utf8",stdin:"ignore",timeout:6e4,maxBuffer:1048576});return stdout}async function installedPlugin(){let stdout=await runCodex(["plugin","list","--marketplace",MARKETPLACE,"--json"]),{installed:installed2}=pluginListSchema.parse(JSON.parse(stdout));return installed2.find(plugin=>plugin.pluginId===PLUGIN_ID)}async function setupCodexPlugin(client,opts){if(!await codex.detect(opts.home))return{status:"not_detected",message:"Codex was not detected on this machine."};let before;try{before=await installedPlugin()}catch{return{status:"failed",message:"Couldn't inspect Codex plugins. Install or update the Codex CLI, sign in with `codex login`, then re-run `vercel setup --plugin --agent codex`."}}if(before?.enabled)return{status:"up_to_date",message:`Vercel plugin for Codex is installed${before.version?` (v${before.version})`:""}.`};let action=before?"enable":"install";if(opts.dryRun)return{status:"dry_run",action,message:`Setup would ${action} the Vercel plugin for Codex from the OpenAI marketplace.`};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:`Re-run with --yes to ${action} the Vercel plugin for Codex.`};if(printAlignedLabel("Plugin","Vercel for Codex (OpenAI marketplace)"),!await client.input.confirm(before?"Enable this plugin?":"Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for Codex."}}output_manager_default.spinner(`${before?"Enabling":"Installing"} the Vercel plugin for Codex\u2026`);try{let stdout=await runCodex(["plugin","add",PLUGIN_ID,"--json"]),install2=z2.object({appsNeedingAuth:z2.array(z2.unknown()).optional()}).parse(JSON.parse(stdout)),after=await installedPlugin();if(!after?.enabled)return{status:"failed",message:"The Vercel plugin is not enabled in Codex. Open Codex's /plugins browser, enable Vercel, then re-run `vercel setup --plugin --agent codex`."};let version2=after.version?` v${after.version}`:"",connection=install2.appsNeedingAuth?.length?" Connect Vercel in Codex's /plugins browser to use its connected tools.":" Start a new Codex session to load the plugin.";return{status:before?"enabled":"installed",message:`${before?"Enabled":"Installed"} the Vercel plugin for Codex${version2}.${connection}`}}catch{return{status:"failed",message:`Failed to set up the Vercel plugin for Codex. Run \`${INSTALL_COMMAND}\` to finish setup in Codex.`}}finally{output_manager_default.stopSpinner()}}var SetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){for(let agent2 of agents??[])this.trackCliOption({option:"agent",value:agent2})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry2=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,"Invalid setup arguments. Run vercel setup --help for usage."),printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("setup"),output_manager_default.print(help(setupCommand,{columns:client.stderr.columns})),2;if(parsedArgs.args.length>1){let message="The setup command does not accept positional arguments. Use --plugin or --gateway to select a step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}let{flags}=parsedArgs,onlyPlugin=flags["--plugin"],onlyGateway=flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent2=>agent2.toLowerCase()))]:void 0;if(agents?.some(agent2=>!getAgentById(agent2)||onlyPlugin&&!onlyGateway&&!["claude-code","codex"].includes(agent2))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code and --agent codex.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}telemetry2.trackCliOptionAgent(agents),telemetry2.trackCliFlagPlugin(onlyPlugin),telemetry2.trackCliFlagGateway(onlyGateway),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagYes(yes);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
1276
- ${import_chalk285.default.bold(` ${STEP_LABELS[step]}`)}
1277
- `);let outcome=step==="plugin"?await runPluginStep(client,{yes:!!yes,dryRun:!!dryRun,canPrompt:canPrompt2,home,machine,onlyStep:steps.length===1,agents}):await runGatewayStep(client,{yes:!!yes,dryRun:!!dryRun,agents});if(outcomes.set(step,outcome),machine&&!outcome.ok)break}}catch(error){return output_manager_default.stopSpinner(),machine&&writeSetupError(client,"setup_failed","Failed to complete setup."),printError(error),1}let failed=[...outcomes.values()].some(o=>!o.ok),complete=[...outcomes.values()].every(o=>o.complete),gutter=failed?import_chalk285.default.red("\u2717"):complete?import_chalk285.default.green("\u2713"):" ",heading=complete?dryRun?"Dry run complete":"Setup complete":"Setup incomplete";output_manager_default.print(`
1278
- ${gutter} ${import_chalk285.default.bold(heading)}
1283
+ `);for(let finding of mutedFindings.sort())output_manager_default.print(` ${import_chalk285.default.dim(`${finding} (muted)`)}
1284
+ `);posture&&posture.violationsCount>findings.length&&output_manager_default.print(` ${import_chalk285.default.gray(`Showing ${findings.length} of ${posture.violationsCount}${posture.truncated?"+":""} findings (raise with --limit)`)}
1285
+ `)}}var COMMAND_CONFIG58={check:["check"]};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG58);return parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand2,{parent:securityCommand,columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var import_chalk286=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa3=__toESM(require_execa(),1);import{z as z2}from"zod";var MARKETPLACE="openai-curated-remote",PLUGIN_ID=`vercel@${MARKETPLACE}`,INSTALL_COMMAND=`codex plugin add ${PLUGIN_ID}`,pluginListSchema=z2.object({installed:z2.array(z2.object({pluginId:z2.string(),enabled:z2.boolean(),version:z2.string().nullable().optional()}))});async function runCodex(args){let{stdout}=await(0,import_execa3.default)("codex",args,{encoding:"utf8",stdin:"ignore",timeout:6e4,maxBuffer:1048576});return stdout}async function installedPlugin(){let stdout=await runCodex(["plugin","list","--marketplace",MARKETPLACE,"--json"]),{installed:installed2}=pluginListSchema.parse(JSON.parse(stdout));return installed2.find(plugin=>plugin.pluginId===PLUGIN_ID)}async function setupCodexPlugin(client,opts){if(!await codex.detect(opts.home))return{status:"not_detected",message:"Codex was not detected on this machine."};let before;try{before=await installedPlugin()}catch{return{status:"failed",message:"Couldn't inspect Codex plugins. Install or update the Codex CLI, sign in with `codex login`, then re-run `vercel setup --plugin --agent codex`."}}if(before?.enabled)return{status:"up_to_date",message:`Vercel plugin for Codex is installed${before.version?` (v${before.version})`:""}.`};let action=before?"enable":"install";if(opts.dryRun)return{status:"dry_run",action,message:`Setup would ${action} the Vercel plugin for Codex from the OpenAI marketplace.`};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:`Re-run with --yes to ${action} the Vercel plugin for Codex.`};if(printAlignedLabel("Plugin","Vercel for Codex (OpenAI marketplace)"),!await client.input.confirm(before?"Enable this plugin?":"Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for Codex."}}output_manager_default.spinner(`${before?"Enabling":"Installing"} the Vercel plugin for Codex\u2026`);try{let stdout=await runCodex(["plugin","add",PLUGIN_ID,"--json"]),install2=z2.object({appsNeedingAuth:z2.array(z2.unknown()).optional()}).parse(JSON.parse(stdout)),after=await installedPlugin();if(!after?.enabled)return{status:"failed",message:"The Vercel plugin is not enabled in Codex. Open Codex's /plugins browser, enable Vercel, then re-run `vercel setup --plugin --agent codex`."};let version2=after.version?` v${after.version}`:"",connection=install2.appsNeedingAuth?.length?" Connect Vercel in Codex's /plugins browser to use its connected tools.":" Start a new Codex session to load the plugin.";return{status:before?"enabled":"installed",message:`${before?"Enabled":"Installed"} the Vercel plugin for Codex${version2}.${connection}`}}catch{return{status:"failed",message:`Failed to set up the Vercel plugin for Codex. Run \`${INSTALL_COMMAND}\` to finish setup in Codex.`}}finally{output_manager_default.stopSpinner()}}var SetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){for(let agent2 of agents??[])this.trackCliOption({option:"agent",value:agent2})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry2=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,"Invalid setup arguments. Run vercel setup --help for usage."),printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("setup"),output_manager_default.print(help(setupCommand,{columns:client.stderr.columns})),2;if(parsedArgs.args.length>1){let message="The setup command does not accept positional arguments. Use --plugin or --gateway to select a step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}let{flags}=parsedArgs,onlyPlugin=flags["--plugin"],onlyGateway=flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent2=>agent2.toLowerCase()))]:void 0;if(agents?.some(agent2=>!getAgentById(agent2)||onlyPlugin&&!onlyGateway&&!["claude-code","codex"].includes(agent2))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code and --agent codex.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),1}telemetry2.trackCliOptionAgent(agents),telemetry2.trackCliFlagPlugin(onlyPlugin),telemetry2.trackCliFlagGateway(onlyGateway),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagYes(yes);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
1286
+ ${import_chalk286.default.bold(` ${STEP_LABELS[step]}`)}
1287
+ `);let outcome=step==="plugin"?await runPluginStep(client,{yes:!!yes,dryRun:!!dryRun,canPrompt:canPrompt2,home,machine,onlyStep:steps.length===1,agents}):await runGatewayStep(client,{yes:!!yes,dryRun:!!dryRun,agents});if(outcomes.set(step,outcome),machine&&!outcome.ok)break}}catch(error){return output_manager_default.stopSpinner(),machine&&writeSetupError(client,"setup_failed","Failed to complete setup."),printError(error),1}let failed=[...outcomes.values()].some(o=>!o.ok),complete=[...outcomes.values()].every(o=>o.complete),gutter=failed?import_chalk286.default.red("\u2717"):complete?import_chalk286.default.green("\u2713"):" ",heading=complete?dryRun?"Dry run complete":"Setup complete":"Setup incomplete";output_manager_default.print(`
1288
+ ${gutter} ${import_chalk286.default.bold(heading)}
1279
1289
  `);for(let[step,outcome]of outcomes)printAlignedLabel(STEP_LABELS[step],outcome.summary);return failed?1:0}function writeSetupError(client,reason,message){client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
1280
1290
  `)}async function runPluginStep(client,opts){let targets=[{agent:"claude-code",name:"Claude Code",setup:setupVercelPlugin},{agent:"codex",name:"Codex",setup:setupCodexPlugin}].filter(target=>!opts.agents||opts.agents.includes(target.agent)),results=[];for(let target of targets){let result2=await target.setup(client,opts);results.push({...result2,agent:target.agent,name:target.name})}let detected=results.filter(result2=>result2.status!=="not_detected"),visible=detected.length>0?detected:results;for(let result2 of visible)output_manager_default.print(` ${result2.message}
1281
1291
  `);let result=["failed","confirmation_required","declined","installed","enabled","updated","dry_run","up_to_date","not_detected"].map(status6=>results.find(result2=>result2.status===status6)).find(result2=>result2!==void 0)??{status:"not_detected",message:"No Vercel plugin is available for the selected agents."},message=visible.map(result2=>result2.message).join(" ")||result.message;visible.length===0&&output_manager_default.print(` ${message}
1282
1292
  `);let confirmationRequired=result.status==="confirmation_required",ok=result.status!=="failed"&&!confirmationRequired;return opts.machine&&(opts.onlyStep||!ok)&&client.stdout.write(`${JSON.stringify({status:confirmationRequired?AGENT_STATUS.ACTION_REQUIRED:ok?AGENT_STATUS.OK:AGENT_STATUS.ERROR,reason:confirmationRequired?AGENT_REASON.CONFIRMATION_REQUIRED:`plugin_${result.status}`,message,plugins:results,...confirmationRequired&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`setup${opts.onlyStep?" --plugin":""}${opts.agents?.map(agent2=>` --agent ${agent2}`).join("")??""} --yes`,void 0,{globalFlags:"all"})}]}},null,2)}
1283
- `),{ok,complete:ok&&result.status!=="declined",summary:visible.length>0?visible.map(result2=>summarizePlugin(result2,result2.name)).join("; "):"Skipped (no plugin available for the selected agents)"}}function summarizePlugin(result,name){switch(result.status){case"installed":return`Installed for ${name}`;case"enabled":return`Enabled for ${name}`;case"updated":return`Updated for ${name}`;case"up_to_date":return`Already installed for ${name}`;case"not_detected":return`Skipped (${name} not detected)`;case"declined":return`Skipped for ${name}`;case"confirmation_required":return`Confirmation required for ${name} (re-run with --yes)`;case"dry_run":return`Would ${result.action??"install"} for ${name}`;case"failed":return`Failed for ${name}`}}async function runGatewayStep(client,opts){let argv=[];opts.yes&&argv.push("--yes"),opts.dryRun&&argv.push("--dry-run");for(let agent2 of opts.agents??[])argv.push("--agent",agent2);let result=await setupCodingAgents(client,argv),summaries={configured:"Completed (see above)",already_configured:"Already configured",dry_run:"Previewed (see above)",canceled:"Canceled (no changes applied)",skipped:"Skipped (see above)",agent_prompt:"Prompt generated (apply it with your agent)",failed:"Failed \u2014 see the messages above"};return{ok:result.exitCode===0,complete:result.exitCode===0&&result.outcome!=="canceled"&&result.outcome!=="skipped"&&result.outcome!=="agent_prompt",summary:summaries[result.outcome]}}var import_chalk286=__toESM(require_source(),1);var SignupTelemetryClient=class extends TelemetryClient{trackCliOptionEmail(email2){email2&&this.trackCliOption({option:"email",value:this.redactedValue})}trackState(...args){this.trackLoginState(...args)}};function isValidEmail(value){return email.test(value.trim())}async function signup(client){let telemetry2=new SignupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(signupCommand.options))}catch(error){return printError(error,client),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("signup"),output_manager_default.print(help(signupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.flags["--token"])return output_manager_default.error('`--token` may not be used with the "signup" command'),2;if(parsedArgs.args.slice(1).length)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("signup --email user@example.com")}`),2;let emailOption=parsedArgs.flags["--email"];telemetry2.trackCliOptionEmail(emailOption);let email2=emailOption?.trim();if(email2&&!isValidEmail(email2))return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The value provided for --email is not a valid email address."}),output_manager_default.error(`Couldn't use ${import_chalk286.default.bold(email2)}: not a valid email address.`),1;let canPrompt2=client.stdin.isTTY===!0&&!client.nonInteractive&&!client.isAgent;if(!email2){if(!canPrompt2)return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Provide an email address with --email."}),output_manager_default.error(`Provide an email address with ${import_chalk286.default.bold("--email")}. Example: ${getCommandName("signup --email user@example.com")}`),1;email2=await client.input.text({message:"Email?",validate:value=>isValidEmail(value)?!0:"Enter a valid email address."}),email2=email2.trim()}telemetry2.trackState("started");try{let tokens=await performDeviceCodeFlow(client,{signupEmail:email2});if(!tokens)return telemetry2.trackState("error"),1;await saveDeviceCodeTokens(client,tokens)}catch(error){return telemetry2.trackState("error"),printError(error),1}return output_manager_default.print(`
1284
- ${import_chalk286.default.cyan("Welcome to Vercel!")} Your account is ready and you are signed in.
1293
+ `),{ok,complete:ok&&result.status!=="declined",summary:visible.length>0?visible.map(result2=>summarizePlugin(result2,result2.name)).join("; "):"Skipped (no plugin available for the selected agents)"}}function summarizePlugin(result,name){switch(result.status){case"installed":return`Installed for ${name}`;case"enabled":return`Enabled for ${name}`;case"updated":return`Updated for ${name}`;case"up_to_date":return`Already installed for ${name}`;case"not_detected":return`Skipped (${name} not detected)`;case"declined":return`Skipped for ${name}`;case"confirmation_required":return`Confirmation required for ${name} (re-run with --yes)`;case"dry_run":return`Would ${result.action??"install"} for ${name}`;case"failed":return`Failed for ${name}`}}async function runGatewayStep(client,opts){let argv=[];opts.yes&&argv.push("--yes"),opts.dryRun&&argv.push("--dry-run");for(let agent2 of opts.agents??[])argv.push("--agent",agent2);let result=await setupCodingAgents(client,argv),summaries={configured:"Completed (see above)",already_configured:"Already configured",dry_run:"Previewed (see above)",canceled:"Canceled (no changes applied)",skipped:"Skipped (see above)",agent_prompt:"Prompt generated (apply it with your agent)",failed:"Failed \u2014 see the messages above"};return{ok:result.exitCode===0,complete:result.exitCode===0&&result.outcome!=="canceled"&&result.outcome!=="skipped"&&result.outcome!=="agent_prompt",summary:summaries[result.outcome]}}var import_chalk287=__toESM(require_source(),1);var SignupTelemetryClient=class extends TelemetryClient{trackCliOptionEmail(email2){email2&&this.trackCliOption({option:"email",value:this.redactedValue})}trackState(...args){this.trackLoginState(...args)}};function isValidEmail(value){return email.test(value.trim())}async function signup(client){let telemetry2=new SignupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(signupCommand.options))}catch(error){return printError(error,client),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("signup"),output_manager_default.print(help(signupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.flags["--token"])return output_manager_default.error('`--token` may not be used with the "signup" command'),2;if(parsedArgs.args.slice(1).length)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("signup --email user@example.com")}`),2;let emailOption=parsedArgs.flags["--email"];telemetry2.trackCliOptionEmail(emailOption);let email2=emailOption?.trim();if(email2&&!isValidEmail(email2))return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The value provided for --email is not a valid email address."}),output_manager_default.error(`Couldn't use ${import_chalk287.default.bold(email2)}: not a valid email address.`),1;let canPrompt2=client.stdin.isTTY===!0&&!client.nonInteractive&&!client.isAgent;if(!email2){if(!canPrompt2)return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Provide an email address with --email."}),output_manager_default.error(`Provide an email address with ${import_chalk287.default.bold("--email")}. Example: ${getCommandName("signup --email user@example.com")}`),1;email2=await client.input.text({message:"Email?",validate:value=>isValidEmail(value)?!0:"Enter a valid email address."}),email2=email2.trim()}telemetry2.trackState("started");try{let tokens=await performDeviceCodeFlow(client,{signupEmail:email2});if(!tokens)return telemetry2.trackState("error"),1;await saveDeviceCodeTokens(client,tokens)}catch(error){return telemetry2.trackState("error"),printError(error),1}return output_manager_default.print(`
1294
+ ${import_chalk287.default.cyan("Welcome to Vercel!")} Your account is ready and you are signed in.
1285
1295
 
1286
1296
  To deploy something, run ${getCommandName()}.
1287
1297
 
1288
1298
  ${emoji("tip")} To deploy every commit automatically,
1289
- connect a Git Repository (${import_chalk286.default.bold(output_manager_default.link("vercel.link/git","https://vercel.link/git",{color:!1}))}).
1290
- `),telemetry2.trackState("success"),0}var import_chalk287=__toESM(require_source(),1),import_frameworks3=__toESM(require_frameworks(),1),import_fs_detectors=__toESM(require_dist2(),1);import{access as access2,readFile as readFile9}from"fs/promises";import{join as join38}from"path";import{homedir as homedir3}from"os";import{spawn as spawn4}from"child_process";var SkillsTelemetryClient=class extends TelemetryClient{trackCliFlagJson(v){v&&this.trackCliFlag("json")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var SKILLS_API="https://skills.sh/api/search",FETCH_TIMEOUT_MS=1e4,MIN_INSTALLS=100,MAX_RESULTS=8,MAX_FRAMEWORK_RESULTS=4,MAX_DEP_QUERIES=5,NOTABLE_DEPS=new Set(["prisma","@prisma/client","drizzle-orm","mongoose","typeorm","sequelize","tailwindcss","next-auth","@auth/core","@clerk/nextjs","lucia","@supabase/supabase-js","@trpc/server","graphql","@apollo/client","stripe","zustand","@reduxjs/toolkit","@tanstack/react-query","playwright","@playwright/test","cypress","vitest","jest","sanity","payload","contentful","turborepo","docker-compose","firebase","@sentry/nextjs","zod","convex","upstash","flags","@flags-sdk/vercel","@vercel/flags"]);async function searchSkills(query){try{let url=`${SKILLS_API}?q=${encodeURIComponent(query)}`,controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(url,{signal:controller.signal});return res.ok?(await res.json()).skills??[]:(output_manager_default.debug(`Skills API returned ${res.status} for query "${query}"`),[])}finally{clearTimeout(timeout)}}catch(err){return output_manager_default.debug(`Skills search failed for "${query}": ${err}`),[]}}async function detectProjectFramework(cwd){try{let fs3=new import_fs_detectors.LocalFileSystemDetector(cwd),detected=await(0,import_fs_detectors.detectFrameworks)({fs:fs3,frameworkList:import_frameworks3.frameworkList});if(detected.length>0)return{name:detected[0].name,slug:detected[0].slug||""}}catch{}return null}async function readPackageDeps(cwd){try{let raw=await readFile9(join38(cwd,"package.json"),"utf8"),pkg=JSON.parse(raw),allDeps={...pkg.dependencies,...pkg.devDependencies},depNames=Object.keys(allDeps),notable=depNames.filter(d=>NOTABLE_DEPS.has(d)),language=depNames.includes("typescript")?"typescript":"javascript";return{deps:notable,language}}catch{return{deps:[],language:"unknown"}}}function cleanDepName(dep){return dep.replace(/^@/,"").replace(/\//g,"-")}async function isSkillInstalled(name,cwd){let sanitized=name.toLowerCase().replace(/\s+/g,"-"),dirs=[join38(cwd,".agents","skills",sanitized),join38(homedir3(),".agents","skills",sanitized)];for(let dir of dirs)try{return await access2(dir),!0}catch{}return!1}function formatInstalls(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}async function skills(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(skillsCommand.options))}catch(error){return printError(error),1}let telemetry2=new SkillsTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("skills"),output_manager_default.print(help(skillsCommand,{columns:client.stderr.columns})),2;telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliArgumentQuery(parsedArgs.args[1]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,query=parsedArgs.args[1],{cwd}=client,yes=parsedArgs.flags["--yes"]??!1;try{return query?await directSearch(client,query,asJson,cwd):await autoDetect(client,cwd,asJson,yes)}catch(err){return printError(err),1}}async function directSearch(client,query,asJson,cwd){output_manager_default.spinner("Searching skills...");let results=await searchSkills(query);output_manager_default.stopSpinner();let filtered=results.filter(s=>s.installs>=MIN_INSTALLS).slice(0,MAX_RESULTS),{exitCode:exitCode2}=await displayResults(client,filtered,asJson,`Search: "${query}"`,cwd);return exitCode2}async function autoDetect(client,cwd,asJson,yes){output_manager_default.spinner("Detecting project...");let[framework,{deps,language}]=await Promise.all([detectProjectFramework(cwd),readPackageDeps(cwd)]);if(!framework&&deps.length===0)return output_manager_default.stopSpinner(),output_manager_default.log("Could not detect a framework or notable dependencies in this directory."),output_manager_default.log(`Try searching directly: ${import_chalk287.default.cyan("vercel skills <query>")}`),0;let detectedParts=[];framework&&detectedParts.push(framework.name),language!=="unknown"&&detectedParts.push(language),deps.length>0&&detectedParts.push(deps.join(", ")),output_manager_default.stopSpinner(),output_manager_default.log(`Detected: ${import_chalk287.default.bold(detectedParts.join(" + "))}`),output_manager_default.spinner("Searching for relevant skills...");let queries=[];if(framework){let slug=(framework.slug||framework.name).toLowerCase().replace(/-\d+$/,"");queries.push({term:slug,tier:"framework"});let base=slug.replace(/(kit|js)$/,"");base&&base!==slug&&queries.push({term:base,tier:"framework"}),output_manager_default.debug(`Framework queries: ${queries.map(q=>q.term).join(", ")}`)}for(let dep of deps.slice(0,MAX_DEP_QUERIES))queries.push({term:cleanDepName(dep),tier:"dependency"});output_manager_default.debug(`Total queries: ${queries.map(q=>`${q.term} (${q.tier})`).join(", ")}`);let searchResults=await Promise.allSettled(queries.map(async q=>({tier:q.tier,skills:await searchSkills(q.term)}))),frameworkSkills=new Map,depSkills=new Map;for(let result of searchResults){if(result.status!=="fulfilled")continue;let{tier,skills:resultSkills}=result.value,bucket=tier==="framework"?frameworkSkills:depSkills;for(let skill of resultSkills){if(skill.installs<MIN_INSTALLS)continue;let existing=bucket.get(skill.skillId);(!existing||skill.installs>existing.installs)&&bucket.set(skill.skillId,skill)}}let sortByInstalls=(a,b)=>b.installs-a.installs,topFramework=Array.from(frameworkSkills.values()).sort(sortByInstalls).slice(0,MAX_FRAMEWORK_RESULTS);for(let fw of topFramework)depSkills.delete(fw.skillId);let topDeps=Array.from(depSkills.values()).sort(sortByInstalls).slice(0,MAX_RESULTS-topFramework.length),ranked=[...topFramework,...topDeps];output_manager_default.debug(`Results: ${topFramework.length} framework + ${topDeps.length} dependency skills`),output_manager_default.stopSpinner();let{exitCode:exitCode2,results:displayedResults,installedChecks}=await displayResults(client,ranked,asJson,`Detected: ${detectedParts.join(" + ")}`,cwd);if(exitCode2!==0||asJson)return exitCode2;let installable=displayedResults.map((s,i)=>({...s,installed:installedChecks[i]})).filter(s=>!s.installed);if(installable.length===0)return output_manager_default.log(import_chalk287.default.green("All recommended skills are already installed.")),0;let toInstall;if(yes)toInstall=installable;else if(client.stdin.isTTY){let selected=await client.input.checkbox({message:"Select skills to install",choices:installable.map(s=>({name:`${s.skillId} ${import_chalk287.default.gray(`(${s.source})`)}`,value:s,checked:!0}))});if(!Array.isArray(selected)||selected.length===0)return output_manager_default.log("No skills selected."),0;toInstall=selected}else return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;output_manager_default.log(`
1299
+ connect a Git Repository (${import_chalk287.default.bold(output_manager_default.link("vercel.link/git","https://vercel.link/git",{color:!1}))}).
1300
+ `),telemetry2.trackState("success"),0}var import_chalk288=__toESM(require_source(),1),import_frameworks3=__toESM(require_frameworks(),1),import_fs_detectors=__toESM(require_dist2(),1);import{access as access2,readFile as readFile9}from"fs/promises";import{join as join38}from"path";import{homedir as homedir3}from"os";import{spawn as spawn4}from"child_process";var SkillsTelemetryClient=class extends TelemetryClient{trackCliFlagJson(v){v&&this.trackCliFlag("json")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var SKILLS_API="https://skills.sh/api/search",FETCH_TIMEOUT_MS=1e4,MIN_INSTALLS=100,MAX_RESULTS=8,MAX_FRAMEWORK_RESULTS=4,MAX_DEP_QUERIES=5,NOTABLE_DEPS=new Set(["prisma","@prisma/client","drizzle-orm","mongoose","typeorm","sequelize","tailwindcss","next-auth","@auth/core","@clerk/nextjs","lucia","@supabase/supabase-js","@trpc/server","graphql","@apollo/client","stripe","zustand","@reduxjs/toolkit","@tanstack/react-query","playwright","@playwright/test","cypress","vitest","jest","sanity","payload","contentful","turborepo","docker-compose","firebase","@sentry/nextjs","zod","convex","upstash","flags","@flags-sdk/vercel","@vercel/flags"]);async function searchSkills(query){try{let url=`${SKILLS_API}?q=${encodeURIComponent(query)}`,controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(url,{signal:controller.signal});return res.ok?(await res.json()).skills??[]:(output_manager_default.debug(`Skills API returned ${res.status} for query "${query}"`),[])}finally{clearTimeout(timeout)}}catch(err){return output_manager_default.debug(`Skills search failed for "${query}": ${err}`),[]}}async function detectProjectFramework(cwd){try{let fs3=new import_fs_detectors.LocalFileSystemDetector(cwd),detected=await(0,import_fs_detectors.detectFrameworks)({fs:fs3,frameworkList:import_frameworks3.frameworkList});if(detected.length>0)return{name:detected[0].name,slug:detected[0].slug||""}}catch{}return null}async function readPackageDeps(cwd){try{let raw=await readFile9(join38(cwd,"package.json"),"utf8"),pkg=JSON.parse(raw),allDeps={...pkg.dependencies,...pkg.devDependencies},depNames=Object.keys(allDeps),notable=depNames.filter(d=>NOTABLE_DEPS.has(d)),language=depNames.includes("typescript")?"typescript":"javascript";return{deps:notable,language}}catch{return{deps:[],language:"unknown"}}}function cleanDepName(dep){return dep.replace(/^@/,"").replace(/\//g,"-")}async function isSkillInstalled(name,cwd){let sanitized=name.toLowerCase().replace(/\s+/g,"-"),dirs=[join38(cwd,".agents","skills",sanitized),join38(homedir3(),".agents","skills",sanitized)];for(let dir of dirs)try{return await access2(dir),!0}catch{}return!1}function formatInstalls(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}async function skills(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(skillsCommand.options))}catch(error){return printError(error),1}let telemetry2=new SkillsTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("skills"),output_manager_default.print(help(skillsCommand,{columns:client.stderr.columns})),2;telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliArgumentQuery(parsedArgs.args[1]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,query=parsedArgs.args[1],{cwd}=client,yes=parsedArgs.flags["--yes"]??!1;try{return query?await directSearch(client,query,asJson,cwd):await autoDetect(client,cwd,asJson,yes)}catch(err){return printError(err),1}}async function directSearch(client,query,asJson,cwd){output_manager_default.spinner("Searching skills...");let results=await searchSkills(query);output_manager_default.stopSpinner();let filtered=results.filter(s=>s.installs>=MIN_INSTALLS).slice(0,MAX_RESULTS),{exitCode:exitCode2}=await displayResults(client,filtered,asJson,`Search: "${query}"`,cwd);return exitCode2}async function autoDetect(client,cwd,asJson,yes){output_manager_default.spinner("Detecting project...");let[framework,{deps,language}]=await Promise.all([detectProjectFramework(cwd),readPackageDeps(cwd)]);if(!framework&&deps.length===0)return output_manager_default.stopSpinner(),output_manager_default.log("Could not detect a framework or notable dependencies in this directory."),output_manager_default.log(`Try searching directly: ${import_chalk288.default.cyan("vercel skills <query>")}`),0;let detectedParts=[];framework&&detectedParts.push(framework.name),language!=="unknown"&&detectedParts.push(language),deps.length>0&&detectedParts.push(deps.join(", ")),output_manager_default.stopSpinner(),output_manager_default.log(`Detected: ${import_chalk288.default.bold(detectedParts.join(" + "))}`),output_manager_default.spinner("Searching for relevant skills...");let queries=[];if(framework){let slug=(framework.slug||framework.name).toLowerCase().replace(/-\d+$/,"");queries.push({term:slug,tier:"framework"});let base=slug.replace(/(kit|js)$/,"");base&&base!==slug&&queries.push({term:base,tier:"framework"}),output_manager_default.debug(`Framework queries: ${queries.map(q=>q.term).join(", ")}`)}for(let dep of deps.slice(0,MAX_DEP_QUERIES))queries.push({term:cleanDepName(dep),tier:"dependency"});output_manager_default.debug(`Total queries: ${queries.map(q=>`${q.term} (${q.tier})`).join(", ")}`);let searchResults=await Promise.allSettled(queries.map(async q=>({tier:q.tier,skills:await searchSkills(q.term)}))),frameworkSkills=new Map,depSkills=new Map;for(let result of searchResults){if(result.status!=="fulfilled")continue;let{tier,skills:resultSkills}=result.value,bucket=tier==="framework"?frameworkSkills:depSkills;for(let skill of resultSkills){if(skill.installs<MIN_INSTALLS)continue;let existing=bucket.get(skill.skillId);(!existing||skill.installs>existing.installs)&&bucket.set(skill.skillId,skill)}}let sortByInstalls=(a,b)=>b.installs-a.installs,topFramework=Array.from(frameworkSkills.values()).sort(sortByInstalls).slice(0,MAX_FRAMEWORK_RESULTS);for(let fw of topFramework)depSkills.delete(fw.skillId);let topDeps=Array.from(depSkills.values()).sort(sortByInstalls).slice(0,MAX_RESULTS-topFramework.length),ranked=[...topFramework,...topDeps];output_manager_default.debug(`Results: ${topFramework.length} framework + ${topDeps.length} dependency skills`),output_manager_default.stopSpinner();let{exitCode:exitCode2,results:displayedResults,installedChecks}=await displayResults(client,ranked,asJson,`Detected: ${detectedParts.join(" + ")}`,cwd);if(exitCode2!==0||asJson)return exitCode2;let installable=displayedResults.map((s,i)=>({...s,installed:installedChecks[i]})).filter(s=>!s.installed);if(installable.length===0)return output_manager_default.log(import_chalk288.default.green("All recommended skills are already installed.")),0;let toInstall;if(yes)toInstall=installable;else if(client.stdin.isTTY){let selected=await client.input.checkbox({message:"Select skills to install",choices:installable.map(s=>({name:`${s.skillId} ${import_chalk288.default.gray(`(${s.source})`)}`,value:s,checked:!0}))});if(!Array.isArray(selected)||selected.length===0)return output_manager_default.log("No skills selected."),0;toInstall=selected}else return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;output_manager_default.log(`
1291
1301
  Installing ${toInstall.length} skill${toInstall.length>1?"s":""}...
1292
- `);let bySource=new Map;for(let skill of toInstall){let existing=bySource.get(skill.source)??[];existing.push(skill.skillId),bySource.set(skill.source,existing)}let succeeded=[],failed=[];for(let[source,skillIds]of bySource){let label=skillIds.length===1?skillIds[0]:skillIds.join(", ");output_manager_default.spinner(`Installing ${label} from ${source}...`);let args=["skills","add",source];for(let id of skillIds)args.push("--skill",id);args.push("-y"),output_manager_default.debug(`> npx ${args.join(" ")}`);let code2=await runCommand("npx",args);output_manager_default.stopSpinner(),code2!==0?failed.push(...skillIds):succeeded.push(...skillIds)}return succeeded.length>0&&output_manager_default.success(`Installed ${succeeded.length} skill${succeeded.length>1?"s":""}: ${succeeded.join(", ")}`),failed.length>0&&output_manager_default.error(`Failed to install: ${failed.join(", ")}`),0}async function displayResults(client,results,asJson,context,cwd){let empty={exitCode:0,results,installedChecks:[]};if(results.length===0)return output_manager_default.log("No skills found."),output_manager_default.log(`Try searching directly: ${import_chalk287.default.cyan("vercel skills <query>")}`),empty;let installedChecks=await Promise.all(results.map(s=>isSkillInstalled(s.skillId,cwd)));if(asJson){output_manager_default.stopSpinner();let skillsWithStatus=results.map((s,i)=>({...s,installed:installedChecks[i]}));return client.stdout.write(`${JSON.stringify({context,skills:skillsWithStatus},null,2)}
1293
- `),{exitCode:0,results,installedChecks}}let tableData=[["Skill","Installs","Source",""].map(h=>import_chalk287.default.bold(import_chalk287.default.cyan(h))),...results.map((s,i)=>[s.skillId,formatInstalls(s.installs),import_chalk287.default.gray(s.source),installedChecks[i]?import_chalk287.default.green("installed"):""])];return output_manager_default.log(`
1294
- ${table(tableData,{hsep:4})}`),{exitCode:0,results,installedChecks}}function runCommand(cmd2,args){return new Promise(resolve14=>{let child=spawn4(cmd2,args,{stdio:"pipe"});child.on("close",code2=>resolve14(code2??1)),child.on("error",()=>resolve14(1))})}var StorageTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}};var import_chalk290=__toESM(require_source(),1);var STORAGE_AUTH_MODES=["oidc","token"],DEFAULT_STORAGE_AUTH_MODE="oidc";function parseAuthMode(value){if(value===void 0)return{valid:!0,mode:DEFAULT_STORAGE_AUTH_MODE,explicit:!1};let normalized=value.toLowerCase();return STORAGE_AUTH_MODES.includes(normalized)?{valid:!0,mode:normalized,explicit:!0}:{valid:!1,error:`Invalid --auth value: "${value}". Must be one of: ${STORAGE_AUTH_MODES.join(", ")}.`}}function resolveStorageAuth({store,mode,addRwToken}){let product=storeProductLabel(store);return storeSupportsOidc(store)?mode==="token"&&!addRwToken?{valid:!1,reason:"rw_token_opt_in_required",error:"--auth token writes a long-lived read-write token into your project.",hint:"Pass --add-rw-token to confirm, or drop --auth token to use the OIDC default."}:mode==="token"?{valid:!0,auth:{requested:mode,effective:"token",useOidcHeader:!1,readWriteToken:!0,notes:[]}}:{valid:!0,auth:{requested:mode,effective:"oidc",useOidcHeader:!0,readWriteToken:addRwToken,notes:addRwToken?["The static read-write token is written alongside the OIDC variables because --add-rw-token was passed."]:[]}}:addRwToken?{valid:!1,reason:"unsupported_auth_mode",error:`--add-rw-token only applies to Vercel Blob stores. ${store.name} is a ${product} resource, and its credentials are issued by the provider.`,hint:"Re-run without --add-rw-token."}:{valid:!0,auth:{requested:mode,effective:"provider-managed",useOidcHeader:mode==="oidc",readWriteToken:!1,notes:[`${product} issues its own credentials for this resource; Vercel OIDC does not apply.`]}}}function storageAuthHeaders(auth){return auth.useOidcHeader?{"x-vercel-use-oidc":"1"}:{}}function describeStorageAuth(auth){switch(auth.effective){case"oidc":return auth.readWriteToken?"oidc + static read-write token":"oidc (no static credentials)";case"token":return"static read-write token";case"provider-managed":return"provider-managed credentials"}}function inferConnectionAuth(store,environmentVariables){if(!storeSupportsOidc(store))return"provider-managed";if(!environmentVariables)return"unknown";let hasStoreId=environmentVariables.some(name=>name.endsWith("_STORE_ID")),hasRwToken=environmentVariables.some(name=>name.endsWith("_READ_WRITE_TOKEN"));return hasStoreId?"oidc":hasRwToken?"token":"unknown"}async function connectStoreToProject(client,{store,projectId,environments,envVarPrefix,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),body:{projectId,envVarEnvironments:environments,...envVarPrefix!==void 0?{envVarPrefix}:{},...storeSupportsOidc(store)&&!auth.readWriteToken?{skipReadWriteToken:!0}:{}},accountId})}async function updateStoreConnection(client,{store,connectionId,environments,envVarPrefix,skipReadWriteToken,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"PATCH",body:{...environments!==void 0?{envVarEnvironments:environments}:{},...envVarPrefix!==void 0?{envVarPrefix}:{},...skipReadWriteToken!==void 0?{skipReadWriteToken}:{}},accountId})}async function upgradeStoreConnectionToOidc(client,{store,connectionId,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}/upgrade-to-oidc`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),accountId})}async function disconnectStoreConnection(client,{store,connectionId,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"DELETE",accountId})}async function disconnectAllStoreConnections(client,{store,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"DELETE",accountId})}var ENV_VAR_PREFIX_PATTERN=/^[a-zA-Z][a-zA-Z0-9_]*$/;function normalizeEnvVarPrefix(prefix){if(prefix==null)return;let canonical=prefix.replace(/_+$/,"");return canonical.length>0?canonical:void 0}var BLOB_DEFAULT_PREFIX="BLOB";function blobEnvVarNames(prefix){let base=normalizeEnvVarPrefix(prefix)??BLOB_DEFAULT_PREFIX;return{readWriteToken:`${base}_READ_WRITE_TOKEN`,storeId:`${base}_STORE_ID`,webhookPublicKey:`${base}_WEBHOOK_PUBLIC_KEY`}}function emptyPlan(source){return{add:[],remove:[],keep:[],source,notes:[]}}function sorted(names){return[...new Set(names)].sort()}function difference(a,b){let exclude=new Set(b);return sorted(a.filter(name=>!exclude.has(name)))}function intersection(a,b){let include=new Set(b);return sorted(a.filter(name=>include.has(name)))}function desiredBlobNames({auth,prefix,hasOidcVars}){let names=blobEnvVarNames(prefix),desired=[];return(auth.effective==="oidc"||hasOidcVars)&&desired.push(names.storeId,names.webhookPublicKey),auth.readWriteToken&&desired.push(names.readWriteToken),sorted(desired)}function planConnectEnvVars({store,auth,prefix,sibling}){return storeSupportsOidc(store)?{add:desiredBlobNames({auth,prefix,hasOidcVars:!1}),remove:[],keep:[],source:"computed",notes:[]}:sibling!==void 0&&normalizeEnvVarPrefix(sibling.envVarPrefix)===normalizeEnvVarPrefix(prefix)&&sibling?.environmentVariables&&sibling.environmentVariables.length>0?{add:sorted(sibling.environmentVariables),remove:[],keep:[],source:"connection",notes:[`Names mirror this store's existing connection to ${sibling.name}.`]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the connection is created.`]}}function planUpdateEnvVars({store,auth,prefix,connection,prefixChanged}){let current=sorted(connection.environmentVariables??[]);if(storeSupportsOidc(store)){let hasOidcVars=current.some(name=>name.endsWith("_STORE_ID")),desired=desiredBlobNames({auth,prefix,hasOidcVars}),plan={add:difference(desired,current),remove:difference(current,desired),keep:intersection(current,desired),source:"computed",notes:[]};return hasOidcVars&&auth.effective==="token"&&plan.notes.push("The OIDC variables stay in place \u2014 Vercel does not remove them once a connection has been upgraded."),plan}return current.length?prefixChanged?{add:[],remove:current,keep:[],source:"provider",notes:[`${storeProductLabel(store)} names the variables for this resource, so the re-prefixed names are reported once the update is applied.`]}:{add:[],remove:[],keep:current,source:"connection",notes:["The variables are re-scoped, not renamed."]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the update is applied.`]}}function diffEnvVarNames(before,after){return{add:difference(after,before),remove:difference(before,after),keep:intersection(before,after),source:"connection",notes:[]}}function planDisconnectEnvVars(connections){let known=connections.flatMap(connection=>connection.environmentVariables??[]),anyUnknown=connections.some(connection=>connection.environmentVariables===void 0);return!known.length&&anyUnknown?{...emptyPlan("provider"),notes:["Vercel did not report the variable names for this connection; every variable it owns is removed."]}:{add:[],remove:sorted(known),keep:[],source:"connection",notes:[]}}var import_chalk288=__toESM(require_source(),1);function buildStoragePlan({action,dryRun,store,projects:projects2,environments,envVarPrefix,auth,envVars}){return{action,dryRun,store:{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store)},projects:projects2,environments,envVarPrefix:envVarPrefix??null,...auth?{auth:{requested:auth.requested,effective:auth.effective,readWriteToken:auth.readWriteToken}}:{},envVars:{add:envVars.add,remove:envVars.remove,keep:envVars.keep,source:envVars.source,notes:[...auth?.notes??[],...envVars.notes]}}}var ACTION_TITLES={connect:"Storage connect plan",update:"Storage update plan",disconnect:"Storage disconnect plan"};function formatStoragePlan(plan){let lines=[`${import_chalk288.default.bold(ACTION_TITLES[plan.action])}${plan.dryRun?import_chalk288.default.dim(" (dry run)"):""}`,formatAlignedLabel("Store",`${plan.store.name} ${import_chalk288.default.dim(`(${plan.store.id})`)} \xB7 ${plan.store.product}`),formatAlignedLabel(plan.projects.length===1?"Project":"Projects",plan.projects.length?plan.projects.map(project=>`${project.name} ${import_chalk288.default.dim(`(${project.id})`)}`).join(", "):import_chalk288.default.dim("none"))];plan.environments.length&&lines.push(formatAlignedLabel("Environments",plan.environments.join(", "))),lines.push(formatAlignedLabel("Prefix",plan.envVarPrefix??import_chalk288.default.dim("none (product default)"))),plan.auth&&lines.push(formatAlignedLabel("Credentials",describeStorageAuth(plan.auth)));let changes=[...plan.envVars.add.map(name=>import_chalk288.default.green(`+ ${name}`)),...plan.envVars.remove.map(name=>import_chalk288.default.red(`- ${name}`)),...plan.envVars.keep.map(name=>import_chalk288.default.dim(`= ${name}`))];if(changes.length){lines.push(formatAlignedLabel("Env vars",changes[0]));for(let change2 of changes.slice(1))lines.push(formatAlignedLabel("",change2))}else lines.push(formatAlignedLabel("Env vars",import_chalk288.default.dim(plan.envVars.source==="provider"?"names unavailable":"no changes")));for(let note of plan.envVars.notes)lines.push(formatAlignedLabel("Note",import_chalk288.default.dim(note)));return`${lines.join(`
1302
+ `);let bySource=new Map;for(let skill of toInstall){let existing=bySource.get(skill.source)??[];existing.push(skill.skillId),bySource.set(skill.source,existing)}let succeeded=[],failed=[];for(let[source,skillIds]of bySource){let label=skillIds.length===1?skillIds[0]:skillIds.join(", ");output_manager_default.spinner(`Installing ${label} from ${source}...`);let args=["skills","add",source];for(let id of skillIds)args.push("--skill",id);args.push("-y"),output_manager_default.debug(`> npx ${args.join(" ")}`);let code2=await runCommand("npx",args);output_manager_default.stopSpinner(),code2!==0?failed.push(...skillIds):succeeded.push(...skillIds)}return succeeded.length>0&&output_manager_default.success(`Installed ${succeeded.length} skill${succeeded.length>1?"s":""}: ${succeeded.join(", ")}`),failed.length>0&&output_manager_default.error(`Failed to install: ${failed.join(", ")}`),0}async function displayResults(client,results,asJson,context,cwd){let empty={exitCode:0,results,installedChecks:[]};if(results.length===0)return output_manager_default.log("No skills found."),output_manager_default.log(`Try searching directly: ${import_chalk288.default.cyan("vercel skills <query>")}`),empty;let installedChecks=await Promise.all(results.map(s=>isSkillInstalled(s.skillId,cwd)));if(asJson){output_manager_default.stopSpinner();let skillsWithStatus=results.map((s,i)=>({...s,installed:installedChecks[i]}));return client.stdout.write(`${JSON.stringify({context,skills:skillsWithStatus},null,2)}
1303
+ `),{exitCode:0,results,installedChecks}}let tableData=[["Skill","Installs","Source",""].map(h=>import_chalk288.default.bold(import_chalk288.default.cyan(h))),...results.map((s,i)=>[s.skillId,formatInstalls(s.installs),import_chalk288.default.gray(s.source),installedChecks[i]?import_chalk288.default.green("installed"):""])];return output_manager_default.log(`
1304
+ ${table(tableData,{hsep:4})}`),{exitCode:0,results,installedChecks}}function runCommand(cmd2,args){return new Promise(resolve14=>{let child=spawn4(cmd2,args,{stdio:"pipe"});child.on("close",code2=>resolve14(code2??1)),child.on("error",()=>resolve14(1))})}var StorageTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}};var import_chalk291=__toESM(require_source(),1);var STORAGE_AUTH_MODES=["oidc","token"],DEFAULT_STORAGE_AUTH_MODE="oidc";function parseAuthMode(value){if(value===void 0)return{valid:!0,mode:DEFAULT_STORAGE_AUTH_MODE,explicit:!1};let normalized=value.toLowerCase();return STORAGE_AUTH_MODES.includes(normalized)?{valid:!0,mode:normalized,explicit:!0}:{valid:!1,error:`Invalid --auth value: "${value}". Must be one of: ${STORAGE_AUTH_MODES.join(", ")}.`}}function resolveStorageAuth({store,mode,addRwToken}){let product=storeProductLabel(store);return storeSupportsOidc(store)?mode==="token"&&!addRwToken?{valid:!1,reason:"rw_token_opt_in_required",error:"--auth token writes a long-lived read-write token into your project.",hint:"Pass --add-rw-token to confirm, or drop --auth token to use the OIDC default."}:mode==="token"?{valid:!0,auth:{requested:mode,effective:"token",useOidcHeader:!1,readWriteToken:!0,notes:[]}}:{valid:!0,auth:{requested:mode,effective:"oidc",useOidcHeader:!0,readWriteToken:addRwToken,notes:addRwToken?["The static read-write token is written alongside the OIDC variables because --add-rw-token was passed."]:[]}}:addRwToken?{valid:!1,reason:"unsupported_auth_mode",error:`--add-rw-token only applies to Vercel Blob stores. ${store.name} is a ${product} resource, and its credentials are issued by the provider.`,hint:"Re-run without --add-rw-token."}:{valid:!0,auth:{requested:mode,effective:"provider-managed",useOidcHeader:mode==="oidc",readWriteToken:!1,notes:[`${product} issues its own credentials for this resource; Vercel OIDC does not apply.`]}}}function storageAuthHeaders(auth){return auth.useOidcHeader?{"x-vercel-use-oidc":"1"}:{}}function describeStorageAuth(auth){switch(auth.effective){case"oidc":return auth.readWriteToken?"oidc + static read-write token":"oidc (no static credentials)";case"token":return"static read-write token";case"provider-managed":return"provider-managed credentials"}}function inferConnectionAuth(store,environmentVariables){if(!storeSupportsOidc(store))return"provider-managed";if(!environmentVariables)return"unknown";let hasStoreId=environmentVariables.some(name=>name.endsWith("_STORE_ID")),hasRwToken=environmentVariables.some(name=>name.endsWith("_READ_WRITE_TOKEN"));return hasStoreId?"oidc":hasRwToken?"token":"unknown"}async function connectStoreToProject(client,{store,projectId,environments,envVarPrefix,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),body:{projectId,envVarEnvironments:environments,...envVarPrefix!==void 0?{envVarPrefix}:{},...storeSupportsOidc(store)&&!auth.readWriteToken?{skipReadWriteToken:!0}:{}},accountId})}async function updateStoreConnection(client,{store,connectionId,environments,envVarPrefix,skipReadWriteToken,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"PATCH",body:{...environments!==void 0?{envVarEnvironments:environments}:{},...envVarPrefix!==void 0?{envVarPrefix}:{},...skipReadWriteToken!==void 0?{skipReadWriteToken}:{}},accountId})}async function upgradeStoreConnectionToOidc(client,{store,connectionId,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}/upgrade-to-oidc`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),accountId})}async function disconnectStoreConnection(client,{store,connectionId,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"DELETE",accountId})}async function disconnectAllStoreConnections(client,{store,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"DELETE",accountId})}var ENV_VAR_PREFIX_PATTERN=/^[a-zA-Z][a-zA-Z0-9_]*$/;function normalizeEnvVarPrefix(prefix){if(prefix==null)return;let canonical=prefix.replace(/_+$/,"");return canonical.length>0?canonical:void 0}var BLOB_DEFAULT_PREFIX="BLOB";function blobEnvVarNames(prefix){let base=normalizeEnvVarPrefix(prefix)??BLOB_DEFAULT_PREFIX;return{readWriteToken:`${base}_READ_WRITE_TOKEN`,storeId:`${base}_STORE_ID`,webhookPublicKey:`${base}_WEBHOOK_PUBLIC_KEY`}}function emptyPlan(source){return{add:[],remove:[],keep:[],source,notes:[]}}function sorted(names){return[...new Set(names)].sort()}function difference(a,b){let exclude=new Set(b);return sorted(a.filter(name=>!exclude.has(name)))}function intersection(a,b){let include=new Set(b);return sorted(a.filter(name=>include.has(name)))}function desiredBlobNames({auth,prefix,hasOidcVars}){let names=blobEnvVarNames(prefix),desired=[];return(auth.effective==="oidc"||hasOidcVars)&&desired.push(names.storeId,names.webhookPublicKey),auth.readWriteToken&&desired.push(names.readWriteToken),sorted(desired)}function planConnectEnvVars({store,auth,prefix,sibling}){return storeSupportsOidc(store)?{add:desiredBlobNames({auth,prefix,hasOidcVars:!1}),remove:[],keep:[],source:"computed",notes:[]}:sibling!==void 0&&normalizeEnvVarPrefix(sibling.envVarPrefix)===normalizeEnvVarPrefix(prefix)&&sibling?.environmentVariables&&sibling.environmentVariables.length>0?{add:sorted(sibling.environmentVariables),remove:[],keep:[],source:"connection",notes:[`Names mirror this store's existing connection to ${sibling.name}.`]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the connection is created.`]}}function planUpdateEnvVars({store,auth,prefix,connection,prefixChanged}){let current=sorted(connection.environmentVariables??[]);if(storeSupportsOidc(store)){let hasOidcVars=current.some(name=>name.endsWith("_STORE_ID")),desired=desiredBlobNames({auth,prefix,hasOidcVars}),plan={add:difference(desired,current),remove:difference(current,desired),keep:intersection(current,desired),source:"computed",notes:[]};return hasOidcVars&&auth.effective==="token"&&plan.notes.push("The OIDC variables stay in place \u2014 Vercel does not remove them once a connection has been upgraded."),plan}return current.length?prefixChanged?{add:[],remove:current,keep:[],source:"provider",notes:[`${storeProductLabel(store)} names the variables for this resource, so the re-prefixed names are reported once the update is applied.`]}:{add:[],remove:[],keep:current,source:"connection",notes:["The variables are re-scoped, not renamed."]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the update is applied.`]}}function diffEnvVarNames(before,after){return{add:difference(after,before),remove:difference(before,after),keep:intersection(before,after),source:"connection",notes:[]}}function planDisconnectEnvVars(connections){let known=connections.flatMap(connection=>connection.environmentVariables??[]),anyUnknown=connections.some(connection=>connection.environmentVariables===void 0);return!known.length&&anyUnknown?{...emptyPlan("provider"),notes:["Vercel did not report the variable names for this connection; every variable it owns is removed."]}:{add:[],remove:sorted(known),keep:[],source:"connection",notes:[]}}var import_chalk289=__toESM(require_source(),1);function buildStoragePlan({action,dryRun,store,projects:projects2,environments,envVarPrefix,auth,envVars}){return{action,dryRun,store:{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store)},projects:projects2,environments,envVarPrefix:envVarPrefix??null,...auth?{auth:{requested:auth.requested,effective:auth.effective,readWriteToken:auth.readWriteToken}}:{},envVars:{add:envVars.add,remove:envVars.remove,keep:envVars.keep,source:envVars.source,notes:[...auth?.notes??[],...envVars.notes]}}}var ACTION_TITLES={connect:"Storage connect plan",update:"Storage update plan",disconnect:"Storage disconnect plan"};function formatStoragePlan(plan){let lines=[`${import_chalk289.default.bold(ACTION_TITLES[plan.action])}${plan.dryRun?import_chalk289.default.dim(" (dry run)"):""}`,formatAlignedLabel("Store",`${plan.store.name} ${import_chalk289.default.dim(`(${plan.store.id})`)} \xB7 ${plan.store.product}`),formatAlignedLabel(plan.projects.length===1?"Project":"Projects",plan.projects.length?plan.projects.map(project=>`${project.name} ${import_chalk289.default.dim(`(${project.id})`)}`).join(", "):import_chalk289.default.dim("none"))];plan.environments.length&&lines.push(formatAlignedLabel("Environments",plan.environments.join(", "))),lines.push(formatAlignedLabel("Prefix",plan.envVarPrefix??import_chalk289.default.dim("none (product default)"))),plan.auth&&lines.push(formatAlignedLabel("Credentials",describeStorageAuth(plan.auth)));let changes=[...plan.envVars.add.map(name=>import_chalk289.default.green(`+ ${name}`)),...plan.envVars.remove.map(name=>import_chalk289.default.red(`- ${name}`)),...plan.envVars.keep.map(name=>import_chalk289.default.dim(`= ${name}`))];if(changes.length){lines.push(formatAlignedLabel("Env vars",changes[0]));for(let change2 of changes.slice(1))lines.push(formatAlignedLabel("",change2))}else lines.push(formatAlignedLabel("Env vars",import_chalk289.default.dim(plan.envVars.source==="provider"?"names unavailable":"no changes")));for(let note of plan.envVars.notes)lines.push(formatAlignedLabel("Note",import_chalk289.default.dim(note)));return`${lines.join(`
1295
1305
  `)}
1296
- `}var StorageConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_chalk289=__toESM(require_source(),1);function failWith(client,{reason,message,hint,next}){let payload={status:AGENT_STATUS.ERROR,reason,message,...hint?{hint}:{},...next?{next}:{}};return outputAgentError(client,payload),wantsMachineReadableOutput(void 0,client.argv)&&client.stdout.write(`${JSON.stringify(payload,null,2)}
1306
+ `}var StorageConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_chalk290=__toESM(require_source(),1);function failWith(client,{reason,message,hint,next}){let payload={status:AGENT_STATUS.ERROR,reason,message,...hint?{hint}:{},...next?{next}:{}};return outputAgentError(client,payload),wantsMachineReadableOutput(void 0,client.argv)&&client.stdout.write(`${JSON.stringify(payload,null,2)}
1297
1307
  `),output_manager_default.error(message),hint&&output_manager_default.log(hint),1}async function resolveStorageScope(client,projectNameOrId){let link=await resolveProjectContext({client,projectNameOrId});return link.status==="error"?link.exitCode:link.status==="not_linked"?failWith(client,{reason:AGENT_REASON.NOT_LINKED,message:"No project resolved. Pass --project <name-or-id>, or link this directory first.",next:[{command:getCommandNamePlain("link"),when:"link this directory to a project"}]}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{project:{id:link.project.id,name:link.project.name},accountId:link.org.id,teamSlug:link.org.slug})}async function resolveStorageAccount(client){let link=await getLinkedProject(client);if(link.status==="error")return link.exitCode;if(link.status==="linked")return client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{accountId:link.org.id,teamSlug:link.org.slug,linkedProject:{id:link.project.id,name:link.project.name}};let{team}=await getScope(client);return client.config.currentTeam=team?.id,{accountId:team?.id,teamSlug:team?.slug,linkedProject:void 0}}function labelFor(key){return key.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\burl\b/i,"URL").replace(/\bid\b/i,"ID").replace(/^./,first=>first.toUpperCase())}async function resolveStorageStore(client,identifier,accountId,options={}){output_manager_default.spinner("Retrieving storage resources\u2026",500);let stores;try{stores=await getStorageStores(client,{accountId})}finally{output_manager_default.stopSpinner()}options.type&&(stores=stores.filter(store=>storeMatchesType(store,options.type)));let result=resolveStore(stores,identifier);if(result.status==="found")return result.store;if(result.status==="ambiguous"){let candidates=result.matches.map(store=>`${store.id} (${storeTypeName(store)})`).join(", ");return failWith(client,{reason:"ambiguous_store",message:`More than one storage resource is named ${identifier}: ${candidates}. Pass --type <type> or a store ID instead.`})}return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`No storage resource ${identifier} found in this scope.`,next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]})}function resolveEnvironments(environmentFlags){if(!environmentFlags?.length)return{valid:!0,environments:[...VALID_ENVIRONMENTS],explicit:!1};let validation=validateEnvironments(environmentFlags);return validation.valid?{valid:!0,environments:[...new Set(environmentFlags)],explicit:!0}:{valid:!1,message:`Invalid environment value: ${validation.invalid.map(value=>`"${value}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}.`}}function resolvePrefix(prefix){return prefix===void 0?{valid:!0,prefix:void 0}:ENV_VAR_PREFIX_PATTERN.test(prefix)?{valid:!0,prefix:normalizeEnvVarPrefix(prefix)}:{valid:!1,message:"Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."}}function printStoragePlan(client,plan,asJson){if(asJson){client.stdout.write(`${JSON.stringify(plan,null,2)}
1298
- `);return}output_manager_default.print(formatStoragePlan(plan))}async function confirmStorageChange(client,{skipConfirmation,question}){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?failWith(client,{reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"This change requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]}):client.input.confirm(import_chalk289.default.cyan(question),!0)}function writeStorageResult(client,plan,{applied,asJson,message,next}){if(asJson){let result={...plan,applied,...next?.length?{next}:{}};client.stdout.write(`${JSON.stringify(result,null,2)}
1299
- `);return}if(!applied){output_manager_default.print(formatStoragePlan(plan)),output_manager_default.log("No changes applied. Re-run without --dry-run to apply them.");return}message&&output_manager_default.success(message);let written=[...plan.envVars.add,...plan.envVars.keep];written.length&&output_manager_default.log(`Environment variables: ${written.join(", ")}`),plan.envVars.remove.length&&output_manager_default.log(`Removed: ${plan.envVars.remove.join(", ")}`);for(let note of plan.envVars.notes)output_manager_default.log(note)}async function readBackConnectionEnvVars(client,{store,projectId,environments,accountId}){try{let fresh=await getStorageStore(client,store.id,{accountId}),connection=resolveProjectConnection(fresh,projectId,environments);return connection.status!=="found"?void 0:connection.connection.environmentVariables}catch(error){output_manager_default.debug(`Could not read back storage connection env vars: ${error.message}`);return}}async function connect3(client,argv){let telemetry2=new StorageConnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(connectSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwToken=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwToken),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage connect <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),1;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environments=resolveEnvironments(flags["--environment"]);if(!environments.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environments.message});let prefix=resolvePrefix(flags["--prefix"]);if(!prefix.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefix.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let auth=resolveStorageAuth({store,mode:authMode.mode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let overlapping=findOverlappingConnections(store,scope.project.id,environments.environments);if(overlapping.length>0)return failWith(client,{reason:"already_connected",message:`${store.name} is already connected to ${scope.project.name} in ${overlapping.flatMap(connection=>connection.environments).join(", ")}.`,hint:`Change the connection with ${getCommandName(`storage update ${store.name}`)}, or remove it with ${getCommandName(`storage disconnect ${store.name}`)}.`,next:[{command:getCommandNamePlain(`storage update ${store.name}`),when:"change environments, prefix, or credential mode"},{command:getCommandNamePlain(`storage disconnect ${store.name}`),when:"remove the existing connection first"}]});let envVars=planConnectEnvVars({store,auth:auth.auth,prefix:prefix.prefix,sibling:getConnections(store)[0]}),plan=buildStoragePlan({action:"connect",dryRun,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Connecting storage resource\u2026",500),await connectStoreToProject(client,{store,projectId:scope.project.id,environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,accountId:scope.accountId})}catch(error){return output_manager_default.stopSpinner(),reportConnectFailure(client,error,{storeName:store.name,projectName:scope.project.name,teamSlug:scope.teamSlug,environments:environments.environments,prefix:prefix.prefix})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments:environments.environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"connect",dryRun:!1,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars:diffEnvVarNames([],verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Connected ${import_chalk290.default.bold(store.name)} to ${import_chalk290.default.bold(scope.project.name)} (${environments.environments.join(", ")})`,next:[{command:getCommandNamePlain("env pull"),when:"sync the new variables into .env.local"}]}),0}function reportConnectFailure(client,error,{storeName,projectName,teamSlug,environments,prefix}){if(isAPIError(error)&&error.status===400){let conflict=error.serverMessage?.match(/existing environment variable with name ([A-Za-z_][A-Za-z0-9_]*)/);if(conflict){let varName=conflict[1],envRmCmd=["env rm",varName,environments.length===1?environments[0]:void 0,`--project ${projectName}`,teamSlug?`--scope ${teamSlug}`:void 0].filter(Boolean).join(" ");return failWith(client,{reason:"env_var_conflict",message:`Cannot connect ${storeName}: env var ${varName} already exists on ${projectName} in one of the target environments (${environments.join(", ")}).`,hint:prefix===void 0?"Re-run with `--prefix <PREFIX>` to namespace the new variables, or remove the existing one.":`Prefix \`${prefix}\` did not avoid the collision. Try a different prefix or remove the existing variable.`,next:[{command:buildCommandWithGlobalFlags(client.argv,envRmCmd,void 0,{excludeFlags:["--yes","-y"]}),when:`remove ${varName} from ${projectName}`}]})}}return failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while connecting: ${error.message}`})}var import_chalk291=__toESM(require_source(),1);var StorageCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(v){v&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliOptionAccess(v){v&&this.trackCliOption({option:"access",value:["public","private"].includes(v)?v:this.redactedValue})}trackCliOptionRegion(v){v&&this.trackCliOption({option:"region",value:this.redactedValue})}trackCliOptionItems(v){v&&this.trackCliOption({option:"items",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function create7(client,argv){let telemetry2=new StorageCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(createSubcommand7.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,name=args[0];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionType(flags["--type"]),telemetry2.trackCliOptionAccess(flags["--access"]),telemetry2.trackCliOptionRegion(flags["--region"]),telemetry2.trackCliOptionItems(flags["--items"]),!name)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a name for the store. See `--help` for details.",next:[{command:buildCommandWithGlobalFlags(client.argv,"storage create <name> --type <type>"),when:`replace <name> and <type> (${listStorageProviderTypes().join(", ")})`}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage create <name> --type <type>`."});let interactive=canPrompt(client),provider=await resolveProvider(client,flags["--type"],interactive);if(typeof provider=="number")return provider;let foreignFlags=findForeignCreateFlags(provider,flags);if(foreignFlags.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${foreignFlags.join(", ")} ${foreignFlags.length===1?"does":"do"} not apply to ${provider.label} stores.`});let validation=await provider.validateCreate(flags,{prompt:interactive?{select:(message,choices)=>client.input.select({message,choices})}:void 0});if(!validation.valid)return failWith(client,{reason:validation.reason,message:validation.message});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;output_manager_default.spinner(`Creating ${provider.label} store\u2026`,500);let created;try{created=await provider.create(client,{name,params:validation.params,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to create the store: ${error.message}`})}output_manager_default.stopSpinner();let connectCommand=account.linkedProject?`storage connect ${created.name}`:`storage connect ${created.name} --project <project>`,next=[{command:getCommandNamePlain(`${connectCommand} --yes`),when:account.linkedProject?"connect the new store to the linked project":"connect the new store to a project (replace <project>)"}];if(asJson){let result={status:"ok",store:{id:created.id,name:created.name,type:provider.type,product:provider.label,details:created.details},next};return client.stdout.write(`${JSON.stringify(result,null,2)}
1308
+ `);return}output_manager_default.print(formatStoragePlan(plan))}async function confirmStorageChange(client,{skipConfirmation,question}){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?failWith(client,{reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"This change requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]}):client.input.confirm(import_chalk290.default.cyan(question),!0)}function getStorageEnvPullNext(client,scope,environments){if(!environments.includes("development"))return;let teamFlag=scope.teamSlug?` --scope ${quoteArg(scope.teamSlug)}`:"";return[{command:buildCommandWithGlobalFlags(client.argv,`env pull --environment development --project ${quoteArg(scope.project.id)}${teamFlag}`,void 0,{excludeFlags:["--yes"]}),when:"if needed, refresh local development variables in .env.local"}]}function writeStorageResult(client,plan,{applied,asJson,message,next}){if(asJson){let result={...plan,applied,...next?.length?{next}:{}};client.stdout.write(`${JSON.stringify(result,null,2)}
1309
+ `);return}if(!applied){output_manager_default.print(formatStoragePlan(plan)),output_manager_default.log("No changes applied. Re-run without --dry-run to apply them.");return}message&&output_manager_default.success(message);let written=[...plan.envVars.add,...plan.envVars.keep];written.length&&output_manager_default.log(`Environment variables: ${written.join(", ")}`),plan.envVars.remove.length&&output_manager_default.log(`Removed: ${plan.envVars.remove.join(", ")}`);for(let note of plan.envVars.notes)output_manager_default.log(note)}async function readBackConnectionEnvVars(client,{store,projectId,environments,accountId}){try{let fresh=await getStorageStore(client,store.id,{accountId}),connection=resolveProjectConnection(fresh,projectId,environments);return connection.status!=="found"?void 0:connection.connection.environmentVariables}catch(error){output_manager_default.debug(`Could not read back storage connection env vars: ${error.message}`);return}}async function connect3(client,argv){let telemetry2=new StorageConnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(connectSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwToken=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwToken),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage connect <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),1;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environments=resolveEnvironments(flags["--environment"]);if(!environments.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environments.message});let prefix=resolvePrefix(flags["--prefix"]);if(!prefix.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefix.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let auth=resolveStorageAuth({store,mode:authMode.mode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let overlapping=findOverlappingConnections(store,scope.project.id,environments.environments);if(overlapping.length>0)return failWith(client,{reason:"already_connected",message:`${store.name} is already connected to ${scope.project.name} in ${overlapping.flatMap(connection=>connection.environments).join(", ")}.`,hint:`Change the connection with ${getCommandName(`storage update ${store.name}`)}, or remove it with ${getCommandName(`storage disconnect ${store.name}`)}.`,next:[{command:getCommandNamePlain(`storage update ${store.name}`),when:"change environments, prefix, or credential mode"},{command:getCommandNamePlain(`storage disconnect ${store.name}`),when:"remove the existing connection first"}]});let envVars=planConnectEnvVars({store,auth:auth.auth,prefix:prefix.prefix,sibling:getConnections(store)[0]}),plan=buildStoragePlan({action:"connect",dryRun,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Connecting storage resource\u2026",500),await connectStoreToProject(client,{store,projectId:scope.project.id,environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,accountId:scope.accountId})}catch(error){return output_manager_default.stopSpinner(),reportConnectFailure(client,error,{storeName:store.name,projectName:scope.project.name,teamSlug:scope.teamSlug,environments:environments.environments,prefix:prefix.prefix})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments:environments.environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"connect",dryRun:!1,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars:diffEnvVarNames([],verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Connected ${import_chalk291.default.bold(store.name)} to ${import_chalk291.default.bold(scope.project.name)} (${environments.environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,environments.environments)}),0}function reportConnectFailure(client,error,{storeName,projectName,teamSlug,environments,prefix}){if(isAPIError(error)&&error.status===400){let conflict=error.serverMessage?.match(/existing environment variable with name ([A-Za-z_][A-Za-z0-9_]*)/);if(conflict){let varName=conflict[1],envRmCmd=["env rm",varName,environments.length===1?environments[0]:void 0,`--project ${projectName}`,teamSlug?`--scope ${teamSlug}`:void 0].filter(Boolean).join(" ");return failWith(client,{reason:"env_var_conflict",message:`Cannot connect ${storeName}: env var ${varName} already exists on ${projectName} in one of the target environments (${environments.join(", ")}).`,hint:prefix===void 0?"Re-run with `--prefix <PREFIX>` to namespace the new variables, or remove the existing one.":`Prefix \`${prefix}\` did not avoid the collision. Try a different prefix or remove the existing variable.`,next:[{command:buildCommandWithGlobalFlags(client.argv,envRmCmd,void 0,{excludeFlags:["--yes","-y"]}),when:`remove ${varName} from ${projectName}`}]})}}return failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while connecting: ${error.message}`})}var import_chalk292=__toESM(require_source(),1);var StorageCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(v){v&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliOptionAccess(v){v&&this.trackCliOption({option:"access",value:["public","private"].includes(v)?v:this.redactedValue})}trackCliOptionRegion(v){v&&this.trackCliOption({option:"region",value:this.redactedValue})}trackCliOptionItems(v){v&&this.trackCliOption({option:"items",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function create7(client,argv){let telemetry2=new StorageCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(createSubcommand7.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,name=args[0];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionType(flags["--type"]),telemetry2.trackCliOptionAccess(flags["--access"]),telemetry2.trackCliOptionRegion(flags["--region"]),telemetry2.trackCliOptionItems(flags["--items"]),!name)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a name for the store. See `--help` for details.",next:[{command:buildCommandWithGlobalFlags(client.argv,"storage create <name> --type <type>"),when:`replace <name> and <type> (${listStorageProviderTypes().join(", ")})`}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage create <name> --type <type>`."});let interactive=canPrompt(client),provider=await resolveProvider(client,flags["--type"],interactive);if(typeof provider=="number")return provider;let foreignFlags=findForeignCreateFlags(provider,flags);if(foreignFlags.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${foreignFlags.join(", ")} ${foreignFlags.length===1?"does":"do"} not apply to ${provider.label} stores.`});let validation=await provider.validateCreate(flags,{prompt:interactive?{select:(message,choices)=>client.input.select({message,choices})}:void 0});if(!validation.valid)return failWith(client,{reason:validation.reason,message:validation.message});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;output_manager_default.spinner(`Creating ${provider.label} store\u2026`,500);let created;try{created=await provider.create(client,{name,params:validation.params,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to create the store: ${error.message}`})}output_manager_default.stopSpinner();let connectCommand=account.linkedProject?`storage connect ${created.name}`:`storage connect ${created.name} --project <project>`,next=[{command:getCommandNamePlain(`${connectCommand} --yes`),when:account.linkedProject?"connect the new store to the linked project":"connect the new store to a project (replace <project>)"}];if(asJson){let result={status:"ok",store:{id:created.id,name:created.name,type:provider.type,product:provider.label,details:created.details},next};return client.stdout.write(`${JSON.stringify(result,null,2)}
1300
1310
  `),0}printAlignedLabel("Created",created.name,{gutter:"\u2713"}),printAlignedLabel("ID",created.id),printAlignedLabel("Type",provider.label);for(let[key,value]of Object.entries(created.details))value!==null&&value!==""&&printAlignedLabel(labelFor(key),String(value));return output_manager_default.print(`
1301
- `),output_manager_default.log(`Run ${import_chalk291.default.cyan(getCommandName(connectCommand))} to connect it to a project.`),0}async function resolveProvider(client,typeFlag,interactive){if(typeFlag){let provider=getStorageProvider(typeFlag);return provider||failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Unknown store type "${typeFlag}". Known types: ${listStorageProviderTypes().join(", ")}.`,hint:"Marketplace resources (Neon, Upstash, Supabase, \u2026) are created with `vercel integration add <integration>`.",next:[{command:getCommandNamePlain("integration add <integration>"),when:"provision a Marketplace resource (replace <integration>)"}]})}return interactive?client.input.select({message:"Choose the type of store to create",choices:STORAGE_PROVIDERS.map(provider=>({name:provider.label,value:provider}))}):failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:`You must specify --type. Known types: ${listStorageProviderTypes().join(", ")}.`,next:STORAGE_PROVIDERS.map(provider=>({command:buildCommandWithGlobalFlags(client.argv,`storage create <name> --type ${provider.type}`),when:`create a ${provider.label} store (replace <name>)`}))})}var import_chalk292=__toESM(require_source(),1);var StorageDeleteTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}};async function deleteStore(client,argv){let telemetry2=new StorageDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(deleteSubcommand5.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments;if(telemetry2.trackCliArgumentStore(args[0]),telemetry2.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage delete <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let provider=getStorageProvider(resolved.type);if(!provider)return resolved.type==="integration"?failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${resolved.name} is a Marketplace resource (${storeProductLabel(resolved)}). Use \`vercel integration-resource remove\` to delete it.`,next:[{command:getCommandNamePlain(`integration-resource remove ${resolved.name}`),when:"delete the Marketplace resource"}]}):failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${storeProductLabel(resolved)} stores cannot be deleted with the CLI yet. Delete ${resolved.name} from the Vercel dashboard instead.`});if(!canPrompt(client)){let commandTail=[`storage delete ${args[0]}`,flags["--type"]?`--type ${flags["--type"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a storage resource cannot be undone, removes its project connections, and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the store and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`storage get ${args[0]} --json`),when:"Inspect the store and its connections first"}]},1),output_manager_default.error("Confirmation required. Deleting a storage resource cannot be undone and must be confirmed in an interactive terminal."),1}let store;output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let connections=getConnections(store),projectNames=[...new Set(connections.map(connection=>connection.name))];printAlignedLabel("Store",store.name),printAlignedLabel("ID",store.id),printAlignedLabel("Type",provider.label),printAlignedLabel("Projects",projectNames.length?projectNames.join(", "):import_chalk292.default.dim("not connected")),output_manager_default.print(`
1302
- `);let consequence=projectNames.length?` This disconnects it from ${projectNames.length} ${projectNames.length===1?"project":"projects"} and removes their environment variables.`:"";if(!await client.input.confirm(`Delete ${import_chalk292.default.bold(store.name)}?${consequence} This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;output_manager_default.spinner(`Deleting ${provider.label} store\u2026`,500);try{await provider.delete(client,{store,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to delete the store: ${error.message}`})}return output_manager_default.stopSpinner(),printAlignedLabel("Deleted",store.name,{gutter:"\u2713"}),projectNames.length&&(printAlignedLabel("Disconnected",projectNames.join(", ")),output_manager_default.print(`
1303
- `),output_manager_default.log(`Run ${import_chalk292.default.cyan(getCommandName("env pull"))} in the affected projects to refresh their local environment files.`)),0}var import_chalk293=__toESM(require_source(),1);var StorageDisconnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function disconnect3(client,argv){let telemetry2=new StorageDisconnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(disconnectSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,all=flags["--all"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage disconnect <store> [--project <name-or-id>]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});if(asJson&&!dryRun)return output_manager_default.error("--json requires --dry-run. Disconnecting removes environment variables from the project, so applying it always requires interactive confirmation."),1;if(!dryRun&&!canPrompt(client)){let commandTail=[`storage disconnect ${args[0]}`,all?"--all":void 0,flags["--project"]?`--project ${flags["--project"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Disconnecting a storage resource removes its environment variables from the project and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal. Agents may only run the --dry-run preview.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the change set and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`${commandTail} --dry-run --json`),when:"Preview the environment variables that would be removed"}]},1),output_manager_default.error("Confirmation required. Disconnecting removes environment variables from the project and must be confirmed in an interactive terminal."),1}let accountId,project;if(all){let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}else{let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}let store=await resolveStorageStore(client,args[0],accountId);if(typeof store=="number")return store;let connections;if(all){if(connections=getConnections(store),connections.length===0)return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to any project.`})}else{let target=resolveProjectConnection(store,project.id);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${project.name}.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"see which projects are connected"}]});connections=target.status==="found"?[target.connection]:target.connections}let plan=buildStoragePlan({action:"disconnect",dryRun,store,projects:connections.map(connection=>({id:connection.projectId,name:connection.name})),environments:[...new Set(connections.flatMap(connection=>connection.environments))],envVars:planDisconnectEnvVars(connections)});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;printStoragePlan(client,plan,!1);let removedCount=plan.envVars.remove.length,targetName=all?`${connections.length} ${connections.length===1?"project":"projects"}`:import_chalk293.default.bold(connections[0]?.name??project.name),consequence=removedCount>0?` This removes ${removedCount} environment ${removedCount===1?"variable":"variables"}.`:"";if(!await client.input.confirm(`Disconnect ${import_chalk293.default.bold(store.name)} from ${targetName}?${consequence}`,!1))return output_manager_default.log("Canceled"),0;try{if(output_manager_default.spinner("Disconnecting storage resource\u2026",500),all)await disconnectAllStoreConnections(client,{store,accountId});else for(let connection of connections)await disconnectStoreConnection(client,{store,connectionId:connection.id,accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while disconnecting: ${error.message}`})}output_manager_default.stopSpinner();let targetLabel=all?"all projects":import_chalk293.default.bold(connections[0]?.name??project.name);return writeStorageResult(client,plan,{applied:!0,asJson,message:`Disconnected ${import_chalk293.default.bold(store.name)} from ${targetLabel}`}),0}var import_chalk294=__toESM(require_source(),1);var StorageGetTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function get4(client,argv){let telemetry2=new StorageGetTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(getSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliArgumentStore(args[0]),telemetry2.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage get <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let store,details={};output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId);let provider=getStorageProvider(store.type);provider&&(details=await provider.describe(client,{store,accountId:account.accountId}))}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let result=summarizeStore(store,details,account.teamSlug);return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
1304
- `),0):(printDetails2(result),0)}function summarizeStore(store,details,teamSlug){let raw=store;return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,createdAt:raw.createdAt??null,updatedAt:raw.updatedAt??null,dashboardUrl:teamSlug?`https://vercel.com/${teamSlug}/~/stores/${encodeURIComponent(store.type??"unknown")}/${encodeURIComponent(store.id)}`:null,details,connections:getConnections(store).map(connection=>({id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments}))}}function printDetails2(result){printAlignedLabel("Store",result.name),printAlignedLabel("ID",result.id),printAlignedLabel("Type",result.product),result.status&&printAlignedLabel("Status",result.status);for(let[key,value]of Object.entries(result.details))value!==null&&value!==""&&printAlignedLabel(labelFor(key),String(value));result.createdAt&&printAlignedLabel("Created",formatDate(result.createdAt)),result.updatedAt&&printAlignedLabel("Updated",formatDate(result.updatedAt)),result.dashboardUrl&&printAlignedLabel("Dashboard",output_manager_default.link(result.dashboardUrl,result.dashboardUrl)||result.dashboardUrl),printAlignedLabel("Projects",result.connections.length?result.connections.map(connection=>`${connection.project.name} (${connection.environments.join(", ")})`).join(", "):import_chalk294.default.dim("not connected")),output_manager_default.print(`
1305
- `)}var import_chalk295=__toESM(require_source(),1);var StorageListTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function list25(client,argv){let telemetry2=new StorageListTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(listSubcommand21.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,typeFlag=flags["--type"];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionType(typeFlag),args.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage list [--type <type>]`."});let typeFilter=typeFlag?getStorageProvider(typeFlag)?.type??typeFlag.toLowerCase():void 0,account=await resolveStorageAccount(client);if(typeof account=="number")return account;let stores;output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let entries=stores.filter(store=>!typeFilter||storeMatchesType(store,typeFilter)).map(summarizeStore2);return asJson?(client.stdout.write(`${JSON.stringify({stores:entries},null,2)}
1306
- `),0):entries.length===0?(typeFilter?output_manager_default.log(`No storage resources of type ${import_chalk295.default.bold(typeFilter)} found in this scope. Known types: ${listStorageProviderTypes().join(", ")}.`):output_manager_default.log(`No storage resources found in this scope. Run ${getCommandName("storage create <name> --type <type>")} to create one.`),0):(printListTable(entries),0)}function summarizeStore2(store){let projects2=new Map;for(let connection of getConnections(store))projects2.set(connection.projectId,connection.name);return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,projects:[...projects2.entries()].map(([id,name])=>({id,name}))}}function printListTable(entries){let rows=[["Store","ID","Product","Status","Projects"].map(header=>import_chalk295.default.bold(import_chalk295.default.cyan(header)))];for(let entry2 of entries)rows.push([entry2.name,import_chalk295.default.dim(entry2.id),entry2.product,entry2.status??import_chalk295.default.dim("\u2013"),entry2.projects.length?entry2.projects.map(project=>project.name).join(", "):import_chalk295.default.dim("not connected")]);output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
1307
-
1308
- `)}var import_chalk296=__toESM(require_source(),1);var StorageStatusTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function status3(client,argv){let telemetry2=new StorageStatusTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(statusSubcommand5.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,all=flags["--all"]??!1,storeIdentifier=args[0];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliArgumentStore(storeIdentifier),args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage status [store]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});let needsProject=!!flags["--project"]||!all&&!storeIdentifier,accountId,project;if(needsProject){let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}else{let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}let stores;if(storeIdentifier){let store=await resolveStorageStore(client,storeIdentifier,accountId);if(typeof store=="number")return store;stores=[store]}else{output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner()}let scopedProjectId=project?.id,summaries=stores.map(store=>summarizeStore3(store,scopedProjectId)).filter(summary=>all||storeIdentifier||summary.connections.length>0);return asJson?(client.stdout.write(`${JSON.stringify({stores:summaries},null,2)}
1309
- `),0):summaries.length===0?(output_manager_default.log(project?`No storage resources are connected to ${import_chalk296.default.bold(project.name)}. Use ${getCommandName("storage status --all")} to list every resource in this scope.`:"No storage resources found in this scope."),0):(printStatusTable(summaries),0)}function summarizeStore3(store,projectId){let connections=getConnections(store).filter(connection=>!projectId||connection.projectId===projectId);return{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store),status:store.status??null,connections:connections.map(connection=>summarizeConnection(store,connection))}}function summarizeConnection(store,connection){return{id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments,envVarPrefix:connection.envVarPrefix??null,auth:inferConnectionAuth(store,connection.environmentVariables),environmentVariables:connection.environmentVariables??null}}function formatAuthCell(connection){return connection.auth==="unknown"?import_chalk296.default.dim("unknown"):describeStorageAuth({effective:connection.auth,readWriteToken:(connection.environmentVariables??[]).some(name=>name.endsWith("_READ_WRITE_TOKEN"))})}function printStatusTable(summaries){let rows=[["Store","Product","Project","Environments","Credentials","Env vars"].map(header=>import_chalk296.default.bold(import_chalk296.default.cyan(header)))];for(let store of summaries){if(store.connections.length===0){rows.push([store.name,store.product,import_chalk296.default.dim("not connected"),import_chalk296.default.dim("\u2013"),import_chalk296.default.dim("\u2013"),import_chalk296.default.dim("\u2013")]);continue}for(let[index,connection]of store.connections.entries())rows.push([index===0?store.name:"",index===0?store.product:"",connection.project.name,connection.environments.join(", "),formatAuthCell(connection),connection.environmentVariables?.length?connection.environmentVariables.join(", "):import_chalk296.default.dim("\u2013")])}output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
1310
-
1311
- `)}var import_chalk297=__toESM(require_source(),1);var StorageUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};function sameEnvironments(a,b){if(a.length!==b.length)return!1;let left=new Set(a);return b.every(value=>left.has(value))}async function update8(client,argv){let telemetry2=new StorageUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(updateSubcommand10.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwTokenFlag=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwTokenFlag),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage update <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),1;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environmentsFlag=resolveEnvironments(flags["--environment"]);if(!environmentsFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environmentsFlag.message});let prefixFlag=resolvePrefix(flags["--prefix"]);if(!prefixFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefixFlag.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let target=resolveProjectConnection(store,scope.project.id,environmentsFlag.explicit?environmentsFlag.environments:void 0);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${scope.project.name}.`,next:[{command:getCommandNamePlain(`storage connect ${store.name}`),when:"create the connection"}]});if(target.status==="ambiguous")return failWith(client,{reason:"ambiguous_connection",message:`${scope.project.name} has more than one connection to ${store.name} (${target.connections.map(connection2=>connection2.environments.join("+")).join(", ")}). Pass --environment to pick one.`});let connection=target.connection,currentEnvVars=connection.environmentVariables??[],currentAuth=inferConnectionAuth(store,connection.environmentVariables),hasOidcVars=currentEnvVars.some(name=>name.endsWith("_STORE_ID")),hasRwTokenNow=currentEnvVars.some(name=>name.endsWith("_READ_WRITE_TOKEN")),requestedMode=authMode.explicit?authMode.mode:currentAuth==="token"?"token":"oidc",addRwToken=addRwTokenFlag||!authMode.explicit&&hasRwTokenNow,auth=resolveStorageAuth({store,mode:requestedMode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let environments=environmentsFlag.explicit?environmentsFlag.environments:connection.environments,currentPrefix=normalizeEnvVarPrefix(connection.envVarPrefix),prefix=prefixFlag.prefix!==void 0?prefixFlag.prefix:currentPrefix,environmentsChanged=environmentsFlag.explicit&&!sameEnvironments(environments,connection.environments),prefixChanged=flags["--prefix"]!==void 0&&prefix!==currentPrefix,needsOidcUpgrade=storeSupportsOidc(store)&&auth.auth.effective==="oidc"&&!hasOidcVars,rwTokenChanged=storeSupportsOidc(store)&&auth.auth.readWriteToken!==hasRwTokenNow;if(!environmentsChanged&&!prefixChanged&&!needsOidcUpgrade&&!rwTokenChanged)return failWith(client,{reason:AGENT_REASON.NO_CHANGES_REQUESTED,message:`Nothing to update: ${store.name} on ${scope.project.name} already matches the requested configuration.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"inspect the current connection"}]});let plan=buildStoragePlan({action:"update",dryRun,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:planUpdateEnvVars({store,auth:auth.auth,prefix,connection,prefixChanged})});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Updating storage connection\u2026",500),needsOidcUpgrade&&await upgradeStoreConnectionToOidc(client,{store,connectionId:connection.id,auth:auth.auth,accountId:scope.accountId});let patchEnvironments=environmentsChanged?environments:void 0,patchPrefix=prefixChanged?prefix??null:void 0,patchSkipReadWriteToken=storeSupportsOidc(store)?!auth.auth.readWriteToken:void 0;(patchEnvironments!==void 0||patchPrefix!==void 0||patchSkipReadWriteToken!==void 0)&&await updateStoreConnection(client,{store,connectionId:connection.id,accountId:scope.accountId,environments:patchEnvironments,envVarPrefix:patchPrefix,skipReadWriteToken:patchSkipReadWriteToken})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while updating the connection: ${error.message}`})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"update",dryRun:!1,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:diffEnvVarNames(currentEnvVars,verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Updated ${import_chalk297.default.bold(store.name)} on ${import_chalk297.default.bold(scope.project.name)} (${environments.join(", ")})`,next:[{command:getCommandNamePlain("env pull"),when:"sync the updated variables into .env.local"}]}),0}var COMMAND_CONFIG58={list:getCommandAliases(listSubcommand21),create:getCommandAliases(createSubcommand7),get:getCommandAliases(getSubcommand3),delete:getCommandAliases(deleteSubcommand5),connect:getCommandAliases(connectSubcommand3),status:getCommandAliases(statusSubcommand5),update:getCommandAliases(updateSubcommand10),disconnect:getCommandAliases(disconnectSubcommand3)};async function main32(client){let telemetry2=new StorageTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification(storageCommand.options),{permissive:!0})}catch(error){return printError(error),1}let needHelp=!!parsedArguments.flags["--help"],subArgs=parsedArguments.args.slice(1),{subcommand,subcommandOriginal,args}=getSubcommand7(subArgs,COMMAND_CONFIG58);if(!subcommand)return needHelp?(telemetry2.trackCliFlagHelp("storage"),output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),0):subArgs.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),2):(output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),2);function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:storageCommand}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(listSubcommand21),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list25(client,args));case"create":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(createSubcommand7),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create7(client,args));case"get":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(getSubcommand3),0):(telemetry2.trackCliSubcommandGet(subcommandOriginal),get4(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(deleteSubcommand5),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteStore(client,args));case"connect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(connectSubcommand3),0):(telemetry2.trackCliSubcommandConnect(subcommandOriginal),connect3(client,args));case"status":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(statusSubcommand5),0):(telemetry2.trackCliSubcommandStatus(subcommandOriginal),status3(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(updateSubcommand10),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update8(client,args));case"disconnect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(disconnectSubcommand3),0):(telemetry2.trackCliSubcommandDisconnect(subcommandOriginal),disconnect3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),2}}var import_ms37=__toESM(require_ms(),1),import_chalk298=__toESM(require_source(),1);function formatBranchMatcher(branchMatcher){return branchMatcher?.type==="equals"?branchMatcher.pattern:branchMatcher?.type==="startsWith"?`${branchMatcher.pattern}${import_chalk298.default.dim("*")}`:branchMatcher?.type==="endsWith"?`${import_chalk298.default.dim("*")}${branchMatcher.pattern}`:import_chalk298.default.dim("No branch configuration")}var TYPE_MAP={production:"Production",preview:"Preview",development:"Development"},BRANCH_TRACKING_MAP={production:project=>project.link?.productionBranch??"main",preview:(_,env)=>env.slug==="preview"?import_chalk298.default.dim("All unassigned git branches"):formatBranchMatcher(env.branchMatcher),development:()=>import_chalk298.default.dim("Accessible via CLI")};async function list26(client,argv){let{cwd}=client,telemetry2=new TelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand22.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let validationResult=validateLsArgs({commandName:"target ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink(targetCommand.name,client,cwd,{autoConfirm,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let start=Date.now(),projectSlugLink=formatProject(link.org.slug,link.project.name);output_manager_default.spinner(`Fetching custom environments for ${projectSlugLink}`);let url=`/projects/${encodeURIComponent(link.project.id)}/custom-environments`,{environments:result}=await client.fetch(url,{method:"GET",accountId:link.org.id});output_manager_default.stopSpinner();let elapsed2=(0,import_ms37.default)(Date.now()-start);if(result=withDefaultEnvironmentsIncluded(result),asJson){let jsonOutput={targets:result.map(target=>({id:target.id,slug:target.slug,type:target.type,description:target.description,branchMatcher:target.branchMatcher,createdAt:target.createdAt,updatedAt:target.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1312
- `)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${import_chalk298.default.gray(`[${elapsed2}]`)}`);let tablePrint=table([["Target Name","Branch Tracking","Type","Updated"].map(header=>import_chalk298.default.bold(import_chalk298.default.cyan(header))),...result.flatMap(target=>[[formatEnvironment(link.org.slug,link.project.name,target),BRANCH_TRACKING_MAP[target.type](link.project,target),TYPE_MAP[target.type],import_chalk298.default.gray(target.updatedAt>0?(0,import_ms37.default)(Date.now()-target.updatedAt):"-")]])],{hsep:3}).replace(/^/gm," ");output_manager_default.print(`
1311
+ `),output_manager_default.log(`Run ${import_chalk292.default.cyan(getCommandName(connectCommand))} to connect it to a project.`),0}async function resolveProvider(client,typeFlag,interactive){if(typeFlag){let provider=getStorageProvider(typeFlag);return provider||failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Unknown store type "${typeFlag}". Known types: ${listStorageProviderTypes().join(", ")}.`,hint:"Marketplace resources (Neon, Upstash, Supabase, \u2026) are created with `vercel integration add <integration>`.",next:[{command:getCommandNamePlain("integration add <integration>"),when:"provision a Marketplace resource (replace <integration>)"}]})}return interactive?client.input.select({message:"Choose the type of store to create",choices:STORAGE_PROVIDERS.map(provider=>({name:provider.label,value:provider}))}):failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:`You must specify --type. Known types: ${listStorageProviderTypes().join(", ")}.`,next:STORAGE_PROVIDERS.map(provider=>({command:buildCommandWithGlobalFlags(client.argv,`storage create <name> --type ${provider.type}`),when:`create a ${provider.label} store (replace <name>)`}))})}var import_chalk293=__toESM(require_source(),1);var StorageDeleteTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}};async function deleteStore(client,argv){let telemetry2=new StorageDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(deleteSubcommand5.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments;if(telemetry2.trackCliArgumentStore(args[0]),telemetry2.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage delete <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let provider=getStorageProvider(resolved.type);if(!provider)return resolved.type==="integration"?failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${resolved.name} is a Marketplace resource (${storeProductLabel(resolved)}). Use \`vercel integration-resource remove\` to delete it.`,next:[{command:getCommandNamePlain(`integration-resource remove ${resolved.name}`),when:"delete the Marketplace resource"}]}):failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${storeProductLabel(resolved)} stores cannot be deleted with the CLI yet. Delete ${resolved.name} from the Vercel dashboard instead.`});if(!canPrompt(client)){let commandTail=[`storage delete ${args[0]}`,flags["--type"]?`--type ${flags["--type"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a storage resource cannot be undone, removes its project connections, and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the store and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`storage get ${args[0]} --json`),when:"Inspect the store and its connections first"}]},1),output_manager_default.error("Confirmation required. Deleting a storage resource cannot be undone and must be confirmed in an interactive terminal."),1}let store;output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let connections=getConnections(store),projectNames=[...new Set(connections.map(connection=>connection.name))];printAlignedLabel("Store",store.name),printAlignedLabel("ID",store.id),printAlignedLabel("Type",provider.label),printAlignedLabel("Projects",projectNames.length?projectNames.join(", "):import_chalk293.default.dim("not connected")),output_manager_default.print(`
1312
+ `);let consequence=projectNames.length?` This disconnects it from ${projectNames.length} ${projectNames.length===1?"project":"projects"} and removes their environment variables.`:"";if(!await client.input.confirm(`Delete ${import_chalk293.default.bold(store.name)}?${consequence} This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;output_manager_default.spinner(`Deleting ${provider.label} store\u2026`,500);try{await provider.delete(client,{store,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to delete the store: ${error.message}`})}return output_manager_default.stopSpinner(),printAlignedLabel("Deleted",store.name,{gutter:"\u2713"}),projectNames.length&&(printAlignedLabel("Disconnected",projectNames.join(", ")),output_manager_default.print(`
1313
+ `),output_manager_default.log(`Run ${import_chalk293.default.cyan(getCommandName("env pull"))} in the affected projects to refresh their local environment files.`)),0}var import_chalk294=__toESM(require_source(),1);var StorageDisconnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function disconnect3(client,argv){let telemetry2=new StorageDisconnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(disconnectSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,all=flags["--all"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage disconnect <store> [--project <name-or-id>]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});if(asJson&&!dryRun)return output_manager_default.error("--json requires --dry-run. Disconnecting removes environment variables from the project, so applying it always requires interactive confirmation."),1;if(!dryRun&&!canPrompt(client)){let commandTail=[`storage disconnect ${args[0]}`,all?"--all":void 0,flags["--project"]?`--project ${flags["--project"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Disconnecting a storage resource removes its environment variables from the project and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal. Agents may only run the --dry-run preview.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the change set and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`${commandTail} --dry-run --json`),when:"Preview the environment variables that would be removed"}]},1),output_manager_default.error("Confirmation required. Disconnecting removes environment variables from the project and must be confirmed in an interactive terminal."),1}let accountId,project;if(all){let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}else{let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}let store=await resolveStorageStore(client,args[0],accountId);if(typeof store=="number")return store;let connections;if(all){if(connections=getConnections(store),connections.length===0)return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to any project.`})}else{let target=resolveProjectConnection(store,project.id);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${project.name}.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"see which projects are connected"}]});connections=target.status==="found"?[target.connection]:target.connections}let plan=buildStoragePlan({action:"disconnect",dryRun,store,projects:connections.map(connection=>({id:connection.projectId,name:connection.name})),environments:[...new Set(connections.flatMap(connection=>connection.environments))],envVars:planDisconnectEnvVars(connections)});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;printStoragePlan(client,plan,!1);let removedCount=plan.envVars.remove.length,targetName=all?`${connections.length} ${connections.length===1?"project":"projects"}`:import_chalk294.default.bold(connections[0]?.name??project.name),consequence=removedCount>0?` This removes ${removedCount} environment ${removedCount===1?"variable":"variables"}.`:"";if(!await client.input.confirm(`Disconnect ${import_chalk294.default.bold(store.name)} from ${targetName}?${consequence}`,!1))return output_manager_default.log("Canceled"),0;try{if(output_manager_default.spinner("Disconnecting storage resource\u2026",500),all)await disconnectAllStoreConnections(client,{store,accountId});else for(let connection of connections)await disconnectStoreConnection(client,{store,connectionId:connection.id,accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while disconnecting: ${error.message}`})}output_manager_default.stopSpinner();let targetLabel=all?"all projects":import_chalk294.default.bold(connections[0]?.name??project.name);return writeStorageResult(client,plan,{applied:!0,asJson,message:`Disconnected ${import_chalk294.default.bold(store.name)} from ${targetLabel}`}),0}var import_chalk295=__toESM(require_source(),1);var StorageGetTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function get4(client,argv){let telemetry2=new StorageGetTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(getSubcommand3.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliArgumentStore(args[0]),telemetry2.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage get <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let store,details={};output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId);let provider=getStorageProvider(store.type);provider&&(details=await provider.describe(client,{store,accountId:account.accountId}))}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let result=summarizeStore(store,details,account.teamSlug);return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
1314
+ `),0):(printDetails2(result),0)}function summarizeStore(store,details,teamSlug){let raw=store;return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,createdAt:raw.createdAt??null,updatedAt:raw.updatedAt??null,dashboardUrl:teamSlug?`https://vercel.com/${teamSlug}/~/stores/${encodeURIComponent(store.type??"unknown")}/${encodeURIComponent(store.id)}`:null,details,connections:getConnections(store).map(connection=>({id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments}))}}function printDetails2(result){printAlignedLabel("Store",result.name),printAlignedLabel("ID",result.id),printAlignedLabel("Type",result.product),result.status&&printAlignedLabel("Status",result.status);for(let[key,value]of Object.entries(result.details))value!==null&&value!==""&&printAlignedLabel(labelFor(key),String(value));result.createdAt&&printAlignedLabel("Created",formatDate(result.createdAt)),result.updatedAt&&printAlignedLabel("Updated",formatDate(result.updatedAt)),result.dashboardUrl&&printAlignedLabel("Dashboard",output_manager_default.link(result.dashboardUrl,result.dashboardUrl)||result.dashboardUrl),printAlignedLabel("Projects",result.connections.length?result.connections.map(connection=>`${connection.project.name} (${connection.environments.join(", ")})`).join(", "):import_chalk295.default.dim("not connected")),output_manager_default.print(`
1315
+ `)}var import_chalk296=__toESM(require_source(),1);var StorageListTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function list26(client,argv){let telemetry2=new StorageListTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(listSubcommand21.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,typeFlag=flags["--type"];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionType(typeFlag),args.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage list [--type <type>]`."});let typeFilter=typeFlag?getStorageProvider(typeFlag)?.type??typeFlag.toLowerCase():void 0,account=await resolveStorageAccount(client);if(typeof account=="number")return account;let stores;output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let entries=stores.filter(store=>!typeFilter||storeMatchesType(store,typeFilter)).map(summarizeStore2);return asJson?(client.stdout.write(`${JSON.stringify({stores:entries},null,2)}
1316
+ `),0):entries.length===0?(typeFilter?output_manager_default.log(`No storage resources of type ${import_chalk296.default.bold(typeFilter)} found in this scope. Known types: ${listStorageProviderTypes().join(", ")}.`):output_manager_default.log(`No storage resources found in this scope. Run ${getCommandName("storage create <name> --type <type>")} to create one.`),0):(printListTable(entries),0)}function summarizeStore2(store){let projects2=new Map;for(let connection of getConnections(store))projects2.set(connection.projectId,connection.name);return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,projects:[...projects2.entries()].map(([id,name])=>({id,name}))}}function printListTable(entries){let rows=[["Store","ID","Product","Status","Projects"].map(header=>import_chalk296.default.bold(import_chalk296.default.cyan(header)))];for(let entry2 of entries)rows.push([entry2.name,import_chalk296.default.dim(entry2.id),entry2.product,entry2.status??import_chalk296.default.dim("\u2013"),entry2.projects.length?entry2.projects.map(project=>project.name).join(", "):import_chalk296.default.dim("not connected")]);output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
1317
+
1318
+ `)}var import_chalk297=__toESM(require_source(),1);var StorageStatusTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function status3(client,argv){let telemetry2=new StorageStatusTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(statusSubcommand5.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,all=flags["--all"]??!1,storeIdentifier=args[0];if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliArgumentStore(storeIdentifier),args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage status [store]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});let needsProject=!!flags["--project"]||!all&&!storeIdentifier,accountId,project;if(needsProject){let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}else{let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}let stores;if(storeIdentifier){let store=await resolveStorageStore(client,storeIdentifier,accountId);if(typeof store=="number")return store;stores=[store]}else{output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner()}let scopedProjectId=project?.id,summaries=stores.map(store=>summarizeStore3(store,scopedProjectId)).filter(summary=>all||storeIdentifier||summary.connections.length>0);return asJson?(client.stdout.write(`${JSON.stringify({stores:summaries},null,2)}
1319
+ `),0):summaries.length===0?(output_manager_default.log(project?`No storage resources are connected to ${import_chalk297.default.bold(project.name)}. Use ${getCommandName("storage status --all")} to list every resource in this scope.`:"No storage resources found in this scope."),0):(printStatusTable(summaries),0)}function summarizeStore3(store,projectId){let connections=getConnections(store).filter(connection=>!projectId||connection.projectId===projectId);return{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store),status:store.status??null,connections:connections.map(connection=>summarizeConnection(store,connection))}}function summarizeConnection(store,connection){return{id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments,envVarPrefix:connection.envVarPrefix??null,auth:inferConnectionAuth(store,connection.environmentVariables),environmentVariables:connection.environmentVariables??null}}function formatAuthCell(connection){return connection.auth==="unknown"?import_chalk297.default.dim("unknown"):describeStorageAuth({effective:connection.auth,readWriteToken:(connection.environmentVariables??[]).some(name=>name.endsWith("_READ_WRITE_TOKEN"))})}function printStatusTable(summaries){let rows=[["Store","Product","Project","Environments","Credentials","Env vars"].map(header=>import_chalk297.default.bold(import_chalk297.default.cyan(header)))];for(let store of summaries){if(store.connections.length===0){rows.push([store.name,store.product,import_chalk297.default.dim("not connected"),import_chalk297.default.dim("\u2013"),import_chalk297.default.dim("\u2013"),import_chalk297.default.dim("\u2013")]);continue}for(let[index,connection]of store.connections.entries())rows.push([index===0?store.name:"",index===0?store.product:"",connection.project.name,connection.environments.join(", "),formatAuthCell(connection),connection.environmentVariables?.length?connection.environmentVariables.join(", "):import_chalk297.default.dim("\u2013")])}output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
1320
+
1321
+ `)}var import_chalk298=__toESM(require_source(),1);var StorageUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};function sameEnvironments(a,b){if(a.length!==b.length)return!1;let left=new Set(a);return b.every(value=>left.has(value))}async function update8(client,argv){let telemetry2=new StorageUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(updateSubcommand10.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwTokenFlag=flags["--add-rw-token"]??!1;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAddRwToken(addRwTokenFlag),telemetry2.trackCliOptionAuth(flags["--auth"]),telemetry2.trackCliOptionPrefix(flags["--prefix"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage update <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),1;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environmentsFlag=resolveEnvironments(flags["--environment"]);if(!environmentsFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environmentsFlag.message});let prefixFlag=resolvePrefix(flags["--prefix"]);if(!prefixFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefixFlag.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let target=resolveProjectConnection(store,scope.project.id,environmentsFlag.explicit?environmentsFlag.environments:void 0);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${scope.project.name}.`,next:[{command:getCommandNamePlain(`storage connect ${store.name}`),when:"create the connection"}]});if(target.status==="ambiguous")return failWith(client,{reason:"ambiguous_connection",message:`${scope.project.name} has more than one connection to ${store.name} (${target.connections.map(connection2=>connection2.environments.join("+")).join(", ")}). Pass --environment to pick one.`});let connection=target.connection,currentEnvVars=connection.environmentVariables??[],currentAuth=inferConnectionAuth(store,connection.environmentVariables),hasOidcVars=currentEnvVars.some(name=>name.endsWith("_STORE_ID")),hasRwTokenNow=currentEnvVars.some(name=>name.endsWith("_READ_WRITE_TOKEN")),requestedMode=authMode.explicit?authMode.mode:currentAuth==="token"?"token":"oidc",addRwToken=addRwTokenFlag||!authMode.explicit&&hasRwTokenNow,auth=resolveStorageAuth({store,mode:requestedMode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let environments=environmentsFlag.explicit?environmentsFlag.environments:connection.environments,currentPrefix=normalizeEnvVarPrefix(connection.envVarPrefix),prefix=prefixFlag.prefix!==void 0?prefixFlag.prefix:currentPrefix,environmentsChanged=environmentsFlag.explicit&&!sameEnvironments(environments,connection.environments),prefixChanged=flags["--prefix"]!==void 0&&prefix!==currentPrefix,needsOidcUpgrade=storeSupportsOidc(store)&&auth.auth.effective==="oidc"&&!hasOidcVars,rwTokenChanged=storeSupportsOidc(store)&&auth.auth.readWriteToken!==hasRwTokenNow;if(!environmentsChanged&&!prefixChanged&&!needsOidcUpgrade&&!rwTokenChanged)return failWith(client,{reason:AGENT_REASON.NO_CHANGES_REQUESTED,message:`Nothing to update: ${store.name} on ${scope.project.name} already matches the requested configuration.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"inspect the current connection"}]});let plan=buildStoragePlan({action:"update",dryRun,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:planUpdateEnvVars({store,auth:auth.auth,prefix,connection,prefixChanged})});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Updating storage connection\u2026",500),needsOidcUpgrade&&await upgradeStoreConnectionToOidc(client,{store,connectionId:connection.id,auth:auth.auth,accountId:scope.accountId});let patchEnvironments=environmentsChanged?environments:void 0,patchPrefix=prefixChanged?prefix??null:void 0,patchSkipReadWriteToken=storeSupportsOidc(store)?!auth.auth.readWriteToken:void 0;(patchEnvironments!==void 0||patchPrefix!==void 0||patchSkipReadWriteToken!==void 0)&&await updateStoreConnection(client,{store,connectionId:connection.id,accountId:scope.accountId,environments:patchEnvironments,envVarPrefix:patchPrefix,skipReadWriteToken:patchSkipReadWriteToken})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while updating the connection: ${error.message}`})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"update",dryRun:!1,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:diffEnvVarNames(currentEnvVars,verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Updated ${import_chalk298.default.bold(store.name)} on ${import_chalk298.default.bold(scope.project.name)} (${environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,[...connection.environments,...environments])}),0}var COMMAND_CONFIG59={list:getCommandAliases(listSubcommand21),create:getCommandAliases(createSubcommand7),get:getCommandAliases(getSubcommand3),delete:getCommandAliases(deleteSubcommand5),connect:getCommandAliases(connectSubcommand3),status:getCommandAliases(statusSubcommand5),update:getCommandAliases(updateSubcommand10),disconnect:getCommandAliases(disconnectSubcommand3)};async function main32(client){let telemetry2=new StorageTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification(storageCommand.options),{permissive:!0})}catch(error){return printError(error),1}let needHelp=!!parsedArguments.flags["--help"],subArgs=parsedArguments.args.slice(1),{subcommand,subcommandOriginal,args}=getSubcommand7(subArgs,COMMAND_CONFIG59);if(!subcommand)return needHelp?(telemetry2.trackCliFlagHelp("storage"),output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),0):subArgs.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG59)),2):(output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),2);function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:storageCommand}))}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(listSubcommand21),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list26(client,args));case"create":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(createSubcommand7),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create7(client,args));case"get":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(getSubcommand3),0):(telemetry2.trackCliSubcommandGet(subcommandOriginal),get4(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(deleteSubcommand5),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),deleteStore(client,args));case"connect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(connectSubcommand3),0):(telemetry2.trackCliSubcommandConnect(subcommandOriginal),connect3(client,args));case"status":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(statusSubcommand5),0):(telemetry2.trackCliSubcommandStatus(subcommandOriginal),status3(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(updateSubcommand10),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update8(client,args));case"disconnect":return needHelp?(telemetry2.trackCliFlagHelp("storage",subcommandOriginal),printHelp(disconnectSubcommand3),0):(telemetry2.trackCliSubcommandDisconnect(subcommandOriginal),disconnect3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG59)),2}}var import_ms37=__toESM(require_ms(),1),import_chalk299=__toESM(require_source(),1);function formatBranchMatcher(branchMatcher){return branchMatcher?.type==="equals"?branchMatcher.pattern:branchMatcher?.type==="startsWith"?`${branchMatcher.pattern}${import_chalk299.default.dim("*")}`:branchMatcher?.type==="endsWith"?`${import_chalk299.default.dim("*")}${branchMatcher.pattern}`:import_chalk299.default.dim("No branch configuration")}var TYPE_MAP={production:"Production",preview:"Preview",development:"Development"},BRANCH_TRACKING_MAP={production:project=>project.link?.productionBranch??"main",preview:(_,env)=>env.slug==="preview"?import_chalk299.default.dim("All unassigned git branches"):formatBranchMatcher(env.branchMatcher),development:()=>import_chalk299.default.dim("Accessible via CLI")};async function list27(client,argv){let{cwd}=client,telemetry2=new TelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand22.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let validationResult=validateLsArgs({commandName:"target ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink(targetCommand.name,client,cwd,{autoConfirm,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let start=Date.now(),projectSlugLink=formatProject(link.org.slug,link.project.name);output_manager_default.spinner(`Fetching custom environments for ${projectSlugLink}`);let url=`/projects/${encodeURIComponent(link.project.id)}/custom-environments`,{environments:result}=await client.fetch(url,{method:"GET",accountId:link.org.id});output_manager_default.stopSpinner();let elapsed2=(0,import_ms37.default)(Date.now()-start);if(result=withDefaultEnvironmentsIncluded(result),asJson){let jsonOutput={targets:result.map(target=>({id:target.id,slug:target.slug,type:target.type,description:target.description,branchMatcher:target.branchMatcher,createdAt:target.createdAt,updatedAt:target.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1322
+ `)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${import_chalk299.default.gray(`[${elapsed2}]`)}`);let tablePrint=table([["Target Name","Branch Tracking","Type","Updated"].map(header=>import_chalk299.default.bold(import_chalk299.default.cyan(header))),...result.flatMap(target=>[[formatEnvironment(link.org.slug,link.project.name,target),BRANCH_TRACKING_MAP[target.type](link.project,target),TYPE_MAP[target.type],import_chalk299.default.gray(target.updatedAt>0?(0,import_ms37.default)(Date.now()-target.updatedAt):"-")]])],{hsep:3}).replace(/^/gm," ");output_manager_default.print(`
1313
1323
  ${tablePrint}
1314
1324
 
1315
- `)}return 0}function withDefaultEnvironmentsIncluded(environments){return[{id:"production",slug:"production",createdAt:0,updatedAt:0,type:"production",description:"",domains:[]},{id:"preview",slug:"preview",createdAt:0,updatedAt:0,type:"preview",description:"",domains:[]},{id:"development",slug:"development",createdAt:0,updatedAt:0,type:"development",description:"",domains:[]},...environments.slice().sort((a,b)=>a.slug.localeCompare(b.slug))]}var TargetTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(subcommandActual){this.trackCliSubcommand({subcommand:"list",value:subcommandActual})}};var COMMAND_CONFIG59={ls:getCommandAliases(listSubcommand22)};async function main33(client){let parsedArgs,flagsSpecification=getFlagsSpecification(targetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let{telemetryEventStore}=client,telemetry2=new TargetTelemetryClient({opts:{store:telemetryEventStore}});parsedArgs.args=parsedArgs.args.slice(1);let subcommand=parsedArgs.args[0],args=parsedArgs.args.slice(1),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("target"),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:targetCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":case"list":return needHelp?(telemetry2.trackCliFlagHelp("target","list"),printHelp(listSubcommand22),2):(telemetry2.trackCliSubcommandList(subcommand),await list26(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG59)),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),2}}var import_chalk299=__toESM(require_source(),1);var TeamsListTelemetryClient=class extends TelemetryClient{trackCliOptionNext(value){value&&value>0&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionLimit(value){value&&value>0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionUntil(value){value&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionSince(value){value&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionCount(value){value&&value>0&&this.trackCliOption({option:"count",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list27(client,argv){let{config,telemetryEventStore}=client,telemetry2=new TeamsListTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand23.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 validationResult=validateLsArgs({commandName:"teams ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let next=parsedArgs.flags["--next"],limit=parsedArgs.flags["--limit"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliOptionCount(parsedArgs.flags["--count"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("Please provide a number for flag `--next`"),1;try{getPaginationOpts(parsedArgs.flags)}catch(error){return output_manager_default.error(error instanceof Error?error.message:String(error)),1}output_manager_default.spinner("Fetching teams");let{teams:teams2,pagination}=await getTeams(client,{next,limit,apiVersion:2}),{currentTeam}=config;output_manager_default.spinner("Fetching user information");let user=await getUser(client),accountIsCurrent=!currentTeam&&user.version!=="northstar";accountIsCurrent&&(currentTeam=user.id);let teamList=teams2.map(({id,slug,name,billing})=>({id,name,plan:billing?.plan??null,value:slug,isCurrent:id===currentTeam}));if(user.version!=="northstar"&&teamList.unshift({id:user.id,name:user.email,plan:user.billing?.plan??null,value:user.username||user.email,isCurrent:accountIsCurrent}),!accountIsCurrent){let index=teamList.findIndex(choice2=>choice2.id===currentTeam),choice=teamList.splice(index,1)[0];teamList.unshift(choice)}if(output_manager_default.stopSpinner(),asJson){let jsonOutput={teams:teamList.map(team=>({id:team.id,slug:team.value,name:team.name,plan:team.plan,current:team.isCurrent})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1325
+ `)}return 0}function withDefaultEnvironmentsIncluded(environments){return[{id:"production",slug:"production",createdAt:0,updatedAt:0,type:"production",description:"",domains:[]},{id:"preview",slug:"preview",createdAt:0,updatedAt:0,type:"preview",description:"",domains:[]},{id:"development",slug:"development",createdAt:0,updatedAt:0,type:"development",description:"",domains:[]},...environments.slice().sort((a,b)=>a.slug.localeCompare(b.slug))]}var TargetTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(subcommandActual){this.trackCliSubcommand({subcommand:"list",value:subcommandActual})}};var COMMAND_CONFIG60={ls:getCommandAliases(listSubcommand22)};async function main33(client){let parsedArgs,flagsSpecification=getFlagsSpecification(targetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let{telemetryEventStore}=client,telemetry2=new TargetTelemetryClient({opts:{store:telemetryEventStore}});parsedArgs.args=parsedArgs.args.slice(1);let subcommand=parsedArgs.args[0],args=parsedArgs.args.slice(1),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("target"),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:targetCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":case"list":return needHelp?(telemetry2.trackCliFlagHelp("target","list"),printHelp(listSubcommand22),2):(telemetry2.trackCliSubcommandList(subcommand),await list27(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG60)),output_manager_default.print(help(targetCommand,{columns:client.stderr.columns})),2}}var import_chalk300=__toESM(require_source(),1);var TeamsListTelemetryClient=class extends TelemetryClient{trackCliOptionNext(value){value&&value>0&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionLimit(value){value&&value>0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionUntil(value){value&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionSince(value){value&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionCount(value){value&&value>0&&this.trackCliOption({option:"count",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list28(client,argv){let{config,telemetryEventStore}=client,telemetry2=new TeamsListTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand23.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 validationResult=validateLsArgs({commandName:"teams ls",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let next=parsedArgs.flags["--next"],limit=parsedArgs.flags["--limit"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliOptionCount(parsedArgs.flags["--count"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),typeof next<"u"&&!Number.isInteger(next))return output_manager_default.error("Please provide a number for flag `--next`"),1;try{getPaginationOpts(parsedArgs.flags)}catch(error){return output_manager_default.error(error instanceof Error?error.message:String(error)),1}output_manager_default.spinner("Fetching teams");let{teams:teams2,pagination}=await getTeams(client,{next,limit,apiVersion:2}),{currentTeam}=config;output_manager_default.spinner("Fetching user information");let user=await getUser(client),accountIsCurrent=!currentTeam&&user.version!=="northstar";accountIsCurrent&&(currentTeam=user.id);let teamList=teams2.map(({id,slug,name,billing})=>({id,name,plan:billing?.plan??null,value:slug,isCurrent:id===currentTeam}));if(user.version!=="northstar"&&teamList.unshift({id:user.id,name:user.email,plan:user.billing?.plan??null,value:user.username||user.email,isCurrent:accountIsCurrent}),!accountIsCurrent){let index=teamList.findIndex(choice2=>choice2.id===currentTeam),choice=teamList.splice(index,1)[0];teamList.unshift(choice)}if(output_manager_default.stopSpinner(),asJson){let jsonOutput={teams:teamList.map(team=>({id:team.id,slug:team.value,name:team.name,plan:team.plan,current:team.isCurrent})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1316
1326
  `)}else{client.stdout.write(`
1317
- `);let teamTable=table([["id","Team name","Plan"].map(str=>(0,import_chalk299.gray)(str)),...teamList.map(team=>[team.value,team.name,team.plan??"-"])],{hsep:5});if(client.stderr.write(currentTeam?teamTable.split(`
1327
+ `);let teamTable=table([["id","Team name","Plan"].map(str=>(0,import_chalk300.gray)(str)),...teamList.map(team=>[team.value,team.name,team.plan??"-"])],{hsep:5});if(client.stderr.write(currentTeam?teamTable.split(`
1318
1328
  `).map((line2,i)=>`${i>0&&teamList[i-1].isCurrent?chars_default.tick:" "} ${line2}`).join(`
1319
1329
  `):teamTable),client.stderr.write(`
1320
1330
  `),pagination?.next){let flags=getCommandFlags(parsedArgs.flags,["--next","-N","-d","--format"]),nextCmd=`${packageName} teams ls${flags} --next ${pagination.next}`;client.stdout.write(`
1321
- `),output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}}return 0}var import_chalk301=__toESM(require_source(),1);var import_chalk300=__toESM(require_source(),1);async function inviteUserToTeam(client,teamId,email2){return await client.fetch(`/teams/${encodeURIComponent(teamId)}/members`,{method:"POST",body:{email:email2}})}var import_error_utils23=__toESM(require_dist(),1);var TeamsInviteTelemetryClient=class extends TelemetryClient{trackCliArgumentEmail(values){values&&this.trackCliArgument({arg:"email",value:this.redactedArgumentsLength(values)})}};var validateEmail=data=>email.test(data.trim())||data.length===0,domains=Array.from(new Set(["aol.com","gmail.com","google.com","yahoo.com","ymail.com","hotmail.com","live.com","outlook.com","inbox.com","mail.com","gmx.com","icloud.com"]));async function invite(client,argv,{introMsg="",noopMsg="No changes made"}={}){let{config,telemetryEventStore}=client,{currentTeam:currentTeamId}=config,telemetry2=new TeamsInviteTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inviteSubcommand.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:emails}=parsedArgs;if(client.nonInteractive&&emails.length===0){let fullArgs=client.argv.slice(2),inviteIdx=fullArgs.indexOf("invite"),afterInvite=inviteIdx>=0?fullArgs.slice(inviteIdx+1):[],flagParts=getSameSubcommandSuggestionFlags(afterInvite),cmd2=getCommandNamePlain(`teams invite <email> ${flagParts.join(" ")}`.trim());return outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`In non-interactive mode at least one email is required. Run: ${cmd2}`,next:[{command:cmd2,when:"to invite teammates (replace <email> with a teammate email)"}]},1),1}output_manager_default.spinner("Fetching teams");let currentTeam=(await getTeams(client)).find(team=>team.id===currentTeamId);output_manager_default.spinner("Fetching user information");let user=await getUser(client);if(domains.push(user.email.split("@")[1]),!currentTeam){let err=`You can't run this command under ${param(user.username||user.email)}.
1322
- Please select a team scope using ${getCommandName("switch")} or use ${cmd("--scope")}`;if(client.nonInteractive){let switchCmd=withGlobalFlags(client,"teams switch <slug>");outputAgentError(client,{status:"error",reason:"team_scope_required",message:`Team scope is required for teams invite. Run ${switchCmd} or use --scope.`,next:[{command:switchCmd,when:"to select a team scope (replace <slug> with your team slug)"}]},1)}return output_manager_default.error(err),1}if(output_manager_default.log(introMsg||`Inviting team members to ${import_chalk300.default.bold(currentTeam.name)}`),telemetry2.trackCliArgumentEmail(emails),emails.length>0){for(let email3 of emails)if(email.test(email3)){output_manager_default.spinner(email3);let elapsed2=stamp_default(),userInfo2=null;try{userInfo2=(await inviteUserToTeam(client,currentTeam.id,email3)).username}catch(err){if(isAPIError(err)&&err.code==="user_not_found"){if(client.nonInteractive){let fullArgs=client.argv.slice(2),inviteIdx=fullArgs.indexOf("invite"),afterInvite=inviteIdx>=0?fullArgs.slice(inviteIdx+1):[],flagParts=getSameSubcommandSuggestionFlags(afterInvite),retryCmd=getCommandNamePlain(`teams invite <email> ${flagParts.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"user_not_found",message:`No user exists with the email address "${email3}".`,next:[{command:retryCmd}]},1)}return output_manager_default.error(`No user exists with the email address "${email3}".`),1}throw err}output_manager_default.log(`${import_chalk300.default.cyan(chars_default.tick)} ${email3}${userInfo2?` (${userInfo2})`:""} ${elapsed2()}`)}else output_manager_default.log(`${import_chalk300.default.red(`\u2716 ${email3}`)} ${import_chalk300.default.gray("[invalid]")}`);return 0}let inviteUserPrefix="Invite User".padEnd(14),sentEmailPrefix="Sent Email".padEnd(14),hasError=!1,email2;do{email2="";try{email2=await client.input.text({message:`- ${inviteUserPrefix}`,validate:validateEmail})}catch(err){if(!(0,import_error_utils23.isError)(err)||err.message!=="USER_ABORT")throw err}let elapsed2;if(email2){elapsed2=stamp_default(),output_manager_default.spinner(inviteUserPrefix+email2);try{let{username}=await inviteUserToTeam(client,currentTeam.id,email2);if(email2=`${email2}${username?` (${username})`:""} ${elapsed2()}`,emails.push(email2),output_manager_default.log(`${import_chalk300.default.cyan(chars_default.tick)} ${sentEmailPrefix}${email2}`),hasError){hasError=!1,process.stderr.write(eraseLines(emails.length+2)),output_manager_default.log(introMsg||`Inviting team members to ${import_chalk300.default.bold(currentTeam.name)}`);for(let email3 of emails)output_manager_default.log(`${import_chalk300.default.cyan(chars_default.tick)} ${inviteUserPrefix}${email3}`)}}catch(err){output_manager_default.stopSpinner(),process.stderr.write(eraseLines(emails.length+2)),output_manager_default.error((0,import_error_utils23.errorToString)(err)),hasError=!0;for(let email3 of emails)output_manager_default.log(`${import_chalk300.default.cyan(chars_default.tick)} ${sentEmailPrefix}${email3}`)}}}while(email2!=="");output_manager_default.stopSpinner(),process.stderr.write(eraseLines(emails.length+2));let n=emails.length;if(emails.length===0)output_manager_default.log(noopMsg);else{output_manager_default.success(`Invited ${n} teammate${n>1?"s":""}`);for(let email3 of emails)output_manager_default.log(`${import_chalk300.default.cyan(chars_default.tick)} ${inviteUserPrefix}${email3}`)}return 0}async function createTeam(client,{slug},opts){let fetchOpts={method:"POST",body:{slug},useCurrentTeam:!1,bailOn429:!0};return opts?.signal&&(fetchOpts.signal=opts.signal),await client.fetch("/teams",fetchOpts)}async function patchTeam(client,teamId,payload){let body=await client.fetch(`/teams/${encodeURIComponent(teamId)}`,{method:"PATCH",body:payload});if(body&&typeof body=="object"&&"ok"in body)throw new Error("PATCH /teams returned non-JSON response");return body}var import_error_utils24=__toESM(require_dist(),1);var validateSlug=value=>/^[a-z]+[a-z0-9_-]*$/.test(value),validateName=value=>/^[ a-zA-Z0-9_-]+$/.test(value),teamUrlPrefix="Team URL".padEnd(14)+import_chalk301.default.gray("vercel.com/"),teamNamePrefix="Team Name".padEnd(14),CREATE_TEAM_TIMEOUT_MS=3e4,TIMEOUT_HINT="The request took too long and was cancelled. The team URL may already be taken, or the server may be slow. Try a different slug (e.g. your-company-name) or try again later. Run with `--debug` to see where the request is getting stuck.";function createTeamWithTimeout(client,slug){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CREATE_TEAM_TIMEOUT_MS);output_manager_default.debug(`Creating team with slug "${slug}" (timeout: ${CREATE_TEAM_TIMEOUT_MS/1e3}s, apiUrl: ${client.apiUrl})`);let promise=createTeam(client,{slug},{signal:controller.signal}).then(result=>(clearTimeout(timeoutId),result)).catch(err=>{throw clearTimeout(timeoutId),err});return Promise.race([promise,new Promise((_,reject)=>setTimeout(()=>reject(new Error("Request timed out.")),CREATE_TEAM_TIMEOUT_MS+500))])}function formatCreateTeamError(err,slug){let isAbort=(0,import_error_utils24.isError)(err)&&err.name==="AbortError",isTimeoutMsg=(0,import_error_utils24.isError)(err)&&err.message==="Request timed out.";if(isAbort||isTimeoutMsg)return TIMEOUT_HINT;if(isAPIError(err)&&err.status===429){let retryMs=err.retryAfterMs,retrySec=typeof retryMs=="number"&&retryMs>=0?Math.ceil(retryMs/1e3):0,formatWait=sec=>sec<60?`${sec} seconds`:sec<3600?`${sec} seconds (${Math.ceil(sec/60)} minutes)`:`${sec} seconds (${(sec/3600).toFixed(1)} hours)`;return"Rate limited (429 Too Many Requests). The Vercel API limits how often you can create teams."+(retrySec>0?` Try again in ${formatWait(retrySec)}.`:" Wait a minute or two, then try again.")+" (The API sends when the rate limit window resets, often a fixed time like the next hour or midnight UTC.) Dashboard: https://vercel.com/account."}if(isAPIError(err)&&err.status===400){let msg=(err.serverMessage||err.message||"").toLowerCase(),slugHint=msg.includes("slug")||msg.includes("cannot be used")?`That team URL (${import_chalk301.default.cyan(`vercel.com/${slug}`)}) is not available. It may already be taken. `:"",paymentHint=msg.includes("payment")?"A payment method is required to create a team. ":"",prefix=slugHint||paymentHint;return prefix?`${prefix}${prefix.trim()?`
1331
+ `),output_manager_default.log(`To display the next page run ${cmd(nextCmd)}`)}}return 0}var import_chalk302=__toESM(require_source(),1);var import_chalk301=__toESM(require_source(),1);async function inviteUserToTeam(client,teamId,email2){return await client.fetch(`/teams/${encodeURIComponent(teamId)}/members`,{method:"POST",body:{email:email2}})}var import_error_utils23=__toESM(require_dist(),1);var TeamsInviteTelemetryClient=class extends TelemetryClient{trackCliArgumentEmail(values){values&&this.trackCliArgument({arg:"email",value:this.redactedArgumentsLength(values)})}};var validateEmail=data=>email.test(data.trim())||data.length===0,domains=Array.from(new Set(["aol.com","gmail.com","google.com","yahoo.com","ymail.com","hotmail.com","live.com","outlook.com","inbox.com","mail.com","gmx.com","icloud.com"]));async function invite(client,argv,{introMsg="",noopMsg="No changes made"}={}){let{config,telemetryEventStore}=client,{currentTeam:currentTeamId}=config,telemetry2=new TeamsInviteTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inviteSubcommand.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:emails}=parsedArgs;if(client.nonInteractive&&emails.length===0){let fullArgs=client.argv.slice(2),inviteIdx=fullArgs.indexOf("invite"),afterInvite=inviteIdx>=0?fullArgs.slice(inviteIdx+1):[],flagParts=getSameSubcommandSuggestionFlags(afterInvite),cmd2=getCommandNamePlain(`teams invite <email> ${flagParts.join(" ")}`.trim());return outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`In non-interactive mode at least one email is required. Run: ${cmd2}`,next:[{command:cmd2,when:"to invite teammates (replace <email> with a teammate email)"}]},1),1}output_manager_default.spinner("Fetching teams");let currentTeam=(await getTeams(client)).find(team=>team.id===currentTeamId);output_manager_default.spinner("Fetching user information");let user=await getUser(client);if(domains.push(user.email.split("@")[1]),!currentTeam){let err=`You can't run this command under ${param(user.username||user.email)}.
1332
+ Please select a team scope using ${getCommandName("switch")} or use ${cmd("--scope")}`;if(client.nonInteractive){let switchCmd=withGlobalFlags(client,"teams switch <slug>");outputAgentError(client,{status:"error",reason:"team_scope_required",message:`Team scope is required for teams invite. Run ${switchCmd} or use --scope.`,next:[{command:switchCmd,when:"to select a team scope (replace <slug> with your team slug)"}]},1)}return output_manager_default.error(err),1}if(output_manager_default.log(introMsg||`Inviting team members to ${import_chalk301.default.bold(currentTeam.name)}`),telemetry2.trackCliArgumentEmail(emails),emails.length>0){for(let email3 of emails)if(email.test(email3)){output_manager_default.spinner(email3);let elapsed2=stamp_default(),userInfo2=null;try{userInfo2=(await inviteUserToTeam(client,currentTeam.id,email3)).username}catch(err){if(isAPIError(err)&&err.code==="user_not_found"){if(client.nonInteractive){let fullArgs=client.argv.slice(2),inviteIdx=fullArgs.indexOf("invite"),afterInvite=inviteIdx>=0?fullArgs.slice(inviteIdx+1):[],flagParts=getSameSubcommandSuggestionFlags(afterInvite),retryCmd=getCommandNamePlain(`teams invite <email> ${flagParts.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"user_not_found",message:`No user exists with the email address "${email3}".`,next:[{command:retryCmd}]},1)}return output_manager_default.error(`No user exists with the email address "${email3}".`),1}throw err}output_manager_default.log(`${import_chalk301.default.cyan(chars_default.tick)} ${email3}${userInfo2?` (${userInfo2})`:""} ${elapsed2()}`)}else output_manager_default.log(`${import_chalk301.default.red(`\u2716 ${email3}`)} ${import_chalk301.default.gray("[invalid]")}`);return 0}let inviteUserPrefix="Invite User".padEnd(14),sentEmailPrefix="Sent Email".padEnd(14),hasError=!1,email2;do{email2="";try{email2=await client.input.text({message:`- ${inviteUserPrefix}`,validate:validateEmail})}catch(err){if(!(0,import_error_utils23.isError)(err)||err.message!=="USER_ABORT")throw err}let elapsed2;if(email2){elapsed2=stamp_default(),output_manager_default.spinner(inviteUserPrefix+email2);try{let{username}=await inviteUserToTeam(client,currentTeam.id,email2);if(email2=`${email2}${username?` (${username})`:""} ${elapsed2()}`,emails.push(email2),output_manager_default.log(`${import_chalk301.default.cyan(chars_default.tick)} ${sentEmailPrefix}${email2}`),hasError){hasError=!1,process.stderr.write(eraseLines(emails.length+2)),output_manager_default.log(introMsg||`Inviting team members to ${import_chalk301.default.bold(currentTeam.name)}`);for(let email3 of emails)output_manager_default.log(`${import_chalk301.default.cyan(chars_default.tick)} ${inviteUserPrefix}${email3}`)}}catch(err){output_manager_default.stopSpinner(),process.stderr.write(eraseLines(emails.length+2)),output_manager_default.error((0,import_error_utils23.errorToString)(err)),hasError=!0;for(let email3 of emails)output_manager_default.log(`${import_chalk301.default.cyan(chars_default.tick)} ${sentEmailPrefix}${email3}`)}}}while(email2!=="");output_manager_default.stopSpinner(),process.stderr.write(eraseLines(emails.length+2));let n=emails.length;if(emails.length===0)output_manager_default.log(noopMsg);else{output_manager_default.success(`Invited ${n} teammate${n>1?"s":""}`);for(let email3 of emails)output_manager_default.log(`${import_chalk301.default.cyan(chars_default.tick)} ${inviteUserPrefix}${email3}`)}return 0}async function createTeam(client,{slug},opts){let fetchOpts={method:"POST",body:{slug},useCurrentTeam:!1,bailOn429:!0};return opts?.signal&&(fetchOpts.signal=opts.signal),await client.fetch("/teams",fetchOpts)}async function patchTeam(client,teamId,payload){let body=await client.fetch(`/teams/${encodeURIComponent(teamId)}`,{method:"PATCH",body:payload});if(body&&typeof body=="object"&&"ok"in body)throw new Error("PATCH /teams returned non-JSON response");return body}var import_error_utils24=__toESM(require_dist(),1);var validateSlug=value=>/^[a-z]+[a-z0-9_-]*$/.test(value),validateName=value=>/^[ a-zA-Z0-9_-]+$/.test(value),teamUrlPrefix="Team URL".padEnd(14)+import_chalk302.default.gray("vercel.com/"),teamNamePrefix="Team Name".padEnd(14),CREATE_TEAM_TIMEOUT_MS=3e4,TIMEOUT_HINT="The request took too long and was cancelled. The team URL may already be taken, or the server may be slow. Try a different slug (e.g. your-company-name) or try again later. Run with `--debug` to see where the request is getting stuck.";function createTeamWithTimeout(client,slug){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),CREATE_TEAM_TIMEOUT_MS);output_manager_default.debug(`Creating team with slug "${slug}" (timeout: ${CREATE_TEAM_TIMEOUT_MS/1e3}s, apiUrl: ${client.apiUrl})`);let promise=createTeam(client,{slug},{signal:controller.signal}).then(result=>(clearTimeout(timeoutId),result)).catch(err=>{throw clearTimeout(timeoutId),err});return Promise.race([promise,new Promise((_,reject)=>setTimeout(()=>reject(new Error("Request timed out.")),CREATE_TEAM_TIMEOUT_MS+500))])}function formatCreateTeamError(err,slug){let isAbort=(0,import_error_utils24.isError)(err)&&err.name==="AbortError",isTimeoutMsg=(0,import_error_utils24.isError)(err)&&err.message==="Request timed out.";if(isAbort||isTimeoutMsg)return TIMEOUT_HINT;if(isAPIError(err)&&err.status===429){let retryMs=err.retryAfterMs,retrySec=typeof retryMs=="number"&&retryMs>=0?Math.ceil(retryMs/1e3):0,formatWait=sec=>sec<60?`${sec} seconds`:sec<3600?`${sec} seconds (${Math.ceil(sec/60)} minutes)`:`${sec} seconds (${(sec/3600).toFixed(1)} hours)`;return"Rate limited (429 Too Many Requests). The Vercel API limits how often you can create teams."+(retrySec>0?` Try again in ${formatWait(retrySec)}.`:" Wait a minute or two, then try again.")+" (The API sends when the rate limit window resets, often a fixed time like the next hour or midnight UTC.) Dashboard: https://vercel.com/account."}if(isAPIError(err)&&err.status===400){let msg=(err.serverMessage||err.message||"").toLowerCase(),slugHint=msg.includes("slug")||msg.includes("cannot be used")?`That team URL (${import_chalk302.default.cyan(`vercel.com/${slug}`)}) is not available. It may already be taken. `:"",paymentHint=msg.includes("payment")?"A payment method is required to create a team. ":"",prefix=slugHint||paymentHint;return prefix?`${prefix}${prefix.trim()?`
1323
1333
  `:""}${err.serverMessage||err.message}`:err.serverMessage||err.message}return(0,import_error_utils24.errorToString)(err)}function formatCreateTeamErrorPlain(err,slug){let isAbort=(0,import_error_utils24.isError)(err)&&err.name==="AbortError",isTimeoutMsg=(0,import_error_utils24.isError)(err)&&err.message==="Request timed out.";if(isAbort||isTimeoutMsg)return TIMEOUT_HINT;if(isAPIError(err)&&err.status===429)return formatCreateTeamError(err,slug);if(isAPIError(err)&&err.status===400){let msg=(err.serverMessage||err.message||"").toLowerCase(),slugHint=msg.includes("slug")||msg.includes("cannot be used")?`That team URL (vercel.com/${slug}) is not available. It may already be taken. `:"",paymentHint=msg.includes("payment")?"A payment method is required to create a team. ":"",prefix=slugHint||paymentHint;return prefix?`${prefix}${prefix.trim()?`
1324
- `:""}${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_chalk301.default.bold(team2.name)} (${import_chalk301.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_chalk301.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_chalk301.default.cyan(`${chars_default.tick} `)+teamUrlPrefix+slug}
1325
- `),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_chalk301.default.cyan(`${chars_default.tick} `)+teamNamePrefix+team.name}
1326
- `),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_chalk302=__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_chalk302.default.bold("(current)")}`),team.limited&&(title6+=` ${emoji("locked")}`),{name:title6,value:team.slug,short:team.slug,selected}}),suffix=personalScopeSelected?` ${import_chalk302.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_chalk302.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_chalk302.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_chalk302.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)}
1327
- `),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_chalk303=__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)}
1328
- `),0;let rows=[["uid","Identity","Role"].map(str=>(0,import_chalk303.gray)(str)),...members3.map(member=>[member.uid,member.username||member.email||"",member.role||""])];if(client.stderr.write(`${table(rows,{hsep:3})}
1329
- `),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_chalk304=__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)}
1330
- `),0):(output_manager_default.log(`${import_chalk304.default.bold("Team")} ${full.name} (${import_chalk304.default.cyan(full.slug)})`),full.saml?(output_manager_default.log(`${import_chalk304.default.cyan("SAML enforced:")} ${String(full.saml.enforced)}`),full.saml.connection?.state&&output_manager_default.log(`${import_chalk304.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_CONFIG60={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_CONFIG60),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),list27(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_chalk305=__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)}
1331
- `),0;if(tokens.length===0)return output_manager_default.log("No tokens found."),0;let rows=[["id","name","type","active"].map(h=>(0,import_chalk305.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})}
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
+ `),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
+ `),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)}
1338
+ `),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
+ `),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)}
1341
+ `),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})}
1332
1342
  `),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.
1333
1343
 
1334
1344
  What to do:
@@ -1341,13 +1351,13 @@ Common cases:
1341
1351
  \u2022 Create a new classic token in the dashboard (Account \u2192 Settings \u2192 Tokens) with access to your personal account / full token permissions.
1342
1352
  \u2022 Then set VERCEL_TOKEN or use --token with that value and run this command again.`,USER_SCOPE_AGENT_HINT=`Creating a personal token requires a classic token that includes full user account scope. Team-scoped, project-scoped, or narrow product tokens are rejected with HTTP 403. Create a classic personal access token at ${VERCEL_ACCOUNT_TOKENS_URL} with account-level access, set VERCEL_TOKEN or --token, then re-run.`;function normalizeApiMessage(message){return message.replace(/\s*\(\d{3}\)\s*$/,"").trim()}function getSanitizedRerunCommand(client){let rerunArgs=stripSensitiveAuthArgs(client.argv.slice(2));return getCommandNamePlain(rerunArgs.join(" ").trim())}function isClassicTokenRequiredForCreateError(err){if(!isAPIError(err)||err.status!==403)return!1;let raw=err.serverMessage||err.message;return normalizeApiMessage(raw)==="Only user authentication tokens can be used to create new tokens."}function isTokenUserScopeRequiredError(err){return!isAPIError(err)||err.status!==403?!1:normalizeApiMessage(err.serverMessage||err.message).startsWith('To create a token you must be authenticated to scope "')}function tokensAddRecoveryNext(client,rerun,rerunWhen){return[{command:openUrlInBrowserCommand(VERCEL_ACCOUNT_TOKENS_URL),when:"Open the Vercel dashboard to create a classic personal access token"},{command:"export VERCEL_TOKEN='<class_access_token>'",when:"Paste your classic token from the dashboard (replace <class_access_token>); on Windows use set VERCEL_TOKEN=<class_access_token> in cmd or $env:VERCEL_TOKEN in PowerShell"},{command:rerun,when:rerunWhen}]}async function openTokensDashboardInBrowser(client){let isCursorAgent=client.agentName===KNOWN_AGENTS2.CURSOR||client.agentName===KNOWN_AGENTS2.CURSOR_CLI;if(!(process.env.CI&&!isCursorAgent))try{(await(0,import_open19.default)(VERCEL_ACCOUNT_TOKENS_URL))?.on?.("error",()=>{})}catch{}}async function add15(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand12.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args}=parsedArgs,name=args[0]?.trim();if(!name)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_arguments",message:'Token name is required. Example: `vercel tokens add "My token"`'},1),output_manager_default.error('Token name is required. Example: `vercel tokens add "My token"`'),1;if(args.length>1)return output_manager_default.error("Too many arguments. Pass a single token name."),1;let validation=validateJsonOutput(parsedArgs.flags);if(!validation.valid)return output_manager_default.error(validation.error),1;let asJson=validation.jsonOutput,projectId=parsedArgs.flags["--project"],body={name};typeof projectId=="string"&&projectId.length>0&&(body.projectId=projectId);let result;try{result=await client.fetch("/v3/user/tokens",{method:"POST",body,useCurrentTeam:!1})}catch(err){if(isClassicTokenRequiredForCreateError(err)){await openTokensDashboardInBrowser(client);let rerun=getSanitizedRerunCommand(client);return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.CLASSIC_TOKEN_REQUIRED,message:"Creating tokens requires a classic personal access token; OAuth login cannot create new tokens.",userActionRequired:!0,verification_uri:VERCEL_ACCOUNT_TOKENS_URL,hint:CLASSIC_TOKEN_AGENT_HINT,next:tokensAddRecoveryNext(client,rerun,"Re-run after the token is set (or use --token <class_access_token> instead of export)")},1),output_manager_default.error(CLASSIC_TOKEN_GUIDANCE),1}if(isTokenUserScopeRequiredError(err)){await openTokensDashboardInBrowser(client);let rerun=getSanitizedRerunCommand(client),apiMessage=normalizeApiMessage(isAPIError(err)?err.serverMessage||err.message:String(err));return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.TOKEN_USER_SCOPE_REQUIRED,message:apiMessage,userActionRequired:!0,verification_uri:VERCEL_ACCOUNT_TOKENS_URL,hint:USER_SCOPE_AGENT_HINT,next:tokensAddRecoveryNext(client,rerun,"Re-run with a classic token that has full user account scope (or pass --token <class_access_token>)")},1),output_manager_default.error(USER_SCOPE_GUIDANCE),output_manager_default.error(""),output_manager_default.error(apiMessage),1}return printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
1343
1353
  `),0):(output_manager_default.success("Token created. Save the value below \u2014 it will not be shown again."),result.bearerToken&&output_manager_default.log(result.bearerToken),result.token?.id&&output_manager_default.log(`id: ${result.token.id}`),0)}async function rm10(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand15.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let id=parsedArgs.args[0];if(!id)return outputAgentError(client,{status:"error",reason:"missing_arguments",message:"Token id is required. Example: `vercel tokens rm tok_abc123`",hint:"Run `tokens ls` to list ids, then pass the id to `tokens rm`.",next:[{command:buildCommandWithGlobalFlags(client.argv,"tokens ls"),when:"List personal access token ids for the current account"},{command:buildCommandWithGlobalFlags(client.argv,"tokens rm <token_id>"),when:"Remove a token after replacing <token_id> with an id from the list"}]},1),output_manager_default.error("Token id is required. Example: `vercel tokens rm tok_abc123`"),1;if(parsedArgs.args.length>1)return output_manager_default.error("Too many arguments. Pass a single token id."),1;let validation=validateJsonOutput(parsedArgs.flags);if(!validation.valid)return output_manager_default.error(validation.error),1;let asJson=validation.jsonOutput;return await client.fetch(`/v3/user/tokens/${encodeURIComponent(id)}`,{method:"DELETE",useCurrentTeam:!1}),asJson?(client.stdout.write(`${JSON.stringify({ok:!0,id},null,2)}
1344
- `),0):(output_manager_default.success(`Removed token ${id}`),0)}var TokensTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG61={add:["add","create"],remove:["rm","remove","delete"],ls:["ls","list"]};async function main34(client){let parsedArgs,flagsSpecification=getFlagsSpecification(tokensCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new TokensTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG61),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("tokens"),output_manager_default.print(help(tokensCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:tokensCommand,columns:client.stderr.columns})),2}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(addSubcommand12)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add15(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(removeSubcommand15)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm10(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(listSubcommand24)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls9(client,args))}}var import_chalk306=__toESM(require_source(),1);async function status4(client){let enabled=client.config.telemetry?.enabled!==!1,status6=enabled?import_chalk306.default.green("Enabled"):import_chalk306.default.red("Disabled");output_manager_default.print(`
1345
- `),output_manager_default.log(`${import_chalk306.default.bold("Telemetry status")}: ${status6}
1354
+ `),0):(output_manager_default.success(`Removed token ${id}`),0)}var TokensTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG62={add:["add","create"],remove:["rm","remove","delete"],ls:["ls","list"]};async function main34(client){let parsedArgs,flagsSpecification=getFlagsSpecification(tokensCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new TokensTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG62),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("tokens"),output_manager_default.print(help(tokensCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:tokensCommand,columns:client.stderr.columns})),2}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(addSubcommand12)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add15(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(removeSubcommand15)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm10(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(listSubcommand24)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls9(client,args))}}var import_chalk307=__toESM(require_source(),1);async function status4(client){let enabled=client.config.telemetry?.enabled!==!1,status6=enabled?import_chalk307.default.green("Enabled"):import_chalk307.default.red("Disabled");output_manager_default.print(`
1355
+ `),output_manager_default.log(`${import_chalk307.default.bold("Telemetry status")}: ${status6}
1346
1356
  `);let learnMoreMessage=`
1347
1357
 
1348
- Learn more: ${import_chalk306.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)}
1349
- `,{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_chalk307=__toESM(require_source(),1);var COMMAND_CONFIG62={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_CONFIG62),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_chalk307.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
1350
- `),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 list29=childrenByParent.get(span.parentSpanId);list29?list29.push(span):childrenByParent.set(span.parentSpanId,[span])}for(let list29 of childrenByParent.values())list29.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(`
1358
+ 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
+ `,{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(`
1351
1361
 
1352
1362
  `)}
1353
1363
  `}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(`
@@ -1356,13 +1366,13 @@ Learn more: ${import_chalk306.default.cyan("https://vercel.com/docs/cli/about-te
1356
1366
  `)}function renderTree(analysis){let lines=["## Span tree",""];if(analysis.treeOrder.length===0&&analysis.orphanOrder.length===0)return lines.push("_No spans._"),lines.join(`
1357
1367
  `);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(`
1358
1368
  `)}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)}
1359
- `),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var COMMAND_CONFIG63={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_CONFIG63),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-Q6V74NTU.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)}
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)}
1360
1370
  `)}else output_manager_default.print(`Current version: ${pkg_default.version}
1361
1371
  `),output_manager_default.print(`Installation type: ${global?"global":"local"}
1362
1372
  `),updateCommand&&output_manager_default.print(`Upgrade command: ${updateCommand}
1363
1373
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1364
1374
  `),requestedPreference&&output_manager_default.print(`Would ${requestedPreference.enabled?"enable":"disable"} ${requestedPreference.label}. No settings changed.
1365
- `);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_chalk310=__toESM(require_source(),1);async function status5(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
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}
1366
1376
  `),output_manager_default.print(`Runtime: ${describeRuntime(context)}
1367
1377
  `),output_manager_default.print(`Managed by: ${describeManager(context)}
1368
1378
  `),context.manager==="installer"){if(output_manager_default.print(`Track: ${context.track??"legacy"}
@@ -1375,56 +1385,56 @@ Learn more: ${import_chalk306.default.cyan("https://vercel.com/docs/cli/about-te
1375
1385
  `):output_manager_default.print(`${context.upgradeError.message}
1376
1386
  `),output_manager_default.print(`Tip: the recommended way to manage the Vercel CLI is the installer: ${CURL_INSTALL_COMMAND}
1377
1387
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1378
- `);return 0}var import_chalk308=__toESM(require_source(),1);var DEFAULT_COUNT=20;async function list28(){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_chalk308.default.cyan(version2)} ${import_chalk308.default.dim("(current)")}
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)")}
1379
1389
  `:`${version2}
1380
- `)}return versions2.length>shown.length&&output_manager_default.print(import_chalk308.default.dim(`\u2026 and ${versions2.length-shown.length} more
1381
- `)),0}var import_chalk309=__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_chalk309.default.dim("(current)")}
1382
- `),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_chalk309.default.dim("(active)")}`:""}
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)")}`:""}
1383
1393
  `)}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:
1384
1394
  ${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"}
1385
1395
  `),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}
1386
1396
  `),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.
1387
1397
  `),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
1388
- `),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_CONFIG64={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_CONFIG64),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),list28());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_chalk310.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1389
- `),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk315=__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_chalk312=__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_chalk311=__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_chalk311.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk311.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk311.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk311.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_chalk311.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_chalk312.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk312.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk312.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk312.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_chalk312.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_chalk312.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk312.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_chalk312.default.bold("Estimated total"),import_chalk312.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1390
- `)}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_chalk312.default.bold(subtotalLabel),"",import_chalk312.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk312.default.bold(import_chalk312.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
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(`
1391
1401
  ${tablePrint}
1392
- `)}var import_chalk313=__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_chalk313.default.bold(import_chalk313.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_chalk313.default.bold(import_chalk313.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1393
- `)}outputHiddenServicesHint(hiddenCount)}var import_chalk314=__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_chalk314.default.bold(import_chalk314.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_chalk314.default.bold(import_chalk314.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1394
- `)}log(""),log(`${import_chalk314.default.gray("Estimated total:")} ${import_chalk314.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)}
1395
- `)}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_chalk315.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_CONFIG65={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_CONFIG65),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-LOXX7YQ2.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-LGQ44GYB.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-7OUJAZIH.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-26RISHPB.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-C5GXOG3I.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-QIPGRGDE.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-VSV5LVJK.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-ZQWVBEAJ.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-JSRGITRJ.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-LZ32HAQV.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-XHGXTFEU.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG65)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms38=__toESM(require_ms(),1),import_chalk316=__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_chalk316.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)}
1396
- `)}else output_manager_default.log(`${(0,import_pluralize22.default)("Webhook",webhooks.length,!0)} found under ${import_chalk316.default.bold(contextName)} ${import_chalk316.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
1397
-
1398
- `));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_chalk316.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk317=__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_chalk317.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_chalk317.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)}
1399
- `)}else{output_manager_default.log(`Webhook ${webhookId} found under ${import_chalk317.default.bold(contextName)} ${import_chalk317.default.gray(getStamp())}`),output_manager_default.print(`
1400
- `),output_manager_default.print(import_chalk317.default.bold(` General
1401
-
1402
- `)),output_manager_default.print(` ${import_chalk317.default.cyan("ID")} ${webhook.id}
1403
- `),output_manager_default.print(` ${import_chalk317.default.cyan("URL")} ${webhook.url}
1404
- `),output_manager_default.print(` ${import_chalk317.default.cyan("Created At")} ${formatDate(webhook.createdAt)}
1405
- `),output_manager_default.print(` ${import_chalk317.default.cyan("Updated At")} ${formatDate(webhook.updatedAt)}
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)}
1406
1416
  `),output_manager_default.print(`
1407
- `),output_manager_default.print(import_chalk317.default.bold(` Events
1417
+ `),output_manager_default.print(import_chalk318.default.bold(` Events
1408
1418
 
1409
1419
  `));for(let event of webhook.events)output_manager_default.print(` - ${event}
1410
1420
  `);if(webhook.projectIds&&webhook.projectIds.length>0)if(output_manager_default.print(`
1411
- `),output_manager_default.print(import_chalk317.default.bold(` Projects
1421
+ `),output_manager_default.print(import_chalk318.default.bold(` Projects
1412
1422
 
1413
1423
  `)),webhook.projectsMetadata&&webhook.projectsMetadata.length>0)for(let project of webhook.projectsMetadata)output_manager_default.print(` - ${project.name} (${project.id})
1414
1424
  `);else for(let projectId of webhook.projectIds)output_manager_default.print(` - ${projectId}
1415
1425
  `);output_manager_default.print(`
1416
- `)}return 0}var import_chalk318=__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_chalk318.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)}
1417
- `),0}return output_manager_default.stopSpinner(),output_manager_default.success(`Webhook created: ${import_chalk318.default.bold(webhook.id)} ${createStamp()}`),output_manager_default.print(`
1418
- `),output_manager_default.print(import_chalk318.default.bold(` Webhook Details
1419
-
1420
- `)),output_manager_default.print(` ${import_chalk318.default.cyan("ID".padEnd(10))}${webhook.id}
1421
- `),output_manager_default.print(` ${import_chalk318.default.cyan("URL".padEnd(10))}${webhook.url}
1422
- `),output_manager_default.print(` ${import_chalk318.default.cyan("Events".padEnd(10))}${webhook.events.join(", ")}
1423
- `),webhook.projectIds&&webhook.projectIds.length>0&&output_manager_default.print(` ${import_chalk318.default.cyan("Projects".padEnd(10))}${webhook.projectIds.join(", ")}
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(", ")}
1424
1434
  `),output_manager_default.print(`
1425
- `),output_manager_default.warn(`Save this secret - it will not be shown again: ${import_chalk318.default.bold(webhook.secret)}`),output_manager_default.print(`
1426
- `),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_chalk319=__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_chalk319.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_chalk319.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)}
1427
- `),0):(output_manager_default.success(`Webhook ${import_chalk319.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_CONFIG66={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_CONFIG66),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_chalk320=__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)}
1428
- `):(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,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}:null};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)}
1429
- `)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${import_chalk320.default.bold(formatUsername(scope))}`),team?output_manager_default.log(`Active team: ${import_chalk320.default.bold(team.slug)}${team.name&&team.name!==team.slug?` (${team.name})`:""}`):output_manager_default.log(`Active team: ${import_chalk320.default.bold("Personal Account")}`),hasLocalOverride){let globalLabel=globalTeam?globalTeam.slug:"Personal Account",localLabel=team?team.slug:"Personal Account";output_manager_default.log(`${import_chalk320.default.yellow("Local override:")} scope is set to ${import_chalk320.default.bold(localLabel)} by the linked project in this directory (globally selected: ${import_chalk320.default.bold(globalLabel)}).`)}}else client.stdout.write(`${formatUsername(scope)}
1430
- `);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")}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};
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)}
1438
+ `):(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)}
1440
+ `);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};