vercel 64.1.0 → 64.2.0

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 (155) hide show
  1. package/dist/chunks/{add-GEAC4RAQ.js → add-IATD2WUV.js} +1 -1
  2. package/dist/chunks/{add-XZJ4G2MM.js → add-UPXURHDI.js} +1 -1
  3. package/dist/chunks/{add-JH6ALI3H.js → add-WVK3AP46.js} +1 -1
  4. package/dist/chunks/{build-3T6EUCCK.js → build-JOGD3ZEF.js} +1 -1
  5. package/dist/chunks/{chunk-RZGWCQP7.js → chunk-2FHICLHJ.js} +1 -1
  6. package/dist/chunks/{chunk-AG5QQNJ3.js → chunk-2UMWTCY7.js} +1 -1
  7. package/dist/chunks/{chunk-OZ47SVXA.js → chunk-3EU7MN5M.js} +1 -1
  8. package/dist/chunks/{chunk-37QGCN6P.js → chunk-3GSGG4YR.js} +1 -1
  9. package/dist/chunks/{chunk-SD757OFS.js → chunk-4BS552UW.js} +1 -1
  10. package/dist/chunks/{chunk-NJINP2WU.js → chunk-4GL254L4.js} +1 -1
  11. package/dist/chunks/{chunk-RFEREQPS.js → chunk-4IIRQJUW.js} +1 -1
  12. package/dist/chunks/{chunk-KELSPU2J.js → chunk-4TTF5E5U.js} +3 -3
  13. package/dist/chunks/{chunk-Z6UFAIEX.js → chunk-4VEK7DEH.js} +1 -1
  14. package/dist/chunks/{chunk-UBKETNGO.js → chunk-5JEU6QSM.js} +1 -1
  15. package/dist/chunks/{chunk-NFJPCOTV.js → chunk-7BOCT55A.js} +1 -1
  16. package/dist/chunks/{chunk-67NNB6S6.js → chunk-7C6BXZCV.js} +1 -1
  17. package/dist/chunks/{chunk-DW3TSGVC.js → chunk-AKM22FBX.js} +1 -1
  18. package/dist/chunks/chunk-BTCKMXWW.js +7 -0
  19. package/dist/chunks/{chunk-MYCQIZU6.js → chunk-CN3IVZJO.js} +1 -1
  20. package/dist/chunks/{chunk-Z4OH72VZ.js → chunk-CRQDQNQZ.js} +1 -1
  21. package/dist/chunks/chunk-EEZLBOSP.js +14 -0
  22. package/dist/chunks/{chunk-WHVT7UXE.js → chunk-EF3YL2R7.js} +1 -1
  23. package/dist/chunks/{chunk-AR5T62PK.js → chunk-EKUHN42H.js} +1 -1
  24. package/dist/chunks/{chunk-JESE5FPO.js → chunk-FGNMYSLD.js} +2 -2
  25. package/dist/chunks/{chunk-JAQM6UXY.js → chunk-FTY4BCAF.js} +1 -1
  26. package/dist/chunks/{chunk-IDGWQE4B.js → chunk-GSVOI5LW.js} +1 -1
  27. package/dist/chunks/{chunk-ZMBDYOVN.js → chunk-GUJVJKO7.js} +1 -1
  28. package/dist/chunks/{chunk-M7GT3ZPT.js → chunk-GVVIFYQE.js} +1 -1
  29. package/dist/chunks/{chunk-R5K37TXM.js → chunk-I62UUYTS.js} +1 -1
  30. package/dist/chunks/{chunk-JJSDRKX4.js → chunk-IRJ5XFT2.js} +2 -2
  31. package/dist/chunks/{chunk-QJKJBD2M.js → chunk-ITKS32PG.js} +1 -1
  32. package/dist/chunks/{chunk-THSHYFA6.js → chunk-J3CDVZE7.js} +1 -1
  33. package/dist/chunks/{chunk-UFXKCETS.js → chunk-J6O6JW2K.js} +1 -1
  34. package/dist/chunks/{chunk-PJMVU4JC.js → chunk-KLYIX4HK.js} +3 -3
  35. package/dist/chunks/{chunk-QYDG63GL.js → chunk-KUGY5FIM.js} +1 -1
  36. package/dist/chunks/{chunk-JLXG2XWW.js → chunk-LD5U73LA.js} +1 -1
  37. package/dist/chunks/{chunk-MJD6WHG4.js → chunk-LLPIBKFX.js} +1 -1
  38. package/dist/chunks/{chunk-5IPBCD7K.js → chunk-MI7W4QMV.js} +1 -1
  39. package/dist/chunks/{chunk-YNIW7DTL.js → chunk-N5D4455C.js} +1 -1
  40. package/dist/chunks/{chunk-ASU72O2R.js → chunk-N6ECEBHG.js} +1 -1
  41. package/dist/chunks/{chunk-ELI3L2UX.js → chunk-NBABZO3A.js} +1 -1
  42. package/dist/chunks/{chunk-YCXZZSW6.js → chunk-O7JMHULU.js} +1 -1
  43. package/dist/chunks/{chunk-XXDVZWWM.js → chunk-OLWE4UFC.js} +1 -1
  44. package/dist/chunks/{chunk-FIIHB66A.js → chunk-PAN6TUTQ.js} +1 -1
  45. package/dist/chunks/chunk-Q5ZGA2RO.js +7 -0
  46. package/dist/chunks/{chunk-ZKDWPKO2.js → chunk-QDOYNWNQ.js} +1 -1
  47. package/dist/chunks/{chunk-UDQYOGSQ.js → chunk-QL3IYPBV.js} +1 -1
  48. package/dist/chunks/chunk-RIDPB64C.js +10 -0
  49. package/dist/chunks/{chunk-WLK5BBNP.js → chunk-SGXN7SMU.js} +1 -1
  50. package/dist/chunks/{chunk-OGCVOINQ.js → chunk-SQB4T5FL.js} +1 -1
  51. package/dist/chunks/{chunk-YI5G2A3V.js → chunk-SRAC7DI4.js} +1 -1
  52. package/dist/chunks/{chunk-MFIVZXHH.js → chunk-THZR6O2M.js} +1 -1
  53. package/dist/chunks/{chunk-S7XZC23O.js → chunk-TPVAPVQC.js} +1 -1
  54. package/dist/chunks/{chunk-G6B6TVAE.js → chunk-TWKII7HO.js} +1 -1
  55. package/dist/chunks/{chunk-5VWJIYJE.js → chunk-TY4PMK7Y.js} +1 -1
  56. package/dist/chunks/{chunk-GRTIWUV2.js → chunk-UCAE5Z5L.js} +1 -1
  57. package/dist/chunks/{chunk-L5FUUGYX.js → chunk-UGMTKOTN.js} +1 -1
  58. package/dist/chunks/{chunk-WQIGKVBV.js → chunk-UJUNGWSD.js} +1 -1
  59. package/dist/chunks/{chunk-BAJDLMZS.js → chunk-VURCIZKT.js} +1 -1
  60. package/dist/chunks/chunk-W3TGCMRW.js +9 -0
  61. package/dist/chunks/{chunk-VM6TZGLE.js → chunk-WE3ZJX7P.js} +1 -1
  62. package/dist/chunks/{chunk-KAJM2NEI.js → chunk-WIAAACUI.js} +1 -1
  63. package/dist/chunks/{chunk-FWFTX2WE.js → chunk-WVJYKHGZ.js} +1 -1
  64. package/dist/chunks/{chunk-7YRPMVZK.js → chunk-WW4VUFHJ.js} +1 -1
  65. package/dist/chunks/{chunk-J53D7SLS.js → chunk-WZ7YJDKT.js} +1 -1
  66. package/dist/chunks/{chunk-OJZEOWK2.js → chunk-X65QKYDM.js} +1 -1
  67. package/dist/chunks/{chunk-FBJWLH2A.js → chunk-XSVF2CZM.js} +1 -1
  68. package/dist/chunks/{chunk-2JBVMF2Y.js → chunk-Y24OSBXP.js} +1 -1
  69. package/dist/chunks/{chunk-JNPG7MVL.js → chunk-YDM2PMMP.js} +1 -1
  70. package/dist/chunks/{chunk-VRWPRZJY.js → chunk-YO4VLAB7.js} +1 -1
  71. package/dist/chunks/{chunk-4ZICRXI5.js → chunk-YP46QVEI.js} +1 -1
  72. package/dist/chunks/{chunk-3AVG55SO.js → chunk-ZBDLYNUF.js} +1 -1
  73. package/dist/chunks/{clear-XCZCETRU.js → clear-FNH7KUCF.js} +1 -1
  74. package/dist/chunks/{compile-vercel-config-NQKOGOPH.js → compile-vercel-config-4LNHE3YV.js} +1 -1
  75. package/dist/chunks/{config-CIM647OM.js → config-JEHKUQMZ.js} +1 -1
  76. package/dist/chunks/{config-P42IQJDF.js → config-W3TVZPSK.js} +1 -1
  77. package/dist/chunks/{delete-MVJ3NENU.js → delete-HCZA6EVL.js} +1 -1
  78. package/dist/chunks/{delete-KJMVCQ7C.js → delete-LV744KVD.js} +1 -1
  79. package/dist/chunks/{detect-services-UYQZT6MU.js → detect-services-TVZ4HYVB.js} +1 -1
  80. package/dist/chunks/{disable-666GPFHE.js → disable-N7WZSMD4.js} +1 -1
  81. package/dist/chunks/{discard-RUQPJMOG.js → discard-2DN52DNW.js} +1 -1
  82. package/dist/chunks/{edit-NRJCMP4B.js → edit-CALU7PMG.js} +1 -1
  83. package/dist/chunks/{edit-IIM7GKC2.js → edit-MGJWXNFV.js} +1 -1
  84. package/dist/chunks/{enable-FVXIP7NX.js → enable-7GKPLJNR.js} +1 -1
  85. package/dist/chunks/{export-VPGLK5KL.js → export-BSOJAVDV.js} +1 -1
  86. package/dist/chunks/{future-MDYFVS3M.js → future-OV5I5HWT.js} +1 -1
  87. package/dist/chunks/{generate-cert-for-deploy-MWXVKKFQ.js → generate-cert-for-deploy-GKQRQ3ZQ.js} +1 -1
  88. package/dist/chunks/{image-URNV2ABR.js → image-NMQWZBTW.js} +1 -1
  89. package/dist/chunks/{import-builders-FC5ESQ34.js → import-builders-WLKZNPTB.js} +1 -1
  90. package/dist/chunks/{inspect-6KZERH2F.js → inspect-LF3DIZZ2.js} +1 -1
  91. package/dist/chunks/{inspect-LYGYBYV3.js → inspect-LZJ5X3PH.js} +1 -1
  92. package/dist/chunks/{inspect-OBNVJRYC.js → inspect-PV6VVAN6.js} +1 -1
  93. package/dist/chunks/{inspect-G5NDWTDB.js → inspect-UEDFNY5H.js} +1 -1
  94. package/dist/chunks/{inspect-P4XEVJW5.js → inspect-V7M3GSZ7.js} +1 -1
  95. package/dist/chunks/{list-ICJMKLOR.js → list-64R2DNZA.js} +1 -1
  96. package/dist/chunks/{list-5YBZG374.js → list-AFVTD43R.js} +1 -1
  97. package/dist/chunks/{list-AV5CMKBK.js → list-QTTCSTZA.js} +1 -1
  98. package/dist/chunks/{login-SUBW6IFU.js → login-OS6DZT32.js} +1 -1
  99. package/dist/chunks/{login-5VKAY2R5.js → login-SKIDVUB7.js} +1 -1
  100. package/dist/chunks/{logs-BJL37R5U.js → logs-6AXWBF4D.js} +1 -1
  101. package/dist/chunks/{ls-TXKT6RCY.js → ls-5TZIOB3Q.js} +1 -1
  102. package/dist/chunks/{ls-AKUJ4VUV.js → ls-723HTK5U.js} +1 -1
  103. package/dist/chunks/{ls-VEWJPLJC.js → ls-A5A3APRI.js} +1 -1
  104. package/dist/chunks/{ls-3Y2X26EY.js → ls-EADWIBEQ.js} +1 -1
  105. package/dist/chunks/{ls-SOTQGCPD.js → ls-UP6KDPCD.js} +1 -1
  106. package/dist/chunks/{ls-QGJPVPLK.js → ls-WSPWJDWP.js} +1 -1
  107. package/dist/chunks/{ls-EJ4THXVR.js → ls-YPQ3CTTN.js} +1 -1
  108. package/dist/chunks/{mutate-Y4KO4NAJ.js → mutate-WHVA5NTT.js} +1 -1
  109. package/dist/chunks/{notifications-J3SMCQX5.js → notifications-I4PKIOYY.js} +1 -1
  110. package/dist/chunks/{open-COGMMSHS.js → open-SV3USET3.js} +1 -1
  111. package/dist/chunks/{openapi-TP6GEZGZ.js → openapi-NZJ6Q5Y2.js} +1 -1
  112. package/dist/chunks/{permissions-43WFISAY.js → permissions-3ZMQVJAQ.js} +1 -1
  113. package/dist/chunks/{prompt-missing-credentials-5AQVXSFB.js → prompt-missing-credentials-44DQQXOI.js} +1 -1
  114. package/dist/chunks/{publish-4NSLHSHF.js → publish-EDLEZCAF.js} +1 -1
  115. package/dist/chunks/{pull-MS2PVQUV.js → pull-5DQNSJCA.js} +1 -1
  116. package/dist/chunks/{purchase-domain-if-available-S43PVX5Y.js → purchase-domain-if-available-R3YQ2TFP.js} +1 -1
  117. package/dist/chunks/{push-2NBXVOX2.js → push-6O3JAFDA.js} +1 -1
  118. package/dist/chunks/{query-DI4FF2ZM.js → query-MYKQOBG3.js} +1 -1
  119. package/dist/chunks/{reauthenticate-Z62FFYZH.js → reauthenticate-3UH4WWKC.js} +1 -1
  120. package/dist/chunks/{reorder-P4AXRPMF.js → reorder-IU6GZK4H.js} +1 -1
  121. package/dist/chunks/{reply-ULZRH7KA.js → reply-FG74YRJ3.js} +1 -1
  122. package/dist/chunks/{resolve-3IS44LUW.js → resolve-MD3PGOME.js} +1 -1
  123. package/dist/chunks/{resolve-agent-team-DDBPICVE.js → resolve-agent-team-X6GPGGDR.js} +1 -1
  124. package/dist/chunks/{restore-WM4EZHD4.js → restore-7KOACNT7.js} +1 -1
  125. package/dist/chunks/{rm-C455A2EH.js → rm-CSIBWFYG.js} +1 -1
  126. package/dist/chunks/{rm-TRMBM6DD.js → rm-HOE3GJAB.js} +1 -1
  127. package/dist/chunks/{rm-4XX3UUUF.js → rm-JRAF4TPV.js} +1 -1
  128. package/dist/chunks/{rm-7Z6GJ4O2.js → rm-SKKBN7LZ.js} +1 -1
  129. package/dist/chunks/{rm-53YK7N2N.js → rm-ZF2F2ZE3.js} +1 -1
  130. package/dist/chunks/{rule-inspect-FMZTPH3S.js → rule-inspect-NICYVQPY.js} +1 -1
  131. package/dist/chunks/{rules-K7XMFMXG.js → rules-NHACEVVC.js} +1 -1
  132. package/dist/chunks/{schema-5R44NJNE.js → schema-3XLZGVH5.js} +1 -1
  133. package/dist/chunks/{schema-PQZAACV2.js → schema-ZJASGDRI.js} +1 -1
  134. package/dist/chunks/{select-org-GGUGYGDL.js → select-org-XVAGUP4V.js} +1 -1
  135. package/dist/chunks/{set-SZPCOILW.js → set-JOSIBICX.js} +1 -1
  136. package/dist/chunks/{setup-and-link-OAS7PYL6.js → setup-and-link-7GIAMCTM.js} +1 -1
  137. package/dist/chunks/{tags-YS7EQDJY.js → tags-LVP4LVHL.js} +1 -1
  138. package/dist/chunks/{types-FK3W7A2Y.js → types-YEYQERHE.js} +1 -1
  139. package/dist/chunks/{update-QVYTOT35.js → update-HPEVXFST.js} +1 -1
  140. package/dist/commands/build/index.js +1 -1
  141. package/dist/commands/deploy/index.js +4 -4
  142. package/dist/commands/dev/index.js +2 -2
  143. package/dist/commands/env/index.js +1 -1
  144. package/dist/commands/link/index.js +1 -1
  145. package/dist/commands/list/index.js +1 -1
  146. package/dist/commands-bulk.js +73 -63
  147. package/dist/index.js +2 -2
  148. package/dist/internal-build.js +1 -1
  149. package/dist/version.mjs +1 -1
  150. package/package.json +24 -24
  151. package/dist/chunks/chunk-AU42HSQ3.js +0 -7
  152. package/dist/chunks/chunk-CSIUJLB7.js +0 -9
  153. package/dist/chunks/chunk-FLQJAP2A.js +0 -14
  154. package/dist/chunks/chunk-FZIRYAXC.js +0 -10
  155. package/dist/chunks/chunk-QC47UKDR.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{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope,tracingErrorMessage,tracingErrorReason}from"./chunks/chunk-ZMBDYOVN.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-HAVEFTOO.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-KAJM2NEI.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-R5K37TXM.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-NFJPCOTV.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-WHVT7UXE.js";import{warnDeprecatedSubcommand}from"./chunks/chunk-JEPRHNQU.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime,require_format}from"./chunks/chunk-YTDK6AHS.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-5UEBA6N6.js";import{login}from"./chunks/chunk-RFEREQPS.js";import{collectBuildLogs,displayBuildLogs}from"./chunks/chunk-MFIVZXHH.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-WQIGKVBV.js";import{CONTACT_FIELDS,billingFieldsUsed,collectContactInformation,getBillingContact,getDomainPrice,getDomainStatus,getOrderOutcome,mergeContact,missingContactFields,pollForOrder,purchaseDomain,readContactFlags}from"./chunks/chunk-IDGWQE4B.js";import{api,tryOpenApiFallback}from"./chunks/chunk-XXDVZWWM.js";import"./chunks/chunk-GHAY4PSD.js";import{main}from"./chunks/chunk-JAQM6UXY.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-G6B6TVAE.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,tokensAfterCommand,withDirectoryLock}from"./chunks/chunk-SD757OFS.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-JNPG7MVL.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-THSHYFA6.js";import{readJSONFile}from"./chunks/chunk-ZKDWPKO2.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-JJSDRKX4.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-DW3TSGVC.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-SYEKOJHT.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-5VWJIYJE.js";import{require_dist as require_dist3}from"./chunks/chunk-JESE5FPO.js";import{require_dist2}from"./chunks/chunk-BLAIBYEU.js";import"./chunks/chunk-OGCVOINQ.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-PJMVU4JC.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-YI5G2A3V.js";import{resolveProjectContext}from"./chunks/chunk-AR5T62PK.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-4ZICRXI5.js";import"./chunks/chunk-UBKETNGO.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-37QGCN6P.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{BACKGROUND_FUNCTION_EXCLUSION,CI_LOG_LEVELS,CREDIT_TYPE_LABELS,DEFAULT_LIMIT,DEFAULT_WINDOW,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,MAX_LIMIT,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,categoriesSubcommand2,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,discoverSubcommand2,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand5,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand7,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsCommand,logsSources,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,requestsSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,runtimeSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,sourceForEvent,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-FLQJAP2A.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-3AVG55SO.js";import{tracesConfigCommand}from"./chunks/chunk-UFXKCETS.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-RZGWCQP7.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-AG5QQNJ3.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-AU42HSQ3.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-L5FUUGYX.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QC47UKDR.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-QJKJBD2M.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand6,listSubcommand as listSubcommand8,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-MYCQIZU6.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-2JBVMF2Y.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-M7GT3ZPT.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-CSIUJLB7.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-JLXG2XWW.js";import"./chunks/chunk-OJZEOWK2.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-S7XZC23O.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-VM6TZGLE.js";import{getTeams}from"./chunks/chunk-DYQXJCHO.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-J2LAZELI.js";import{mapCertError}from"./chunks/chunk-E6UKNYFF.js";import"./chunks/chunk-GRTIWUV2.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-NJINP2WU.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-OZ47SVXA.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,scopeFlagPassed,writeToConfigFile}from"./chunks/chunk-J53D7SLS.js";import{TelemetryClient}from"./chunks/chunk-JNJOUMGF.js";import{getGlobalPathConfig}from"./chunks/chunk-FIIHB66A.js";import"./chunks/chunk-VKXEOL4K.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{getInstallRoot,isManagedBuildersInstall,isNativeBinaryInstall}from"./chunks/chunk-NWGBDBZI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-Z4OH72VZ.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,agentErrorMetadata,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getErrorRecovery,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,quoteArg,shouldEmitNonInteractiveCommandError,targetRecovery,trackAgentError,withGlobalFlags,writeAgentError}from"./chunks/chunk-FZIRYAXC.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-5IPBCD7K.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-KELSPU2J.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-WPQN5UKR.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-2VBFQZ72.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPriceChanged,DomainPurchasePending,DomainPurchaseRefundFailed,DomainPurchaseRefunded,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-YIIPBH2D.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji,recordCliError,require_build_utils}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__commonJS,__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var require_split2=__commonJS({"../../node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js"(exports,module){"use strict";var{Transform:Transform2}=__require("stream"),{StringDecoder}=__require("string_decoder"),kLast=Symbol("last"),kDecoder=Symbol("decoder");function transform(chunk,enc,cb){let list30;if(this.overflow){if(list30=this[kDecoder].write(chunk).split(this.matcher),list30.length===1)return cb();list30.shift(),this.overflow=!1}else this[kLast]+=this[kDecoder].write(chunk),list30=this[kLast].split(this.matcher);this[kLast]=list30.pop();for(let i=0;i<list30.length;i++)try{push(this,this.mapper(list30[i]))}catch(error){return cb(error)}if(this.overflow=this[kLast].length>this.maxLength,this.overflow&&!this.skipOverflow){cb(new Error("maximum buffer reached"));return}cb()}function flush2(cb){if(this[kLast]+=this[kDecoder].end(),this[kLast])try{push(this,this.mapper(this[kLast]))}catch(error){return cb(error)}cb()}function push(self,val){val!==void 0&&self.push(val)}function noop(incoming){return incoming}function split3(matcher,mapper,options){switch(matcher=matcher||/\r?\n/,mapper=mapper||noop,options=options||{},arguments.length){case 1:typeof matcher=="function"?(mapper=matcher,matcher=/\r?\n/):typeof matcher=="object"&&!(matcher instanceof RegExp)&&!matcher[Symbol.split]&&(options=matcher,matcher=/\r?\n/);break;case 2:typeof matcher=="function"?(options=mapper,mapper=matcher,matcher=/\r?\n/):typeof mapper=="object"&&(options=mapper,mapper=noop)}options=Object.assign({},options),options.autoDestroy=!0,options.transform=transform,options.flush=flush2,options.readableObjectMode=!0;let stream=new Transform2(options);return stream[kLast]="",stream[kDecoder]=new StringDecoder("utf8"),stream.matcher=matcher,stream.mapper=mapper,stream.maxLength=options.maxLength,stream.skipOverflow=options.skipOverflow||!1,stream.overflow=!1,stream._destroy=function(err,cb){this._writableState.errorEmitted=!1,cb(err)},stream}module.exports=split3}});var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
7
+ import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope,tracingErrorMessage,tracingErrorReason}from"./chunks/chunk-GUJVJKO7.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-HAVEFTOO.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-WIAAACUI.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-I62UUYTS.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-7BOCT55A.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-EF3YL2R7.js";import{warnDeprecatedSubcommand}from"./chunks/chunk-JEPRHNQU.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime,require_format}from"./chunks/chunk-YTDK6AHS.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-5UEBA6N6.js";import{login}from"./chunks/chunk-4IIRQJUW.js";import{collectBuildLogs,displayBuildLogs}from"./chunks/chunk-THZR6O2M.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-UJUNGWSD.js";import{CONTACT_FIELDS,billingFieldsUsed,collectContactInformation,getBillingContact,getDomainPrice,getDomainStatus,getOrderOutcome,mergeContact,missingContactFields,pollForOrder,purchaseDomain,readContactFlags}from"./chunks/chunk-GSVOI5LW.js";import{api,tryOpenApiFallback}from"./chunks/chunk-OLWE4UFC.js";import"./chunks/chunk-GHAY4PSD.js";import{main}from"./chunks/chunk-FTY4BCAF.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-TWKII7HO.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,tokensAfterCommand,withDirectoryLock}from"./chunks/chunk-4BS552UW.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-YDM2PMMP.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-J3CDVZE7.js";import{readJSONFile}from"./chunks/chunk-QDOYNWNQ.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-IRJ5XFT2.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-AKM22FBX.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-SYEKOJHT.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-TY4PMK7Y.js";import{require_dist as require_dist3}from"./chunks/chunk-FGNMYSLD.js";import{require_dist2}from"./chunks/chunk-BLAIBYEU.js";import"./chunks/chunk-SQB4T5FL.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-KLYIX4HK.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-SRAC7DI4.js";import{resolveProjectContext}from"./chunks/chunk-EKUHN42H.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-YP46QVEI.js";import"./chunks/chunk-5JEU6QSM.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-3GSGG4YR.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{BACKGROUND_FUNCTION_EXCLUSION,CI_LOG_LEVELS,CREDIT_TYPE_LABELS,DEFAULT_LIMIT,DEFAULT_WINDOW,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,MAX_LIMIT,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,categoriesSubcommand2,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,discoverSubcommand2,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand5,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand7,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsCommand,logsSources,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,requestsSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,runtimeSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,sourceForEvent,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-EEZLBOSP.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-ZBDLYNUF.js";import{tracesConfigCommand}from"./chunks/chunk-J6O6JW2K.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-2FHICLHJ.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-2UMWTCY7.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-Q5ZGA2RO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-UGMTKOTN.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-BTCKMXWW.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-ITKS32PG.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand6,listSubcommand as listSubcommand8,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-CN3IVZJO.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-Y24OSBXP.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-GVVIFYQE.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-W3TGCMRW.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-LD5U73LA.js";import"./chunks/chunk-X65QKYDM.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-TPVAPVQC.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-WE3ZJX7P.js";import{getTeams}from"./chunks/chunk-DYQXJCHO.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-J2LAZELI.js";import{mapCertError}from"./chunks/chunk-E6UKNYFF.js";import"./chunks/chunk-UCAE5Z5L.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-4GL254L4.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-3EU7MN5M.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,scopeFlagPassed,writeToConfigFile}from"./chunks/chunk-WZ7YJDKT.js";import{TelemetryClient}from"./chunks/chunk-JNJOUMGF.js";import{getGlobalPathConfig}from"./chunks/chunk-PAN6TUTQ.js";import"./chunks/chunk-VKXEOL4K.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{getInstallRoot,isManagedBuildersInstall,isNativeBinaryInstall}from"./chunks/chunk-NWGBDBZI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-CRQDQNQZ.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,agentErrorMetadata,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getErrorRecovery,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,quoteArg,shouldEmitNonInteractiveCommandError,targetRecovery,trackAgentError,withGlobalFlags,writeAgentError}from"./chunks/chunk-RIDPB64C.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-MI7W4QMV.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-4TTF5E5U.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-WPQN5UKR.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-2VBFQZ72.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPriceChanged,DomainPurchasePending,DomainPurchaseRefundFailed,DomainPurchaseRefunded,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-YIIPBH2D.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji,recordCliError,require_build_utils}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__commonJS,__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var require_split2=__commonJS({"../../node_modules/.pnpm/split2@4.2.0/node_modules/split2/index.js"(exports,module){"use strict";var{Transform:Transform2}=__require("stream"),{StringDecoder}=__require("string_decoder"),kLast=Symbol("last"),kDecoder=Symbol("decoder");function transform(chunk2,enc,cb){let list30;if(this.overflow){if(list30=this[kDecoder].write(chunk2).split(this.matcher),list30.length===1)return cb();list30.shift(),this.overflow=!1}else this[kLast]+=this[kDecoder].write(chunk2),list30=this[kLast].split(this.matcher);this[kLast]=list30.pop();for(let i=0;i<list30.length;i++)try{push(this,this.mapper(list30[i]))}catch(error){return cb(error)}if(this.overflow=this[kLast].length>this.maxLength,this.overflow&&!this.skipOverflow){cb(new Error("maximum buffer reached"));return}cb()}function flush2(cb){if(this[kLast]+=this[kDecoder].end(),this[kLast])try{push(this,this.mapper(this[kLast]))}catch(error){return cb(error)}cb()}function push(self,val){val!==void 0&&self.push(val)}function noop(incoming){return incoming}function split3(matcher,mapper,options){switch(matcher=matcher||/\r?\n/,mapper=mapper||noop,options=options||{},arguments.length){case 1:typeof matcher=="function"?(mapper=matcher,matcher=/\r?\n/):typeof matcher=="object"&&!(matcher instanceof RegExp)&&!matcher[Symbol.split]&&(options=matcher,matcher=/\r?\n/);break;case 2:typeof matcher=="function"?(options=mapper,mapper=matcher,matcher=/\r?\n/):typeof mapper=="object"&&(options=mapper,mapper=noop)}options=Object.assign({},options),options.autoDestroy=!0,options.transform=transform,options.flush=flush2,options.readableObjectMode=!0;let stream=new Transform2(options);return stream[kLast]="",stream[kDecoder]=new StringDecoder("utf8"),stream.matcher=matcher,stream.mapper=mapper,stream.maxLength=options.maxLength,stream.skipOverflow=options.skipOverflow||!1,stream.overflow=!1,stream._destroy=function(err,cb){this._writableState.errorEmitted=!1,cb(err)},stream}module.exports=split3}});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,20 +55,20 @@ ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
55
55
  `),0;let projectList=asArray(data.projects??data.items);if(projectList.length===0)return output_manager_default.log("No projects with Agent Runs activity found."),0;output_manager_default.log(`Projects with Agent Runs under ${import_chalk5.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Project","Runs","Avg Duration"].map(header=>import_chalk5.default.bold(import_chalk5.default.cyan(header))),...projectList.map(project=>[import_chalk5.default.bold(readString(project,"projectName","name","project","projectId","id")??"-"),formatCount(readNumber(project,"runs","runCount","totalRuns")),import_chalk5.default.gray(formatDurationMs(readNumber(project,"avgDurationMs","averageDurationMs","avgDuration")))])];return client.stdout.write(`
56
56
  ${table(rows,{hsep:3}).replace(/^/gm," ")}
57
57
 
58
- `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-FK3W7A2Y.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-ICJMKLOR.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_LENGTH=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_LENGTH?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"],tokenPass2=opts["--token-pass"];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),telemetry2.trackCliFlagTokenPass(tokenPass2),tokenPass2&&(zdrExempt||bypassAll)){let message="Cannot combine --token-pass with --zdr-exempt or --bypass-all-settings. Remove the exemption flags to create a Token Pass key.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --token-pass")}]},2),output_manager_default.error(message),2}if(budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!await client.resolveCurrentTeam()){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...tokenPass2&&{tokenPass:!0},...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
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(await client.resolveCurrentTeam())return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&&notFoundMessage?notFoundMessage:err.message),1;if(err instanceof PaginationError)return output_manager_default.error(err.message),1;throw err}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
60
- `),0;if(isEmpty(data)){let nextCursor=next?.(data)??null;return nextCursor?(output_manager_default.log("No results on this page."),printNextPageHint(client,nextCursor),0):(output_manager_default.log(emptyMessage),0)}return output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function listBudgetsPage(client,opts){let query=new URLSearchParams;opts.scopeType&&query.set("scopeType",opts.scopeType),query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDefaultCovered!==void 0&&query.set("includeDefaultCovered",String(opts.includeDefaultCovered));let{budgets:budgets2,nextCursor,defaultCoveredCounts}=await client.fetch(`/ai-gateway/budgets/list?${query.toString()}`,{method:"GET"});return{items:budgets2??[],next:nextCursor??null,defaultCoveredCounts}}function countDefaultCovered(budgets2){let counts={};for(let budget2 of budgets2)budget2.source==="default"&&(counts[budget2.scopeType]=(counts[budget2.scopeType]??0)+1);return counts}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),2}let{flags:opts}=parsedArgs,limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:()=>listApiKeysPage(client,{limit,next}),toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more API keys.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault),next:page=>page.next})}function printApiKeysTable(apiKeys2,keyDefault){return`${table([["id","name","key","token pass","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.metadata?.tokenPass?"yes":"no",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","l"],hsep:4}).replace(/^/gm," ")}
58
+ `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-YEYQERHE.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-64R2DNZA.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_QUERY_CHARS=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_QUERY_CHARS?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"],tokenPass2=opts["--token-pass"];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),telemetry2.trackCliFlagTokenPass(tokenPass2),tokenPass2&&(zdrExempt||bypassAll)){let message="Cannot combine --token-pass with --zdr-exempt or --bypass-all-settings. Remove the exemption flags to create a Token Pass key.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --token-pass")}]},2),output_manager_default.error(message),2}if(budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!await client.resolveCurrentTeam()){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...tokenPass2&&{tokenPass:!0},...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
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")}.`),client.isAgent&&output_manager_default.log(`Prefer OIDC over long-lived API keys: code on Vercel can authenticate to AI Gateway with VERCEL_OIDC_TOKEN, and local development can get one with ${getCommandName("link")} and ${getCommandName("env pull")}. Revoke this key with ${getCommandName(`ai-gateway api-keys remove ${result.apiKey.id} --yes`)} if you don't need it.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);var import_async_sema=__toESM(require_async_sema(),1);var DIRECTORY_KEY_SORTS=["createdAt:desc","createdAt:asc","lastActiveAt:desc","lastActiveAt:asc","name:asc","name:desc","expiresAt:asc","expiresAt:desc"],DIRECTORY_KEY_STATES=["active","expired","deleted","purged","any"],MAX_DIRECTORY_RESOLVE_IDS=100,FETCH_OPTS={retry:{retries:0},bailOn429:!0},DIRECTORY_KILL_SWITCH="VERCEL_AI_GATEWAY_DIRECTORY";function isDirectoryEnabledByEnv(env=process.env){let value=env[DIRECTORY_KILL_SWITCH]?.trim().toLowerCase();return value!=="0"&&value!=="false"}async function listDirectoryKeysPage(client,opts={}){let query=new URLSearchParams,search3=opts.search?.trim();search3&&query.set("search",search3),opts.createdBy&&query.set("createdBy",opts.createdBy),opts.accessPolicyId&&query.set("accessPolicyId",opts.accessPolicyId),opts.state&&query.set("state",opts.state),opts.sort&&query.set("sort",opts.sort),opts.cursor&&query.set("cursor",opts.cursor),opts.limit!==void 0&&query.set("limit",String(opts.limit));let qs=query.toString(),page=await client.fetch(`/ai-gateway/directory/keys${qs?`?${qs}`:""}`,{method:"GET",...FETCH_OPTS});return{items:page.data??[],next:page.cursor??null}}function chunk(items,size){let chunks=[];for(let i=0;i<items.length;i+=size)chunks.push(items.slice(i,i+size));return chunks}var BATCH_CONCURRENCY=4;async function mapConcurrent(items,fn){let sema=new import_async_sema.default(BATCH_CONCURRENCY);return Promise.all(items.map(async item=>{await sema.acquire();try{return await fn(item)}finally{sema.release()}}))}async function resolveDirectoryIdentities(client,input){let keyChunks=chunk([...new Set(input.keyIds??[])],MAX_DIRECTORY_RESOLVE_IDS),userChunks=chunk([...new Set(input.userIds??[])],MAX_DIRECTORY_RESOLVE_IDS),requests=Math.max(keyChunks.length,userChunks.length),bodies=Array.from({length:requests},(_,i)=>{let body={};return keyChunks[i]?.length&&(body.keyIds=keyChunks[i]),userChunks[i]?.length&&(body.userIds=userChunks[i]),body}),pages=await mapConcurrent(bodies,body=>client.fetch("/ai-gateway/directory/identities/resolve",{method:"POST",body,...FETCH_OPTS})),keys=new Map,users=new Map;return pages.forEach((res,i)=>{for(let key of res.data?.keys??[])keys.set(key.keyId,key);if(Array.isArray(res.data?.users))for(let user of res.data.users)users?.set(user.uid,user);else bodies[i].userIds&&(users=null)}),{keys,users}}async function resolveDirectoryKeyQuotas(client,keyIds){let pages=await mapConcurrent(chunk([...new Set(keyIds)],MAX_DIRECTORY_RESOLVE_IDS),ids=>client.fetch("/ai-gateway/directory/keys/quotas",{method:"POST",body:{keyIds:ids},...FETCH_OPTS})),quotas=new Map;for(let res of pages)for(let quota of res.data?.quotas??[])quotas.set(quota.apiKeyId,quota);return quotas}function isDirectoryUnavailable(err){return isAPIError(err)&&(err.status===429||err.status>=500)}function isDirectoryCursor(cursor2){try{let parsed=JSON.parse(Buffer.from(cursor2,"base64url").toString());return typeof parsed=="object"&&parsed!==null&&parsed.v===1&&typeof parsed.fp=="string"&&Array.isArray(parsed.sa)}catch{return!1}}function toApiKey(key,quota){let apiKey={id:key.keyId,name:key.name,partialKey:key.suffix??"",teamId:key.teamId,purpose:"ai-gateway",projectId:key.projectId??null,expiresAt:key.expiresAt??null,activeAt:key.lastActiveAt??key.createdAt,createdAt:key.createdAt,createdBy:key.createdBy??"",leakedAt:key.leakedAt??null,leakedUrl:null,createdByAppId:key.attribution?.createdByAppId??null};if(quota){let{apiKeyId:_apiKeyId,...rest}=quota;apiKey.quota=rest}return apiKey}async function ensureTeam(client){if(await client.resolveCurrentTeam())return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}function teamMemberLabel(member){return member.username||member.email||member.uid}function fetchMembers(client,teamId,opts){let query=new URLSearchParams({limit:"100"});opts.search&&query.set("search",opts.search);for(let id2 of opts.userIds??[])query.append("filterByUserIds",id2);return client.fetch(`/v2/teams/${encodeURIComponent(teamId)}/members?${query}`).then(res=>res.members??[])}async function getTeamMemberByIdentifier(client,teamId,identifier){let needle=identifier.toLowerCase(),match=(await fetchMembers(client,teamId,{search:identifier})).find(member=>member.uid===identifier||member.email?.toLowerCase()===needle||member.username?.toLowerCase()===needle);return match||((await fetchMembers(client,teamId,{userIds:[identifier]})).find(member=>member.uid===identifier)??null)}async function getTeamMembersByIds(client,teamId,uids){let chunks=[];for(let i=0;i<uids.length;i+=20)chunks.push(uids.slice(i,i+20));let pages=await Promise.all(chunks.map(userIds=>fetchMembers(client,teamId,{userIds})));return new Map(pages.flat().map(member=>[member.uid,member]))}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionQuery(query){query&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(search3){search3&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionCreator(creator){creator&&this.trackCliOption({option:"creator",value:creator==="me"?"me":this.redactedValue})}trackCliOptionState(state){state&&this.trackCliOption({option:"state",value:state})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage:emptyMessage2,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&&notFoundMessage?notFoundMessage:err.message),1;if(err instanceof PaginationError)return output_manager_default.error(err.message),1;throw err}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
60
+ `),0;if(isEmpty(data)){let nextCursor=next?.(data)??null;return nextCursor?(output_manager_default.log("No results on this page."),printNextPageHint(client,nextCursor),0):(output_manager_default.log(emptyMessage2),0)}return output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function listBudgetsPage(client,opts){let query=new URLSearchParams;opts.scopeType&&query.set("scopeType",opts.scopeType),query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDefaultCovered!==void 0&&query.set("includeDefaultCovered",String(opts.includeDefaultCovered));let{budgets:budgets2,nextCursor,defaultCoveredCounts}=await client.fetch(`/ai-gateway/budgets/list?${query.toString()}`,{method:"GET"});return{items:budgets2??[],next:nextCursor??null,defaultCoveredCounts:defaultCoveredCounts??{}}}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&&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"})}var STATE_FLAG_VALUES=DIRECTORY_KEY_STATES.filter(s=>s!=="purged"),SORT_FIELDS=["createdAt","lastActiveAt","name","expiresAt"],DEFAULT_STATE="active",DEFAULT_SORT="lastActiveAt:desc";async function list3(client,argv){let telemetry2=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,queryFlag=opts["--query"],searchFlag=opts["--search"],search3=queryFlag??searchFlag,creator=opts["--creator"],stateFlag=opts["--state"],sortFlag=opts["--sort"],limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionQuery(queryFlag),telemetry2.trackCliOptionSearch(searchFlag),telemetry2.trackCliOptionCreator(creator),telemetry2.trackCliOptionState(stateFlag),telemetry2.trackCliOptionSort(sortFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(queryFlag!==void 0&&searchFlag!==void 0&&queryFlag!==searchFlag)return usageError(client,"Pass only one of --query or --search.");if(search3!==void 0&&search3.trim().length===0)return usageError(client,"The --query option requires some text.");if(search3&&search3.length>MAX_SEARCH_QUERY_CHARS)return usageError(client,`The --query option must be at most ${MAX_SEARCH_QUERY_CHARS} characters.`);if(stateFlag!==void 0&&!STATE_FLAG_VALUES.includes(stateFlag))return usageError(client,`The --state option must be one of: ${STATE_FLAG_VALUES.join(", ")}.`);let sort=sortFlag===void 0?void 0:parseSortFlag(sortFlag);if(sortFlag!==void 0&&!sort)return usageError(client,`The --sort option must be one of ${SORT_FIELDS.join(", ")}, optionally followed by :asc or :desc.`);if(creator!==void 0&&creator.trim().length===0)return usageError(client,"The --creator option requires a team member.");let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}let directoryOnly=creator!==void 0||stateFlag!==void 0||sortFlag!==void 0||next!==void 0&&isDirectoryCursor(next),legacyOnly=!isDirectoryEnabledByEnv()||next!==void 0&&!isDirectoryCursor(next);if(directoryOnly&&legacyOnly){let message;return isDirectoryEnabledByEnv()?message="The --next cursor does not belong to this query. Rerun without --next to start from the first page.":next!==void 0&&isDirectoryCursor(next)?message=`The --next cursor came from the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment. Rerun without --next to start from the first page.`:message=`The --creator, --state, and --sort options need the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment.`,usageError(client,message)}let createdBy;if(creator!==void 0)try{createdBy=await resolveCreator(client,creator.trim())}catch(err){if(err instanceof UnknownCreatorError)return usageError(client,err.message);if(isAPIError(err))return output_manager_default.error(`Could not look up team member "${creator}": ${err.message}`),1;throw err}let legacyPage=async()=>({...await listApiKeysPage(client,{limit,next,search:search3}),metadataKnown:!0}),fetch3=async()=>{if(legacyOnly)return legacyPage();try{return await fetchDirectoryPage(client,{search:search3,createdBy,state:stateFlag??DEFAULT_STATE,sort:sort??DEFAULT_SORT,cursor:next,limit})}catch(err){if(!isDirectoryUnavailable(err))throw err;if(output_manager_default.debug(`AI Gateway key directory unavailable: ${err instanceof Error?err.message:String(err)}`),directoryOnly)throw new DirectoryUnavailableError;return legacyPage()}};try{return await renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:fetch3,toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:emptyMessage({next,search:search3,creator,stateFlag}),header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault,page.metadataKnown),next:page=>page.next})}catch(err){if(err instanceof DirectoryUnavailableError)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:err.message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},1),output_manager_default.error(err.message),1;throw err}}var DirectoryUnavailableError=class extends Error{constructor(){super("The AI Gateway key directory is temporarily unavailable, so --creator, --state, --sort, and directory cursors cannot be served. Retry shortly, or list without those options."),this.name="DirectoryUnavailableError"}};function usageError(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},2),output_manager_default.error(message),2}function parseSortFlag(value){if(DIRECTORY_KEY_SORTS.includes(value))return value;if(SORT_FIELDS.includes(value))return`${value}:${value==="name"?"asc":"desc"}`}var UnknownCreatorError=class extends Error{constructor(identifier){super(`No team member matches "${identifier}".`),this.name="UnknownCreatorError"}};async function resolveCreator(client,identifier){if(identifier==="me")return(await getUser(client)).id;let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,identifier);if(member)return member.uid;if(identifier.includes("@"))throw new UnknownCreatorError(identifier);return output_manager_default.debug(`No team member matches "${identifier}"; using it as a user id.`),identifier}async function fetchDirectoryPage(client,opts){let page=await listDirectoryKeysPage(client,opts),liveIds=page.items.filter(key=>key.state==="active").map(key=>key.keyId),quotas=new Map;if(liveIds.length>0)try{quotas=await resolveDirectoryKeyQuotas(client,liveIds)}catch(err){output_manager_default.debug(`Skipping AI Gateway key budgets in list output: ${err instanceof Error?err.message:String(err)}`)}return{items:page.items.map(key=>toApiKey(key,quotas.get(key.keyId))),next:page.next,metadataKnown:!1}}function emptyMessage({next,search:search3,creator,stateFlag}){return next?"No more API keys.":search3||creator||stateFlag?"No API keys match these filters.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`}function printApiKeysTable(apiKeys2,keyDefault,metadataKnown){return`${table([["id","name","key","token pass","budget","spend","refresh","created"].map(header=>import_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"),metadataKnown?apiKey.metadata?.tokenPass?"yes":"no":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","l"],hsep:4}).replace(/^/gm," ")}
61
61
 
62
- `}var import_chalk8=__toESM(require_source(),1);var AiGatewayApiKeysInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function inspect2(client,argv){let telemetry2=new AiGatewayApiKeysInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id2]=args;telemetry2.trackCliArgumentId(id2),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(!id2)return output_manager_default.error(`${getCommandName("ai-gateway api-keys inspect <id>")} expects an API key id.`),2;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 key",fetch:()=>getApiKey(client,id2),toJSON:apiKey=>({apiKey}),isEmpty:()=>!1,emptyMessage:"",header:apiKey=>`API key ${import_chalk8.default.bold(apiKey.name||apiKey.id)}`,renderTable:apiKey=>printApiKeyDetails(apiKey,keyDefault)})}function dim(value){return import_chalk8.default.gray(value)}function yesNo(value){return value?"yes":"no"}function printApiKeyDetails(apiKey,keyDefault){let rows=[["id",apiKey.id],["name",apiKey.name||dim("\u2013")],["key",apiKey.partialKey?`\u2026${apiKey.partialKey}`:dim("\u2013")],["token pass",yesNo(apiKey.metadata?.tokenPass??!1)],["purpose",apiKey.purpose],["project",apiKey.projectId??dim("all projects")],["created",apiKey.createdAt?new Date(apiKey.createdAt).toLocaleString():dim("\u2013")],["last used",apiKey.activeAt?new Date(apiKey.activeAt).toLocaleString():dim("never")],["expires",apiKey.expiresAt?new Date(apiKey.expiresAt).toLocaleString():dim("never")],["created by",apiKey.createdBy||dim("\u2013")]];apiKey.metadata?.zdr?.enableNonZdrModels&&rows.push(["zdr exempt","yes"]),apiKey.metadata?.bypassAll&&rows.push(["bypass all settings","yes"]);let quota=apiKey.quota;return quota?rows.push(["budget",`$${quota.limitAmount}`],["spend",`$${quota.currentSpend}`],["byok spend",`$${quota.currentByokSpend}`],["include byok",yesNo(quota.includeByokInQuota)],["refresh",quota.refreshPeriod],["alerts",quota.alertThresholds&&quota.alertThresholds.length>0?quota.alertThresholds.map(threshold=>`${threshold}%`).join(", "):dim("none")],["active",yesNo(quota.active)]):keyDefault?rows.push(["budget",`${formatBudgetCap(keyDefault.limitAmount,keyDefault.refreshPeriod)} ${dim("(default)")}`]):rows.push(["budget",dim("none")]),`${table(rows.map(([label,value])=>[dim(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
62
+ `}var import_chalk8=__toESM(require_source(),1);var AiGatewayApiKeysInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect2(client,argv){let telemetry2=new AiGatewayApiKeysInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id2]=args;telemetry2.trackCliArgumentId(id2),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(!id2)return output_manager_default.error(`${getCommandName("ai-gateway api-keys inspect <id>")} expects an API key id.`),2;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 key",fetch:()=>getApiKey(client,id2),toJSON:apiKey=>({apiKey}),isEmpty:()=>!1,emptyMessage:"",header:apiKey=>`API key ${import_chalk8.default.bold(apiKey.name||apiKey.id)}`,renderTable:apiKey=>printApiKeyDetails(apiKey,keyDefault)})}function dim(value){return import_chalk8.default.gray(value)}function yesNo(value){return value?"yes":"no"}function printApiKeyDetails(apiKey,keyDefault){let rows=[["id",apiKey.id],["name",apiKey.name||dim("\u2013")],["key",apiKey.partialKey?`\u2026${apiKey.partialKey}`:dim("\u2013")],["token pass",yesNo(apiKey.metadata?.tokenPass??!1)],["purpose",apiKey.purpose],["project",apiKey.projectId??dim("all projects")],["created",apiKey.createdAt?new Date(apiKey.createdAt).toLocaleString():dim("\u2013")],["last used",apiKey.activeAt?new Date(apiKey.activeAt).toLocaleString():dim("never")],["expires",apiKey.expiresAt?new Date(apiKey.expiresAt).toLocaleString():dim("never")],["created by",apiKey.createdBy||dim("\u2013")]];apiKey.metadata?.zdr?.enableNonZdrModels&&rows.push(["zdr exempt","yes"]),apiKey.metadata?.bypassAll&&rows.push(["bypass all settings","yes"]);let quota=apiKey.quota;return quota?rows.push(["budget",`$${quota.limitAmount}`],["spend",`$${quota.currentSpend}`],["byok spend",`$${quota.currentByokSpend}`],["include byok",yesNo(quota.includeByokInQuota)],["refresh",quota.refreshPeriod],["alerts",quota.alertThresholds&&quota.alertThresholds.length>0?quota.alertThresholds.map(threshold=>`${threshold}%`).join(", "):dim("none")],["active",yesNo(quota.active)]):keyDefault?rows.push(["budget",`${formatBudgetCap(keyDefault.limitAmount,keyDefault.refreshPeriod)} ${dim("(default)")}`]):rows.push(["budget",dim("none")]),`${table(rows.map(([label,value])=>[dim(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
63
63
 
64
- `}var import_chalk9=__toESM(require_source(),1);var AiGatewayApiKeysRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function remove(client,argv){let telemetry2=new AiGatewayApiKeysRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id2]=args,yes=opts["--yes"];telemetry2.trackCliArgumentId(id2),telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!id2)return output_manager_default.error(`${getCommandName("ai-gateway api-keys rm <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Remove API key ${import_chalk9.default.bold(id2)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing API key");try{return await deleteApiKey(client,id2),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({id:id2,removed:!0},null,2)}
64
+ `}var import_chalk9=__toESM(require_source(),1);var AiGatewayApiKeysRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove(client,argv){let telemetry2=new AiGatewayApiKeysRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id2]=args,yes=opts["--yes"];telemetry2.trackCliArgumentId(id2),telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!id2)return output_manager_default.error(`${getCommandName("ai-gateway api-keys rm <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Remove API key ${import_chalk9.default.bold(id2)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing API key");try{return await deleteApiKey(client,id2),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({id:id2,removed:!0},null,2)}
65
65
  `):output_manager_default.success(`API key ${import_chalk9.default.bold(id2)} removed ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`API key "${id2}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayApiKeysTelemetryClient=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})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG3={create:getCommandAliases(createSubcommand),list:getCommandAliases(listSubcommand2),inspect:getCommandAliases(inspectSubcommand2),remove:getCommandAliases(removeSubcommand)};async function apiKeys(client){let telemetry2=new AiGatewayApiKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(apiKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG3),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway api-keys",subcommand),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:apiKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(createSubcommand),0):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(listSubcommand2),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(inspectSubcommand2),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect2(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(removeSubcommand),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),2}}async function setScopeDefault(client,opts){output_manager_default.spinner("Setting budget default\u2026");try{let budgetDefault=await upsertScopeBudgetDefault(client,{scopeType:opts.scopeType,limitAmount:opts.limit,...opts.refreshPeriod?{refreshPeriod:opts.refreshPeriod}:{}});return output_manager_default.stopSpinner(),opts.asJson?client.stdout.write(`${JSON.stringify(budgetDefault,null,2)}
66
66
  `):(printAlignedLabel("Set default",opts.scopeType,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budgetDefault.limitAmount}`),printAlignedLabel("Refresh",budgetDefault.refreshPeriod),printAlignedLabel("Applies to",`${BUDGET_DEFAULT_APPLIES_TO[opts.scopeType]}, including existing ones`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}async function removeScopeDefault(client,scopeType,{yes,asJson}){if(!yes&&(client.nonInteractive||!client.stdin.isTTY))return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(await listScopeBudgetDefaults(client).then(defaults=>defaults.find(d=>d.scopeType===scopeType&&d.active!==!1)??null).catch(()=>{})===null)return output_manager_default.error(`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`),1;if(!yes){let affected=BUDGET_DEFAULT_COVERED[scopeType];if(!await client.input.confirm(`Remove the ${scopeType} budget default? ${affected} without their own budget will have no default cap.`,!1))return output_manager_default.log("Canceled"),0}output_manager_default.spinner("Removing budget default\u2026");try{return await deleteScopeBudgetDefault(client,scopeType),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({scopeType,removed:!0},null,2)}
67
- `):printAlignedLabel("Removed",`${scopeType} default`,{gutter:"\u2713"}),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function teamMemberLabel(member){return member.username||member.email||member.uid}function fetchMembers(client,teamId,opts){let query=new URLSearchParams({limit:"100"});opts.search&&query.set("search",opts.search);for(let id2 of opts.userIds??[])query.append("filterByUserIds",id2);return client.fetch(`/v2/teams/${encodeURIComponent(teamId)}/members?${query}`).then(res=>res.members??[])}async function getTeamMemberByIdentifier(client,teamId,identifier){let needle=identifier.toLowerCase(),match=(await fetchMembers(client,teamId,{search:identifier})).find(member=>member.uid===identifier||member.email?.toLowerCase()===needle||member.username?.toLowerCase()===needle);return match||((await fetchMembers(client,teamId,{userIds:[identifier]})).find(member=>member.uid===identifier)??null)}async function getTeamMembersByIds(client,teamId,uids){let chunks=[];for(let i=0;i<uids.length;i+=20)chunks.push(uids.slice(i,i+20));let pages=await Promise.all(chunks.map(userIds=>fetchMembers(client,teamId,{userIds})));return new Map(pages.flat().map(member=>[member.uid,member]))}var AiGatewayBudgetsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",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})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var REFRESH_PERIODS=["daily","weekly","monthly","none"];async function set(client,argv){let telemetry2=new AiGatewayBudgetsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,limit=opts["--limit"],refreshPeriod=opts["--refresh-period"],isDefault=opts["--default"];telemetry2.trackCliArgumentScope(args[0]),telemetry2.trackCliArgumentName(args[1]),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagDefault(isDefault),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(limit===void 0||Number.isNaN(limit)||limit<1)return output_manager_default.error("The --limit flag is required and must be at least 1."),2;if(refreshPeriod!==void 0&&!REFRESH_PERIODS.includes(refreshPeriod))return output_manager_default.error(`The --refresh-period flag must be one of: ${REFRESH_PERIODS.join(", ")}.`),2;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await setScopeDefault(client,{scopeType:scope.scopeType,limit,refreshPeriod,asJson});let projectId,userId,apiKeyId,scopeLabel="team";if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;apiKeyId=resolved.apiKey.id,scopeLabel=`api key ${resolved.apiKey.name||apiKeyId}`}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;projectId=resolved.id,scopeLabel=`project ${scope.name}`}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;userId=member.uid,scopeLabel=`user ${teamMemberLabel(member)}`}output_manager_default.spinner("Setting budget\u2026");try{let budget2=scope.scopeType==="api-key"?(await updateApiKeyQuota(client,apiKeyId,{limitAmount:limit,...refreshPeriod?{refreshPeriod}:{},active:!0,archived:!1})).quota:await setBudget(client,{scopeType:scope.scopeType,...projectId?{projectId}:{},...userId?{userId}:{},limitAmount:limit,...refreshPeriod?{refreshPeriod}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(budget2,null,2)}
68
- `):(printAlignedLabel("Set budget",scopeLabel,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budget2.limitAmount}`),printAlignedLabel("Refresh",budget2.refreshPeriod)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk10=__toESM(require_source(),1),import_async_sema=__toESM(require_async_sema(),1);var AiGatewayBudgetsListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliOptionScopeType(scopeType){scopeType&&this.trackCliOption({option:"scope-type",value:scopeType})}trackCliFlagDefaults(defaults){defaults&&this.trackCliFlag("defaults")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list4(client,argv){let telemetry2=new AiGatewayBudgetsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,scopeType=opts["--scope-type"],showDefaults=opts["--defaults"],limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliOptionScopeType(scopeType),telemetry2.trackCliFlagDefaults(showDefaults);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(scopeType!==void 0&&!BUDGET_SCOPE_TYPES.includes(scopeType))return output_manager_default.error(`The --scope-type flag must be one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`),2;let scopeFilter=scopeType;if(showDefaults&&scopeFilter==="team")return output_manager_default.error("The team scope does not support --default. Drop --defaults to list the team budget."),1;if(showDefaults&&(limitFlag!==void 0||next!==void 0))return output_manager_default.error("The --limit and --next options do not apply to --defaults, which lists every default in one page."),1;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;if(showDefaults)return await listDefaults(client,{scopeType:scopeFilter,asJson});output_manager_default.spinner("Fetching budgets\u2026");let page,defaults;try{[page,defaults]=await Promise.all([listBudgetsPage(client,{scopeType:scopeFilter,limit,next,includeDefaultCovered:!1}),asJson||next?[]:listScopeBudgetDefaults(client).catch(err=>(output_manager_default.debug(`Skipping budget defaults in list output: ${err instanceof Error?err.message:String(err)}`),[]))])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}let configured=page.items.filter(budget2=>budget2.source!=="default"),counts=page.defaultCoveredCounts??countDefaultCovered(page.items);if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({budgets:configured,pagination:{next:page.next},defaultCoveredCounts:counts},null,2)}
69
- `),0;if(configured.length===0)return output_manager_default.stopSpinner(),next?(output_manager_default.log("No more budgets."),0):(output_manager_default.log(scopeType?`No ${scopeType} budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`:`No budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`),printDefaultsSection(defaults,counts,scopeFilter),printNextPageHint(client,page.next),0);let names=await resolveScopeNames(client,configured);return output_manager_default.stopSpinner(),printDefaultsSection(defaults,counts,scopeFilter),output_manager_default.log("Custom budgets"),client.stdout.write(printBudgetsTable(configured,names)),printNextPageHint(client,page.next),0}var KEY_LOOKUP_BY_ID_MAX=DEFAULT_LIST_LIMIT,KEY_LOOKUP_CONCURRENCY=5,KEY_ROSTER_PAGE_SIZE=100,KEY_ROSTER_MAX_PAGES=1e3;async function resolveApiKeyNames(client,ids){let names=new Map;if(ids.length===0)return names;if(ids.length<=KEY_LOOKUP_BY_ID_MAX){let sema=new import_async_sema.default(KEY_LOOKUP_CONCURRENCY);return await Promise.all(ids.map(async id2=>{await sema.acquire();try{let key=await getApiKey(client,id2).catch(()=>null);key?.name&&names.set(id2,key.name)}finally{sema.release()}})),names}let wanted=new Set(ids),seen=new Set,next;try{for(let pages=0;pages<KEY_ROSTER_MAX_PAGES;pages++){let page=await listApiKeysPage(client,{limit:KEY_ROSTER_PAGE_SIZE,next});for(let key of page.items)wanted.delete(key.id)&&key.name&&names.set(key.id,key.name);if(!page.next||wanted.size===0||seen.has(page.next))break;seen.add(page.next),next=page.next}}catch{}return names}async function resolveScopeNames(client,configured){let ids=scopeType=>[...new Set(configured.filter(b=>b.scopeType===scopeType).map(b=>b.scopeId))],userIds=ids("user").map(id2=>id2.replace(/^usr_/,"")),unnamedKeyIds=[...new Set(configured.filter(b=>b.scopeType==="api-key"&&!b.name).map(b=>b.scopeId))],[apiKeyNames,members3,projects2,teams2]=await Promise.all([resolveApiKeyNames(client,unnamedKeyIds),userIds.length?getTeamMembersByIds(client,client.config.currentTeam,userIds).catch(()=>new Map):new Map,Promise.all(ids("project").map(async id2=>{let project=await getProjectByNameOrId(client,id2).catch(()=>null),name=project&&!(project instanceof ProjectNotFound)?project.name:void 0;return[id2,name||id2]})),Promise.all(ids("team").map(async id2=>{let team=await getTeamByIdOrSlug(client,id2).catch(()=>null);return[id2,team?.slug||team?.name||id2]}))]),projectNames=new Map(projects2),teamNames=new Map(teams2);return configured.map(budget2=>{switch(budget2.scopeType){case"team":return teamNames.get(budget2.scopeId)||budget2.scopeId;case"project":return projectNames.get(budget2.scopeId)||budget2.scopeId;case"user":{let member=members3.get(budget2.scopeId.replace(/^usr_/,""));return member?teamMemberLabel(member):budget2.scopeId}default:return budget2.name||apiKeyNames.get(budget2.scopeId)||budget2.scopeId}})}function defaultRows(defaults,counts,filter){return BUDGET_DEFAULT_SCOPE_TYPES.flatMap(scopeType=>{if(filter&&scopeType!==filter)return[];let row=defaults.find(d=>d.scopeType===scopeType&&d.active!==!1);if(!row)return[];let applied=counts[scopeType]??0,covered=BUDGET_DEFAULT_COVERED[scopeType],noun=applied===1?covered.toLowerCase().replace(/s$/,""):covered.toLowerCase();return[[scopeType,`$${row.limitAmount}`,row.refreshPeriod,`${applied} ${noun}`]]})}async function listDefaults(client,{scopeType,asJson}){output_manager_default.spinner("Fetching budget defaults\u2026");let counts,defaults;try{[counts,defaults]=await Promise.all([asJson?{}:fetchDefaultCoveredCounts(client,scopeType),listScopeBudgetDefaults(client)])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let policyRows=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType)&&(scopeType===void 0||d.scopeType===scopeType));if(asJson)return client.stdout.write(`${JSON.stringify({defaults:policyRows},null,2)}
67
+ `):printAlignedLabel("Removed",`${scopeType} default`,{gutter:"\u2713"}),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayBudgetsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",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})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var REFRESH_PERIODS=["daily","weekly","monthly","none"];async function set(client,argv){let telemetry2=new AiGatewayBudgetsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,limit=opts["--limit"],refreshPeriod=opts["--refresh-period"],isDefault=opts["--default"];telemetry2.trackCliArgumentScope(args[0]),telemetry2.trackCliArgumentName(args[1]),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagDefault(isDefault),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(limit===void 0||Number.isNaN(limit)||limit<1)return output_manager_default.error("The --limit flag is required and must be at least 1."),2;if(refreshPeriod!==void 0&&!REFRESH_PERIODS.includes(refreshPeriod))return output_manager_default.error(`The --refresh-period flag must be one of: ${REFRESH_PERIODS.join(", ")}.`),2;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await setScopeDefault(client,{scopeType:scope.scopeType,limit,refreshPeriod,asJson});let projectId,userId,apiKeyId,scopeLabel="team";if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;apiKeyId=resolved.apiKey.id,scopeLabel=`api key ${resolved.apiKey.name||apiKeyId}`}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;projectId=resolved.id,scopeLabel=`project ${scope.name}`}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;userId=member.uid,scopeLabel=`user ${teamMemberLabel(member)}`}output_manager_default.spinner("Setting budget\u2026");try{let budget2=scope.scopeType==="api-key"?(await updateApiKeyQuota(client,apiKeyId,{limitAmount:limit,...refreshPeriod?{refreshPeriod}:{},active:!0,archived:!1})).quota:await setBudget(client,{scopeType:scope.scopeType,...projectId?{projectId}:{},...userId?{userId}:{},limitAmount:limit,...refreshPeriod?{refreshPeriod}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(budget2,null,2)}
68
+ `):(printAlignedLabel("Set budget",scopeLabel,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budget2.limitAmount}`),printAlignedLabel("Refresh",budget2.refreshPeriod)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk10=__toESM(require_source(),1),import_async_sema2=__toESM(require_async_sema(),1);var AiGatewayBudgetsListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliOptionScopeType(scopeType){scopeType&&this.trackCliOption({option:"scope-type",value:scopeType})}trackCliFlagDefaults(defaults){defaults&&this.trackCliFlag("defaults")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list4(client,argv){let telemetry2=new AiGatewayBudgetsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,scopeType=opts["--scope-type"],showDefaults=opts["--defaults"],limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliOptionScopeType(scopeType),telemetry2.trackCliFlagDefaults(showDefaults);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(scopeType!==void 0&&!BUDGET_SCOPE_TYPES.includes(scopeType))return output_manager_default.error(`The --scope-type flag must be one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`),2;let scopeFilter=scopeType;if(showDefaults&&scopeFilter==="team")return output_manager_default.error("The team scope does not support --default. Drop --defaults to list the team budget."),1;if(showDefaults&&(limitFlag!==void 0||next!==void 0))return output_manager_default.error("The --limit and --next options do not apply to --defaults, which lists every default in one page."),1;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;if(showDefaults)return await listDefaults(client,{scopeType:scopeFilter,asJson});output_manager_default.spinner("Fetching budgets\u2026");let page,defaults;try{[page,defaults]=await Promise.all([listBudgetsPage(client,{scopeType:scopeFilter,limit,next,includeDefaultCovered:!1}),asJson||next?[]:listScopeBudgetDefaults(client).catch(err=>(output_manager_default.debug(`Skipping budget defaults in list output: ${err instanceof Error?err.message:String(err)}`),[]))])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}let configured=page.items,counts=page.defaultCoveredCounts;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({budgets:configured,pagination:{next:page.next},defaultCoveredCounts:counts},null,2)}
69
+ `),0;if(configured.length===0)return output_manager_default.stopSpinner(),next?(output_manager_default.log("No more budgets."),0):(output_manager_default.log(scopeType?`No ${scopeType} budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`:`No budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`),printDefaultsSection(defaults,counts,scopeFilter),printNextPageHint(client,page.next),0);let names=await resolveScopeNames(client,configured);return output_manager_default.stopSpinner(),printDefaultsSection(defaults,counts,scopeFilter),output_manager_default.log("Custom budgets"),client.stdout.write(printBudgetsTable(configured,names)),printNextPageHint(client,page.next),0}var KEY_LOOKUP_BY_ID_MAX=DEFAULT_LIST_LIMIT,KEY_LOOKUP_CONCURRENCY=5,KEY_ROSTER_PAGE_SIZE=100,KEY_ROSTER_MAX_PAGES=1e3,DIRECTORY_SKIPPED={keys:new Map,users:null};async function resolveDirectoryLabels(client,input){if(!isDirectoryEnabledByEnv()||input.keyIds.length===0&&input.userIds.length===0)return DIRECTORY_SKIPPED;try{return await resolveDirectoryIdentities(client,input)}catch(err){return output_manager_default.debug(`Skipping AI Gateway key directory labels: ${err instanceof Error?err.message:String(err)}`),DIRECTORY_SKIPPED}}async function resolveApiKeyNames(client,ids,{directoryAnswered=!1}={}){let names=new Map;if(ids.length===0)return names;if(directoryAnswered&&(ids=ids.slice(0,KEY_LOOKUP_BY_ID_MAX)),ids.length<=KEY_LOOKUP_BY_ID_MAX){let sema=new import_async_sema2.default(KEY_LOOKUP_CONCURRENCY);return await Promise.all(ids.map(async id2=>{await sema.acquire();try{let key=await getApiKey(client,id2).catch(()=>null);key?.name&&names.set(id2,key.name)}finally{sema.release()}})),names}let wanted=new Set(ids),seen=new Set,next;try{for(let pages=0;pages<KEY_ROSTER_MAX_PAGES;pages++){let page=await listApiKeysPage(client,{limit:KEY_ROSTER_PAGE_SIZE,next});for(let key of page.items)wanted.delete(key.id)&&key.name&&names.set(key.id,key.name);if(!page.next||wanted.size===0||seen.has(page.next))break;seen.add(page.next),next=page.next}}catch{}return names}async function resolveScopeNames(client,configured){let ids=scopeType=>[...new Set(configured.filter(b=>b.scopeType===scopeType).map(b=>b.scopeId))],userIds=ids("user").map(id2=>id2.replace(/^usr_/,"")),unnamedKeyIds=[...new Set(configured.filter(b=>b.scopeType==="api-key"&&!b.name).map(b=>b.scopeId))],directory=await resolveDirectoryLabels(client,{keyIds:unnamedKeyIds,userIds}),directoryAnswered=directory!==DIRECTORY_SKIPPED,apiKeyNames=new Map;for(let[id2,key]of directory.keys)key.name&&apiKeyNames.set(id2,key.name);let members3=new Map;for(let[uid,label]of directory.users??[])members3.set(uid,{uid,username:label.username,name:label.name});let leftoverKeyIds=unnamedKeyIds.filter(id2=>!apiKeyNames.has(id2)),leftoverUserIds=directory.users===null?userIds:userIds.filter(uid=>!members3.has(uid)),[legacyKeyNames,legacyMembers,projects2,teams2]=await Promise.all([resolveApiKeyNames(client,leftoverKeyIds,{directoryAnswered}),leftoverUserIds.length?getTeamMembersByIds(client,client.config.currentTeam,leftoverUserIds).catch(()=>new Map):new Map,Promise.all(ids("project").map(async id2=>{let project=await getProjectByNameOrId(client,id2).catch(()=>null),name=project&&!(project instanceof ProjectNotFound)?project.name:void 0;return[id2,name||id2]})),Promise.all(ids("team").map(async id2=>{let team=await getTeamByIdOrSlug(client,id2).catch(()=>null);return[id2,team?.slug||team?.name||id2]}))]),projectNames=new Map(projects2),teamNames=new Map(teams2);for(let[id2,name]of legacyKeyNames)apiKeyNames.set(id2,name);for(let[uid,member]of legacyMembers)members3.set(uid,member);return configured.map(budget2=>{switch(budget2.scopeType){case"team":return teamNames.get(budget2.scopeId)||budget2.scopeId;case"project":return projectNames.get(budget2.scopeId)||budget2.scopeId;case"user":{let member=members3.get(budget2.scopeId.replace(/^usr_/,""));return member?teamMemberLabel(member):budget2.scopeId}default:return budget2.name||apiKeyNames.get(budget2.scopeId)||budget2.scopeId}})}function defaultRows(defaults,counts,filter){return BUDGET_DEFAULT_SCOPE_TYPES.flatMap(scopeType=>{if(filter&&scopeType!==filter)return[];let row=defaults.find(d=>d.scopeType===scopeType&&d.active!==!1);if(!row)return[];let applied=counts[scopeType]??0,covered=BUDGET_DEFAULT_COVERED[scopeType],noun=applied===1?covered.toLowerCase().replace(/s$/,""):covered.toLowerCase();return[[scopeType,`$${row.limitAmount}`,row.refreshPeriod,`${applied} ${noun}`]]})}async function listDefaults(client,{scopeType,asJson}){output_manager_default.spinner("Fetching budget defaults\u2026");let counts,defaults;try{[counts,defaults]=await Promise.all([asJson?{}:fetchDefaultCoveredCounts(client,scopeType),listScopeBudgetDefaults(client)])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let policyRows=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType)&&(scopeType===void 0||d.scopeType===scopeType));if(asJson)return client.stdout.write(`${JSON.stringify({defaults:policyRows},null,2)}
70
70
  `),0;let rows=defaultRows(defaults,counts,scopeType);return rows.length===0?(output_manager_default.log(scopeType?`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`:`No budget defaults set. Set one with ${getCommandName("ai-gateway budgets set <scope> --default")}.`),0):(output_manager_default.log("Budget defaults"),client.stdout.write(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk10.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
71
- `),0)}async function fetchDefaultCoveredCounts(client,scopeType){let page=await listBudgetsPage(client,{scopeType,limit:1,includeDefaultCovered:!1});return page.defaultCoveredCounts??countDefaultCovered(page.items)}function printDefaultsSection(defaults,counts,filter){let rows=defaultRows(defaults,counts,filter);rows.length!==0&&(output_manager_default.log("Scopes without their own budget inherit the following defaults:"),output_manager_default.print(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk10.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
71
+ `),0)}async function fetchDefaultCoveredCounts(client,scopeType){return(await listBudgetsPage(client,{scopeType,limit:1,includeDefaultCovered:!1})).defaultCoveredCounts}function printDefaultsSection(defaults,counts,filter){let rows=defaultRows(defaults,counts,filter);rows.length!==0&&(output_manager_default.log("Scopes without their own budget inherit the following defaults:"),output_manager_default.print(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk10.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
72
72
  `))}function printBudgetsTable(budgets2,names){return`${table([["scope","name","limit","spent","refresh"].map(header=>import_chalk10.default.gray(header)),...budgets2.map((budget2,i)=>[budget2.scopeType,names[i],`$${budget2.limitAmount}`,`$${budget2.currentSpend.toFixed(2)}`,budget2.refreshPeriod])],{align:["l","l","r","r","l"],hsep:4}).replace(/^/gm," ")}
73
73
 
74
74
  `}var AiGatewayBudgetsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect3(client,argv){let telemetry2=new AiGatewayBudgetsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry2.trackCliArgumentScope(args[0]),telemetry2.trackCliArgumentName(args[1]),telemetry2.trackCliFlagDefault(opts["--default"]),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,isDefault=opts["--default"],scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await inspectScopeDefault(client,scope.scopeType,asJson);let scopeId,targetName;if(scope.scopeType==="team"){let team=await getTeamByIdOrSlug(client,client.config.currentTeam).catch(()=>null);targetName=team?.slug||team?.name}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;scopeId=resolved.id,targetName=resolved.name||scope.name}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;scopeId=member.uid,targetName=teamMemberLabel(member)}else if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;scopeId=resolved.apiKey.id,targetName=resolved.apiKey.name||scopeId}output_manager_default.spinner("Fetching budget\u2026");let budgets2;try{budgets2=await listBudgets(client,scope.scopeType)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let budget2=budgets2.find(row=>row.scopeType===scope.scopeType&&(scope.scopeType==="team"||row.scopeId===scopeId||row.scopeId===`usr_${scopeId}`)),label=scope.scopeType==="team"?"the team":targetName;return budget2?asJson?(client.stdout.write(`${JSON.stringify(budget2,null,2)}
@@ -91,7 +91,7 @@ Available: status, visibility, baseUrl, inferenceRegion,
91
91
  disallowPromptTraining.
92
92
  Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"}}}:`,validate:v=>{let result=parseConfigFlag(v,"The value");return result.ok?!0:result.error}}),parsed=parseConfigFlag(raw,"The value");if(!parsed.ok)return output_manager_default.error(parsed.error),1;for(let[key,value]of Object.entries(parsed.value))merged[key]===void 0&&(merged[key]=value);break}}}if(!await ensureTeam(client))return 1;let createStamp=stamp_default();output_manager_default.spinner("Creating virtual model");try{let virtualModel=await createVirtualModel(client,merged);return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
93
93
  `):(client.stdout.write(`${virtualModel.virtualModelSlug}
94
- `),output_manager_default.success(`Virtual model ${import_chalk17.default.bold(virtualModel.virtualModelSlug)} created ${createStamp()}. Call it as ${import_chalk17.default.bold(`vmc/${virtualModel.virtualModelSlug}`)}.`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk18=__toESM(require_source(),1);var AiGatewayVirtualModelsListTelemetryClient=class extends TelemetryClient{trackCliFlagIncludeArchived(includeArchived){includeArchived&&this.trackCliFlag("include-archived")}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")}};async function list7(client,argv){let telemetry2=new AiGatewayVirtualModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,includeArchived=!!opts["--include-archived"],limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliFlagIncludeArchived(opts["--include-archived"]),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}return await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching virtual models",fetch:async()=>{let page=await listVirtualModelsPage(client,{limit,next,includeArchived});return includeArchived?page:{...page,items:page.items.filter(vm=>vm.status!=="archived")}},toJSON:page=>({virtualModels:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more virtual models.":`No virtual models found. Create one with ${getCommandName("ai-gateway virtual-models create")}.`,header:()=>"Virtual models",renderTable:page=>printVirtualModelsTable(page.items),next:page=>page.next}):1}function printVirtualModelsTable(virtualModels2){return`${table([["slug","kind","model","status"].map(header=>import_chalk18.default.gray(header)),...virtualModels2.map(vm=>[vm.virtualModelSlug,vm.kind??"alias",vm.modelSlug??import_chalk18.default.gray("\u2013"),vm.status??"active"])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
94
+ `),output_manager_default.success(`Virtual model ${import_chalk17.default.bold(virtualModel.virtualModelSlug)} created ${createStamp()}. Call it as ${import_chalk17.default.bold(`vmc/${virtualModel.virtualModelSlug}`)}.`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk18=__toESM(require_source(),1);var AiGatewayVirtualModelsListTelemetryClient=class extends TelemetryClient{trackCliFlagIncludeArchived(includeArchived){includeArchived&&this.trackCliFlag("include-archived")}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")}};async function list7(client,argv){let telemetry2=new AiGatewayVirtualModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,includeArchived=!!opts["--include-archived"],limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliFlagIncludeArchived(opts["--include-archived"]),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}return await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching virtual models",fetch:()=>listVirtualModelsPage(client,{limit,next,includeArchived}),toJSON:page=>({virtualModels:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more virtual models.":`No virtual models found. Create one with ${getCommandName("ai-gateway virtual-models create")}.`,header:()=>"Virtual models",renderTable:page=>printVirtualModelsTable(page.items),next:page=>page.next}):1}function printVirtualModelsTable(virtualModels2){return`${table([["slug","kind","model","status"].map(header=>import_chalk18.default.gray(header)),...virtualModels2.map(vm=>[vm.virtualModelSlug,vm.kind??"alias",vm.modelSlug??import_chalk18.default.gray("\u2013"),vm.status??"active"])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
95
95
 
96
96
  `}var import_chalk19=__toESM(require_source(),1);var AiGatewayVirtualModelsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect4(client,argv){let telemetry2=new AiGatewayVirtualModelsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry2.trackCliArgumentSlug(slug),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);return formatResult.valid?slug?await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching virtual model ${slug}`,fetch:()=>getVirtualModel(client,slug),toJSON:virtualModel=>virtualModel,isEmpty:()=>!1,emptyMessage:"",header:virtualModel=>`Virtual model ${import_chalk19.default.bold(virtualModel.virtualModelSlug)}`,renderTable:printVirtualModelDetails,notFoundMessage:`Virtual model "${slug}" not found.`}):1:(output_manager_default.error(`${getCommandName("ai-gateway virtual-models inspect <slug>")} expects a virtual model slug.`),2):(output_manager_default.error(formatResult.error),2)}function dim2(value){return import_chalk19.default.gray(value)}function printVirtualModelDetails(vm){let rows=[["slug",vm.virtualModelSlug],["kind",vm.kind??"alias"],["model",vm.modelSlug],["display name",vm.displayName],["description",vm.description],["status",vm.status??"active"],["visibility",vm.visibility],["base url",vm.baseUrl],["fallback models",vm.models?.join(", ")],["provider order",vm.providerOrder?.join(", ")],["provider only",vm.providerOnly?.join(", ")],["observability tags",vm.observabilityTags?.join(", ")],["inference region",formatRegion(vm.inferenceRegion)],["sort",vm.sort],["has",vm.has?.join(", ")],["caching",vm.caching],["service tier",vm.serviceTier],["provider timeouts",formatTimeouts(vm.providerTimeouts)],["speed",vm.speed],["allow fallback from fast",yesNo2(vm.allowFallbackFromFast)],["zero data retention",yesNo2(vm.zeroDataRetention)],["disallow prompt training",yesNo2(vm.disallowPromptTraining)],["created",new Date(vm.createdAt).toLocaleString()],["updated",new Date(vm.updatedAt).toLocaleString()]];return`${table(rows.filter(([,value])=>value!==void 0&&value!=="").map(([label,value])=>[dim2(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
97
97
 
@@ -102,10 +102,10 @@ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"
102
102
  `:`
103
103
  `,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(id2=>({...asObject2(models3.find(m=>asObject2(m).name===id2)),name:id2,provider:"openai",model:id2,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()}
104
104
  `}],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}],actionRequired:!0,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)}
105
- `}},{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)}
105
+ `}},{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.`,...ctx.tokenPass?[]:["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)}
106
106
  `}}],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)}
107
- `}}],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,id2){let model=models3?.find(m=>m.id===id2),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)}
108
- `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Mistral Vibe will default to ${activeModel} through the gateway; switch with /model.`,...models3.length?[`${models3.length} shortlisted gateway models are in the /model picker; it scrolls but has no type-to-filter, and Vibe's own Mistral models are listed first. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join29}from"node:path";var ZCODE_PROVIDER_KEY="c7c0f1e6-4aa2-4b7e-8f5e-2f1d9f3f7a42",ZCODE_PROVIDER_NAME="Vercel AI Gateway",ZCODE_KIND_OPENAI_COMPATIBLE="openai-compatible",VERIFIED_MODELS={[GATEWAY_DEFAULT_MODEL]:{limit:{context:1e6,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}},"openai/gpt-5.6-sol":{limit:{context:105e4,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}}};function seedModels(ctx){let ranked=shortlistModels(ctx,{requireContextWindow:!0,requireMaxTokens:!0,ensureDefault:!0});if(!ranked.length)return VERIFIED_MODELS;let models3={};for(let m of ranked)models3[m.id]=VERIFIED_MODELS[m.id]??{limit:{context:m.context_window,output:m.max_tokens}};return models3}function findExistingGatewayKey(config,targetBaseURL){let providers2=config?.provider;if(!providers2)return null;for(let[key,entry2]of Object.entries(providers2)){let baseURL=entry2?.options?.baseURL;if(entry2?.kind===ZCODE_KIND_OPENAI_COMPATIBLE&&baseURL===targetBaseURL)return key}return null}var zcode={id:"zcode",displayName:"ZCode",honorsBaseUrl:!0,needsTopModels:!0,needsModelCatalogue:!0,async detect(home){return pathExists(join29(home,".zcode"))},configPath(ctx){return ctx.overrides?.zcode??join29(ctx.home,".zcode","v2","config.json")},async warnings(){return[{code:"zcode-quit-before-setup",impact:"Quit the ZCode desktop app before continuing.",why:["ZCode keeps its provider registry in memory and rewrites its config file when it saves settings or exits, silently discarding edits made while it runs.","ZCode has no env-var lookup for custom providers, so the gateway key is stored in ~/.zcode/v2/config.json (written 0600)."],undo:'remove the "Vercel AI Gateway" provider under Settings \u2192 Model settings in ZCode',confirm:"ZCode is quit and writing the key into its config file is OK"}]},buildPlan(ctx){let baseURL=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=seedModels(ctx);return{fileChanges:[{path:this.configPath(ctx),label:"ZCode providers",format:"json",mode:384,transform:current=>{let parsed=parseJsonObjectOrNull(current),existingKey=findExistingGatewayKey(parsed,baseURL);return mergeJson(current,{provider:{[existingKey??ZCODE_PROVIDER_KEY]:{...existingKey?{}:{name:ZCODE_PROVIDER_NAME},kind:ZCODE_KIND_OPENAI_COMPATIBLE,options:{apiKey:ctx.apiKey,baseURL,apiKeyRequired:!0},source:"custom",models:models3}}})}}],envExports:[],notes:[`Open ZCode and pick a model under "${ZCODE_PROVIDER_NAME}" in the chat's model picker; ${Object.keys(models3).length} gateway models are seeded and any other gateway model id can be added via Manage models \u2192 Add model.`,`Fresh install: choose "Skip for now" on ZCode's welcome screen \u2014 its API-key dropdown only takes Z.ai/BigModel accounts; the gateway provider lives in Settings \u2192 Model settings.`,"When adding gateway providers by hand, keep the API format on Chat completions: ZCode's Anthropic-messages format sends a legacy thinking parameter that current Claude models reject (zai-org/feedback#233)."]}}};init_main();import{isAbsolute as isAbsolute5,join as join30}from"node:path";var PROVIDER_ID3="vercel_ai_gateway",ZED_KEY_ENV="VERCEL_AI_GATEWAY_API_KEY";function zedConfigDir(home){if(process.platform==="win32"){let appData=process.env.APPDATA,base2=appData&&isAbsolute5(appData)?appData:join30(home,"AppData","Roaming");return join30(base2,"Zed")}let xdg=process.env.XDG_CONFIG_HOME,base=process.platform!=="darwin"&&xdg&&isAbsolute5(xdg)?xdg:join30(home,".config");return join30(base,"zed")}var zed={id:"zed",needsModelCatalogue:!0,needsTopModels:!0,displayName:"Zed",async detect(home){return pathExists(zedConfigDir(home))},configPath(ctx){return ctx.overrides?.zed??join30(zedConfigDir(ctx.home),"settings.json")},buildPlan(ctx){let apiUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,top=(ctx.gatewayModels??[]).find(m=>m.id===ctx.topModels?.[0]?.id&&m.context_window),defaultModel=top?.id??GATEWAY_DEFAULT_MODEL,starter=top?{name:top.id,display_name:top.name,max_tokens:top.context_window,...top.max_tokens?{max_output_tokens:top.max_tokens}:{},capabilities:{tools:!0,images:(top.tags??[]).includes("vision")}}:{name:GATEWAY_DEFAULT_MODEL,display_name:"Claude Fable 5",max_tokens:1e6,max_output_tokens:128e3,capabilities:{tools:!0,images:!0}};return{fileChanges:[{path:this.configPath(ctx),label:"Zed settings",format:"json",transform:current=>{let hasModels=!!parse(current??"")?.language_models?.[PROVIDER_ID3]?.available_models;return mergeJsonc(current,{language_models:{[PROVIDER_ID3]:{api_url:apiUrl,...hasModels?{}:{available_models:[starter]}}},agent:{default_model:{provider:PROVIDER_ID3,model:defaultModel}}})}}],envExports:[{name:ZED_KEY_ENV,value:ctx.apiKey}],notes:[`Zed's built-in Vercel AI Gateway provider now targets the coding-agent endpoint with ${defaultModel} as the Agent Panel default; the full catalog loads from /models once the key is visible.`,`Launch Zed from a new terminal (or restart it) so ${ZED_KEY_ENV} is in its environment; Settings \u2192 AI \u2192 LLM Providers also accepts the key directly.`]}}};var CODING_AGENTS=[aider,claudeCode,cline,codex,continueCli,copilot,crush,cursor,deepagents,deepseek,droid,forge,fx,goose,gptme,grok,hermes,junie,kilo,kimi,omp,openclaw,opencode,openhands,pi,qwen,vibe,zcode,zed],DEFAULT_AGENTS=CODING_AGENTS.filter(a=>!a.experimental);function getAgentById(id2){return CODING_AGENTS.find(a=>a.id===id2)}var UNSUPPORTED_AGENTS={};var import_chalk23=__toESM(require_source(),1);import{hostname,userInfo}from"node:os";var CHILD_PROMPT=import_chalk23.default.dim("\u21B3");function defaultKeyName(tokenPass2=!1){let host="",user="";try{host=hostname()}catch{}try{user=userInfo().username}catch{}let device=host.split(".")[0].replace(/[-_]+/g," ").trim(),who=user.trim(),label=tokenPass2?"Coding Agents token-pass":"Coding Agents";return who&&device?`[${who}'s ${device}] ${label}`:device?`[${device}] ${label}`:who?`[${who}] ${label}`:label}async function promptExistingKey(client,defaultSource="create"){return await client.input.select({message:"AI Gateway API key?",choices:[{name:"Create a new key",value:"create"},{name:"Use an existing key",value:"existing"}],default:defaultSource})==="create"?void 0:(await client.input.password({message:`${CHILD_PROMPT} Paste your AI Gateway API key `,mask:!0,validate:value=>value.trim().length>0?!0:"Enter an AI Gateway API key."})).trim()}async function promptKeyName(client,tokenPass2=!1){let fallback=defaultKeyName(tokenPass2);return(await client.input.text({message:"Key name?",default:fallback})).trim()||fallback}async function promptQuota(client){if(!await client.input.confirm("Set a spend limit for this key?",!1))return{};let refreshPeriod=await client.input.select({message:`${CHILD_PROMPT} How often should the limit reset?`,choices:[{name:"Never (one-time limit)",value:"none"},{name:"Daily",value:"daily"},{name:"Weekly",value:"weekly"},{name:"Monthly",value:"monthly"}],default:"none"}),amount=await client.input.text({message:`${CHILD_PROMPT} Spend limit in USD`,default:"100",validate:value=>{let n=Number(value);return Number.isFinite(n)&&n>=1?!0:"Enter a number of dollars (minimum 1)."}});return{budget:Number(amount),refreshPeriod}}async function promptExpiry(client){if(!await client.input.confirm("Set an expiration for this key?",!1))return;let preset=await client.input.select({message:`${CHILD_PROMPT} Expires in`,choices:EXPIRY_PRESETS.map(p=>({name:p.label,value:p.value})),default:DEFAULT_EXPIRY_PRESET});return presetToExpiresAt(preset)}async function promptKeychain(client){return client.input.confirm("Store the API key in your macOS Keychain?",!0)}function hasExplicitScopeFlag(argv){return argv.slice(2).some(a=>a==="--scope"||a==="-S"||a==="--team"||a==="-T"||a.startsWith("--scope=")||a.startsWith("--team="))}async function ensureTeam2(client,opts){let{machine,canPrompt:canPrompt2,yes}=opts;if(canPrompt2&&!yes&&!hasExplicitScopeFlag(client.argv)){let org=await selectOrg(client,"Which team?",void 0,!0,void 0,"The new AI Gateway API key will be created under this team:");client.config.currentTeam=org.type==="team"?org.id:void 0;return}if(hasExplicitScopeFlag(client.argv)||await client.resolveCurrentTeam())return;let message="No team selected. Pass --scope <team-slug> or run `vercel switch` first.";return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message,next:[{command:getCommandName("ai-gateway setup --scope <team-slug>")}]}),output_manager_default.error(message),1}async function createKey(client,opts){output_manager_default.spinner("Creating AI Gateway API key\u2026");try{return(await createApiKey(client,{name:opts.name,aiGatewayQuota:buildQuota({budget:opts.budget,refreshPeriod:opts.refreshPeriod,includeByok:opts.includeByok}),...opts.expiresAt!==void 0&&{expiresAt:opts.expiresAt},...opts.tokenPass&&{metadata:{tokenPass:!0}}})).apiKeyString}finally{output_manager_default.stopSpinner()}}function resolveKeyOptions(opts){return{...opts,name:opts.name??(opts.tokenPass?defaultKeyName(!0):void 0)}}async function resolveAgents(args){let{client,agentFlags,all,canPrompt:canPrompt2,yes,home}=args,guidance2=[],unsupported=[];if(agentFlags&&agentFlags.length>0){let selected2=[],unknown=[];for(let raw of agentFlags){let id2=raw.toLowerCase(),agent2=getAgentById(id2);agent2?selected2.includes(agent2)||selected2.push(agent2):UNSUPPORTED_AGENTS[id2]?(unsupported.push(id2),guidance2.push(`${id2}: ${UNSUPPORTED_AGENTS[id2]}`)):unknown.push(raw)}if(unknown.length>0){let known=DEFAULT_AGENTS.map(a=>a.id).join(", ");return{error:`Unknown agent(s): ${unknown.join(", ")}. Supported: ${known}.`,reason:AGENT_REASON.INVALID_ARGUMENTS}}return selected2.length===0?{error:"No configurable agents selected.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance:guidance2,unsupported}}if(all)return{selected:DEFAULT_AGENTS,guidance:guidance2,unsupported};let detected=await Promise.all(DEFAULT_AGENTS.map(a=>a.detect(home)));if(!canPrompt2||yes){let selected2=DEFAULT_AGENTS.filter((_,i)=>detected[i]);return selected2.length===0?{error:"No coding agents detected on this machine. Pass --agent <name> (repeatable) or --all.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance:guidance2,unsupported}}let choices=DEFAULT_AGENTS.map((agent2,i)=>({name:agent2.displayName,value:agent2.id,checked:detected[i]})),selected=(await client.input.checkbox({message:`Which coding agents should use the AI Gateway?
107
+ `}}],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=ctx.tokenPass?[]:["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,id2){let model=models3?.find(m=>m.id===id2),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:ctx.tokenPass?[]:["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)}
108
+ `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Mistral Vibe will default to ${activeModel} through the gateway; switch with /model.`,...models3.length?[`${models3.length} shortlisted gateway models are in the /model picker; it scrolls but has no type-to-filter, and Vibe's own Mistral models are listed first. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join29}from"node:path";var ZCODE_PROVIDER_KEY="c7c0f1e6-4aa2-4b7e-8f5e-2f1d9f3f7a42",ZCODE_PROVIDER_NAME="Vercel AI Gateway",ZCODE_KIND_OPENAI_COMPATIBLE="openai-compatible",VERIFIED_MODELS={[GATEWAY_DEFAULT_MODEL]:{limit:{context:1e6,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}},"openai/gpt-5.6-sol":{limit:{context:105e4,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}}};function seedModels(ctx){let ranked=shortlistModels(ctx,{requireContextWindow:!0,requireMaxTokens:!0,ensureDefault:!0});if(!ranked.length)return VERIFIED_MODELS;let models3={};for(let m of ranked)models3[m.id]=VERIFIED_MODELS[m.id]??{limit:{context:m.context_window,output:m.max_tokens}};return models3}function findExistingGatewayKey(config,targetBaseURL){let providers2=config?.provider;if(!providers2)return null;for(let[key,entry2]of Object.entries(providers2)){let baseURL=entry2?.options?.baseURL;if(entry2?.kind===ZCODE_KIND_OPENAI_COMPATIBLE&&baseURL===targetBaseURL)return key}return null}var zcode={id:"zcode",displayName:"ZCode",honorsBaseUrl:!0,needsTopModels:!0,needsModelCatalogue:!0,async detect(home){return pathExists(join29(home,".zcode"))},configPath(ctx){return ctx.overrides?.zcode??join29(ctx.home,".zcode","v2","config.json")},async warnings(){return[{code:"zcode-quit-before-setup",impact:"Quit the ZCode desktop app before continuing.",why:["ZCode keeps its provider registry in memory and rewrites its config file when it saves settings or exits, silently discarding edits made while it runs.","ZCode has no env-var lookup for custom providers, so the gateway key is stored in ~/.zcode/v2/config.json (written 0600)."],undo:'remove the "Vercel AI Gateway" provider under Settings \u2192 Model settings in ZCode',confirm:"ZCode is quit and writing the key into its config file is OK"}]},buildPlan(ctx){let baseURL=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=seedModels(ctx);return{fileChanges:[{path:this.configPath(ctx),label:"ZCode providers",format:"json",mode:384,transform:current=>{let parsed=parseJsonObjectOrNull(current),existingKey=findExistingGatewayKey(parsed,baseURL);return mergeJson(current,{provider:{[existingKey??ZCODE_PROVIDER_KEY]:{...existingKey?{}:{name:ZCODE_PROVIDER_NAME},kind:ZCODE_KIND_OPENAI_COMPATIBLE,options:{apiKey:ctx.apiKey,baseURL,apiKeyRequired:!0},source:"custom",models:models3}}})}}],envExports:[],notes:[`Open ZCode and pick a model under "${ZCODE_PROVIDER_NAME}" in the chat's model picker; ${Object.keys(models3).length} gateway models are seeded and any other gateway model id can be added via Manage models \u2192 Add model.`,`Fresh install: choose "Skip for now" on ZCode's welcome screen \u2014 its API-key dropdown only takes Z.ai/BigModel accounts; the gateway provider lives in Settings \u2192 Model settings.`,"When adding gateway providers by hand, keep the API format on Chat completions: ZCode's Anthropic-messages format sends a legacy thinking parameter that current Claude models reject (zai-org/feedback#233)."]}}};init_main();import{isAbsolute as isAbsolute5,join as join30}from"node:path";var PROVIDER_ID3="vercel_ai_gateway",ZED_KEY_ENV="VERCEL_AI_GATEWAY_API_KEY";function zedConfigDir(home){if(process.platform==="win32"){let appData=process.env.APPDATA,base2=appData&&isAbsolute5(appData)?appData:join30(home,"AppData","Roaming");return join30(base2,"Zed")}let xdg=process.env.XDG_CONFIG_HOME,base=process.platform!=="darwin"&&xdg&&isAbsolute5(xdg)?xdg:join30(home,".config");return join30(base,"zed")}var zed={id:"zed",needsModelCatalogue:!0,needsTopModels:!0,displayName:"Zed",async detect(home){return pathExists(zedConfigDir(home))},configPath(ctx){return ctx.overrides?.zed??join30(zedConfigDir(ctx.home),"settings.json")},buildPlan(ctx){let apiUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,top=(ctx.gatewayModels??[]).find(m=>m.id===ctx.topModels?.[0]?.id&&m.context_window),defaultModel=top?.id??GATEWAY_DEFAULT_MODEL,starter=top?{name:top.id,display_name:top.name,max_tokens:top.context_window,...top.max_tokens?{max_output_tokens:top.max_tokens}:{},capabilities:{tools:!0,images:(top.tags??[]).includes("vision")}}:{name:GATEWAY_DEFAULT_MODEL,display_name:"Claude Fable 5",max_tokens:1e6,max_output_tokens:128e3,capabilities:{tools:!0,images:!0}};return{fileChanges:[{path:this.configPath(ctx),label:"Zed settings",format:"json",transform:current=>{let hasModels=!!parse(current??"")?.language_models?.[PROVIDER_ID3]?.available_models;return mergeJsonc(current,{language_models:{[PROVIDER_ID3]:{api_url:apiUrl,...hasModels?{}:{available_models:[starter]}}},agent:{default_model:{provider:PROVIDER_ID3,model:defaultModel}}})}}],envExports:[{name:ZED_KEY_ENV,value:ctx.apiKey}],notes:[`Zed's built-in Vercel AI Gateway provider now targets the coding-agent endpoint with ${defaultModel} as the Agent Panel default; the full catalog loads from /models once the key is visible.`,`Launch Zed from a new terminal (or restart it) so ${ZED_KEY_ENV} is in its environment; Settings \u2192 AI \u2192 LLM Providers also accepts the key directly.`]}}};var CODING_AGENTS=[aider,claudeCode,cline,codex,continueCli,copilot,crush,cursor,deepagents,deepseek,droid,forge,fx,goose,gptme,grok,hermes,junie,kilo,kimi,omp,openclaw,opencode,openhands,pi,qwen,vibe,zcode,zed],DEFAULT_AGENTS=CODING_AGENTS.filter(a=>!a.experimental),TOKEN_PASS_AGENTS=[fx,opencode,pi];function getAgentById(id2){return CODING_AGENTS.find(a=>a.id===id2)}var UNSUPPORTED_AGENTS={};var import_chalk23=__toESM(require_source(),1);import{hostname,userInfo}from"node:os";var CHILD_PROMPT=import_chalk23.default.dim("\u21B3");function defaultKeyName(tokenPass2=!1){let host="",user="";try{host=hostname()}catch{}try{user=userInfo().username}catch{}let device=host.split(".")[0].replace(/[-_]+/g," ").trim(),who=user.trim(),label=tokenPass2?"Coding Agents token-pass":"Coding Agents";return who&&device?`[${who}'s ${device}] ${label}`:device?`[${device}] ${label}`:who?`[${who}] ${label}`:label}async function promptExistingKey(client,defaultSource="create"){return await client.input.select({message:"AI Gateway API key?",choices:[{name:"Create a new key",value:"create"},{name:"Use an existing key",value:"existing"}],default:defaultSource})==="create"?void 0:(await client.input.password({message:`${CHILD_PROMPT} Paste your AI Gateway API key `,mask:!0,validate:value=>value.trim().length>0?!0:"Enter an AI Gateway API key."})).trim()}async function promptKeyName(client,tokenPass2=!1){let fallback=defaultKeyName(tokenPass2);return(await client.input.text({message:"Key name?",default:fallback})).trim()||fallback}async function promptQuota(client){if(!await client.input.confirm("Set a spend limit for this key?",!1))return{};let refreshPeriod=await client.input.select({message:`${CHILD_PROMPT} How often should the limit reset?`,choices:[{name:"Never (one-time limit)",value:"none"},{name:"Daily",value:"daily"},{name:"Weekly",value:"weekly"},{name:"Monthly",value:"monthly"}],default:"none"}),amount=await client.input.text({message:`${CHILD_PROMPT} Spend limit in USD`,default:"100",validate:value=>{let n=Number(value);return Number.isFinite(n)&&n>=1?!0:"Enter a number of dollars (minimum 1)."}});return{budget:Number(amount),refreshPeriod}}async function promptExpiry(client){if(!await client.input.confirm("Set an expiration for this key?",!1))return;let preset=await client.input.select({message:`${CHILD_PROMPT} Expires in`,choices:EXPIRY_PRESETS.map(p=>({name:p.label,value:p.value})),default:DEFAULT_EXPIRY_PRESET});return presetToExpiresAt(preset)}async function promptKeychain(client){return client.input.confirm("Store the API key in your macOS Keychain?",!0)}function hasExplicitScopeFlag(argv){return argv.slice(2).some(a=>a==="--scope"||a==="-S"||a==="--team"||a==="-T"||a.startsWith("--scope=")||a.startsWith("--team="))}async function ensureTeam2(client,opts){let{machine,canPrompt:canPrompt2,yes}=opts;if(canPrompt2&&!yes&&!hasExplicitScopeFlag(client.argv)){let org=await selectOrg(client,"Which team?",void 0,!0,void 0,opts.tokenPass?"The new Token Pass API Key will be created under this team:":"The new AI Gateway API key will be created under this team:");client.config.currentTeam=org.type==="team"?org.id:void 0;return}if(hasExplicitScopeFlag(client.argv)||await client.resolveCurrentTeam())return;let message="No team selected. Pass --scope <team-slug> or run `vercel switch` first.";return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message,next:[{command:getCommandName("ai-gateway setup --scope <team-slug>")}]}),output_manager_default.error(message),1}async function createKey(client,opts){output_manager_default.spinner("Creating AI Gateway API key\u2026");try{return(await createApiKey(client,{name:opts.name,aiGatewayQuota:buildQuota({budget:opts.budget,refreshPeriod:opts.refreshPeriod,includeByok:opts.includeByok}),...opts.expiresAt!==void 0&&{expiresAt:opts.expiresAt},...opts.tokenPass&&{metadata:{tokenPass:!0}}})).apiKeyString}finally{output_manager_default.stopSpinner()}}function resolveKeyOptions(opts){return{...opts,name:opts.name??(opts.tokenPass?defaultKeyName(!0):void 0)}}async function resolveAgents(args){let{client,agentFlags,all,tokenPass:tokenPass2,canPrompt:canPrompt2,yes,home}=args,availableAgents=tokenPass2?TOKEN_PASS_AGENTS:DEFAULT_AGENTS,guidance2=[],unsupported=[];if(agentFlags&&agentFlags.length>0){let selected2=[],unknown=[];for(let raw of agentFlags){let id2=raw.toLowerCase(),agent2=tokenPass2?availableAgents.find(a=>a.id===id2):getAgentById(id2);agent2?selected2.includes(agent2)||selected2.push(agent2):!tokenPass2&&UNSUPPORTED_AGENTS[id2]?(unsupported.push(id2),guidance2.push(`${id2}: ${UNSUPPORTED_AGENTS[id2]}`)):unknown.push(raw)}if(unknown.length>0){let known=availableAgents.map(a=>a.id).join(", ");return{error:`${tokenPass2?"Unsupported Token Pass":"Unknown"} agent(s): ${unknown.join(", ")}. Supported: ${known}.`,reason:AGENT_REASON.INVALID_ARGUMENTS}}return selected2.length===0?{error:"No configurable agents selected.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance:guidance2,unsupported}}if(all)return{selected:availableAgents,guidance:guidance2,unsupported};let detected=await Promise.all(availableAgents.map(a=>a.detect(home)));if(!canPrompt2||yes){let selected2=availableAgents.filter((_,i)=>detected[i]);return selected2.length===0?{error:"No coding agents detected on this machine. Pass --agent <name> (repeatable) or --all.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance:guidance2,unsupported}}let choices=availableAgents.map((agent2,i)=>({name:agent2.displayName,value:agent2.id,checked:detected[i]})),selected=(await client.input.checkbox({message:`Which coding agents should use the AI Gateway?
109
109
  ${import_chalk24.default.dim(" Detected agents are pre-selected \xB7")}${CHECKBOX_INSTRUCTIONS}`,instructions:!1,loop:!1,pageSize:Math.max(choices.length,7),choices})).map(id2=>getAgentById(id2)).filter(a=>!!a);return selected.length===0?{error:"Select at least one agent to configure.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected,guidance:guidance2,unsupported}}import{join as join31}from"node:path";import{existsSync}from"node:fs";import{execFileSync}from"node:child_process";var SECURITY_BIN="/usr/bin/security",KEYCHAIN_SERVICE="Vercel AI Gateway",KEYCHAIN_ACCOUNT="vercel-ai-gateway";function isKeychainAvailable(){return process.platform==="darwin"&&existsSync(SECURITY_BIN)}function storeKeyInKeychain(key){try{return execFileSync(SECURITY_BIN,["add-generic-password","-U","-s",KEYCHAIN_SERVICE,"-a",KEYCHAIN_ACCOUNT,"-w",key],{stdio:"ignore"}),!0}catch{return!1}}function readKeyFromKeychain(){if(isKeychainAvailable())try{return execFileSync(SECURITY_BIN,["find-generic-password","-s",KEYCHAIN_SERVICE,"-a",KEYCHAIN_ACCOUNT,"-w"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function keychainLookup(opts={}){let cmd2=`${SECURITY_BIN} find-generic-password -s '${KEYCHAIN_SERVICE}' -a '${KEYCHAIN_ACCOUNT}' -w 2>/dev/null`;return opts.fish?`(${cmd2})`:`$(${cmd2})`}var PBCOPY_BIN="/usr/bin/pbcopy";function copyToClipboard(text4){try{return execFileSync(PBCOPY_BIN,{input:text4,stdio:["pipe","ignore","ignore"]}),!0}catch{return!1}}async function planSessionMigrations(agents,ctx){let migrations=[];for(let agent2 of agents){if(!agent2.sessionMigration)continue;let migration=await agent2.sessionMigration.plan(ctx);migration&&migration.itemCount>0&&migrations.push({...migration,agentId:agent2.id,agent:agent2.displayName})}return migrations}function detectShellRc(home,override2){if(override2&&override2.trim())return override2;let shell=process.env.SHELL??"";if(shell.includes("fish")){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join31(home,".config");return join31(base,"fish","config.fish")}if(shell.includes("zsh")){let zdot=process.env.ZDOTDIR;return join31(zdot&&zdot.trim()?zdot:home,".zshrc")}return shell.includes("bash")?join31(home,process.platform==="darwin"?".bash_profile":".bashrc"):join31(home,".profile")}var LEGACY_MANAGED_SENTENCE="# Managed by `vercel ai-gateway coding-agents setup` \u2014 safe to remove this block.",MANAGED_SENTENCE="# Managed by `vercel ai-gateway setup` \u2014 safe to remove this block.";function normalizeManagedSentence(text4){return text4.split(LEGACY_MANAGED_SENTENCE).join(MANAGED_SENTENCE)}function shellQuote(value){return`'${value.split("'").join("'\\''")}'`}function fishQuote(value){return`'${value.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function envBlockBody(exports,useKeychain,fish){let lines=[MANAGED_SENTENCE];for(let e2 of exports){let fromKeychain=useKeychain&&!e2.plain;fish?lines.push(fromKeychain?`set -gx ${e2.name} ${keychainLookup({fish:!0})}`:`set -gx ${e2.name} ${fishQuote(e2.value)}`):fromKeychain?lines.push(`export ${e2.name}="${keychainLookup()}"`):lines.push(`export ${e2.name}=${shellQuote(e2.value)}`)}return lines.join(`
110
110
  `)}function preservedEnvLines(current,writtenNames){if(!current)return[];let start=current.indexOf(MANAGED_BLOCK_START),end=current.indexOf(MANAGED_BLOCK_END);if(start===-1||end===-1||end<=start)return[];let kept=[];for(let line2 of current.slice(start,end).split(`
111
111
  `)){let match=/^(?:export|set -gx) ([A-Za-z_][A-Za-z0-9_]*)[ =]/.exec(line2.trim());match&&!writtenNames.has(match[1])&&kept.push(line2.trim())}return kept}function matchesWithStoredKey(current,templated){let parts=templated.split(KEY_PLACEHOLDER);if(parts.length<2)return!1;let escaped=parts.map(p=>p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=`^${escaped[0]}([^\\s"'\\\\]+)${escaped.slice(1).join("\\1")}$`;return new RegExp(pattern).test(current)}async function configsPointAtGateway(agents,ctx){let markers=[MANAGED_BLOCK_START,GATEWAY_ANTHROPIC_BASE_URL],override2=ctx.baseUrlOverride?.trim();override2&&markers.push(override2);let paths=new Set([detectShellRc(ctx.home,ctx.shellRcOverride)]);for(let agent2 of agents)paths.add(agent2.configPath(ctx));for(let path3 of paths){if(!await isFile(path3))continue;let current=await readFileOrNull(path3);if(current&&markers.some(m=>current.includes(m)))return!0}return!1}var MANAGED_KEY=/^(?:export|set -gx) [A-Z0-9_]+[= ]'?"?(vck_[A-Za-z0-9_-]+)/m;async function recoverStoredKey(ctx){let stored=readKeyFromKeychain();if(stored)return stored;let rc=await readFileOrNull(detectShellRc(ctx.home,ctx.shellRcOverride));if(!rc)return;let start=rc.indexOf(MANAGED_BLOCK_START),end=rc.indexOf(MANAGED_BLOCK_END);if(!(start===-1||end<=start))return rc.slice(start,end).match(MANAGED_KEY)?.[1]}async function buildSetupPlan(agents,ctx,migrations=[]){let pending=[],envExports=[],notes=[];for(let agent2 of agents){let plan=agent2.buildPlan(ctx);for(let fc of plan.fileChanges)pending.push({...fc,owner:agent2.displayName});for(let ee of plan.envExports)envExports.some(x=>x.name===ee.name)||envExports.push(ee);plan.notes.length&&notes.push({id:agent2.id,displayName:agent2.displayName,notes:plan.notes,actionRequired:plan.actionRequired??!1})}let shellRcPath;if(envExports.length&&process.platform==="win32"&&!ctx.shellRcOverride)notes.push({id:"environment",displayName:"Environment",actionRequired:!1,notes:[`Automatic shell setup is not supported on Windows. Set ${envExports.map(e2=>e2.name).join(", ")} to your API key in your environment.`]});else if(envExports.length){shellRcPath=detectShellRc(ctx.home,ctx.shellRcOverride);let body=envBlockBody(envExports,ctx.useKeychain,shellRcPath.endsWith(".fish")),writtenNames=new Set(envExports.map(e2=>e2.name));pending.push({path:shellRcPath,label:"Shell environment",format:"shell",owner:"Environment",transform:current=>{let preserved=preservedEnvLines(current,writtenNames);return upsertManagedBlock(current,preserved.length>0?`${body}
@@ -149,12 +149,12 @@ ${sections.join(`
149
149
  `),{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)}
150
150
  `),{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)}
151
151
  `),{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)}
152
- `),{exitCode:1,outcome:"failed"};let migrated=args.promptMode?{results:[],errors:[]}:await applySessionMigrations(previewPlan);if(migrated.errors.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"session_migration_failed",message:"No agent configuration was changed because one or more Codex Desktop session copies failed. Original sessions were left unchanged.",configured:[],migrated:migrated.results,skipped:[...skipped,...migrationSkips(migrated.errors)],warnings:args.warnings}),{exitCode:1,outcome:"failed"};if(applicable.length===0&&errored.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"unparseable_config",message:"Copied the eligible sessions, but couldn't write any agent configurations.",configured:[],migrated:migrated.results,skipped,warnings:args.warnings}),{exitCode:1,outcome:"failed"};let key;try{key=args.keySource?args.keySource.key:await args.createKey()}catch(err){throw isAPIError(err)&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:err.status===403?"forbidden":AGENT_REASON.API_ERROR,message:err.message,hint:`Session migrations: ${JSON.stringify(migrated.results)}`}),err}let useKeychain=args.useKeychain&&storeKeyInKeychain(key),finalPlan=await buildSetupPlan(selected,{apiKey:key,home,useKeychain,overrides:args.overrides,shellRcOverride:args.shellRcOverride,baseUrlOverride:args.baseUrlOverride,topModels:args.topModels,gatewayModels:args.gatewayModels},previewPlan.migrations);if(args.promptMode)return useKeychain?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"agent_prompt",message:"Created the AI Gateway key and generated an agent prompt. No files were written.",prompt:buildAgentPrompt(finalPlan,key),configured:[],skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line2=>`${n.displayName}: ${line2}`))},null,2)}
152
+ `),{exitCode:1,outcome:"failed"};let migrated=args.promptMode?{results:[],errors:[]}:await applySessionMigrations(previewPlan);if(migrated.errors.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"session_migration_failed",message:"No agent configuration was changed because one or more Codex Desktop session copies failed. Original sessions were left unchanged.",configured:[],migrated:migrated.results,skipped:[...skipped,...migrationSkips(migrated.errors)],warnings:args.warnings}),{exitCode:1,outcome:"failed"};if(applicable.length===0&&errored.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"unparseable_config",message:"Copied the eligible sessions, but couldn't write any agent configurations.",configured:[],migrated:migrated.results,skipped,warnings:args.warnings}),{exitCode:1,outcome:"failed"};let key;try{key=args.keySource?args.keySource.key:await args.createKey()}catch(err){throw isAPIError(err)&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:err.status===403?"forbidden":AGENT_REASON.API_ERROR,message:err.message,hint:`Session migrations: ${JSON.stringify(migrated.results)}`}),err}let useKeychain=args.useKeychain&&storeKeyInKeychain(key),finalPlan=await buildSetupPlan(selected,{apiKey:key,tokenPass:args.tokenPass,home,useKeychain,overrides:args.overrides,shellRcOverride:args.shellRcOverride,baseUrlOverride:args.baseUrlOverride,topModels:args.topModels,gatewayModels:args.gatewayModels},previewPlan.migrations);if(args.promptMode)return useKeychain?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"agent_prompt",message:"Created the AI Gateway key and generated an agent prompt. No files were written.",prompt:buildAgentPrompt(finalPlan,key),configured:[],skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line2=>`${n.displayName}: ${line2}`))},null,2)}
153
153
  `),{exitCode:0,outcome:"agent_prompt"}):(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"keychain_error",message:"The `--apply prompt` mode needs the key in the macOS Keychain, but storing it failed, so no prompt was produced.",skipped,warnings:args.warnings},null,2)}
154
154
  `),{exitCode:1,outcome:"failed"});let results=await applyPlan(finalPlan,{backup});return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"coding_agents_configured",message:`Configured ${results.length} ${results.length===1?"file":"files"} across ${selected.length} ${selected.length===1?"agent":"agents"} to use the AI Gateway.`,apiKey:key,configured:results.map(r=>({agent:r.owners.join(", "),file:r.path,action:r.action,backup:r.backupPath})),migrated:migrated.results,skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line2=>`${n.displayName}: ${line2}`))},null,2)}
155
155
  `),{exitCode:0,outcome:"configured"}}function migrationSkips(errors){return errors.map(error=>({target:error.agentId,reason:"session_migration_failed",message:error.message}))}function writeJson(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
156
- `)}var DEFAULT_LEADERBOARD_BASE="https://vercel.com";var LEADERBOARD_MODALITIES=["all","text","image","video"],LEADERBOARD_METRICS=["requests","tokens","spend","imageCount","videoCount"];function leaderboardBase(){return process.env.VERCEL_LEADERBOARD_URL??DEFAULT_LEADERBOARD_BASE}function buildUrl(query,format3){let params=new URLSearchParams;return params.set("dataset",query.dataset),query.modality&&params.set("modality",query.modality),params.set("format",format3),`${leaderboardBase()}/api/ai/leaderboard-export?${params.toString()}`}async function fetchLeaderboard(client,query,opts={}){return client.fetch(buildUrl(query,"json"),{method:"GET",teamOptional:!0,...opts})}async function fetchLeaderboardCsv(client,query){return(await client.fetch(buildUrl(query,"csv"),{method:"GET",teamOptional:!0,json:!1})).text()}function latestDate(rows){let max;for(let row of rows)(max===void 0||row.date>max)&&(max=row.date);return max}function availableDates(rows){return Array.from(new Set(rows.map(r=>r.date))).sort((a,b)=>a<b?1:a>b?-1:0)}function filterTimeseries(rows,options){let day=options.date??latestDate(rows);return rows.filter(row=>row.metric===options.metric&&row.date===day).sort((a,b)=>b.share_percent-a.share_percent)}var TOP_MODELS_LIMIT=10,TOP_MODELS_METRIC="spend",TOP_MODELS_MODALITY="text",MIN_USABLE_MODELS=3,DEFAULT_TIMEOUT_MS=2e3,OTHER_ROW_NAME="other";function normalizeName(name){return name.trim().toLowerCase()}function resolveTopModels(rows,catalog,limit=TOP_MODELS_LIMIT){let idByName=new Map;for(let model of catalog){if(!model.name||!model.id)continue;let key=normalizeName(model.name);idByName.has(key)?idByName.get(key)!==model.id&&idByName.set(key,null):idByName.set(key,model.id)}let nameById=new Map(catalog.map(model=>[model.id,model.name])),ranked=filterTimeseries(rows,{metric:TOP_MODELS_METRIC}),resolved=[],seen=new Set;for(let row of ranked){if(resolved.length>=limit)break;if(normalizeName(row.name)===OTHER_ROW_NAME)continue;let id2=row.slug??idByName.get(normalizeName(row.name))??void 0;!id2||seen.has(id2)||(seen.add(id2),resolved.push({id:id2,name:nameById.get(id2)??row.name}))}return resolved}function withTimeout(run3,ms47){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms47}ms`))},ms47);timer.unref?.(),run3(controller.signal).then(resolvePromise,reject).finally(()=>clearTimeout(timer))})}async function fetchTopModels(client,opts={}){let{limit=TOP_MODELS_LIMIT,timeoutMs=DEFAULT_TIMEOUT_MS}=opts;try{let fetchOpts={retry:{retries:0},bailOn429:!0},[leaderboard2,catalog]=await withTimeout(signal=>Promise.all([fetchLeaderboard(client,{dataset:"models",modality:TOP_MODELS_MODALITY},{signal,...fetchOpts}),listModels(client,{signal,...fetchOpts})]),timeoutMs),models3=resolveTopModels(leaderboard2.rows??[],catalog,limit);return models3.length<MIN_USABLE_MODELS?(output_manager_default.debug(`Leaderboard returned only ${models3.length} usable models; using the built-in list.`),null):models3}catch(err){return output_manager_default.debug(`Could not fetch the model leaderboard, using the built-in list: ${err.message}`),null}}var AiGatewayCodingAgentsSetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){if(agents&&agents.length)for(let agent2 of agents)this.trackCliOption({option:"agent",value:agent2})}trackCliFlagAll(all){all&&this.trackCliFlag("all")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliFlagReconfigure(reconfigure){reconfigure&&this.trackCliFlag("reconfigure")}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagNoBackup(noBackup){noBackup&&this.trackCliFlag("no-backup")}trackCliFlagNoSessionMigration(noSessionMigration){noSessionMigration&&this.trackCliFlag("no-session-migration")}trackCliFlagNoKeychain(noKeychain){noKeychain&&this.trackCliFlag("no-keychain")}trackCliOptionAgentConfig(agentConfig){agentConfig&&agentConfig.length&&this.trackCliOption({option:"agent-config",value:this.redactedValue})}trackCliOptionShellRc(shellRc){shellRc&&this.trackCliOption({option:"shell-rc",value:this.redactedValue})}trackCliOptionApply(apply){apply&&this.trackCliOption({option:"apply",value:apply})}trackCliOptionBaseUrl(baseUrl){baseUrl&&this.trackCliOption({option:"base-url",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function codingAgentsSetup(client,argv){return(await setupCodingAgents(client,argv)).exitCode}async function setupCodingAgents(client,argv){let telemetry2=new AiGatewayCodingAgentsSetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),{exitCode:2,outcome:"failed"}}let{flags:opts}=parsedArgs,agentFlags=opts["--agent"],all=opts["--all"],providedKey=opts["--key"],tokenPass2=opts["--token-pass"];if(tokenPass2&&parsedArgs.args.length>0){let message="Token Pass setup does not accept positional arguments. Run `vercel token-pass --help` for usage.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(message),{exitCode:2,outcome:"failed"}}let budget2=opts["--budget"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],expiration=opts["--expiration"],name=opts["--name"],reconfigure=!!(opts["--reconfigure"]||tokenPass2&&!providedKey),dryRun=opts["--dry-run"],noBackup=opts["--no-backup"],noSessionMigration=opts["--no-session-migration"],noKeychain=opts["--no-keychain"],agentConfig=opts["--agent-config"],shellRcOverride=opts["--shell-rc"],applyMode=opts["--apply"],baseUrl=opts["--base-url"],yes=opts["--yes"];telemetry2.trackCliOptionAgent(agentFlags),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionKey(providedKey),telemetry2.trackCliFlagTokenPass(tokenPass2),telemetry2.trackCliOptionBudget(budget2),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliOptionName(name),telemetry2.trackCliFlagReconfigure(opts["--reconfigure"]),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagNoBackup(noBackup),telemetry2.trackCliFlagNoSessionMigration(noSessionMigration),telemetry2.trackCliFlagNoKeychain(noKeychain),telemetry2.trackCliOptionAgentConfig(agentConfig),telemetry2.trackCliOptionShellRc(shellRcOverride),telemetry2.trackCliOptionApply(applyMode),telemetry2.trackCliOptionBaseUrl(baseUrl),telemetry2.trackCliFlagYes(yes);let machine=shouldEmitNonInteractiveCommandError(client),canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir(),wantKeychain=!noKeychain&&isKeychainAvailable();if(budget2!==void 0&&(!Number.isFinite(budget2)||budget2<1))return failValidation(client,machine,AGENT_REASON.INVALID_BUDGET,"Budget must be a positive number in dollars (minimum 1).");if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod))return failValidation(client,machine,AGENT_REASON.INVALID_REFRESH_PERIOD,`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`);if(expiration&&!isValidExpiry(expiration))return failValidation(client,machine,AGENT_REASON.INVALID_EXPIRATION,`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`);if(applyMode!==void 0&&applyMode!=="edit"&&applyMode!=="prompt")return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --apply "${applyMode}". Must be "edit" or "prompt".`);if(baseUrl!==void 0&&!isValidBaseUrl(baseUrl))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --base-url "${baseUrl}". Must be an http(s) URL.`);let flagExpiresAt=expiration&&expiration!=="none"?presetToExpiresAt(expiration):void 0;tokenPass2&&providedKey&&printWarning("Using an existing key; make sure it was created with --token-pass or Token Pass models will not use your pass.");let overrides={};for(let pair of agentConfig??[]){let eq=pair.indexOf("="),id2=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id2||!path3)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --agent-config "${pair}". Use <agent>=<path>, e.g. claude-code=/path/settings.json.`);if(!getAgentById(id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id2}" in --agent-config.`);overrides[id2]=resolve2(path3)}dryRun&&!machine&&printStatus(`${import_chalk28.default.bold("Dry run")}: previewing changes only. No files will be written and no API key will be created.`);let topModelsPromise=(agentFlags?.length?agentFlags.some(id2=>getAgentById(id2.toLowerCase())?.needsTopModels):!0)?fetchTopModels(client):Promise.resolve(null),selection=await resolveAgents({client,agentFlags,all,canPrompt:canPrompt2,yes:!!yes,home});if("error"in selection)return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:selection.reason,message:selection.error}),output_manager_default.error(selection.error),{exitCode:1,outcome:"failed"};let{selected,guidance:guidance2,unsupported}=selection;for(let note of guidance2)printWarning(note);for(let id2 of Object.keys(overrides))if(!selected.some(a=>a.id===id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id2}", which isn't selected. Add --agent ${id2} (or --all).`);let agents=selected,gatewayModels;if(selected.some(a=>a.needsModelCatalogue))try{gatewayModels=await listModels(client)}catch(err){output_manager_default.debug(`Could not fetch the gateway model catalogue: ${err.message}`)}let agentWarnings=await collectAgentWarnings(selected,{home,overrides}),machineWarnings=agentWarnings.map(e2=>({agent:e2.agent.id,code:e2.warning.code,message:formatWarningMessage(e2.warning)})),consentSkipped=[],previewKey=providedKey??KEY_PLACEHOLDER;if(agentWarnings.length>0){let explicit=!!(agentFlags&&agentFlags.length>0||all);if(canPrompt2&&!yes&&!dryRun){let declined=await promptAgentConsent(client,agentWarnings);if(declined.size>0){agents=agents.filter(a=>!declined.has(a.id));for(let agent2 of selected)declined.has(agent2.id)&&printStatus(`Skipped ${agent2.displayName} \u2014 its configuration was left untouched.`);if(agents.length===0)return printStatus("Nothing to configure. No files were changed."),{exitCode:0,outcome:"canceled"}}}else if(explicit||canPrompt2&&!yes&&dryRun){for(let{warning:warning2}of agentWarnings)printAgentWarning(warning2);output_manager_default.print(`
157
- `)}else{for(let[agent2,warnings]of groupWarningsByAgent(agentWarnings)){let message=`${warnings.map(formatWarningMessage).join(" ")} Pass --agent ${agent2.id} to configure it anyway.`;consentSkipped.push({target:agent2.id,reason:AGENT_REASON.REQUIRES_CONSENT,message}),printWarning(message)}if(agents=agents.filter(a=>!consentSkipped.some(s=>s.target===a.id)),agents.length===0&&!dryRun)return failConsent(client,machine,machineWarnings,consentSkipped)}}let sessionMigrations=[];if(!noSessionMigration){try{sessionMigrations=await planSessionMigrations(agents,{home})}catch(error){return failValidation(client,machine,"session_migration_failed",`${error instanceof Error?error.message:String(error)}. No configuration was changed. Pass --no-session-migration to leave existing sessions untouched and continue.`)}if(sessionMigrations.length>0&&canPrompt2&&!yes&&!dryRun){let count2=sessionMigrations.reduce((total,migration)=>total+migration.itemCount,0),agentNames=[...new Set(sessionMigrations.map(migration=>migration.agent))].join(" and ");await client.input.confirm(count2===1?`Copy your existing ${agentNames} Desktop session so it stays visible after switching to the AI Gateway? The original will be left unchanged.`:`Copy your ${count2} existing ${agentNames} Desktop sessions so they stay visible after switching to the AI Gateway? The originals will be left unchanged.`,!0)||(sessionMigrations=[],printStatus(`Skipped ${agentNames} Desktop session migration. Your existing sessions were left unchanged.`))}}let willCreate=!providedKey,unrecoverableKey=!1,existingKey=providedKey,keyName=name,keyBudget=budget2,keyRefresh=refreshPeriod,keyExpiresAt=flagExpiresAt,topModels=await topModelsPromise??void 0,preflightPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain:wantKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations),preflightSessionOnly=!providedKey&&!reconfigure&&preflightPlan.changes.every(change2=>change2.status==="unchanged")&&preflightPlan.migrations.length>0;if(applyMode==="prompt"&&!wantKeychain&&!preflightSessionOnly)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");if(willCreate&&!preflightSessionOnly&&agents.length>0&&(!dryRun||canPrompt2)){let promptCreate=canPrompt2&&!yes,wired=await configsPointAtGateway(agents,{apiKey:KEY_PLACEHOLDER,home,overrides,shellRcOverride,baseUrlOverride:baseUrl});if(promptCreate&&!tokenPass2){let pasted=await promptExistingKey(client,wired?"existing":"create");pasted&&(existingKey=pasted,previewKey=pasted,willCreate=!1)}else if(wired&&!reconfigure){let stored=await recoverStoredKey({home,shellRcOverride});stored?(existingKey=stored,previewKey=stored,willCreate=!1):machine||(unrecoverableKey=!0)}if(willCreate&&!unrecoverableKey){if(await ensureTeam2(client,{machine,canPrompt:canPrompt2,yes:!!yes}))return{exitCode:1,outcome:"failed"};if(promptCreate&&keyName===void 0&&(keyName=await promptKeyName(client,tokenPass2)),promptCreate){if(keyBudget===void 0&&keyRefresh===void 0){let quota=await promptQuota(client);keyBudget=quota.budget,keyRefresh=quota.refreshPeriod}keyExpiresAt===void 0&&!expiration&&(keyExpiresAt=await promptExpiry(client))}}}let useKeychain=wantKeychain;if(!preflightSessionOnly&&wantKeychain&&canPrompt2&&!yes&&(useKeychain=await promptKeychain(client)),canPrompt2&&!yes){let missing=agents.filter(a=>!overrides[a.id]&&!existsSync2(dirname6(a.configPath({apiKey:"",home}))));if(missing.length>0&&await client.input.confirm("Some agents weren't found at their default locations. Set custom config paths?",!1))for(let agent2 of missing){let resolved=agent2.configPath({apiKey:"",home}),picked=(await client.input.text({message:`${agent2.displayName} config path?`,default:resolved})).trim();picked&&resolve2(picked)!==resolved&&(overrides[agent2.id]=resolve2(picked))}}let previewPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(baseUrl&&!machine){let target=baseUrl.trim();previewPlan.changes.some(c=>c.next?.includes(target))||previewPlan.envExports.some(e2=>e2.value.includes(target))||previewPlan.notes.some(n=>n.notes.some(l=>l.includes(target)))||printWarning("--base-url has no effect for the selected agents.")}let changed=previewPlan.changes.filter(c=>c.status==="create"||c.status==="update"),errored=previewPlan.changes.filter(c=>c.status==="error"),noConfigChanges=changed.length===0&&errored.length===0,alreadyConfigured=noConfigChanges&&previewPlan.migrations.length===0,sessionOnly=!existingKey&&!reconfigure&&noConfigChanges&&previewPlan.migrations.length>0,keyOptions=resolveKeyOptions({name:keyName,tokenPass:tokenPass2,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt});if(machine)return runMachine({client,selected:agents,unsupported,warnings:machineWarnings,consentSkipped,previewPlan,dryRun:!!dryRun,backup:!noBackup,keySource:existingKey?{key:existingKey,created:!1}:null,createKey:()=>createKey(client,keyOptions),useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,home,alreadyConfigured,gatewayModels,reconfigure:!!reconfigure&&agents.length>0,promptMode:applyMode==="prompt"});if(unrecoverableKey&&changed.length>0)return printStatus("The selected agents already use the AI Gateway and the stored key could not be read, so nothing was written. Re-run with `--key <key>` to refresh them, or `--reconfigure` to create a new key."),{exitCode:0,outcome:"skipped"};if(alreadyConfigured){let skippedSome=agents.length<selected.length;if(dryRun&&agents.length===0&&consentSkipped.length>0)return printStatus(`All selected agents need explicit consent (see the warnings above) \u2014 a real run would fail. Pass ${consentSkipped.map(s=>`--agent ${s.target}`).join(" ")} (or --all) to consent. No files would be changed.`),{exitCode:0,outcome:"dry_run"};if(!dryRun&&useKeychain&&existingKey)return applyMode!=="prompt"&&await enforcePlanModes(previewPlan),storeKeyInKeychain(existingKey)?(printStatus(agents.length===0?"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key.":`${skippedSome?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`),printKey(existingKey,{keychain:!0}),{exitCode:0,outcome:"configured"}):(output_manager_default.error("Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead."),{exitCode:1,outcome:"failed"});let doReconfigure=!!reconfigure&&agents.length>0;if(!doReconfigure&&agents.length>0&&canPrompt2&&!yes&&!dryRun&&(doReconfigure=await client.input.confirm("These agents are already configured for the AI Gateway. Reconfigure them?",!1)),!doReconfigure)return!dryRun&&applyMode!=="prompt"&&await enforcePlanModes(previewPlan),printStatus(agents.length===0?"Every selected agent needs explicit consent (see the warnings above); the existing configuration already uses the AI Gateway.":`${skippedSome?"The remaining":"All selected"} agents are already configured for the AI Gateway.`),existingKey&&printKey(existingKey),{exitCode:0,outcome:"already_configured"}}if(printResolvedState({selected:agents,willCreate,name:keyOptions.name,budget:keyBudget,refreshPeriod:keyRefresh,expiresAt:keyExpiresAt,keychain:wantKeychain?useKeychain:void 0,preserveKey:sessionOnly}),printPlan(previewPlan,previewKey,{backup:!noBackup}),dryRun)return printStatus(`Dry run: no files written. Re-run without ${import_chalk28.default.bold("--dry-run")} to apply.`),{exitCode:0,outcome:"dry_run"};let agentConfigChanged=changed.filter(c=>c.format!=="shell");if(agentConfigChanged.length===0&&errored.length>0&&previewPlan.migrations.length===0)return output_manager_default.error("Couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let applyAction=applyMode==="prompt"?"copy":"apply";if(applyMode===void 0&&(changed.length>0||previewPlan.migrations.length>0)&&canPrompt2&&!yes){if(useKeychain){let choice=await client.input.select({message:"Apply these changes?",choices:[{name:"Yes, write the files now",value:"apply"},{name:"Copy a prompt for my agent",value:"copy"},{name:"Cancel",value:"cancel"}],default:"apply"});if(choice==="cancel")return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"};applyAction=choice}else if(!await client.input.confirm("Apply these changes?",!0))return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"}}if(sessionOnly){if(applyAction==="copy"&&previewPlan.migrations.length>0){let promptText=buildAgentPrompt(previewPlan,KEY_PLACEHOLDER);return emitAgentPrompt(client,promptText,applyMode==="prompt","migration"),{exitCode:0,outcome:"agent_prompt"}}dryRun||await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return printSessionMigrationReceipt(migrated2,!0),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}if(applyAction==="copy"&&!useKeychain)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");let migrated=applyAction==="apply"?await applySessionMigrations(previewPlan):{results:[],errors:[]};if(migrated.errors.length>0)return printSessionMigrationReceipt(migrated),output_manager_default.error("Session migration did not complete, so no agent configuration was changed. Rerun the command to retry, or pass --no-session-migration to set up without copying sessions."),{exitCode:1,outcome:"failed"};if(migrated.results.length>0&&printSessionMigrationReceipt(migrated,!0),applyAction==="apply"&&agentConfigChanged.length===0&&errored.length>0)return output_manager_default.error("Copied the eligible sessions, but couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let keySource;try{keySource=existingKey?{key:existingKey,created:!1}:{key:await createKey(client,keyOptions),created:!0}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1,outcome:"failed"};throw err}if(useKeychain&&!storeKeyInKeychain(keySource.key)){if(applyAction==="copy")return output_manager_default.error("Failed to store the key in the macOS Keychain, so a prompt would expose your plaintext key. Re-run and choose Apply, or pass --no-keychain to write the key to the config files."),{exitCode:1,outcome:"failed"};printWarning("Failed to store the key in the macOS Keychain; writing it to the config files instead."),useKeychain=!1}let applyPlanResult=await buildSetupPlan(agents,{apiKey:keySource.key,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(applyAction==="copy"){let promptText=buildAgentPrompt(applyPlanResult,keySource.key);return emitAgentPrompt(client,promptText,applyMode==="prompt","setup"),printKey(keySource.key,{keychain:!0,created:keySource.created}),{exitCode:0,outcome:"agent_prompt"}}let results=await applyPlan(applyPlanResult,{backup:!noBackup});if(results.length===0&&keySource.created&&(output_manager_default.print(`
156
+ `)}var DEFAULT_LEADERBOARD_BASE="https://vercel.com";var LEADERBOARD_MODALITIES=["all","text","image","video"],LEADERBOARD_METRICS=["requests","tokens","spend","imageCount","videoCount"];function leaderboardBase(){return process.env.VERCEL_LEADERBOARD_URL??DEFAULT_LEADERBOARD_BASE}function buildUrl(query,format3){let params=new URLSearchParams;return params.set("dataset",query.dataset),query.modality&&params.set("modality",query.modality),params.set("format",format3),`${leaderboardBase()}/api/ai/leaderboard-export?${params.toString()}`}async function fetchLeaderboard(client,query,opts={}){return client.fetch(buildUrl(query,"json"),{method:"GET",teamOptional:!0,...opts})}async function fetchLeaderboardCsv(client,query){return(await client.fetch(buildUrl(query,"csv"),{method:"GET",teamOptional:!0,json:!1})).text()}function latestDate(rows){let max;for(let row of rows)(max===void 0||row.date>max)&&(max=row.date);return max}function availableDates(rows){return Array.from(new Set(rows.map(r=>r.date))).sort((a,b)=>a<b?1:a>b?-1:0)}function filterTimeseries(rows,options){let day=options.date??latestDate(rows);return rows.filter(row=>row.metric===options.metric&&row.date===day).sort((a,b)=>b.share_percent-a.share_percent)}var TOP_MODELS_LIMIT=10,TOP_MODELS_METRIC="spend",TOP_MODELS_MODALITY="text",MIN_USABLE_MODELS=3,DEFAULT_TIMEOUT_MS=2e3,OTHER_ROW_NAME="other";function normalizeName(name){return name.trim().toLowerCase()}function resolveTopModels(rows,catalog,limit=TOP_MODELS_LIMIT){let idByName=new Map;for(let model of catalog){if(!model.name||!model.id)continue;let key=normalizeName(model.name);idByName.has(key)?idByName.get(key)!==model.id&&idByName.set(key,null):idByName.set(key,model.id)}let nameById=new Map(catalog.map(model=>[model.id,model.name])),ranked=filterTimeseries(rows,{metric:TOP_MODELS_METRIC}),resolved=[],seen=new Set;for(let row of ranked){if(resolved.length>=limit)break;if(normalizeName(row.name)===OTHER_ROW_NAME)continue;let id2=row.slug??idByName.get(normalizeName(row.name))??void 0;!id2||seen.has(id2)||(seen.add(id2),resolved.push({id:id2,name:nameById.get(id2)??row.name}))}return resolved}function withTimeout(run3,ms47){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms47}ms`))},ms47);timer.unref?.(),run3(controller.signal).then(resolvePromise,reject).finally(()=>clearTimeout(timer))})}async function fetchTopModels(client,opts={}){let{limit=TOP_MODELS_LIMIT,timeoutMs=DEFAULT_TIMEOUT_MS}=opts;try{let fetchOpts={retry:{retries:0},bailOn429:!0},[leaderboard2,catalog]=await withTimeout(signal=>Promise.all([fetchLeaderboard(client,{dataset:"models",modality:TOP_MODELS_MODALITY},{signal,...fetchOpts}),listModels(client,{signal,...fetchOpts})]),timeoutMs),models3=resolveTopModels(leaderboard2.rows??[],catalog,limit);return models3.length<MIN_USABLE_MODELS?(output_manager_default.debug(`Leaderboard returned only ${models3.length} usable models; using the built-in list.`),null):models3}catch(err){return output_manager_default.debug(`Could not fetch the model leaderboard, using the built-in list: ${err.message}`),null}}var AiGatewayCodingAgentsSetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){if(agents&&agents.length)for(let agent2 of agents)this.trackCliOption({option:"agent",value:agent2})}trackCliFlagAll(all){all&&this.trackCliFlag("all")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliFlagReconfigure(reconfigure){reconfigure&&this.trackCliFlag("reconfigure")}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagNoBackup(noBackup){noBackup&&this.trackCliFlag("no-backup")}trackCliFlagNoSessionMigration(noSessionMigration){noSessionMigration&&this.trackCliFlag("no-session-migration")}trackCliFlagNoKeychain(noKeychain){noKeychain&&this.trackCliFlag("no-keychain")}trackCliOptionAgentConfig(agentConfig){agentConfig&&agentConfig.length&&this.trackCliOption({option:"agent-config",value:this.redactedValue})}trackCliOptionShellRc(shellRc){shellRc&&this.trackCliOption({option:"shell-rc",value:this.redactedValue})}trackCliOptionApply(apply){apply&&this.trackCliOption({option:"apply",value:apply})}trackCliOptionBaseUrl(baseUrl){baseUrl&&this.trackCliOption({option:"base-url",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function codingAgentsSetup(client,argv){return(await setupCodingAgents(client,argv)).exitCode}async function setupCodingAgents(client,argv){let telemetry2=new AiGatewayCodingAgentsSetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),{exitCode:2,outcome:"failed"}}let{flags:opts}=parsedArgs,agentFlags=opts["--agent"],all=opts["--all"],providedKey=opts["--key"],tokenPass2=opts["--token-pass"];if(tokenPass2&&parsedArgs.args.length>0){let message="Token Pass setup does not accept positional arguments. Run `vercel token-pass --help` for usage.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(message),{exitCode:2,outcome:"failed"}}let budget2=opts["--budget"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],expiration=opts["--expiration"],name=opts["--name"],reconfigure=!!(opts["--reconfigure"]||tokenPass2&&!providedKey),dryRun=opts["--dry-run"],noBackup=opts["--no-backup"],noSessionMigration=opts["--no-session-migration"],noKeychain=opts["--no-keychain"],agentConfig=opts["--agent-config"],shellRcOverride=opts["--shell-rc"],applyMode=opts["--apply"],baseUrl=opts["--base-url"],yes=opts["--yes"];telemetry2.trackCliOptionAgent(agentFlags),telemetry2.trackCliFlagAll(all),telemetry2.trackCliOptionKey(providedKey),telemetry2.trackCliFlagTokenPass(tokenPass2),telemetry2.trackCliOptionBudget(budget2),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliOptionName(name),telemetry2.trackCliFlagReconfigure(opts["--reconfigure"]),telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagNoBackup(noBackup),telemetry2.trackCliFlagNoSessionMigration(noSessionMigration),telemetry2.trackCliFlagNoKeychain(noKeychain),telemetry2.trackCliOptionAgentConfig(agentConfig),telemetry2.trackCliOptionShellRc(shellRcOverride),telemetry2.trackCliOptionApply(applyMode),telemetry2.trackCliOptionBaseUrl(baseUrl),telemetry2.trackCliFlagYes(yes);let machine=shouldEmitNonInteractiveCommandError(client),canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir(),wantKeychain=!noKeychain&&isKeychainAvailable();if(budget2!==void 0&&(!Number.isFinite(budget2)||budget2<1))return failValidation(client,machine,AGENT_REASON.INVALID_BUDGET,"Budget must be a positive number in dollars (minimum 1).");if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod))return failValidation(client,machine,AGENT_REASON.INVALID_REFRESH_PERIOD,`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`);if(expiration&&!isValidExpiry(expiration))return failValidation(client,machine,AGENT_REASON.INVALID_EXPIRATION,`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`);if(applyMode!==void 0&&applyMode!=="edit"&&applyMode!=="prompt")return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --apply "${applyMode}". Must be "edit" or "prompt".`);if(baseUrl!==void 0&&!isValidBaseUrl(baseUrl))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --base-url "${baseUrl}". Must be an http(s) URL.`);let flagExpiresAt=expiration&&expiration!=="none"?presetToExpiresAt(expiration):void 0;tokenPass2&&providedKey&&printWarning("Using an existing key; make sure it was created with --token-pass or Token Pass models will not use your pass.");let overrides={};for(let pair of agentConfig??[]){let eq=pair.indexOf("="),id2=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path3=eq>0?pair.slice(eq+1).trim():"";if(!id2||!path3)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --agent-config "${pair}". Use <agent>=<path>, e.g. claude-code=/path/settings.json.`);if(!getAgentById(id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id2}" in --agent-config.`);overrides[id2]=resolve2(path3)}dryRun&&!machine&&printStatus(`${import_chalk28.default.bold("Dry run")}: previewing changes only. No files will be written and no API key will be created.`);let topModelsPromise=(agentFlags?.length?agentFlags.some(id2=>getAgentById(id2.toLowerCase())?.needsTopModels):!0)?fetchTopModels(client):Promise.resolve(null),selection=await resolveAgents({client,agentFlags,all,tokenPass:tokenPass2,canPrompt:canPrompt2,yes:!!yes,home});if("error"in selection)return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:selection.reason,message:selection.error}),output_manager_default.error(selection.error),{exitCode:tokenPass2?2:1,outcome:"failed"};let{selected,guidance:guidance2,unsupported}=selection;for(let note of guidance2)printWarning(note);for(let id2 of Object.keys(overrides))if(!selected.some(a=>a.id===id2))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id2}", which isn't selected. Add --agent ${id2} (or --all).`);let agents=selected,gatewayModels;if(selected.some(a=>a.needsModelCatalogue))try{gatewayModels=await listModels(client)}catch(err){output_manager_default.debug(`Could not fetch the gateway model catalogue: ${err.message}`)}let agentWarnings=await collectAgentWarnings(selected,{home,overrides}),machineWarnings=agentWarnings.map(e2=>({agent:e2.agent.id,code:e2.warning.code,message:formatWarningMessage(e2.warning)})),consentSkipped=[],previewKey=providedKey??KEY_PLACEHOLDER;if(agentWarnings.length>0){let explicit=!!(agentFlags&&agentFlags.length>0||all);if(canPrompt2&&!yes&&!dryRun){let declined=await promptAgentConsent(client,agentWarnings);if(declined.size>0){agents=agents.filter(a=>!declined.has(a.id));for(let agent2 of selected)declined.has(agent2.id)&&printStatus(`Skipped ${agent2.displayName} \u2014 its configuration was left untouched.`);if(agents.length===0)return printStatus("Nothing to configure. No files were changed."),{exitCode:0,outcome:"canceled"}}}else if(explicit||canPrompt2&&!yes&&dryRun){for(let{warning:warning2}of agentWarnings)printAgentWarning(warning2);output_manager_default.print(`
157
+ `)}else{for(let[agent2,warnings]of groupWarningsByAgent(agentWarnings)){let message=`${warnings.map(formatWarningMessage).join(" ")} Pass --agent ${agent2.id} to configure it anyway.`;consentSkipped.push({target:agent2.id,reason:AGENT_REASON.REQUIRES_CONSENT,message}),printWarning(message)}if(agents=agents.filter(a=>!consentSkipped.some(s=>s.target===a.id)),agents.length===0&&!dryRun)return failConsent(client,machine,machineWarnings,consentSkipped)}}let sessionMigrations=[];if(!noSessionMigration){try{sessionMigrations=await planSessionMigrations(agents,{home})}catch(error){return failValidation(client,machine,"session_migration_failed",`${error instanceof Error?error.message:String(error)}. No configuration was changed. Pass --no-session-migration to leave existing sessions untouched and continue.`)}if(sessionMigrations.length>0&&canPrompt2&&!yes&&!dryRun){let count2=sessionMigrations.reduce((total,migration)=>total+migration.itemCount,0),agentNames=[...new Set(sessionMigrations.map(migration=>migration.agent))].join(" and ");await client.input.confirm(count2===1?`Copy your existing ${agentNames} Desktop session so it stays visible after switching to the AI Gateway? The original will be left unchanged.`:`Copy your ${count2} existing ${agentNames} Desktop sessions so they stay visible after switching to the AI Gateway? The originals will be left unchanged.`,!0)||(sessionMigrations=[],printStatus(`Skipped ${agentNames} Desktop session migration. Your existing sessions were left unchanged.`))}}let willCreate=!providedKey,unrecoverableKey=!1,existingKey=providedKey,keyName=name,keyBudget=budget2,keyRefresh=refreshPeriod,keyExpiresAt=flagExpiresAt,topModels=await topModelsPromise??void 0,preflightPlan=await buildSetupPlan(agents,{apiKey:previewKey,tokenPass:tokenPass2,home,useKeychain:wantKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations),preflightSessionOnly=!providedKey&&!reconfigure&&preflightPlan.changes.every(change2=>change2.status==="unchanged")&&preflightPlan.migrations.length>0;if(applyMode==="prompt"&&!wantKeychain&&!preflightSessionOnly)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");if(willCreate&&!preflightSessionOnly&&agents.length>0&&(!dryRun||canPrompt2)){let promptCreate=canPrompt2&&!yes,wired=await configsPointAtGateway(agents,{apiKey:KEY_PLACEHOLDER,home,overrides,shellRcOverride,baseUrlOverride:baseUrl});if(promptCreate&&!tokenPass2){let pasted=await promptExistingKey(client,wired?"existing":"create");pasted&&(existingKey=pasted,previewKey=pasted,willCreate=!1)}else if(wired&&!reconfigure){let stored=await recoverStoredKey({home,shellRcOverride});stored?(existingKey=stored,previewKey=stored,willCreate=!1):machine||(unrecoverableKey=!0)}if(willCreate&&!unrecoverableKey){if(await ensureTeam2(client,{machine,canPrompt:canPrompt2,yes:!!yes,tokenPass:tokenPass2}))return{exitCode:1,outcome:"failed"};if(promptCreate&&keyName===void 0&&(keyName=await promptKeyName(client,tokenPass2)),promptCreate){if(keyBudget===void 0&&keyRefresh===void 0){let quota=await promptQuota(client);keyBudget=quota.budget,keyRefresh=quota.refreshPeriod}keyExpiresAt===void 0&&!expiration&&(keyExpiresAt=await promptExpiry(client))}}}let useKeychain=wantKeychain;if(!preflightSessionOnly&&wantKeychain&&canPrompt2&&!yes&&(useKeychain=await promptKeychain(client)),canPrompt2&&!yes){let missing=agents.filter(a=>!overrides[a.id]&&!existsSync2(dirname6(a.configPath({apiKey:"",home}))));if(missing.length>0&&await client.input.confirm("Some agents weren't found at their default locations. Set custom config paths?",!1))for(let agent2 of missing){let resolved=agent2.configPath({apiKey:"",home}),picked=(await client.input.text({message:`${agent2.displayName} config path?`,default:resolved})).trim();picked&&resolve2(picked)!==resolved&&(overrides[agent2.id]=resolve2(picked))}}let previewPlan=await buildSetupPlan(agents,{apiKey:previewKey,tokenPass:tokenPass2,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(baseUrl&&!machine){let target=baseUrl.trim();previewPlan.changes.some(c=>c.next?.includes(target))||previewPlan.envExports.some(e2=>e2.value.includes(target))||previewPlan.notes.some(n=>n.notes.some(l=>l.includes(target)))||printWarning("--base-url has no effect for the selected agents.")}let changed=previewPlan.changes.filter(c=>c.status==="create"||c.status==="update"),errored=previewPlan.changes.filter(c=>c.status==="error"),noConfigChanges=changed.length===0&&errored.length===0,alreadyConfigured=noConfigChanges&&previewPlan.migrations.length===0,sessionOnly=!existingKey&&!reconfigure&&noConfigChanges&&previewPlan.migrations.length>0,keyOptions=resolveKeyOptions({name:keyName,tokenPass:tokenPass2,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt});if(machine)return runMachine({client,selected:agents,tokenPass:tokenPass2,unsupported,warnings:machineWarnings,consentSkipped,previewPlan,dryRun:!!dryRun,backup:!noBackup,keySource:existingKey?{key:existingKey,created:!1}:null,createKey:()=>createKey(client,keyOptions),useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,home,alreadyConfigured,gatewayModels,reconfigure:!!reconfigure&&agents.length>0,promptMode:applyMode==="prompt"});if(unrecoverableKey&&changed.length>0)return printStatus("The selected agents already use the AI Gateway and the stored key could not be read, so nothing was written. Re-run with `--key <key>` to refresh them, or `--reconfigure` to create a new key."),{exitCode:0,outcome:"skipped"};if(alreadyConfigured){let skippedSome=agents.length<selected.length;if(dryRun&&agents.length===0&&consentSkipped.length>0)return printStatus(`All selected agents need explicit consent (see the warnings above) \u2014 a real run would fail. Pass ${consentSkipped.map(s=>`--agent ${s.target}`).join(" ")} (or --all) to consent. No files would be changed.`),{exitCode:0,outcome:"dry_run"};if(!dryRun&&useKeychain&&existingKey)return applyMode!=="prompt"&&await enforcePlanModes(previewPlan),storeKeyInKeychain(existingKey)?(printStatus(agents.length===0?"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key.":`${skippedSome?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`),printKey(existingKey,{keychain:!0}),{exitCode:0,outcome:"configured"}):(output_manager_default.error("Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead."),{exitCode:1,outcome:"failed"});let doReconfigure=!!reconfigure&&agents.length>0;if(!doReconfigure&&agents.length>0&&canPrompt2&&!yes&&!dryRun&&(doReconfigure=await client.input.confirm("These agents are already configured for the AI Gateway. Reconfigure them?",!1)),!doReconfigure)return!dryRun&&applyMode!=="prompt"&&await enforcePlanModes(previewPlan),printStatus(agents.length===0?"Every selected agent needs explicit consent (see the warnings above); the existing configuration already uses the AI Gateway.":`${skippedSome?"The remaining":"All selected"} agents are already configured for the AI Gateway.`),existingKey&&printKey(existingKey),{exitCode:0,outcome:"already_configured"}}if(printResolvedState({selected:agents,willCreate,name:keyOptions.name,budget:keyBudget,refreshPeriod:keyRefresh,expiresAt:keyExpiresAt,keychain:wantKeychain?useKeychain:void 0,preserveKey:sessionOnly}),printPlan(previewPlan,previewKey,{backup:!noBackup}),dryRun)return printStatus(`Dry run: no files written. Re-run without ${import_chalk28.default.bold("--dry-run")} to apply.`),{exitCode:0,outcome:"dry_run"};let agentConfigChanged=changed.filter(c=>c.format!=="shell");if(agentConfigChanged.length===0&&errored.length>0&&previewPlan.migrations.length===0)return output_manager_default.error("Couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let applyAction=applyMode==="prompt"?"copy":"apply";if(applyMode===void 0&&(changed.length>0||previewPlan.migrations.length>0)&&canPrompt2&&!yes){if(useKeychain){let choice=await client.input.select({message:"Apply these changes?",choices:[{name:"Yes, write the files now",value:"apply"},{name:"Copy a prompt for my agent",value:"copy"},{name:"Cancel",value:"cancel"}],default:"apply"});if(choice==="cancel")return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"};applyAction=choice}else if(!await client.input.confirm("Apply these changes?",!0))return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"}}if(sessionOnly){if(applyAction==="copy"&&previewPlan.migrations.length>0){let promptText=buildAgentPrompt(previewPlan,KEY_PLACEHOLDER);return emitAgentPrompt(client,promptText,applyMode==="prompt","migration"),{exitCode:0,outcome:"agent_prompt"}}dryRun||await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return printSessionMigrationReceipt(migrated2,!0),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}if(applyAction==="copy"&&!useKeychain)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");let migrated=applyAction==="apply"?await applySessionMigrations(previewPlan):{results:[],errors:[]};if(migrated.errors.length>0)return printSessionMigrationReceipt(migrated),output_manager_default.error("Session migration did not complete, so no agent configuration was changed. Rerun the command to retry, or pass --no-session-migration to set up without copying sessions."),{exitCode:1,outcome:"failed"};if(migrated.results.length>0&&printSessionMigrationReceipt(migrated,!0),applyAction==="apply"&&agentConfigChanged.length===0&&errored.length>0)return output_manager_default.error("Copied the eligible sessions, but couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let keySource;try{keySource=existingKey?{key:existingKey,created:!1}:{key:await createKey(client,keyOptions),created:!0}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1,outcome:"failed"};throw err}if(useKeychain&&!storeKeyInKeychain(keySource.key)){if(applyAction==="copy")return output_manager_default.error("Failed to store the key in the macOS Keychain, so a prompt would expose your plaintext key. Re-run and choose Apply, or pass --no-keychain to write the key to the config files."),{exitCode:1,outcome:"failed"};printWarning("Failed to store the key in the macOS Keychain; writing it to the config files instead."),useKeychain=!1}let applyPlanResult=await buildSetupPlan(agents,{apiKey:keySource.key,tokenPass:tokenPass2,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(applyAction==="copy"){let promptText=buildAgentPrompt(applyPlanResult,keySource.key);return emitAgentPrompt(client,promptText,applyMode==="prompt","setup"),printKey(keySource.key,{keychain:!0,created:keySource.created}),{exitCode:0,outcome:"agent_prompt"}}let results=await applyPlan(applyPlanResult,{backup:!noBackup});if(results.length===0&&keySource.created&&(output_manager_default.print(`
158
158
  `),printAlignedLabel("Rotated","AI Gateway API key"),printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created}),output_manager_default.print(import_chalk28.default.dim(` No config files changed.
159
159
  `))),results.length>0){let failed=new Set(errored.flatMap(c=>c.owners)),connected=selected.map(a=>a.displayName).filter(name2=>!failed.has(name2));output_manager_default.print(`
160
160
  `),printAlignedLabel("Connected",connected.join(", "),{gutter:"\u2713"});for(let result of results)printReceiptPath(result.action==="created"?"Created":"Updated",result.path);printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created})}for(let change2 of errored)printWarning(`Skipped ${change2.label} (${change2.path}): ${change2.error}. Fix or remove the file, then re-run.`);return printNotes(applyPlanResult),keySource.created&&!useKeychain&&applyPlanResult.envExports.length>0&&!applyPlanResult.shellRcPath&&client.stdout.write(`${keySource.key}
@@ -170,7 +170,7 @@ ${sections.join(`
170
170
  `;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," ")}
171
171
  `),printLicense(),0}async function runRankedLeaderboard(client,flags,telemetry2,config){telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format:format3}=formatResult;if(format3==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format3==="json"){let content=`${JSON.stringify(data,null,2)}
172
172
  `;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderRankedTable(client,data,config.label)}function renderRankedTable(client,data,label){let rows=data.rows??[];if(rows.length===0)return output_manager_default.log(`No ${label} data.`),0;let lsStamp=stamp_default(),rankedBy=rows[0]?.ranked_by;return output_manager_default.log(`${label}${rankedBy?` \xB7 ${import_chalk31.default.bold(rankedBy)}`:""} ${lsStamp()}`),client.stdout.write(`${table([["#","name","description"].map(header=>import_chalk31.default.gray(header)),...rows.map(row=>[String(row.rank),row.name,row.description?row.description:dash2()])],{align:["r","l","l"],hsep:3}).replace(/^/gm," ")}
173
- `),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-LYGYBYV3.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-K7XMFMXG.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-AV5CMKBK.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
173
+ `),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-LZJ5X3PH.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-NHACEVVC.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-QTTCSTZA.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
174
174
  `)}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," ")}
175
175
 
176
176
  `}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id2){return client.fetch(`/now/aliases/${id2}`,{method:"DELETE"})}async function findAliasByAliasOrId(client,aliasOrId){return client.fetch(`/now/aliases/${encodeURIComponent(getSafeAlias(aliasOrId))}`)}function getSafeAlias(alias2){return alias2.replace(/^https:\/\//i,"").replace(/^\.+/,"").replace(/\.+$/,"").toLowerCase()}var AliasRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentAlias(alias2){alias2&&this.trackCliArgument({arg:"alias",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,contextName=await getContextName(client),telemetryClient=new AliasRemoveTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagYes(opts["--yes"]);let[aliasOrId]=args;if(telemetryClient.trackCliArgumentAlias(aliasOrId),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("alias rm <alias>")}`)}`),2;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),2;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),2;let alias2=await findAliasByAliasOrId(client,aliasOrId);if(!alias2)return output_manager_default.error(`Alias not found by "${aliasOrId}" under ${import_chalk33.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("alias ls")} to see your aliases.`),1;let removeStamp=stamp_default();return!opts["--yes"]&&!await confirmAliasRemove(client,alias2)?(output_manager_default.log("Canceled"),0):(await removeAliasById(client,alias2.uid),output_manager_default.success(`Alias ${import_chalk33.default.bold(alias2.alias)} removed ${removeStamp()}`),0)}async function confirmAliasRemove(client,alias2){let srcUrl=alias2.deployment?import_chalk33.default.underline(alias2.deployment.url):null,tbl=table([[...srcUrl?[srcUrl]:[],import_chalk33.default.underline(alias2.alias),import_chalk33.default.gray(`${(0,import_ms3.default)(Date.now()-alias2.createdAt)} ago`)]],{hsep:4});return output_manager_default.log("The following alias will be removed permanently"),output_manager_default.print(` ${tbl}
@@ -187,18 +187,19 @@ ${sections.join(`
187
187
  `)),1}return error}var AliasSetTelemetryClient=class extends TelemetryClient{trackCliFlagDebug(flag){flag&&this.trackCliFlag("debug")}trackCliOptionLocalConfig(localConfig){localConfig&&this.trackCliOption({option:"local-config",value:this.redactedValue})}trackCliArgumentIdOrUrl(idOrUrl){idOrUrl&&this.trackCliArgument({arg:"id-or-url",value:this.redactedValue})}trackCliArgumentAlias(customDomain){customDomain&&this.trackCliArgument({arg:"custom-domain",value:this.redactedValue})}};async function set3(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,setStamp=stamp_default(),{localConfig}=client,telemetryClient=new AliasSetTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagDebug(opts["--debug"]),telemetryClient.trackCliOptionLocalConfig(opts["--local-config"]);let{contextName,user}=await getScope(client);if(args.length>2)return output_manager_default.error(`${getCommandName("alias <id-or-url> <target>")} accepts at most two arguments`),1;if(args.length>=1&&!isValidName(args[0]))return output_manager_default.error(`The provided argument "${args[0]}" is not a valid ID or URL`),2;if(args.length>=2&&!isValidName(args[1]))return output_manager_default.error(`The provided argument "${args[1]}" is not a valid domain`),2;if(args.length===0)return output_manager_default.error(`To ship to production, optionally configure your domains (${link_default("https://vercel.link/domain-configuration")}) and run ${getCommandName("--prod")}.`),1;if(args.length===1){let[aliasTarget2]=args;telemetryClient.trackCliArgumentAlias(aliasTarget2);let deployment=handleCertError(await getDeploymentForAlias(client,opts["--local-config"],user,contextName,localConfig));if(deployment===1)return deployment;if(deployment instanceof Error)return output_manager_default.error(deployment.message),1;if(!deployment)return output_manager_default.error("Couldn't find a deployment to alias. Please provide one as an argument."),1;let targets2=getTargetsForAlias(args,localConfig);if(targets2 instanceof Error)return output_manager_default.prettyError(targets2),1;for(let target of targets2){output_manager_default.log(`Assigning alias ${target} to deployment ${deployment.url}`);let record2=await assignAlias(client,deployment.id,target,contextName),handleResult2=handleSetupDomainError(handleCreateAliasError(record2));if(handleResult2===1)return 1;output_manager_default.success(`${import_chalk37.default.bold(`${isWildcardAlias(target)?"":"https://"}${handleResult2.alias}`)} now points to https://${deployment.url} ${setStamp()}`)}return 0}let[idOrUrl,aliasTarget]=args;telemetryClient.trackCliArgumentIdOrUrl(idOrUrl),telemetryClient.trackCliArgumentAlias(aliasTarget),output_manager_default.log(`Assigning alias ${aliasTarget} to ${idOrUrl}`);let isWildcard=isWildcardAlias(aliasTarget),idOrUrlForRequest=idOrUrl.includes(".")?toHost(idOrUrl):idOrUrl,record=await assignAlias(client,idOrUrlForRequest,aliasTarget,contextName),handleResult=handleSetupDomainError(handleCreateAliasError(record));if(handleResult===1)return 1;let prefix=isWildcard?"":"https://";return output_manager_default.success(`${import_chalk37.default.bold(`${prefix}${handleResult.alias}`)} now points to ${idOrUrl} ${setStamp()}`),0}function handleSetupDomainError(error){return error instanceof DomainPermissionDenied?(output_manager_default.error(`You don't have permissions over domain ${import_chalk37.default.underline(error.meta.domain)} under ${import_chalk37.default.bold(error.meta.context)}.`),1):error instanceof UserAborted?(output_manager_default.error("User canceled."),1):error instanceof DomainNotFound?(output_manager_default.error("You should buy the domain before aliasing."),1):error instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported.`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainNotAvailable?(output_manager_default.error(`The domain ${error.meta.domain} is not available to be purchased.`),1):error instanceof UnexpectedDomainPurchaseError?(output_manager_default.error("There was an unexpected error while purchasing the domain."),1):error instanceof DomainAlreadyExists?(output_manager_default.error(`The domain ${error.meta.domain} exists for a different account.`),1):error instanceof DomainPurchasePending?(output_manager_default.error(`The domain ${error.meta.domain} is processing and will be available once the order is completed.`),output_manager_default.print(` An email will be sent upon completion so you can alias to your new domain.
188
188
  `),1):error instanceof SourceNotFound?(output_manager_default.error("You can't purchase the domain you're aliasing to since you have no valid payment method."),output_manager_default.print(` Please add a valid payment method and retry.
189
189
  `),1):error instanceof DomainPaymentError?(output_manager_default.error("You can't purchase the domain you're aliasing to since your card was declined."),output_manager_default.print(` Please add a valid payment method and retry.
190
- `),1):error instanceof TLDNotSupportedViaCLI?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported via the CLI. Use the REST API or the dashboard to purchase.`),1):error instanceof DomainPurchaseRefundFailed||error instanceof DomainPurchaseRefunded||error instanceof DomainChargeOutcomeUnknown||error instanceof DomainPriceChanged?(output_manager_default.error(error.message),1):error}function handleCreateAliasError(errorOrResult){let error=handleCertError(errorOrResult);return error===1?error:error instanceof AliasInUse?(output_manager_default.error(`The alias ${import_chalk37.default.dim(error.meta.alias)} is a deployment URL or it's in use by a different team.`),1):error instanceof DeploymentNotFound?(output_manager_default.error(`Failed to find ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof InvalidAlias?(output_manager_default.error("Invalid alias. Please confirm that the alias you provided is a valid hostname. Note: For `vercel.app`, only sub and sub-sub domains are supported."),1):error instanceof DeploymentPermissionDenied?(output_manager_default.error(`No permission to access ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof CertMissing?(output_manager_default.error(`There is no certificate for the domain ${error.meta.domain} and it could not be created.`),output_manager_default.log(`Please generate a new certificate manually with ${getCommandName(`certs issue ${error.meta.domain}`)}`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainPermissionDenied||error instanceof DeploymentFailedAliasImpossible||error instanceof InvalidDeploymentId?(output_manager_default.error(error.message),1):error instanceof DeploymentNotReady?(output_manager_default.error(error.message),1):error}function getTargetsForAlias(args,{alias:alias2}={}){return args.length?[args[args.length-1]].map(target=>target.indexOf(".")!==-1?toHost(target):target).filter(x=>!!x&&typeof x=="string"):alias2?typeof alias2!="string"&&!Array.isArray(alias2)?new InvalidAliasInConfig(alias2):typeof alias2=="string"?[alias2]:alias2:new NoAliasInConfig}var AliasTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}};var COMMAND_CONFIG13={ls:getCommandAliases(listSubcommand4),rm:getCommandAliases(removeSubcommand2),set:getCommandAliases(setSubcommand)};async function alias(client){let telemetry2=new AliasTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(aliasCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG13),needHelp=parsedArguments.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("alias"),output_manager_default.print(help(aliasCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:aliasCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(listSubcommand4),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args))}}var import_open=__toESM(require_open(),1),import_execa=__toESM(require_execa(),1),import_pluralize=__toESM(require_pluralize(),1),import_chalk38=__toESM(require_source(),1);import{resolve as resolve3}from"path";import{URLSearchParams as URLSearchParams2,parse as parse4}from"url";function hasScheme(url){return url.startsWith("http://")||url.startsWith("https://")}function normalizeURL(url){return hasScheme(url)?url:`https://${url}`}var BisectTelemetryClient=class extends TelemetryClient{trackCliOptionGood(good2){good2&&this.trackCliOption({option:"good",value:this.redactedValue})}trackCliOptionBad(bad2){bad2&&this.trackCliOption({option:"bad",value:this.redactedValue})}trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionRun(run3){run3&&this.trackCliOption({option:"run",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}};async function bisect(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(bisectCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new BisectTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("bisect"),output_manager_default.print(help(bisectCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliOptionGood(parsedArgs.flags["--good"]),telemetry2.trackCliOptionBad(parsedArgs.flags["--bad"]),telemetry2.trackCliOptionPath(parsedArgs.flags["--path"]),telemetry2.trackCliOptionRun(parsedArgs.flags["--run"]),telemetry2.trackCliFlagOpen(parsedArgs.flags["--open"]);let scope=await getScope(client),{contextName}=scope,bad2=parsedArgs.flags["--bad"]||await client.input.text({message:"Specify a URL where the bug occurs:",validate:val=>val?!0:"A URL must be provided"}),good2=parsedArgs.flags["--good"]||await client.input.text({message:"Specify a URL where the bug does not occur:",validate:val=>val?!0:"A URL must be provided"}),subpath=parsedArgs.flags["--path"]||"",run3=parsedArgs.flags["--run"]||"",openEnabled=parsedArgs.flags["--open"]||!1;run3&&(run3=resolve3(run3)),bad2=normalizeURL(bad2);let parsed=parse4(bad2);if(!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;if(bad2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&(subpath&&subpath!==parsed.path?output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} in favor of \`--path\` argument ${import_chalk38.default.bold(subpath)}`):subpath=parsed.path),good2=normalizeURL(good2),parsed=parse4(good2),!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;good2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&subpath&&subpath!==parsed.path&&output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} which does not match ${import_chalk38.default.bold(subpath)}`),subpath||(subpath=await client.input.text({message:"Specify the URL subpath where the bug occurs:",validate:val=>val?!0:"A subpath must be provided"})),output_manager_default.spinner("Retrieving deployments\u2026");let badDeployment=await getDeployment(client,contextName,bad2).catch(err=>err);if(badDeployment){if(badDeployment instanceof Error)return badDeployment.message+=` when requesting bad deployment "${normalizeURL(bad2)}"`,output_manager_default.prettyError(badDeployment),1;bad2=badDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("bad")} Deployment: ${bad2}`),1;let goodDeployment=await getDeployment(client,contextName,good2).catch(err=>err);if(goodDeployment){if(goodDeployment instanceof Error)return goodDeployment.message+=` when requesting good deployment "${normalizeURL(good2)}"`,output_manager_default.prettyError(goodDeployment),1;good2=goodDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("good")} Deployment: ${good2}`),1;let{projectId}=badDeployment;if(projectId!==goodDeployment.projectId)return output_manager_default.error("Good and Bad deployments must be from the same Project"),1;if(badDeployment.url===goodDeployment.url)return output_manager_default.error("Good and Bad deployments must be different"),1;if(badDeployment.createdAt<goodDeployment.createdAt)return output_manager_default.error("Good deployment must be older than the Bad deployment"),1;if(badDeployment.target!==goodDeployment.target)return output_manager_default.error(`Bad deployment target "${badDeployment.target||"preview"}" does not match good deployment target "${goodDeployment.target||"preview"}"`),1;let deployments=[],query=new URLSearchParams2;query.set("projectId",projectId),badDeployment.target&&query.set("target",badDeployment.target),query.set("state","READY"),query.set("until",String(badDeployment.createdAt+1));for await(let chunk of client.fetchPaginated(`/v6/deployments?${query}`,{accountId:badDeployment.ownerId})){let newDeployments=chunk.deployments,hasGood=!1;for(let i=0;i<newDeployments.length;i++)if(newDeployments[i].url===good2){newDeployments=newDeployments.slice(0,i),hasGood=!0;break}if(deployments=deployments.concat(newDeployments),hasGood)break}if(!deployments.length)return output_manager_default.error("Cannot bisect because this project does not have any deployments"),1;let lastBad=deployments.shift();for(;deployments.length>0;){output_manager_default.print(`
190
+ `),1):error instanceof TLDNotSupportedViaCLI?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported via the CLI. Use the REST API or the dashboard to purchase.`),1):error instanceof DomainPurchaseRefundFailed||error instanceof DomainPurchaseRefunded||error instanceof DomainChargeOutcomeUnknown||error instanceof DomainPriceChanged?(output_manager_default.error(error.message),1):error}function handleCreateAliasError(errorOrResult){let error=handleCertError(errorOrResult);return error===1?error:error instanceof AliasInUse?(output_manager_default.error(`The alias ${import_chalk37.default.dim(error.meta.alias)} is a deployment URL or it's in use by a different team.`),1):error instanceof DeploymentNotFound?(output_manager_default.error(`Failed to find ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof InvalidAlias?(output_manager_default.error("Invalid alias. Please confirm that the alias you provided is a valid hostname. Note: For `vercel.app`, only sub and sub-sub domains are supported."),1):error instanceof DeploymentPermissionDenied?(output_manager_default.error(`No permission to access ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof CertMissing?(output_manager_default.error(`There is no certificate for the domain ${error.meta.domain} and it could not be created.`),output_manager_default.log(`Please generate a new certificate manually with ${getCommandName(`certs issue ${error.meta.domain}`)}`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainPermissionDenied||error instanceof DeploymentFailedAliasImpossible||error instanceof InvalidDeploymentId?(output_manager_default.error(error.message),1):error instanceof DeploymentNotReady?(output_manager_default.error(error.message),1):error}function getTargetsForAlias(args,{alias:alias2}={}){return args.length?[args[args.length-1]].map(target=>target.indexOf(".")!==-1?toHost(target):target).filter(x=>!!x&&typeof x=="string"):alias2?typeof alias2!="string"&&!Array.isArray(alias2)?new InvalidAliasInConfig(alias2):typeof alias2=="string"?[alias2]:alias2:new NoAliasInConfig}var AliasTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}};var COMMAND_CONFIG13={ls:getCommandAliases(listSubcommand4),rm:getCommandAliases(removeSubcommand2),set:getCommandAliases(setSubcommand)};async function alias(client){let telemetry2=new AliasTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(aliasCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG13),needHelp=parsedArguments.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("alias"),output_manager_default.print(help(aliasCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:aliasCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(listSubcommand4),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args))}}var import_open=__toESM(require_open(),1),import_execa=__toESM(require_execa(),1),import_pluralize=__toESM(require_pluralize(),1),import_chalk38=__toESM(require_source(),1);import{resolve as resolve3}from"path";import{URLSearchParams as URLSearchParams2,parse as parse4}from"url";function hasScheme(url){return url.startsWith("http://")||url.startsWith("https://")}function normalizeURL(url){return hasScheme(url)?url:`https://${url}`}var BisectTelemetryClient=class extends TelemetryClient{trackCliOptionGood(good2){good2&&this.trackCliOption({option:"good",value:this.redactedValue})}trackCliOptionBad(bad2){bad2&&this.trackCliOption({option:"bad",value:this.redactedValue})}trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionRun(run3){run3&&this.trackCliOption({option:"run",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}};async function bisect(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(bisectCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new BisectTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("bisect"),output_manager_default.print(help(bisectCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliOptionGood(parsedArgs.flags["--good"]),telemetry2.trackCliOptionBad(parsedArgs.flags["--bad"]),telemetry2.trackCliOptionPath(parsedArgs.flags["--path"]),telemetry2.trackCliOptionRun(parsedArgs.flags["--run"]),telemetry2.trackCliFlagOpen(parsedArgs.flags["--open"]);let scope=await getScope(client),{contextName}=scope,bad2=parsedArgs.flags["--bad"]||await client.input.text({message:"Specify a URL where the bug occurs:",validate:val=>val?!0:"A URL must be provided"}),good2=parsedArgs.flags["--good"]||await client.input.text({message:"Specify a URL where the bug does not occur:",validate:val=>val?!0:"A URL must be provided"}),subpath=parsedArgs.flags["--path"]||"",run3=parsedArgs.flags["--run"]||"",openEnabled=parsedArgs.flags["--open"]||!1;run3&&(run3=resolve3(run3)),bad2=normalizeURL(bad2);let parsed=parse4(bad2);if(!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;if(bad2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&(subpath&&subpath!==parsed.path?output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} in favor of \`--path\` argument ${import_chalk38.default.bold(subpath)}`):subpath=parsed.path),good2=normalizeURL(good2),parsed=parse4(good2),!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;good2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&subpath&&subpath!==parsed.path&&output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} which does not match ${import_chalk38.default.bold(subpath)}`),subpath||(subpath=await client.input.text({message:"Specify the URL subpath where the bug occurs:",validate:val=>val?!0:"A subpath must be provided"})),output_manager_default.spinner("Retrieving deployments\u2026");let badDeployment=await getDeployment(client,contextName,bad2).catch(err=>err);if(badDeployment){if(badDeployment instanceof Error)return badDeployment.message+=` when requesting bad deployment "${normalizeURL(bad2)}"`,output_manager_default.prettyError(badDeployment),1;bad2=badDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("bad")} Deployment: ${bad2}`),1;let goodDeployment=await getDeployment(client,contextName,good2).catch(err=>err);if(goodDeployment){if(goodDeployment instanceof Error)return goodDeployment.message+=` when requesting good deployment "${normalizeURL(good2)}"`,output_manager_default.prettyError(goodDeployment),1;good2=goodDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("good")} Deployment: ${good2}`),1;let{projectId}=badDeployment;if(projectId!==goodDeployment.projectId)return output_manager_default.error("Good and Bad deployments must be from the same Project"),1;if(badDeployment.url===goodDeployment.url)return output_manager_default.error("Good and Bad deployments must be different"),1;if(badDeployment.createdAt<goodDeployment.createdAt)return output_manager_default.error("Good deployment must be older than the Bad deployment"),1;if(badDeployment.target!==goodDeployment.target)return output_manager_default.error(`Bad deployment target "${badDeployment.target||"preview"}" does not match good deployment target "${goodDeployment.target||"preview"}"`),1;let deployments=[],query=new URLSearchParams2;query.set("projectId",projectId),badDeployment.target&&query.set("target",badDeployment.target),query.set("state","READY"),query.set("until",String(badDeployment.createdAt+1));for await(let chunk2 of client.fetchPaginated(`/v6/deployments?${query}`,{accountId:badDeployment.ownerId})){let newDeployments=chunk2.deployments,hasGood=!1;for(let i=0;i<newDeployments.length;i++)if(newDeployments[i].url===good2){newDeployments=newDeployments.slice(0,i),hasGood=!0;break}if(deployments=deployments.concat(newDeployments),hasGood)break}if(!deployments.length)return output_manager_default.error("Cannot bisect because this project does not have any deployments"),1;let lastBad=deployments.shift();for(;deployments.length>0;){output_manager_default.print(`
191
191
  `);let middleIndex=Math.floor(deployments.length/2),deployment=deployments[middleIndex],rem=(0,import_pluralize.default)("deployment",deployments.length,!0),steps=Math.floor(Math.log2(deployments.length)),pSteps=(0,import_pluralize.default)("step",steps,!0);output_manager_default.log(import_chalk38.default.magenta(`${import_chalk38.default.bold("Bisecting:")} ${rem} left to test after this (roughly ${pSteps})`),import_chalk38.default.magenta);let testUrl=`https://${deployment.url}${subpath}`;output_manager_default.log(`${import_chalk38.default.bold("Deployment URL:")} ${link_default(testUrl)}`),output_manager_default.log(`${import_chalk38.default.bold("Date:")} ${formatDate(deployment.createdAt)}`);let commit2=getCommit(deployment);if(commit2){let shortSha=commit2.sha.substring(0,7),firstLine=commit2.message?.split(`
192
192
  `)[0];output_manager_default.log(`${import_chalk38.default.bold("Commit:")} [${shortSha}] ${firstLine}`)}let action;if(run3){let proc=await(0,import_execa.default)(run3,[testUrl],{stdio:"inherit",reject:!1,env:{...process.env,HOST:deployment.url,URL:testUrl}});if(proc instanceof Error&&typeof proc.exitCode!="number")return output_manager_default.prettyError(proc),1;let{exitCode:exitCode2}=proc,color;exitCode2===0?(color=import_chalk38.default.green,action="good"):exitCode2===125?(action="skip",color=import_chalk38.default.grey):(action="bad",color=import_chalk38.default.red),output_manager_default.log(`Run script returned exit code ${import_chalk38.default.bold(String(exitCode2))}: ${color(action)}`)}else openEnabled&&await(0,import_open.default)(testUrl),action=await client.input.expand({message:"Select an action:",choices:[{key:"g",name:"Good",value:"good"},{key:"b",name:"Bad",value:"bad"},{key:"s",name:"Skip",value:"skip"}]});action==="good"?deployments=deployments.slice(0,middleIndex):action==="bad"?(lastBad=deployment,deployments=deployments.slice(middleIndex+1)):action==="skip"&&deployments.splice(middleIndex,1)}output_manager_default.print(`
193
193
  `);let result=[import_chalk38.default.bold(`The first bad deployment is: ${link_default(`https://${lastBad.url}`)}`),"",` ${import_chalk38.default.bold("Date:")} ${formatDate(lastBad.createdAt)}`],commit=getCommit(lastBad);if(commit){let shortSha=commit.sha.substring(0,7),firstLine=commit.message?.split(`
194
194
  `)[0];result.push(` ${import_chalk38.default.bold("Commit:")} [${shortSha}] ${firstLine}`)}return result.push(`${import_chalk38.default.bold("Inspect:")} ${link_default(lastBad.inspectorUrl)}`),output_manager_default.print(box(result.join(`
195
195
  `))),output_manager_default.print(`
196
- `),0}function getCommit(deployment){let sha=deployment.meta?.githubCommitSha||deployment.meta?.gitlabCommitSha||deployment.meta?.bitbucketCommitSha;if(!sha)return null;let message=deployment.meta?.githubCommitMessage||deployment.meta?.gitlabCommitMessage||deployment.meta?.bitbucketCommitMessage;return{sha,message}}import*as blob from"@vercel/blob";var import_chalk40=__toESM(require_source(),1),import_ms5=__toESM(require_ms(),1);var BlobListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:next})}trackCliOptionCursor(cursor2){cursor2&&this.trackCliOption({option:"cursor",value:cursor2})}trackCliOptionPrefix(prefix){prefix&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliOptionMode(mode){mode&&this.trackCliOption({option:"mode",value:mode})}};import{resolve as resolve4}from"node:path";var import_chalk39=__toESM(require_source(),1),listItem=(msg,n)=>(n||(n="-"),Number(n)&&(n+="."),`${(0,import_chalk39.default)(n.toString())} ${msg}`),list_item_default=listItem;function findFlagValue(argv,flag){let eqPrefix=`${flag}=`,result;for(let i=0;i<argv.length;i++){let arg2=argv[i];arg2===flag?result=argv[i+1]:arg2.startsWith(eqPrefix)&&(result=arg2.slice(eqPrefix.length))}return result}var ErrorMessage=`No Vercel Blob credentials found. To fix this issue, choose one of the following options:
196
+ `),0}function getCommit(deployment){let sha=deployment.meta?.githubCommitSha||deployment.meta?.gitlabCommitSha||deployment.meta?.bitbucketCommitSha;if(!sha)return null;let message=deployment.meta?.githubCommitMessage||deployment.meta?.gitlabCommitMessage||deployment.meta?.bitbucketCommitMessage;return{sha,message}}import*as blob from"@vercel/blob";var import_chalk40=__toESM(require_source(),1),import_ms5=__toESM(require_ms(),1);var BlobListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:next})}trackCliOptionCursor(cursor2){cursor2&&this.trackCliOption({option:"cursor",value:cursor2})}trackCliOptionPrefix(prefix){prefix&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliOptionMode(mode){mode&&this.trackCliOption({option:"mode",value:mode})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};import{resolve as resolve4}from"node:path";var import_chalk39=__toESM(require_source(),1),listItem=(msg,n)=>(n||(n="-"),Number(n)&&(n+="."),`${(0,import_chalk39.default)(n.toString())} ${msg}`),list_item_default=listItem;function findFlagValue(argv,flag){let eqPrefix=`${flag}=`,result;for(let i=0;i<argv.length;i++){let arg2=argv[i];arg2===flag?result=argv[i+1]:arg2.startsWith(eqPrefix)&&(result=arg2.slice(eqPrefix.length))}return result}var ErrorMessage=`No Vercel Blob credentials found. To fix this issue, choose one of the following options:
197
197
  ${list_item_default(`Pass the read-write token as an option: ${getCommandName("blob list --rw-token BLOB_READ_WRITE_TOKEN")}`,1)}
198
198
  ${list_item_default(`Pass OIDC credentials as options: ${getCommandName("blob list --oidc-token VERCEL_OIDC_TOKEN --store-id BLOB_STORE_ID")}`,2)}
199
199
  ${list_item_default(`Set OIDC credentials as environment variables: ${cmd(`VERCEL_OIDC_TOKEN=... BLOB_STORE_ID=... ${packageName} blob list`)}`,3)}
200
200
  ${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)}
201
- ${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[,,,id2]=auth.token.split("_");return id2?`store_${id2}`: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(listSubcommand28.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}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
+ ${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[,,,id2]=auth.token.split("_");return id2?`store_${id2}`: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(listSubcommand28.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}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,"--json":asJson}=flags,cursor2=next??legacyCursor;telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionCursor(legacyCursor),telemetryClient.trackCliOptionPrefix(prefix),telemetryClient.trackCliOptionMode(modeFlag),telemetryClient.trackCliFlagJson(asJson);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"),asJson||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}if(output_manager_default.stopSpinner(),asJson){let result={blobs:list30.blobs,..."folders"in list30?{folders:list30.folders}:{},pagination:{next:list30.cursor??null}};return client.stdout.write(`${JSON.stringify(result,null,2)}
202
+ `),0}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(`
202
203
  ${tablePrint}
203
204
 
204
205
  `):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),2}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>")}`),2;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>")}`),2;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),2}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>")}`),2;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)}
@@ -234,7 +235,7 @@ ${instruction}:
234
235
  ${command2}`)}function writeChargeAction(client,json,payload){outputActionRequired(client,payload,1),json&&client.stdout.write(`${JSON.stringify(payload,null,2)}
235
236
  `)}function reportUsageError(client,reason,message){let exitCode2=getExitCodeForReason(reason);return outputAgentError(client,{status:"error",reason,message},exitCode2),output_manager_default.error(message),exitCode2}function reportChargeFailure(client,json,payload,opts={}){let document={status:"error",...payload,...opts.apiMessage&&{data:{...payload.data,apiMessage:opts.apiMessage}}};outputAgentError(client,document,1),json&&client.stdout.write(`${JSON.stringify(document,null,2)}
236
237
  `);let headline=opts.apiMessage?`${payload.message}
237
- ${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(headline,opts.recovery.instruction,opts.recovery.command):output_manager_default.fatal(headline),1}function reportUnknownOutcome(client,json,opts){let done=opts.verb==="buy"?"was bought":"was renewed",action=opts.verb==="buy"?"purchase":"renewal";return reportChargeFailure(client,json,{reason:AGENT_REASON.UNKNOWN_OUTCOME,message:`Can't confirm whether ${opts.domain} ${done}. Check the domain before running ${opts.verb} again, or you may be charged twice.`,next:[{command:opts.inspectCommand,when:`Check whether the ${action} went through before retrying`}]},{recovery:{instruction:`Check whether the ${action} went through`,command:opts.inspectCommand}})}function refuseUnnamedTeam(client,json,opts){let{verb,domain:domain2,team}=opts,status6=chargeTeamStatus(client,team.id);if(status6==="named")return;if(status6==="conflict")return reportChargeFailure(client,json,{reason:AGENT_REASON.CONFLICT,message:`Can't ${verb} ${domain2}. VERCEL_ORG_ID names a different team than ${team.slug}, the team this run would charge. Nothing was charged.`,userActionRequired:!0,hint:"Set VERCEL_ORG_ID to the team to charge, or unset it and pass --scope with that team.",data:{domain:domain2,team:team.slug}});let message=`Can't ${verb} ${domain2} without naming the team to charge in non-interactive mode. It would charge ${team.slug}. Nothing was charged.`;return writeChargeAction(client,json,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_SCOPE,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message,userActionRequired:!0,data:{domain:domain2,team:team.slug},missing:["--scope"],next:[{command:opts.nextCommand,when:`Only after a human approves charging ${team.slug}`}]}),printChargeRecovery(message,"Once a person approves the team to charge, run",opts.nextCommand),1}function reportPriceChanged(client,opts){let{verb,domain:domain2,amount,price:price2,nextCommand}=opts;return reportChargeFailure(client,opts.json,{reason:AGENT_REASON.PRICE_CHANGED,message:price2===void 0?`Can't ${verb} ${domain2}. Its price changed from ${formatUsd(amount)}. Nothing was charged.`:`Can't ${verb} ${domain2}. Its price is ${formatUsd(price2)}, not ${formatUsd(amount)}. Nothing was charged.`,userActionRequired:!0,data:price2===void 0?{domain:domain2}:{domain:domain2,amount:price2,currency:"USD"},next:[{command:nextCommand,when:price2===void 0?"Get the current price, then ask a human to approve it":`Only after a human approves the price of ${formatUsd(price2)}`}]},{recovery:{instruction:price2===void 0?"Get the current price":"Once a person approves the price, run",command:nextCommand}})}function buildBuyCommand(client,domain2,opts){let parts=[`domains buy ${domain2}`];opts.team&&parts.push(`--scope ${opts.team}`),opts.amount!==void 0&&parts.push(`--amount ${formatAmountArg(opts.amount)}`),opts.useBilling&&parts.push("--use-billing-details");for(let{field,flag}of CONTACT_FIELDS){let value=opts.contact[field];value!==void 0?parts.push(`${flag} ${quoteArg(value)}`):opts.missing.includes(field)&&parts.push(`${flag} <${flag.slice(2)}>`)}return opts.autoRenew===!0&&parts.push("--auto-renew"),opts.autoRenew===!1&&parts.push("--no-auto-renew"),opts.json&&parts.push("--json"),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function flagFor(field){return CONTACT_FIELDS.find(f=>f.field===field).flag}function usageError(client,message){return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,message)}async function buy(client,argv){let telemetry2=new DomainsBuyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(buySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionAmount(flags["--amount"]),telemetry2.trackCliFlagUseBillingDetails(flags["--use-billing-details"]),telemetry2.trackCliOptionFirstName(flags["--first-name"]),telemetry2.trackCliOptionLastName(flags["--last-name"]),telemetry2.trackCliOptionEmail(flags["--email"]),telemetry2.trackCliOptionPhone(flags["--phone"]),telemetry2.trackCliOptionAddress(flags["--address"]),telemetry2.trackCliOptionCity(flags["--city"]),telemetry2.trackCliOptionState(flags["--state"]),telemetry2.trackCliOptionZip(flags["--zip"]),telemetry2.trackCliOptionCountry(flags["--country"]),telemetry2.trackCliOptionCompany(flags["--company"]),telemetry2.trackCliFlagAutoRenew(flags["--auto-renew"]),telemetry2.trackCliFlagNoAutoRenew(flags["--no-auto-renew"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!domainName){if(client.nonInteractive){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`domains buy <domain> ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"missing_arguments",message:`Missing domain name. Run: ${cmd2}`,next:[{command:cmd2,when:"Replace <domain> with the domain to buy"}]},2)}return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2}if(args.length>1){let extra=args[1].toLowerCase();return usageError(client,extra==="true"||extra==="false"?"Unexpected extra argument. On/off options like --auto-renew don't take a value: pass --auto-renew or --no-auto-renew.":'Unexpected extra argument. domains buy takes one domain; quote option values that contain spaces, like --address "1 Main St".')}let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return usageError(client,formatResult.error);let asJson=formatResult.jsonOutput,{domain:rootDomain,subdomain}=(0,import_tldts3.parse)(domainName);if(subdomain||!rootDomain)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:`Invalid domain name '${domainName}'. Use a registrable root domain (no subdomain).`},1),output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let amount=parseAmount(flags["--amount"]);if(amount instanceof Error)return usageError(client,amount.message);let fromFlags=readContactFlags(flags);if(typeof fromFlags=="string")return usageError(client,fromFlags);let valuedFlag=chargeFlagWithValue(argv,["--auto-renew","--no-auto-renew","--use-billing-details"]);if(valuedFlag)return usageError(client,valuedFlag);let useBilling=!!flags["--use-billing-details"];if(flags["--auto-renew"]&&flags["--no-auto-renew"])return usageError(client,"Can't use --auto-renew with --no-auto-renew.");let autoRenewChoice=flags["--auto-renew"]?!0:flags["--no-auto-renew"]?!1:void 0,{contextName,team}=await getScope(client),availableStamp=stamp_default(),[domainPrice,domainStatus]=await Promise.all([getDomainPrice(client,domainName),getDomainStatus(client,domainName)]);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});if(!domainStatus.available)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.DOMAIN_NOT_AVAILABLE,message:`The domain ${domainName} is unavailable.`});let{years,purchasePrice,renewalPrice}=domainPrice;if(purchasePrice===null||renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The price of ${domainName} was not found.`});output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk51.default.underline("available")} to buy under ${import_chalk51.default.bold(contextName)}! ${availableStamp()}`);let billing=getBillingContact(team),contact=mergeContact(fromFlags,useBilling?billing:{}),commandOptions={team:team?.slug,useBilling,contact:fromFlags,autoRenew:autoRenewChoice,json:asJson};if(amount!==void 0&&!amountMatchesPrice(amount,purchasePrice))return reportPriceChanged(client,{verb:"buy",domain:domainName,amount,price:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount:purchasePrice,missing:missingContactFields(contact)}),json:asJson});let autoRenew2,contactInformation;if(canPromptForCharge(client,asJson)){if(amount===void 0&&!await client.input.confirm(`Buy now for ${import_chalk51.default.bold(formatUsd(purchasePrice))} (${formatTerm(years)})?`,!1))return 0;autoRenew2=autoRenewChoice??await client.input.confirm(years===1?`Auto renew yearly for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`:`Auto renew every ${years} years for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`,!0),contactInformation=await collectContactInformation(client,{provided:contact,defaults:mergeContact(fromFlags,billing)})}else{let missing=missingContactFields(contact);if(amount===void 0||missing.length>0||autoRenewChoice===void 0)return requireApproval(client,{domain:domainName,team:team?.slug,contextName,price:purchasePrice,renewalPrice,years,amount,fromFlags,billing,useBilling,autoRenew:autoRenewChoice,json:asJson});if(team){let refused=refuseUnnamedTeam(client,asJson,{verb:"buy",domain:domainName,team,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount,missing:[]})});if(refused!==void 0)return refused}autoRenew2=autoRenewChoice,contactInformation={...contact,companyName:contact.companyName||void 0}}let inspectCommand2=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`),buyResult,purchaseStamp=stamp_default();output_manager_default.spinner("Purchasing");try{buyResult=await purchaseDomain(client,domainName,purchasePrice,years,autoRenew2,contactInformation)}catch(err){output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils6.errorToString)(err)}`);let apiError=isAPIError(err)?err:void 0;return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:apiError?`Couldn't buy ${domainName}. The API returned an error (${apiError.code}). Nothing was charged.`:`Couldn't buy ${domainName}. The order wasn't sent, so nothing was charged.`},{apiMessage:apiError?.serverMessage})}return output_manager_default.stopSpinner(),buyResult instanceof DomainPriceChanged?reportPriceChanged(client,{verb:"buy",domain:domainName,amount:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,missing:[]}),json:asJson}):buyResult instanceof DomainChargeOutcomeUnknown?reportUnknownOutcome(client,asJson,{verb:"buy",domain:domainName,inspectCommand:inspectCommand2}):buyResult instanceof Error?reportChargeFailure(client,asJson,{reason:chargeFailureReason(buyResult),message:buyResult.message}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,years,charge:{amount:purchasePrice,currency:"USD"},orderId:buyResult.orderId,autoRenew:autoRenew2,renewalPrice,message:`Domain ${domainName} purchased.`},null,2)}
238
+ ${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(headline,opts.recovery.instruction,opts.recovery.command):output_manager_default.fatal(headline),1}function reportUnknownOutcome(client,json,opts){let done=opts.verb==="buy"?"was bought":"was renewed",action=opts.verb==="buy"?"purchase":"renewal";return reportChargeFailure(client,json,{reason:AGENT_REASON.UNKNOWN_OUTCOME,message:`Can't confirm whether ${opts.domain} ${done}. Check the domain before running ${opts.verb} again, or you may be charged twice.`,next:[{command:opts.inspectCommand,when:`Check whether the ${action} went through before retrying`}]},{recovery:{instruction:`Check whether the ${action} went through`,command:opts.inspectCommand}})}function refuseUnnamedTeam(client,json,opts){let{verb,domain:domain2,team}=opts,status6=chargeTeamStatus(client,team.id);if(status6==="named")return;if(status6==="conflict")return reportChargeFailure(client,json,{reason:AGENT_REASON.CONFLICT,message:`Can't ${verb} ${domain2}. VERCEL_ORG_ID names a different team than ${team.slug}, the team this run would charge. Nothing was charged.`,userActionRequired:!0,hint:"Set VERCEL_ORG_ID to the team to charge, or unset it and pass --scope with that team.",data:{domain:domain2,team:team.slug}});let message=`Can't ${verb} ${domain2} without naming the team to charge in non-interactive mode. It would charge ${team.slug}. Nothing was charged.`;return writeChargeAction(client,json,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_SCOPE,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message,userActionRequired:!0,data:{domain:domain2,team:team.slug},missing:["--scope"],next:[{command:opts.nextCommand,when:`Only after a human approves charging ${team.slug}`}]}),printChargeRecovery(message,"Once a person approves the team to charge, run",opts.nextCommand),1}function reportPriceChanged(client,opts){let{verb,domain:domain2,amount,price:price2,nextCommand}=opts;return reportChargeFailure(client,opts.json,{reason:AGENT_REASON.PRICE_CHANGED,message:price2===void 0?`Can't ${verb} ${domain2}. Its price changed from ${formatUsd(amount)}. Nothing was charged.`:`Can't ${verb} ${domain2}. Its price is ${formatUsd(price2)}, not ${formatUsd(amount)}. Nothing was charged.`,userActionRequired:!0,data:price2===void 0?{domain:domain2}:{domain:domain2,amount:price2,currency:"USD"},next:[{command:nextCommand,when:price2===void 0?"Get the current price, then ask a human to approve it":`Only after a human approves the price of ${formatUsd(price2)}`}]},{recovery:{instruction:price2===void 0?"Get the current price":"Once a person approves the price, run",command:nextCommand}})}function buildBuyCommand(client,domain2,opts){let parts=[`domains buy ${domain2}`];opts.team&&parts.push(`--scope ${opts.team}`),opts.amount!==void 0&&parts.push(`--amount ${formatAmountArg(opts.amount)}`),opts.useBilling&&parts.push("--use-billing-details");for(let{field,flag}of CONTACT_FIELDS){let value=opts.contact[field];value!==void 0?parts.push(`${flag} ${quoteArg(value)}`):opts.missing.includes(field)&&parts.push(`${flag} <${flag.slice(2)}>`)}return opts.autoRenew===!0&&parts.push("--auto-renew"),opts.autoRenew===!1&&parts.push("--no-auto-renew"),opts.json&&parts.push("--json"),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function flagFor(field){return CONTACT_FIELDS.find(f=>f.field===field).flag}function usageError2(client,message){return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,message)}async function buy(client,argv){let telemetry2=new DomainsBuyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(buySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionAmount(flags["--amount"]),telemetry2.trackCliFlagUseBillingDetails(flags["--use-billing-details"]),telemetry2.trackCliOptionFirstName(flags["--first-name"]),telemetry2.trackCliOptionLastName(flags["--last-name"]),telemetry2.trackCliOptionEmail(flags["--email"]),telemetry2.trackCliOptionPhone(flags["--phone"]),telemetry2.trackCliOptionAddress(flags["--address"]),telemetry2.trackCliOptionCity(flags["--city"]),telemetry2.trackCliOptionState(flags["--state"]),telemetry2.trackCliOptionZip(flags["--zip"]),telemetry2.trackCliOptionCountry(flags["--country"]),telemetry2.trackCliOptionCompany(flags["--company"]),telemetry2.trackCliFlagAutoRenew(flags["--auto-renew"]),telemetry2.trackCliFlagNoAutoRenew(flags["--no-auto-renew"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!domainName){if(client.nonInteractive){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`domains buy <domain> ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"missing_arguments",message:`Missing domain name. Run: ${cmd2}`,next:[{command:cmd2,when:"Replace <domain> with the domain to buy"}]},2)}return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2}if(args.length>1){let extra=args[1].toLowerCase();return usageError2(client,extra==="true"||extra==="false"?"Unexpected extra argument. On/off options like --auto-renew don't take a value: pass --auto-renew or --no-auto-renew.":'Unexpected extra argument. domains buy takes one domain; quote option values that contain spaces, like --address "1 Main St".')}let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return usageError2(client,formatResult.error);let asJson=formatResult.jsonOutput,{domain:rootDomain,subdomain}=(0,import_tldts3.parse)(domainName);if(subdomain||!rootDomain)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:`Invalid domain name '${domainName}'. Use a registrable root domain (no subdomain).`},1),output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let amount=parseAmount(flags["--amount"]);if(amount instanceof Error)return usageError2(client,amount.message);let fromFlags=readContactFlags(flags);if(typeof fromFlags=="string")return usageError2(client,fromFlags);let valuedFlag=chargeFlagWithValue(argv,["--auto-renew","--no-auto-renew","--use-billing-details"]);if(valuedFlag)return usageError2(client,valuedFlag);let useBilling=!!flags["--use-billing-details"];if(flags["--auto-renew"]&&flags["--no-auto-renew"])return usageError2(client,"Can't use --auto-renew with --no-auto-renew.");let autoRenewChoice=flags["--auto-renew"]?!0:flags["--no-auto-renew"]?!1:void 0,{contextName,team}=await getScope(client),availableStamp=stamp_default(),[domainPrice,domainStatus]=await Promise.all([getDomainPrice(client,domainName),getDomainStatus(client,domainName)]);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});if(!domainStatus.available)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.DOMAIN_NOT_AVAILABLE,message:`The domain ${domainName} is unavailable.`});let{years,purchasePrice,renewalPrice}=domainPrice;if(purchasePrice===null||renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The price of ${domainName} was not found.`});output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk51.default.underline("available")} to buy under ${import_chalk51.default.bold(contextName)}! ${availableStamp()}`);let billing=getBillingContact(team),contact=mergeContact(fromFlags,useBilling?billing:{}),commandOptions={team:team?.slug,useBilling,contact:fromFlags,autoRenew:autoRenewChoice,json:asJson};if(amount!==void 0&&!amountMatchesPrice(amount,purchasePrice))return reportPriceChanged(client,{verb:"buy",domain:domainName,amount,price:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount:purchasePrice,missing:missingContactFields(contact)}),json:asJson});let autoRenew2,contactInformation;if(canPromptForCharge(client,asJson)){if(amount===void 0&&!await client.input.confirm(`Buy now for ${import_chalk51.default.bold(formatUsd(purchasePrice))} (${formatTerm(years)})?`,!1))return 0;autoRenew2=autoRenewChoice??await client.input.confirm(years===1?`Auto renew yearly for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`:`Auto renew every ${years} years for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`,!0),contactInformation=await collectContactInformation(client,{provided:contact,defaults:mergeContact(fromFlags,billing)})}else{let missing=missingContactFields(contact);if(amount===void 0||missing.length>0||autoRenewChoice===void 0)return requireApproval(client,{domain:domainName,team:team?.slug,contextName,price:purchasePrice,renewalPrice,years,amount,fromFlags,billing,useBilling,autoRenew:autoRenewChoice,json:asJson});if(team){let refused=refuseUnnamedTeam(client,asJson,{verb:"buy",domain:domainName,team,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount,missing:[]})});if(refused!==void 0)return refused}autoRenew2=autoRenewChoice,contactInformation={...contact,companyName:contact.companyName||void 0}}let inspectCommand2=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`),buyResult,purchaseStamp=stamp_default();output_manager_default.spinner("Purchasing");try{buyResult=await purchaseDomain(client,domainName,purchasePrice,years,autoRenew2,contactInformation)}catch(err){output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils6.errorToString)(err)}`);let apiError=isAPIError(err)?err:void 0;return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:apiError?`Couldn't buy ${domainName}. The API returned an error (${apiError.code}). Nothing was charged.`:`Couldn't buy ${domainName}. The order wasn't sent, so nothing was charged.`},{apiMessage:apiError?.serverMessage})}return output_manager_default.stopSpinner(),buyResult instanceof DomainPriceChanged?reportPriceChanged(client,{verb:"buy",domain:domainName,amount:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,missing:[]}),json:asJson}):buyResult instanceof DomainChargeOutcomeUnknown?reportUnknownOutcome(client,asJson,{verb:"buy",domain:domainName,inspectCommand:inspectCommand2}):buyResult instanceof Error?reportChargeFailure(client,asJson,{reason:chargeFailureReason(buyResult),message:buyResult.message}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,years,charge:{amount:purchasePrice,currency:"USD"},orderId:buyResult.orderId,autoRenew:autoRenew2,renewalPrice,message:`Domain ${domainName} purchased.`},null,2)}
238
239
  `),0):(client.stdout.write(`${domainName}
239
240
  `),output_manager_default.success(`Domain ${param(domainName)} purchased ${purchaseStamp()}`),output_manager_default.log(`Charged ${formatUsd(purchasePrice)} for ${formatTerm(years)}. Registered to ${contactInformation.firstName} ${contactInformation.lastName} (${contactInformation.email}).`),output_manager_default.note(`You may now use your domain as an alias to your deployments. Run ${getCommandName("alias --help")}`),0)}function requireApproval(client,opts){let{domain:domain2,price:price2,renewalPrice,years,billing,autoRenew:autoRenew2}=opts,shown=billingFieldsUsed(opts.fromFlags,billing),shownFields=CONTACT_FIELDS.filter(({field})=>shown[field]),hasBilling=shownFields.length>0,useBilling=opts.useBilling||hasBilling,missing=missingContactFields(mergeContact(opts.fromFlags,useBilling?billing:{})),missingFlags=missing.map(flagFor),missingNow=missingContactFields(mergeContact(opts.fromFlags,opts.useBilling?billing:{})),needs=[...opts.amount===void 0?["an approved price (--amount)"]:[],...autoRenew2===void 0?["an auto-renew choice (--auto-renew or --no-auto-renew)"]:[],...missingNow.length>0?["registrant details"]:[]],headline=`Can't buy ${domain2} without ${needs.join(" and ")} in non-interactive mode.`,every=years===1?"year":formatTerm(years),renewal=autoRenew2===void 0?`Auto-renew isn't chosen: --auto-renew renews it every ${every} (currently ${formatUsd(renewalPrice)}), --no-auto-renew lets it expire.`:autoRenew2?`Then it auto-renews every ${every} (currently ${formatUsd(renewalPrice)}).`:"Auto-renew is off.",priceLine=`Price: ${formatUsd(price2)} for ${formatTerm(years)}, charged to ${opts.contextName}. ${renewal}`,stillNeeded=missingFlags.length>0?`Still needed: ${missingFlags.join(", ")}.`:"",next=(autoRenew2===void 0?[!0,!1]:[autoRenew2]).map(renews=>({command:buildBuyCommand(client,domain2,{team:opts.team,amount:price2,useBilling,contact:opts.fromFlags,missing,autoRenew:renews,json:opts.json}),when:`Only after a human approves: charges ${formatUsd(price2)} now${renews?` and renews every ${every} (currently ${formatUsd(renewalPrice)})`:", with no renewal"}`}));writeChargeAction(client,opts.json,{status:AGENT_STATUS.ACTION_REQUIRED,reason:opts.amount===void 0||autoRenew2===void 0?AGENT_REASON.CONFIRMATION_REQUIRED:AGENT_REASON.MISSING_REQUIREMENTS,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:[headline,priceLine,hasBilling?`The team's billing info has the registrant ${shownFields.map(({label})=>label.toLowerCase()).join(", ")} (data.billingDetails). Confirm them with the user; --use-billing-details uses them, and any contact option you pass replaces them.`:"",stillNeeded].filter(Boolean).join(" "),userActionRequired:!0,hint:"Show the user the price, renewal terms, and registrant details, and get their approval before running next[]. Domain registrations are non-refundable.",data:{domain:domain2,...opts.team&&{team:opts.team},amount:price2,currency:"USD",years,autoRenew:autoRenew2??null,renewalAmount:renewalPrice,...hasBilling&&{billingDetails:shown}},missing:[...opts.amount===void 0?["--amount"]:[],...autoRenew2===void 0?["--auto-renew|--no-auto-renew"]:[],...useBilling&&!opts.useBilling?["--use-billing-details"]:[],...missingFlags],next});let billingRows=hasBilling?[`From ${opts.contextName}'s billing info:`,...shownFields.map(({field,label})=>` ${label.padEnd(10)}${(0,import_strip_ansi.default)(shown[field])}`)]:[];return printChargeRecovery([headline,priceLine,...billingRows,stillNeeded].filter(Boolean).join(`
240
241
  `),next.length>1?"Once a person approves the price, details, and auto-renew choice, run one of":"Once a person approves the price and details, run",next.map(({command:command2})=>command2).join(`
@@ -249,7 +250,7 @@ ${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(hea
249
250
 
250
251
  `)}
251
252
  `)}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(arg2=>arg2!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),2}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"?searchSubcommand2: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_LIMIT2;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT2)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT2}.`),2;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),2;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,searchSubcommand2),2;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)}
252
- `),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 CiTelemetryClient=class extends TelemetryClient{trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandLogs(actual){this.trackCliSubcommand({subcommand:"logs",value:actual})}trackCliSubcommandGrep(actual){this.trackCliSubcommand({subcommand:"grep",value:actual})}trackCliSubcommandRerun(actual){this.trackCliSubcommand({subcommand:"rerun",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var import_chalk54=__toESM(require_source(),1),import_ms9=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);var import_split2=__toESM(require_split2(),1);import{Transform}from"node:stream";import{pipeline as pipeline3}from"node:stream/promises";async function*readNdjson(client,url,options={}){let response=await client.fetch(url,{json:!1,accountId:options.accountId,signal:options.signal}),source=toNodeReadable(response.body),maxFrameBytes=8*1024*1024,frameBytes=0,bounded=new Transform({transform(chunk,_encoding,callback){let start=0;for(;start<chunk.length;){let newline=chunk.indexOf(10,start),end=newline===-1?chunk.length:newline;if(frameBytes+=end-start,frameBytes>maxFrameBytes){callback(new Error("Vercel CI response frame exceeds 8 MiB."));return}if(newline===-1)break;frameBytes=0,start=newline+1}callback(null,chunk)}}),lines=(0,import_split2.default)(),completion=pipeline3(source,bounded,lines,{signal:options.signal}).then(()=>{},error=>error);try{let snapshot=response.headers.get("content-type")?.split(";")[0]==="application/json",json="",bytes5=0;for await(let line2 of lines)if(snapshot){if(bytes5+=Buffer.byteLength(line2)+1,bytes5>8*1024*1024)throw new Error("Vercel CI JSON snapshot exceeds 8 MiB.");json+=`${line2}
253
+ `),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 CiTelemetryClient=class extends TelemetryClient{trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandLogs(actual){this.trackCliSubcommand({subcommand:"logs",value:actual})}trackCliSubcommandGrep(actual){this.trackCliSubcommand({subcommand:"grep",value:actual})}trackCliSubcommandRerun(actual){this.trackCliSubcommand({subcommand:"rerun",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var import_chalk54=__toESM(require_source(),1),import_ms9=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);var import_split2=__toESM(require_split2(),1);import{Transform}from"node:stream";import{pipeline as pipeline3}from"node:stream/promises";async function*readNdjson(client,url,options={}){let response=await client.fetch(url,{json:!1,accountId:options.accountId,signal:options.signal}),source=toNodeReadable(response.body),maxFrameBytes=8*1024*1024,frameBytes=0,bounded=new Transform({transform(chunk2,_encoding,callback){let start=0;for(;start<chunk2.length;){let newline=chunk2.indexOf(10,start),end=newline===-1?chunk2.length:newline;if(frameBytes+=end-start,frameBytes>maxFrameBytes){callback(new Error("Vercel CI response frame exceeds 8 MiB."));return}if(newline===-1)break;frameBytes=0,start=newline+1}callback(null,chunk2)}}),lines=(0,import_split2.default)(),completion=pipeline3(source,bounded,lines,{signal:options.signal}).then(()=>{},error=>error);try{let snapshot=response.headers.get("content-type")?.split(";")[0]==="application/json",json="",bytes5=0;for await(let line2 of lines)if(snapshot){if(bytes5+=Buffer.byteLength(line2)+1,bytes5>8*1024*1024)throw new Error("Vercel CI JSON snapshot exceeds 8 MiB.");json+=`${line2}
253
254
  `}else line2.trim()&&(yield JSON.parse(line2));let error=await completion;if(error)throw error;snapshot&&(yield JSON.parse(json))}finally{source.destroy(),bounded.destroy(),lines.destroy(),await completion}}async function resolveCiTeam(_client){return{ok:!0}}function listCiInvocations(client,params,accountId){let query=new URLSearchParams({provider:params.provider,repository:params.repository});params.branch&&query.set("branchName",params.branch),params.commitSha&&query.set("snapshot",params.commitSha);for(let status6 of params.statuses??[])query.append("status",status6);for(let conclusion2 of params.conclusions??[])query.append("conclusion",conclusion2);return params.limit&&query.set("limit",String(params.limit)),params.cursor&&query.set("cursor",params.cursor),client.fetch(`/v2/vercel-ci/invocations?${query}`,{accountId})}function getCiInvocationTree(client,invocationId,options={}){let query=new URLSearchParams;options.attempt&&query.set("attempt",String(options.attempt));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree${suffix}`,{accountId:options.accountId})}function streamCiInvocationTree(client,invocationId,options){let query=new URLSearchParams({attempt:String(options.attempt),follow:"1"});return readNdjson(client,`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree?${query}`,{accountId:options.accountId,signal:options.signal})}async function getLatestCiAttempt(client,invocationId,accountId){let{attempts}=await client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts`,{accountId});return Math.max(1,...attempts.map(attempt=>attempt.attempt))}function searchCiLogs(client,runs,filters,accountId){let query=new URLSearchParams;for(let run3 of runs)query.append("invocation",`${run3.invocationId}:${run3.attempt}`);query.set("search",filters.search);for(let level of filters.levels??[])query.append("level",level);return client.fetch(`/v1/vercel-ci/log-search?${query}`,{accountId})}function getCiTaskLogs(client,invocationId,attempt,filters,accountId){let query=new URLSearchParams;for(let task of filters.tasks??[])query.append("task",task);for(let conclusion2 of filters.conclusions??[])query.append("conclusion",conclusion2);for(let level of filters.levels??[])query.append("level",level);filters.search&&query.set("search",filters.search),filters.limit&&query.set("limit",String(filters.limit));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}/task-logs${suffix}`,{accountId})}function streamCiTaskRunLogs(client,locator,options){let query=new URLSearchParams({follow:"1"});options.since!==void 0&&query.set("since",String(options.since));for(let level of options.levels??[])query.append("level",level);return readNdjson(client,`${ciTaskRunLogsPath(locator)}?${query}`,{accountId:options.accountId,signal:options.signal})}async function getCiTaskRunLogs(client,locator,options={}){let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",snapshot;for await(let value of readNdjson(client,`${ciTaskRunLogsPath(locator)}${suffix}`,{accountId:options.accountId})){if(snapshot||typeof value!="object"||value===null||!("lines"in value)||!Array.isArray(value.lines))throw new Error("Invalid Vercel CI log snapshot.");snapshot=value}if(!snapshot)throw new Error("Missing Vercel CI log snapshot.");return snapshot}function ciTaskRunLogsPath(locator){return`/v1/vercel-ci/${["invocations",locator.invocationId,"attempts",locator.attempt,"job-definitions",locator.jobDefinitionId,"runs",locator.jobRunAttempt,"task-definitions",locator.taskDefinitionId,"runs",locator.taskRunAttempt,"logs"].map(segment=>encodeURIComponent(String(segment))).join("/")}`}async function getCiSetupLogs(client,invocationId,attempt,options={}){let base=`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}`,{invocation}=await client.fetch(base,{accountId:options.accountId});if(invocation.setupConclusion?.result!=="failed")return{failed:!1,lines:[]};let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",{lines}=await client.fetch(`${base}/logs${suffix}`,{accountId:options.accountId});return{failed:!0,lines}}var FAILED_SETUP_STATUSES=new Set(["bootstrapping_failed","jobs_on_hive_failed"]);function getRunStatus(invocation){return invocation.runConclusion?invocation.runConclusion.result:invocation.completed?.conclusion?invocation.completed.conclusion:invocation.status==="skipped"?"skipped":FAILED_SETUP_STATUSES.has(invocation.status)?"failed":invocation.status==="completed"?"completed":invocation.status==="new"?"queued":"running"}var CI_RUN_STATUSES=["queued","running","succeeded","failed","skipped"],RUNNING_API_STATUSES=["bootstrapping","snapshotted","sandbox_named","jobs_on_hive_clone_dispatched","jobs_on_hive_dispatched","jobs_on_hive_completed","awaiting_jobs"];function toRunStatusFilter(status6){switch(status6){case"queued":return{statuses:["new"]};case"running":return{statuses:RUNNING_API_STATUSES};case"completed":return{statuses:["completed"]};default:return{conclusions:[status6]}}}function isTerminalRunStatus(status6){return status6!=="queued"&&status6!=="running"}function toBranchName(ref){return ref.startsWith("refs/heads/")?ref.slice(11):ref}function toShortSha(sha){return sha.slice(0,7)}var RUN_ID_PREFIX="invo1_",RUN_ID_PATTERN=/^[A-Za-z0-9]+$/;function toDisplayRunId(id2){return id2.startsWith(RUN_ID_PREFIX)?id2.slice(RUN_ID_PREFIX.length):id2}function toApiRunId(input){let id2=toDisplayRunId(input.trim());return RUN_ID_PATTERN.test(id2)?`${RUN_ID_PREFIX}${id2}`:null}function toRunSummary(invocation,repositories){let repository=repositories[invocation.repositoryKey];return{id:toDisplayRunId(invocation.invocationId),attempt:invocation.attempt,status:getRunStatus(invocation),...getRunReason(invocation),repository:repository?`${repository.owner}/${repository.name}`:"",branch:toBranchName(invocation.ref),commitSha:invocation.commitSha,createdAt:toIso(invocation.createdAt)}}function getRunReason(invocation){return invocation.skipped?{reason:invocation.skipped.reason}:invocation.setupConclusion?.result==="failed"?{reason:"setup_failed"}:{}}function toRunView(tree){return{run:toRunSummary(tree.invocation,tree.repositories),jobs:tree.jobs.map(job=>({name:job.definition.name,kind:job.definition.kind,...toStepTiming(job.run),tasks:job.tasks.map(task=>({name:task.definition.name,...toStepTiming(task.run)}))}))}}function toStepTiming(run3){let startedAt=run3?.started?.startedAt,completedAt=run3?.completed?.completedAt,conclusion2=run3?.completed?.conclusion,status6="queued";return conclusion2?status6=conclusion2.result:startedAt!==void 0&&(status6="running"),{status:status6,...conclusion2&&"reason"in conclusion2?{reason:conclusion2.reason}:{},...startedAt!==void 0?{startedAt:toIso(startedAt)}:{},...completedAt!==void 0?{completedAt:toIso(completedAt)}:{},...startedAt!==void 0&&completedAt!==void 0?{durationMs:Math.max(completedAt-startedAt,0)}:{}}}function toIso(timestamp2){return new Date(timestamp2).toISOString()}function countTasks(view){let total=0,finished=0;for(let job of view.jobs)for(let task of job.tasks)total++,task.status!=="queued"&&task.status!=="running"&&finished++;return{total,finished}}var import_strip_ansi3=__toESM(require_strip_ansi(),1);function ciDisplayText(value){return Array.from((0,import_strip_ansi3.default)(value),char=>{let code2=char.codePointAt(0);return code2>=127&&code2<=159?`\\u${code2.toString(16).padStart(4,"0")}`:code2<32?JSON.stringify(char).slice(1,-1):char}).join("")}function quoteCiCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function buildCiCommand(argv,args){return getCommandNamePlain([...args,...getGlobalFlagsFromArgv(argv)].map(quoteCiCommandArg).join(" "))}var CiGrepTelemetryClient=class extends TelemetryClient{trackCliArgumentText(text4){text4&&this.trackCliArgument({arg:"text",value:this.redactedValue})}trackCliOptionBranch(branch){branch&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagAllBranches(allBranches){allBranches&&this.trackCliFlag("all-branches")}trackCliOptionStatus(status6){status6&&this.trackCliOption({option:"status",value:status6})}trackCliOptionRuns(runs){runs!==void 0&&this.trackCliOption({option:"runs",value:String(runs)})}trackCliOptionLevel(levels){levels?.length&&this.trackCliOption({option:"level",value:levels.join(",")})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SUPPORTED_PROVIDERS=["github"];async function getCiGitContext(cwd){let git=await getGitExecutable(cwd),[remote,branch,commitSha]=await Promise.all([readGit(git,cwd,["remote","get-url","origin"]),readGit(git,cwd,["rev-parse","--abbrev-ref","HEAD"]),readGit(git,cwd,["rev-parse","HEAD"])]);if(!remote)return null;let repo=parseRepoUrl(remote),provider=SUPPORTED_PROVIDERS.find(p=>p===repo?.provider);return!repo||!provider?(output_manager_default.debug(`Unsupported Git remote for Vercel CI: ${remote}`),null):{provider,repository:`${repo.org}/${repo.repo}`,...branch&&branch!=="HEAD"?{branch}:{},...commitSha?{commitSha}:{}}}var COMMIT_SHA_PATTERN=/^[0-9a-f]{4,40}$/i;async function resolveCommitSha(cwd,value){let sha=value.trim().toLowerCase();if(!COMMIT_SHA_PATTERN.test(sha))return null;if(sha.length===40)return sha;let git=await getGitExecutable(cwd);return await readGit(git,cwd,["rev-parse","--verify","--quiet",`${sha}^{commit}`])??null}async function readGit(git,cwd,args){try{let{stdout}=await execFileAsync(git,args,{cwd});return stdout.trim()||void 0}catch(error){output_manager_default.debug(`git ${args.join(" ")} failed: ${error}`);return}}function failCi(client,failure){return shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,...failure}):output_manager_default.fatal(failure.message),getExitCodeForReason(failure.reason)}function invalidCiArguments(client,message){return failCi(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message})}function handleCiApiError(client,action,err){if(isAPIError(err)){let detail=err.serverMessage?` ${err.serverMessage}`:"";switch(err.status){case 403:return failCi(client,{reason:AGENT_REASON.PERMISSION_DENIED,message:`Can't ${action}. You don't have access to Vercel CI runs for this team.`});case 404:return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:"Couldn't find that Vercel CI run for this team."});case 429:return failCi(client,{reason:AGENT_REASON.RATE_LIMITED,message:`Failed to ${action}. Too many requests. Wait a moment, then try again.`});default:return failCi(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to ${action}.${detail}`})}}throw err}async function resolveCiContext(client){let git=await getCiGitContext(client.cwd);if(!git)return failCi(client,{reason:AGENT_REASON.GIT_REPOSITORY_REQUIRED,message:"Couldn't find a supported Git repository here. Vercel CI currently supports GitHub repositories with an origin remote."});let team=await resolveCiTeam(client);return team.ok?{git,accountId:team.accountId}:team.exitCode}var import_chalk53=__toESM(require_source(),1),import_ms8=__toESM(require_ms(),1);function formatStatus2(status6){switch(status6){case"succeeded":return import_chalk53.default.green(status6);case"failed":return import_chalk53.default.red(status6);case"skipped":case"cached":return import_chalk53.default.gray(status6);default:return ciDisplayText(status6)}}function formatCiTable(headers,rows){return formatTable(headers,headers.map(()=>"l"),[{rows}]).split(`
254
255
  `).map(line2=>line2.trimEnd()).filter(line2=>line2.length>0).join(`
255
256
  `)}function printRunView(view,elapsed2){let{run:run3}=view;output_manager_default.log(`Vercel CI run ${import_chalk53.default.bold(ciDisplayText(run3.id))} ${import_chalk53.default.gray(elapsed2)}`),output_manager_default.print(`
@@ -300,7 +301,7 @@ ${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(hea
300
301
  `),0}let scope=describeScope2(git.repository,branch,commitSha);if(runs.length===0){let filtered=!!(status6||commitSha||flags["--next"]);return output_manager_default.log(filtered?"No Vercel CI runs match the current filters.":`No Vercel CI runs found for ${scope}.`),0}return output_manager_default.log(`${(0,import_pluralize6.default)("Vercel CI run",runs.length,!0)} for ${scope} ${import_chalk57.default.gray(lsStamp())}`),output_manager_default.print(`
301
302
  ${formatRunsTable(invocations)}
302
303
 
303
- `),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand7)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand5)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand8),inspect:getCommandAliases(inspectSubcommand6),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand6)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-G5NDWTDB.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-COGMMSHS.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-ULZRH7KA.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-3IS44LUW.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-3IS44LUW.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-IIM7GKC2.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-MVJ3NENU.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand8):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-5YBZG374.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{trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}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){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"connection-method",value})}trackCliOptionTarget(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"target",value})}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}trackCliOptionCategory(v){for(let raw of v??[])for(let category of raw.split(","))category.trim()&&this.trackCliOption({option:"category",value:this.redactedValue})}trackCliFlagSupportsTriggers(v){v&&this.trackCliFlag("supports-triggers")}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_chalk58=__toESM(require_source(),1);var import_strip_ansi4=__toESM(require_strip_ansi(),1);function sanitizeForTerminal(value){return(0,import_strip_ansi4.default)(value)}var DEFAULT_LIMIT3=50,MAX_LIMIT4=500;function splitValues(values){return(values??[]).flatMap(v=>v.split(",").map(s=>s.trim())).filter(Boolean)}async function discover(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error(`Too many arguments. Usage: \`${packageName} connect discover [query]\``),2;let query=args[0],limit=flags["--limit"]??DEFAULT_LIMIT3;if(!Number.isInteger(limit)||limit<1)return output_manager_default.error("--limit must be a whole number of 1 or more."),2;limit>MAX_LIMIT4&&(output_manager_default.warning(`--limit is capped at ${MAX_LIMIT4}. Showing ${MAX_LIMIT4}.`),limit=MAX_LIMIT4);let categories3=splitValues(flags["--category"]),connectionMethods=splitValues(flags["--connection-method"]),targets2=splitValues(flags["--target"]),params=new URLSearchParams;query&&params.set("query",query),categories3.length&&params.set("category",categories3.join(",")),connectionMethods.length&&params.set("connectionMethod",connectionMethods.join(",")),targets2.length&&params.set("target",targets2.join(",")),flags["--supports-triggers"]&&params.set("supportsTriggers","true"),params.set("limit",String(limit)),flags["--next"]&&params.set("cursor",flags["--next"]),output_manager_default.spinner("Fetching services\u2026");let response;try{response=await client.fetch(`/v1/connect/services?${params}`,{teamOptional:!0})}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}output_manager_default.stopSpinner();let services=response.services??[],next=response.pagination?.next??null;if(services.length===0){let unknown=await unknownCategories(client,categories3);if(unknown.length>0)return output_manager_default.error(`Unknown ${unknown.length===1?"category":"categories"}: ${unknown.map(c=>`"${sanitizeForTerminal(c)}"`).join(", ")}. Run \`${packageName} connect categories\` to see the valid slugs.`),2}if(asJson){let jsonServices=services.map(s=>({service:s.service,name:s.name,description:s.description??null,categories:s.categories,connectionMethods:(s.connectionMethods??[]).map(m=>m.connectionMethod),targets:(s.targets??[]).map(t=>t.target),supportsTriggers:s.supportsTriggers,beta:s.beta===!0,website:s.website??null,docsite:s.docsite??null}));return client.stdout.write(`${JSON.stringify({services:jsonServices,pagination:{next}},null,2)}
304
+ `),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand7)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand5)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand8),inspect:getCommandAliases(inspectSubcommand6),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand6)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-UEDFNY5H.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-SV3USET3.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-FG74YRJ3.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-MD3PGOME.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-MD3PGOME.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-MGJWXNFV.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-HCZA6EVL.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand8):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-AFVTD43R.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{trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}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){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"connection-method",value})}trackCliOptionTarget(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"target",value})}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}trackCliOptionCategory(v){for(let raw of v??[])for(let category of raw.split(","))category.trim()&&this.trackCliOption({option:"category",value:this.redactedValue})}trackCliFlagSupportsTriggers(v){v&&this.trackCliFlag("supports-triggers")}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_chalk58=__toESM(require_source(),1);var import_strip_ansi4=__toESM(require_strip_ansi(),1);function sanitizeForTerminal(value){return(0,import_strip_ansi4.default)(value)}var DEFAULT_LIMIT3=50,MAX_LIMIT4=500;function splitValues(values){return(values??[]).flatMap(v=>v.split(",").map(s=>s.trim())).filter(Boolean)}async function discover(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error(`Too many arguments. Usage: \`${packageName} connect discover [query]\``),2;let query=args[0],limit=flags["--limit"]??DEFAULT_LIMIT3;if(!Number.isInteger(limit)||limit<1)return output_manager_default.error("--limit must be a whole number of 1 or more."),2;limit>MAX_LIMIT4&&(output_manager_default.warning(`--limit is capped at ${MAX_LIMIT4}. Showing ${MAX_LIMIT4}.`),limit=MAX_LIMIT4);let categories3=splitValues(flags["--category"]),connectionMethods=splitValues(flags["--connection-method"]),targets2=splitValues(flags["--target"]),params=new URLSearchParams;query&&params.set("query",query),categories3.length&&params.set("category",categories3.join(",")),connectionMethods.length&&params.set("connectionMethod",connectionMethods.join(",")),targets2.length&&params.set("target",targets2.join(",")),flags["--supports-triggers"]&&params.set("supportsTriggers","true"),params.set("limit",String(limit)),flags["--next"]&&params.set("cursor",flags["--next"]),output_manager_default.spinner("Fetching services\u2026");let response;try{response=await client.fetch(`/v1/connect/services?${params}`,{teamOptional:!0})}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}output_manager_default.stopSpinner();let services=response.services??[],next=response.pagination?.next??null;if(services.length===0){let unknown=await unknownCategories(client,categories3);if(unknown.length>0)return output_manager_default.error(`Unknown ${unknown.length===1?"category":"categories"}: ${unknown.map(c=>`"${sanitizeForTerminal(c)}"`).join(", ")}. Run \`${packageName} connect categories\` to see the valid slugs.`),2}if(asJson){let jsonServices=services.map(s=>({service:s.service,name:s.name,description:s.description??null,categories:s.categories,connectionMethods:(s.connectionMethods??[]).map(m=>m.connectionMethod),targets:(s.targets??[]).map(t=>t.target),supportsTriggers:s.supportsTriggers,beta:s.beta===!0,website:s.website??null,docsite:s.docsite??null}));return client.stdout.write(`${JSON.stringify({services:jsonServices,pagination:{next}},null,2)}
304
305
  `),0}if(services.length===0)return output_manager_default.log(query?`No services matching "${sanitizeForTerminal(query)}" found.`:"No services found."),0;let useCompactFormat=client.stderr.columns>0&&client.stderr.columns<120;if(output_manager_default.print(`${useCompactFormat?formatCompactList(services):formatTable2(services)}
305
306
  `),next){let parts=[`${packageName} connect discover`];query&&parts.push(JSON.stringify(query));for(let c of categories3)parts.push(`--category ${c}`);for(let m of connectionMethods)parts.push(`--connection-method ${m}`);for(let t of targets2)parts.push(`--target ${t}`);flags["--supports-triggers"]&&parts.push("--supports-triggers"),flags["--limit"]!==void 0&&parts.push(`--limit ${limit}`),parts.push(`--next ${next}`),output_manager_default.log(`Next page: \`${parts.join(" ")}\``)}return output_manager_default.log(`Run \`${packageName} connect create <service>\` to create a connector.`),0}function methodsOf(s){let methods=(s.connectionMethods??[]).map(m=>m.connectionMethod);return methods.length?methods.join(", "):import_chalk58.default.gray("\u2013")}async function unknownCategories(client,categories3){if(categories3.length===0)return[];try{let response=await client.fetch("/v1/connect/services/categories",{teamOptional:!0}),known=new Set((response.categories??[]).map(c=>c.slug));return categories3.filter(c=>!known.has(c))}catch{return[]}}function formatTable2(services){return table([["Service","Name","Methods","Description"].map(h=>import_chalk58.default.bold(import_chalk58.default.cyan(h))),...services.map(s=>[sanitizeForTerminal(s.service),sanitizeForTerminal(s.name),methodsOf(s),s.description?sanitizeForTerminal(s.description):import_chalk58.default.gray("\u2013")])],{hsep:4})}function formatCompactList(services){return services.map(s=>[`${import_chalk58.default.bold(sanitizeForTerminal(s.name))} (${sanitizeForTerminal(s.service)})`,` Methods: ${methodsOf(s)}`,` Description: ${s.description?sanitizeForTerminal(s.description):"\u2013"}`].join(`
306
307
  `)).join(`
@@ -364,7 +365,8 @@ ${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_def
364
365
 
365
366
  `),output_manager_default.log("To issue the certificate once the records are added, run:"),output_manager_default.print(` ${import_chalk75.default.cyan(getCommandName(`certs issue ${cns.join(" ")}`))}
366
367
  `),output_manager_default.print(` Read more: https://err.sh/vercel/solve-challenges-manually
367
- `),0}var import_chalk76=__toESM(require_source(),1),import_ms11=__toESM(require_ms(),1);async function getCerts(client,next,limit=20){let certsUrl=`/v4/certs?limit=${limit}`;return next&&(certsUrl+=`&until=${next}`),await client.fetch(certsUrl)}var CertsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls3(client,argv){let{telemetryEventStore}=client,telemetry2=new CertsLsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"certs ls",args});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]);let paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default(),{certs,pagination}=await getCerts(client,...paginationOptions),contextName=await getContextName(client);if(output_manager_default.log(`${certs.length>0?"Certificates":"No certificates"} found under ${import_chalk76.default.bold(contextName)} ${lsStamp()}`),certs.length>0&&client.stdout.write(formatCertsTable(certs)),pagination?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`certs ls${flags} --next ${pagination.next}`)}`)}return 0}function formatCertsTable(certsList){return`${table([formatCertsTableHead(),...formatCertsTableBody(certsList)],{align:["l","l","r","c","r"],hsep:2}).replace(/^(.*)/gm," $1")}
368
+ `),0}var import_chalk76=__toESM(require_source(),1),import_ms11=__toESM(require_ms(),1);async function getCerts(client,next,limit=20){let certsUrl=`/v4/certs?limit=${limit}`;return next&&(certsUrl+=`&until=${next}`),await client.fetch(certsUrl)}var CertsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls3(client,argv){let{telemetryEventStore}=client,telemetry2=new CertsLsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"certs ls",args});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]),telemetry2.trackCliFlagJson(opts["--json"]);let paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default(),{certs,pagination}=await getCerts(client,...paginationOptions);if(opts["--json"]){let result={certs,pagination:{next:pagination?.next??null}};return client.stdout.write(`${JSON.stringify(result,null,2)}
369
+ `),0}let contextName=await getContextName(client);if(output_manager_default.log(`${certs.length>0?"Certificates":"No certificates"} found under ${import_chalk76.default.bold(contextName)} ${lsStamp()}`),certs.length>0&&client.stdout.write(formatCertsTable(certs)),pagination?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`certs ls${flags} --next ${pagination.next}`)}`)}return 0}function formatCertsTable(certsList){return`${table([formatCertsTableHead(),...formatCertsTableBody(certsList)],{align:["l","l","r","c","r"],hsep:2}).replace(/^(.*)/gm," $1")}
368
370
  `}function formatCertsTableHead(){return[import_chalk76.default.dim("id"),import_chalk76.default.dim("cns"),import_chalk76.default.dim("expiration"),import_chalk76.default.dim("renew"),import_chalk76.default.dim("age")]}function formatCertsTableBody(certsList){let now=new Date;return certsList.reduce((result,cert)=>result.concat(formatCert(now,cert)),[])}function formatCert(time,cert){return cert.cns.map((cn,idx)=>idx===0?formatCertFirstCn(time,cert,cn,cert.cns.length>1):formatCertNonFirstCn(cn,cert.cns.length>1))}function formatCertNonFirstCn(cn,multiple){return["",formatCertCn(cn,multiple),"","",""]}function formatCertCn(cn,multiple){return multiple?`${import_chalk76.default.gray("-")} ${import_chalk76.default.bold(cn)}`:import_chalk76.default.bold(cn)}function formatCertFirstCn(time,cert,cn,multiple){return[cert.uid,formatCertCn(cn,multiple),formatExpirationDate(new Date(cert.expiration)),cert.autoRenew?"yes":"no",import_chalk76.default.gray((0,import_ms11.default)(time.getTime()-new Date(cert.created).getTime()))]}function formatExpirationDate(date){let diff2=date.getTime()-Date.now();return diff2<0?import_chalk76.default.gray(`${(0,import_ms11.default)(-diff2)} ago`):import_chalk76.default.gray(`in ${(0,import_ms11.default)(diff2)}`)}var ls_default=ls3;var import_chalk77=__toESM(require_source(),1),import_ms12=__toESM(require_ms(),1),import_pluralize7=__toESM(require_pluralize(),1);async function deleteCertById(client,id2){return client.fetch(`/v5/certs/${id2}`,{method:"DELETE"})}async function getCertById(client,id2){try{return await client.fetch(`/v6/certs/${id2}`)}catch(err){if(isAPIError(err)&&err.code==="cert_not_found")return new CertNotFound(id2);throw err}}import{stringify}from"querystring";async function getCustomCertsForDomain(client,context,domain2){try{let{certs}=await client.fetch(`/v5/certs?${stringify({domain:domain2,custom:!0})}`);return certs}catch(err){if(isAPIError(err)&&err.code==="forbidden")return new CertsPermissionDenied(context,domain2);throw err}}var CertsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}};async function rm2(client,argv){let rmStamp=stamp_default(),{telemetryEventStore}=client,telemetry2=new CertsRemoveTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args}=parsedArgs,id2=args[0];if(telemetry2.trackCliArgumentId(id2),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk77.default.cyan(`${getCommandName("certs rm <id or cn>")}`)}`),2;let contextName=await getContextName(client),certs=await getCertsToDelete(client,contextName,id2);return certs instanceof CertsPermissionDenied?(output_manager_default.error(`You don't have access to ${param(id2)}'s certs under ${contextName}.`),1):certs.length===0?(id2.includes(".")?output_manager_default.error(`No custom certificates found for "${id2}" under ${import_chalk77.default.bold(contextName)}`):output_manager_default.error(`No certificates found by id "${id2}" under ${import_chalk77.default.bold(contextName)}`),1):(await readConfirmation(client,"The following certificates will be removed permanently",certs)&&(await Promise.all(certs.map(cert=>deleteCertById(client,cert.uid))),output_manager_default.success(`${import_chalk77.default.bold((0,import_pluralize7.default)("Certificate",certs.length,!0))} removed ${rmStamp()}`)),0)}async function getCertsToDelete(client,contextName,id2){let cert=await getCertById(client,id2);if(cert instanceof CertNotFound){let certs=await getCustomCertsForDomain(client,contextName,id2);return certs instanceof CertsPermissionDenied,certs}return[cert]}function readConfirmation(client,msg,certs){return new Promise(resolve14=>{output_manager_default.log(msg),output_manager_default.print(`${table(certs.map(formatCertRow),{align:["l","r","l"],hsep:6}).replace(/^(.*)/gm," $1")}
369
371
  `),output_manager_default.print(`${import_chalk77.default.bold.red("> Are you sure?")} ${import_chalk77.default.gray("(y/N) ")}`),client.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim().toLowerCase()==="y")}).resume()})}function formatCertRow(cert){return[cert.uid,import_chalk77.default.bold(cert.cns?cert.cns.join(", "):"\u2013"),...cert.created?[import_chalk77.default.gray(`${(0,import_ms12.default)(Date.now()-new Date(cert.created).getTime())} ago`)]:[]]}var rm_default=rm2;var CertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandIssue(actual){this.trackCliSubcommand({subcommand:"issue",value:actual})}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_CONFIG24={add:getCommandAliases(addSubcommand2),issue:getCommandAliases(issueSubcommand),ls:getCommandAliases(listSubcommand6),rm:getCommandAliases(removeSubcommand4)};async function main7(client){let{telemetryEventStore}=client,telemetry2=new CertsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(certsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG24),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("certs",subcommand),output_manager_default.print(help(certsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:certsCommand,columns:client.stderr.columns}))}switch(subcommand){case"issue":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(issueSubcommand),0):(telemetry2.trackCliSubcommandIssue(subcommandOriginal),issue(client,args));case"ls":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(listSubcommand6),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls_default(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(removeSubcommand4),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm_default(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(addSubcommand2),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add_default(client,args));default:return output_manager_default.error("Please specify a valid subcommand: ls | issue | rm"),output_manager_default.print(help(certsCommand,{columns:client.stderr.columns})),2}}var import_chalk78=__toESM(require_source(),1);import{resolve as resolve8}from"path";import{access,readFile as readFile4,writeFile as writeFile4}from"fs/promises";var CronsAddTelemetryClient=class extends TelemetryClient{trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionSchedule(schedule){schedule&&this.trackCliOption({option:"schedule",value:this.redactedValue})}};var CRON_FIELD_RANGES=[["minute",0,59],["hour",0,23],["day of month",1,31],["month",1,12],["day of week",0,7]];function validateCronSchedule(expression){if(expression.length>256)return"Schedule expression must be 256 characters or less";let fields=expression.trim().split(/\s+/);if(fields.length!==5)return`Schedule must have exactly 5 fields (minute hour day-of-month month day-of-week), got ${fields.length}`;for(let i=0;i<fields.length;i++){let[name,min,max]=CRON_FIELD_RANGES[i],error=validateCronField(fields[i],name,min,max);if(error)return error}return!0}function validateCronField(field,name,min,max){let parts=field.split(",");for(let part of parts){let[range,stepStr]=part.split("/");if(stepStr!==void 0){let step=Number(stepStr);if(!Number.isInteger(step)||step<1)return`Invalid step value "${stepStr}" in ${name} field`}if(range==="*")continue;if(range.includes("-")){let rangeParts=range.split("-");if(rangeParts.length!==2||rangeParts[0]===""||rangeParts[1]==="")return`Invalid range "${range}" in ${name} field`;let[startStr,endStr]=rangeParts,start=Number(startStr),end=Number(endStr);if(!Number.isInteger(start)||!Number.isInteger(end))return`Invalid range "${range}" in ${name} field`;if(start<min||start>max||end<min||end>max)return`Value out of range in ${name} field (${min}-${max})`;if(start>end)return`Invalid range "${range}" in ${name} field: start is greater than end`;continue}let value=Number(range);if(!Number.isInteger(value))return`Invalid value "${range}" in ${name} field`;if(value<min||value>max)return`Value ${value} out of range in ${name} field (${min}-${max})`}return null}async function add4(client,argv){let telemetry2=new CronsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags}=parsedArgs,cronPath=flags["--path"],schedule=flags["--schedule"];if(telemetry2.trackCliOptionPath(cronPath),telemetry2.trackCliOptionSchedule(schedule),!cronPath||!schedule){if(!client.stdin.isTTY)return output_manager_default.error(`Missing required flags. Use ${getCommandName('crons add --path /api/cron --schedule "0 10 * * *"')} in non-interactive mode.`),2;cronPath||(cronPath=await client.input.text({message:"What is the API route path for the cron job?",validate:value=>value.startsWith("/")?value.length>512?"Path must be 512 characters or less":!0:"Path must start with /"})),schedule||(schedule=await client.input.text({message:"What is the cron schedule expression?",validate:validateCronSchedule}))}if(!cronPath.startsWith("/"))return output_manager_default.error("Path must start with /"),1;if(cronPath.length>512)return output_manager_default.error("Path must be 512 characters or less"),1;let scheduleValidation=validateCronSchedule(schedule);if(scheduleValidation!==!0)return output_manager_default.error(scheduleValidation),1;let nonJsonConfigs=[...VERCEL_CONFIG_EXTENSIONS.map(ext=>`vercel.${ext}`),"vercel.toml"];for(let configName of nonJsonConfigs){let altPath=resolve8(client.cwd,configName);try{return await access(altPath),output_manager_default.error(`Found ${import_chalk78.default.cyan(configName)} \u2014 ${getCommandName("crons add")} only supports ${import_chalk78.default.cyan("vercel.json")}. Add cron jobs directly to your ${import_chalk78.default.cyan(configName)} file instead.`),1}catch{}}let configPath=resolve8(client.cwd,"vercel.json"),config;try{let content=await readFile4(configPath,"utf-8");config=JSON.parse(content)}catch(err){if(err instanceof SyntaxError)return output_manager_default.error(`Failed to parse ${import_chalk78.default.cyan("vercel.json")}: ${err.message}`),1;if(err instanceof Error&&"code"in err&&err.code==="ENOENT")config={};else return output_manager_default.error(`Failed to read ${import_chalk78.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}let existingCrons=Array.isArray(config.crons)?config.crons:[];if(existingCrons.some(c=>c.path===cronPath))return output_manager_default.error(`A cron job with path ${import_chalk78.default.bold(cronPath)} already exists in vercel.json`),1;existingCrons.push({path:cronPath,schedule}),config.crons=existingCrons;try{await writeFile4(configPath,JSON.stringify(config,null,2)+`
370
372
  `,"utf-8")}catch(err){return output_manager_default.error(`Failed to write ${import_chalk78.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Added cron job ${import_chalk78.default.bold(cronPath)} with schedule ${import_chalk78.default.bold(schedule)} to ${import_chalk78.default.cyan("vercel.json")}`),output_manager_default.warn(`This cron job won't be active until the project is deployed to production. Run ${getCommandName("deploy --prod")} to deploy.`),0}var import_chalk79=__toESM(require_source(),1);var CronsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls4(client,argv){let telemetry2=new CronsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand10.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"crons ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,lsStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk79.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[],isDisabled=projectData.crons?.disabledAt!=null,localConfig=readLocalConfig(client.cwd),localCrons=Array.isArray(localConfig?.crons)?localConfig.crons:[],deployedByPath=new Map(definitions.map(d=>[d.path,d])),undeployedCrons=[],modifiedCrons=[];for(let local of localCrons){let deployed=deployedByPath.get(local.path);deployed?deployed.schedule!==local.schedule&&modifiedCrons.push({local,deployed}):undeployedCrons.push(local)}if(asJson){output_manager_default.stopSpinner();let jsonOutput={crons:definitions.map(cron=>({path:cron.path,schedule:cron.schedule,host:cron.host})),undeployed:undeployedCrons.map(cron=>({path:cron.path,schedule:cron.schedule})),modified:modifiedCrons.map(({local,deployed})=>({path:local.path,localSchedule:local.schedule,deployedSchedule:deployed.schedule})),enabled:!isDisabled};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
@@ -373,7 +375,7 @@ ${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_def
373
375
  `)),undeployedCrons.length>0||modifiedCrons.length>0){let pendingCount=undeployedCrons.length+modifiedCrons.length;output_manager_default.log(`${pendingCount} local ${pendingCount===1?"change":"changes"} pending deploy`),output_manager_default.print(formatPendingCronsTable(undeployedCrons,modifiedCrons).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
374
376
 
375
377
  `),output_manager_default.warn(`Run ${getCommandName("deploy --prod")} to apply local changes.`)}}return 0}function formatCronsTable(definitions){let rows=definitions.map(cron=>[import_chalk79.default.bold(cron.path),cron.schedule]);return formatTable(["Path","Schedule"],["l","l"],[{rows}])}function formatPendingCronsTable(undeployed,modified){let rows=[...modified.map(({local,deployed})=>[import_chalk79.default.bold(local.path),`${import_chalk79.default.dim(deployed.schedule)} \u2192 ${local.schedule}`,import_chalk79.default.yellow("modified")]),...undeployed.map(cron=>[import_chalk79.default.dim(cron.path),import_chalk79.default.dim(cron.schedule),import_chalk79.default.yellow("not deployed")])];return formatTable(["Path","Schedule","Status"],["l","l","l"],[{rows}])}var import_chalk80=__toESM(require_source(),1);var CronsRunTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){path3&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function run(client,argv){let telemetry2=new CronsRunTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(runSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[cronPath]=args,projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName),telemetry2.trackCliArgumentPath(cronPath);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,runStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk80.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[];if(definitions.length===0)return output_manager_default.error(`No cron jobs found for ${import_chalk80.default.bold(`${org.slug}/${project.name}`)}. Define cron jobs in your vercel.json file.`),1;if(projectData.crons?.disabledAt!=null)return output_manager_default.error(`Cron jobs are disabled for ${import_chalk80.default.bold(`${org.slug}/${project.name}`)}. Enable them in the project settings.`),1;if(!cronPath){if(client.nonInteractive)return output_manager_default.error(`A cron path argument is required in non-interactive mode. Usage: ${getCommandName("crons run <path>")}`),2;output_manager_default.stopSpinner(),definitions.length===1?(cronPath=definitions[0].path,output_manager_default.log(`Auto-selected ${import_chalk80.default.bold(cronPath)} (only cron job)`)):cronPath=await client.input.select({message:"Which cron job would you like to run?",choices:definitions.map(cron=>({name:`${cron.path} (${cron.schedule})`,value:cron.path}))})}let cronDef=definitions.find(d=>d.path===cronPath);if(!cronDef)return output_manager_default.error(`Cron job with path ${import_chalk80.default.bold(cronPath)} not found. Run ${getCommandName("crons ls")} to see available cron jobs.`),1;output_manager_default.spinner(`Triggering cron job ${import_chalk80.default.bold(cronPath)}`);let teamId=link.org.type==="team"?link.org.id:void 0,qs=teamId?`?teamId=${encodeURIComponent(teamId)}`:"",result;try{result=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/crons/run${qs}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:cronDef.path,schedule:cronDef.schedule})})}catch(err){if(isAPIError(err))return output_manager_default.error(`Failed to trigger cron job ${import_chalk80.default.bold(cronPath)}: ${err.message}`),1;throw err}return output_manager_default.log(`Cron job ${import_chalk80.default.bold(cronPath)} triggered ${import_chalk80.default.gray(runStamp())}`),output_manager_default.log(` Invocation time: ${import_chalk80.default.cyan(new Date(result.invocationAt).toISOString())}`),0}var CronsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRun(actual){this.trackCliSubcommand({subcommand:"run",value:actual})}};var COMMAND_CONFIG25={add:["add"],ls:["ls","list"],run:["run"]};async function main8(client){let parsedArgs,flagsSpecification=getFlagsSpecification(cronsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new CronsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG25),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("crons"),output_manager_default.print(help(cronsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:cronsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(addSubcommand3)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add4(client,args));case"run":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(runSubcommand)):(telemetry2.trackCliSubcommandRun(subcommandOriginal),run(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(listSubcommand10)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls4(client,args))}}import{spawn as spawn2}from"child_process";var requoteArgs=arg2=>arg2.includes(" ")?arg2.includes('"')?`'${arg2}'`:`"${arg2}"`:arg2;var CurlTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){if(path3){let value=path3.startsWith("/")?"slash":"no-slash";this.trackCliArgument({arg:"path",value})}}trackCliOptionDeployment(deploymentId){if(deploymentId){let value=deploymentId.startsWith("http://")||deploymentId.startsWith("https://")?"url":deploymentId.startsWith("dpl_")?"dpl_":"no-prefix";this.trackCliOption({option:"deployment",value})}}trackCliOptionProtectionBypass(secret){secret&&this.trackCliOption({option:"protection-bypass",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagTrace(trace3){trace3&&this.trackCliFlag("trace")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagYesOnProduction(value){value&&this.trackCliFlag("yes-on-production")}};var import_chalk82=__toESM(require_source(),1),import_error_utils9=__toESM(require_dist(),1);var import_chalk81=__toESM(require_source(),1);async function createDeploymentProtectionToken(client,projectId,orgId){if(!client.authConfig.token)throw output_manager_default.debug("No auth token available, skipping deployment protection token"),new Error("Authentication required to create protection bypass token");try{let response=await client.fetch(`/v1/projects/${projectId}/protection-bypass`,{method:"PATCH",body:"{}",headers:{"Content-Type":"application/json"},accountId:orgId}),{protectionBypass}=response;return output_manager_default.log("You require a deployment protection bypass token to access this deployment... Generating one now..."),output_manager_default.log(`Successfully generated deployment protection bypass token for project ${import_chalk81.default.bold(projectId)}
376
- `),output_manager_default.debug(`Protection Bypass Response: ${protectionBypass}`),await sleep(1e3),getAutomationBypassToken(protectionBypass)}catch(error){throw output_manager_default.debug(`Failed to generate deployment protection bypass token: ${error}`),output_manager_default.note('To bypass deployment protection, create a "Protection Bypass for Automation" secret in your project settings:'),output_manager_default.log(` 1. Visit ${import_chalk81.default.cyan("https://vercel.com/dashboard")}`),output_manager_default.log(" 2. Go to your project settings \u2192 Deployment Protection"),output_manager_default.log(' 3. Generate a "Protection Bypass for Automation" secret'),output_manager_default.log(` 4. Use it with ${import_chalk81.default.cyan("--protection-bypass")} flag or set ${import_chalk81.default.cyan("VERCEL_AUTOMATION_BYPASS_SECRET")} env var`),output_manager_default.log(""),new Error("Failed to create deployment protection bypass token")}}function getAutomationBypassToken(protectionBypass){if(!protectionBypass)throw new Error("No protection bypass tokens found");let token2=Object.keys(protectionBypass).find(key=>protectionBypass[key].scope==="automation-bypass");if(!token2)throw new Error("No automation bypass token found in protection bypass settings");return token2}async function getOrCreateDeploymentProtectionToken(client,{project,org},{createIfMissing=!0}={}){if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),process.env.VERCEL_AUTOMATION_BYPASS_SECRET;if(project.protectionBypass&&Object.values(project.protectionBypass).length){let protectionBypass;try{protectionBypass=getAutomationBypassToken(project.protectionBypass)}catch(error){if(!createIfMissing)return output_manager_default.debug(`No existing automation bypass token found for project ${project.id}`),null;throw error}if(protectionBypass)return output_manager_default.debug(`Using existing protection bypass token from project settings: ${protectionBypass}`),protectionBypass}return createIfMissing?await createDeploymentProtectionToken(client,project.id,org.id):(output_manager_default.debug(`Not creating an automation bypass token for project ${project.id}`),null)}async function getDeploymentAccounts(client){if(detectExplicitScope(client))return client.config.currentTeam?[client.config.currentTeam]:[];if(isAppPrincipalEnabled())try{await getUser(client)}catch(err){if(!(err instanceof InvalidToken))throw err;let token2=await introspectToken(client).catch(()=>null);if(!token2||!resolveAppFromToken(token2))throw err;return token2.team?[token2.team.id]:[]}let currentTeam=client.config.currentTeam;try{return(await getTeams(client)).filter(team=>!team.limited).map(team=>team.id).sort((a,b)=>+(b===currentTeam)-+(a===currentTeam))}catch(err){if(err instanceof InvalidToken&&currentTeam)return[currentTeam];throw err}}async function resolveDeployment(client,selector,accountId){let hostOrId=selector.includes(".")?toHost(selector):selector,endpoint=`/v13/deployments/${encodeURIComponent(hostOrId)}`,lookup=async accountId2=>{try{let deployment2=await client.fetch(endpoint,{useCurrentTeam:!1,...accountId2?{accountId:accountId2}:{},bailOn429:!0});return deployment2?{...deployment2,ownerId:deployment2.ownerId??deployment2.team?.id}:null}catch(err){if(!isAPIError(err)||err.status!==403&&err.status!==404)throw err;return output_manager_default.debug(`Deployment lookup failed for ${hostOrId}: ${err}`),null}};if(accountId||detectExplicitScope(client))return lookup(accountId??client.config.currentTeam);let deployment=await lookup();if(deployment?.projectId&&deployment.ownerId)return deployment;let accounts;try{accounts=await getDeploymentAccounts(client)}catch(err){if(deployment?.url)return deployment;throw err}for(let account of accounts){let scoped=await lookup(account);if(scoped?.projectId&&scoped.ownerId)return scoped;deployment??=scoped}return deployment}async function getDeploymentUrlById(client,deploymentIdOrUrl,accountId){try{if(deploymentIdOrUrl.startsWith("http://")||deploymentIdOrUrl.startsWith("https://"))try{return new URL(deploymentIdOrUrl).origin}catch{return output_manager_default.debug(`Invalid deployment URL provided: ${deploymentIdOrUrl}`),null}if(deploymentIdOrUrl.includes("vercel.app"))return`https://${deploymentIdOrUrl}`;let fullDeploymentId=deploymentIdOrUrl;fullDeploymentId.startsWith("dpl_")||(fullDeploymentId=`dpl_${deploymentIdOrUrl}`);let deployment=await resolveDeployment(client,fullDeploymentId,accountId);return!deployment||!deployment.url?null:`https://${deployment.url}`}catch(error){return output_manager_default.debug(`Failed to fetch deployment by ID: ${error}`),null}}function looksLikeHostname(path3){let firstSegment=path3.split("/")[0];return firstSegment.includes(".")&&!firstSegment.startsWith(".")}function orgFromOwner(id2,slug=id2){return{type:id2.startsWith("team_")?"team":"user",id:id2,slug}}var VC_STRING_FLAGS=new Set(["--deployment","--protection-bypass"]),VC_IGNORED_STRING_FLAGS=new Set(["--scope","--team"]),VC_BOOLEAN_FLAGS=new Set(["--yes","--help","--trace","--json"]);function flagName(arg2){let eqIdx=arg2.indexOf("=");return eqIdx===-1?arg2:arg2.slice(0,eqIdx)}function flagValue(args,index){let arg2=args[index],eqIdx=arg2.indexOf("=");if(eqIdx!==-1)return arg2.slice(eqIdx+1);let next=args[index+1];return next&&!next.startsWith("-")?next:void 0}function getCurlLikeArgs(rawArgs,commandName){if(rawArgs[0]===commandName)return rawArgs.slice(1);let commandIndex=0;for(;commandIndex<rawArgs.length;){let arg2=rawArgs[commandIndex];if(!VC_IGNORED_STRING_FLAGS.has(flagName(arg2)))break;commandIndex++,!arg2.includes("=")&&commandIndex<rawArgs.length&&commandIndex++}return rawArgs[commandIndex]===commandName?rawArgs.slice(commandIndex+1):[...rawArgs]}function parseCurlLikeArgs(rawArgs,commandName){let result={target:void 0,deployment:void 0,protectionBypass:void 0,yes:!1,help:!1,trace:!1,json:!1,toolFlags:[]},args=getCurlLikeArgs(rawArgs,commandName),separatorIndex=args.indexOf("--"),beforeSeparator=separatorIndex===-1?args:args.slice(0,separatorIndex),afterSeparator=separatorIndex===-1?[]:args.slice(separatorIndex+1);for(let i=0;i<beforeSeparator.length;i++){let arg2=beforeSeparator[i],name=flagName(arg2);if(VC_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,name==="--deployment"?result.deployment=value:result.protectionBypass=value;continue}if(VC_IGNORED_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++;continue}if(VC_BOOLEAN_FLAGS.has(name)){name==="--yes"?result.yes=!0:name==="--trace"?result.trace=!0:name==="--json"?result.json=!0:result.help=!0;continue}if(!result.target&&name==="--url"){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,result.target=value;continue}!result.target&&!arg2.startsWith("-")?result.target=arg2:result.toolFlags.push(arg2)}return result.toolFlags.push(...afterSeparator),result}function setupCurlLikeCommand(client,command2,telemetryClient,options={}){let{print}=output_manager_default;if(options.allowFullUrl){let parsed=parseCurlLikeArgs(options.args??client.argv.slice(2),command2.name);if(parsed.help)return print(help(command2,{columns:client.stderr.columns})),0;let path4=parsed.target;if(telemetryClient.trackCliArgumentPath(path4),parsed.deployment&&telemetryClient.trackCliOptionDeployment(parsed.deployment),parsed.protectionBypass&&telemetryClient.trackCliOptionProtectionBypass(parsed.protectionBypass),!path4)return output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`),print(help(command2,{columns:client.stderr.columns})),2;let isFullUrl2=path4.startsWith("http://")||path4.startsWith("https://");return!isFullUrl2&&looksLikeHostname(path4)&&(isFullUrl2=!0),output_manager_default.debug(`${command2.name} flags (${parsed.toolFlags.length} args): ${JSON.stringify(parsed.toolFlags)}`),{path:isFullUrl2&&!path4.startsWith("http")?`https://${path4}`:path4,isFullUrl:isFullUrl2,deploymentFlag:parsed.deployment,protectionBypassFlag:parsed.protectionBypass,toolFlags:parsed.toolFlags,yes:parsed.yes,trace:parsed.trace,json:parsed.json}}let parsedArgs=null,flagsSpecification=getFlagsSpecification(command2.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs;if(parsedArgs.flags["--help"])return print(help(command2,{columns:client.stderr.columns})),0;parsedArgs.args[0]===command2.name&&parsedArgs.args.shift();let separatorIndex=process.argv.indexOf("--"),path3=parsedArgs.args[0];telemetryClient.trackCliArgumentPath(path3);let deploymentFlag=flags["--deployment"];deploymentFlag&&telemetryClient.trackCliOptionDeployment(deploymentFlag);let protectionBypassFlag=flags["--protection-bypass"];if(protectionBypassFlag&&telemetryClient.trackCliOptionProtectionBypass(protectionBypassFlag),!path3||path3==="--"||path3.startsWith("-"))return options.allowFullUrl?output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`):output_manager_default.error(`${getCommandName(`${command2.name} <path>`)} requires an API path (e.g., '/' or '/api/hello' or 'api/hello')`),print(help(command2,{columns:client.stderr.columns})),1;let isFullUrl=path3.startsWith("http://")||path3.startsWith("https://");if(!isFullUrl&&looksLikeHostname(path3)&&(isFullUrl=!0),isFullUrl&&!options.allowFullUrl)return output_manager_default.error("The <path> argument must be a relative API path (e.g., '/' or '/api/hello'), not a full URL."),output_manager_default.print("To target a specific deployment within the currently linked project, use the --deployment <id|url> flag."),print(help(command2,{columns:client.stderr.columns})),1;let toolFlags=separatorIndex!==-1?process.argv.slice(separatorIndex+1):[];return output_manager_default.debug(`${command2.name} flags (${toolFlags.length} args): ${JSON.stringify(toolFlags)}`),{path:isFullUrl&&!path3.startsWith("http")?`https://${path3}`:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,yes:!!flags["--yes"],trace:!!flags["--trace"],json:!!flags["--json"]}}async function resolveProjectFromUrl(client,url){let host=toHost(url);try{let deployment=await resolveDeployment(client,host);if(deployment){let link=await linkFromDeployment(client,deployment);if(link)return link}}catch(err){if(output_manager_default.debug(`Deployment lookup failed for ${host}: ${err}`),isAPIError(err)&&err.status===429)return null}try{let aliasUrl=`/now/aliases/${encodeURIComponent(host)}`;try{let alias2=await client.fetch(aliasUrl,{useCurrentTeam:!1,...detectExplicitScope(client)?{accountId:client.config.currentTeam}:{}});if(alias2.projectId&&alias2.ownerId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(alias2.projectId)}`,{accountId:alias2.ownerId}),org:orgFromOwner(alias2.ownerId)}}catch(err){output_manager_default.debug(`User alias lookup failed for ${host}: ${err}`)}for(let accountId of await getDeploymentAccounts(client))try{let alias2=await client.fetch(aliasUrl,{accountId}),projectId=alias2.projectId,ownerId=alias2.ownerId||accountId;if(projectId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`,{accountId:ownerId}),org:orgFromOwner(ownerId)}}catch(err){output_manager_default.debug(`Alias lookup failed for ${host} in ${accountId}: ${err}`)}}catch(err){output_manager_default.debug(`Team lookup failed for ${host}: ${err}`)}return null}async function getFullUrlAndToken(client,fullUrl,protectionBypassFlag){if(protectionBypassFlag)return{fullUrl,deploymentProtectionToken:protectionBypassFlag,link:null};if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),{fullUrl,deploymentProtectionToken:process.env.VERCEL_AUTOMATION_BYPASS_SECRET,link:null};let link=await resolveProjectFromUrl(client,fullUrl),deploymentProtectionToken=null;if(link)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link)}catch(err){output_manager_default.debug(`Failed to get deployment protection bypass token: ${err}`)}return{fullUrl,deploymentProtectionToken,link}}async function linkFromDeployment(client,deployment){return!deployment.projectId||!deployment.ownerId?null:{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(deployment.projectId)}`,{accountId:deployment.ownerId}),org:orgFromOwner(deployment.ownerId)}}async function resolveTargetProject(client,deployment,deploymentFlag){try{let link=await linkFromDeployment(client,deployment);return link||output_manager_default.warn(`Deployment "${deploymentFlag}" is missing project metadata; proceeding without an automatic protection bypass token.`),link}catch(err){return output_manager_default.debug(`Failed to resolve deployment project: ${err}`),output_manager_default.warn(`Failed to load project for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`),null}}async function tryGetDeployment(client,selector){try{return await resolveDeployment(client,selector)}catch(err){return output_manager_default.debug(`Failed to resolve deployment: ${err}`),null}}async function tryLinkFromSelector(client,selector){try{let deployment=await resolveDeployment(client,selector);return deployment?await linkFromDeployment(client,deployment):null}catch(err){return output_manager_default.debug(`Failed to resolve trace project context: ${err}`),null}}async function getLinkedProjectOrNull(client){try{let linked=await getLinkedProject(client,{cwd:client.cwd});return linked.status==="linked"?linked:null}catch(err){return output_manager_default.debug(`Failed to load linked project: ${err}`),null}}function hasAutomationBypassToken(project){return Object.values(project.protectionBypass??{}).some(token2=>token2.scope==="automation-bypass")}async function getDeploymentUrlAndToken(client,commandName,path3,options){let{deploymentFlag,protectionBypassFlag,autoConfirm,resolveProjectForTrace}=options,suppliedProtectionBypass=deploymentFlag?protectionBypassFlag??(process.env.VERCEL_AUTOMATION_BYPASS_SECRET||void 0):protectionBypassFlag,link=null,createProtectionBypassIfMissing=!deploymentFlag,baseUrl;if(deploymentFlag){let requestedBaseUrl=deploymentFlag.startsWith("http://")||deploymentFlag.startsWith("https://")||deploymentFlag.includes("vercel.app")?await getDeploymentUrlById(client,deploymentFlag):null,deploymentSelector=deploymentFlag.includes(".")||deploymentFlag.startsWith("dpl_")?deploymentFlag:`dpl_${deploymentFlag}`;if(suppliedProtectionBypass!==void 0){if(baseUrl=requestedBaseUrl??await getDeploymentUrlById(client,deploymentFlag)??"",!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;resolveProjectForTrace&&(link=await tryLinkFromSelector(client,deploymentSelector)??await getLinkedProjectOrNull(client))}else{let deployment=await tryGetDeployment(client,deploymentSelector);if(baseUrl=requestedBaseUrl??(deployment?.url?`https://${deployment.url}`:""),!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;deployment?(link=await resolveTargetProject(client,deployment,deploymentFlag),link&&!hasAutomationBypassToken(link.project)&&(createProtectionBypassIfMissing=(await getLinkedProjectOrNull(client))?.project.id===link.project.id)):output_manager_default.warn(`Could not resolve project information for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`)}}else{try{await getScope(client)}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return output_manager_default.error(err.message),1;throw err}let ensuredLink;try{ensuredLink=await ensureLink(commandName,client,client.cwd,{autoConfirm})}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&err.code==="NOT_AUTHORIZED")return output_manager_default.error(err.message),1;throw err}if(typeof ensuredLink=="number")return ensuredLink;let linkedProject=await getLinkedProject(client,{cwd:client.cwd});if(linkedProject.status!=="linked")return output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(" vercel link"),1;if(!linkedProject.project||!linkedProject.org)return output_manager_default.error("Failed to get project information"),1;link=ensuredLink;let preferredAlias=linkedProject.project.targets?.production?.alias?.[0],backupAlias=linkedProject.project.latestDeployments?.[0]?.url,target=preferredAlias||backupAlias;if(!target)throw new Error("No deployment URL found for the project");baseUrl=`https://${target}`}let fullUrl=`${baseUrl}${path3.startsWith("/")?path3:`/${path3}`}`;output_manager_default.debug(`${import_chalk82.default.cyan("Target URL:")} ${import_chalk82.default.bold(fullUrl)}`);let deploymentProtectionToken=suppliedProtectionBypass??null;if(suppliedProtectionBypass===void 0&&link?.project.id)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link,{createIfMissing:createProtectionBypassIfMissing})}catch(err){return output_manager_default.error(`Failed to get deployment protection bypass token: ${err instanceof Error?err.message:String(err)}`),1}return{fullUrl,deploymentProtectionToken,link}}var import_error_utils10=__toESM(require_dist(),1);import{spawn}from"child_process";import{tmpdir}from"os";import{join as join33}from"path";import{mkdtemp,readFile as readFile6,rm as rm3}from"fs/promises";async function confirmProduction(client,{deploymentTarget,yes,isTTY}){return deploymentTarget!=="production"||yes?"proceed":isTTY?await client.input.confirm("You are about to capture a trace against a production deployment. Continue?",!1)?"proceed":"declined":(output_manager_default.error("Use --yes to capture traces on production from non-interactive contexts."),"non-tty-no-yes")}import{createHash as createHash4}from"crypto";import{chmod as chmod2,mkdir,readFile as readFile5,unlink as unlink2,writeFile as writeFile5}from"fs/promises";import{dirname as dirname7,join as join32}from"path";var FALLBACK_TTL_MS=5*60*1e3,EXPIRY_BUFFER_MS=30*1e3,CACHE_SCHEMA_VERSION=1;function resolveCacheDir(override2){return override2||join32(getGlobalPathConfig(),"cache","traces")}function cacheFilename(teamId,host){let key=`${teamId??""}:${host}`;return`${createHash4("sha256").update(key).digest("hex")}.json`}function cachePath(cacheDir,teamId,host){return join32(cacheDir,cacheFilename(teamId,host))}async function readCache(path3){let raw;try{raw=await readFile5(path3,"utf8")}catch{return null}try{let parsed=JSON.parse(raw);return!parsed||typeof parsed.token!="string"||typeof parsed.expiresAt!="number"||parsed.schemaVersion!==CACHE_SCHEMA_VERSION?null:parsed}catch{return output_manager_default.debug(`Trace cookie cache file is corrupt at ${path3}; re-issuing.`),null}}async function writeCache(path3,entry2){await mkdir(dirname7(path3),{recursive:!0}),await writeFile5(path3,JSON.stringify(entry2),{mode:384}),await chmod2(path3,384)}async function issueToken(client,{teamId,projectId,hostname:hostname2}){let body=JSON.stringify({projectId,hostname:hostname2}),response=await client.fetch("/v1/projects/traces/session",{method:"POST",body,headers:{"Content-Type":"application/json"},accountId:teamId});if(!response?.token)throw new Error("Trace session response is missing a token");let expiresAt=typeof response.expiresAt=="number"?response.expiresAt:Date.now()+FALLBACK_TTL_MS;return{token:response.token,expiresAt}}async function getTraceSessionToken({client,teamId,projectId,host,evictedToken,cacheDir}){let dir=resolveCacheDir(cacheDir),hostname2=toHost(host),path3=cachePath(dir,teamId,hostname2),cached=await readCache(path3);if(cached&&evictedToken&&cached.token===evictedToken)await unlink2(path3).catch(()=>{});else if(cached&&Date.now()<cached.expiresAt-EXPIRY_BUFFER_MS)return{token:cached.token,expiresAt:cached.expiresAt,fromCache:!0};let issued=await issueToken(client,{teamId,projectId,hostname:hostname2});try{await writeCache(path3,{token:issued.token,expiresAt:issued.expiresAt,schemaVersion:CACHE_SCHEMA_VERSION})}catch(err){output_manager_default.debug(`Failed to write trace cookie cache: ${err}`)}return{token:issued.token,expiresAt:issued.expiresAt,fromCache:!1}}var TRACE_COOKIE_NAME="_vercel_tracing",SESSION_COOKIE_NAME="_vercel_session";async function lookupDeployment(client,fullUrl,accountId){let deployment=await resolveDeployment(client,fullUrl,accountId);if(!deployment)throw new Error("Deployment not found");return deployment}function resolveTeamId(link,deployment){if(link?.org.type==="team")return link.org.id;if(deployment.ownerId?.startsWith("team_"))return deployment.ownerId}function extractVercelId(headerDump){let lines=headerDump.split(/\r?\n/),lastValue;for(let line2 of lines){let idx=line2.indexOf(":");if(idx===-1)continue;line2.slice(0,idx).trim().toLowerCase()==="x-vercel-id"&&(lastValue=line2.slice(idx+1).trim())}if(!lastValue)return;let sepIdx=lastValue.lastIndexOf("::");return sepIdx===-1?lastValue:lastValue.slice(sepIdx+2)}function extractFinalStatus(headerDump){let lines=headerDump.split(/\r?\n/),lastStatus;for(let line2 of lines){let match=line2.match(/^HTTP\/[\d.]+\s+(\d{3})/);match&&(lastStatus=Number(match[1]))}return lastStatus}async function runCurlAndCaptureHeaders(curlFlags,json){let tmpDir=await mkdtemp(join33(tmpdir(),"vc-curl-trace-")),headerFile=join33(tmpDir,"headers"),flags=["--dump-header",headerFile,...curlFlags];try{let{exitCode:exitCode2,capturedBody}=await new Promise(resolve14=>{let child=spawn("curl",flags,{stdio:json?["inherit","pipe","inherit"]:"inherit",shell:!1}),buf="";json&&child.stdout&&(child.stdout.setEncoding("utf8"),child.stdout.on("data",chunk=>{buf+=chunk})),child.on("error",err=>{err.code==="ENOENT"?output_manager_default.error("curl command not found. Please install curl."):output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14({exitCode:1,capturedBody:buf})}),child.on("close",code2=>{resolve14({exitCode:code2??1,capturedBody:buf})})}),headerDump="";try{headerDump=await readFile6(headerFile,"utf8")}catch(err){output_manager_default.debug(`Failed to read curl header dump: ${err}`)}return{exitCode:exitCode2,headerDump,capturedBody}}finally{await rm3(tmpDir,{recursive:!0,force:!0}).catch(()=>{})}}async function trace2(client,{fullUrl,link,curlFlags,json,yes,telemetry:telemetry2}){telemetry2.trackCliFlagTrace(!0),json&&telemetry2.trackCliFlagJson(!0);let accountId=link?.org.id,deployment;try{deployment=await lookupDeployment(client,fullUrl,accountId)}catch(err){return output_manager_default.error(`Failed to look up deployment for tracing: ${err instanceof Error?err.message:String(err)}`),1}let projectId=link?.project.id??deployment.projectId;if(!projectId)return output_manager_default.error("Could not resolve project for trace session. Run `vercel link` and retry."),1;let teamId=resolveTeamId(link,deployment),userId;try{userId=client.authConfig.userId??(await getUser(client)).id}catch(err){return output_manager_default.error(`Failed to resolve user for trace session: ${(0,import_error_utils10.errorToString)(err)}`),1}let deploymentTarget=deployment.target==="production"?"production":"preview",confirmation=await confirmProduction(client,{deploymentTarget,yes,isTTY:!!client.stdin.isTTY});if(confirmation==="non-tty-no-yes")return 1;if(confirmation==="declined")return output_manager_default.log("Trace cancelled."),0;deploymentTarget==="production"&&yes&&telemetry2.trackCliFlagYesOnProduction(!0);let session;try{session=await getTraceSessionToken({client,teamId,projectId,host:fullUrl})}catch(err){return output_manager_default.error(`Failed to acquire trace session: ${err instanceof Error?err.message:String(err)}`),1}let{exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(session.token,userId,curlFlags,json);if(session.fromCache&&extractFinalStatus(headerDump)===401&&exitCode2===0){output_manager_default.debug("Trace cookie returned 401; evicting cache and retrying.");let refreshed;try{refreshed=await getTraceSessionToken({client,teamId,projectId,host:fullUrl,evictedToken:session.token})}catch(err){return output_manager_default.error(`Failed to refresh trace session after 401: ${err instanceof Error?err.message:String(err)}`),1}({exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(refreshed.token,userId,curlFlags,json))}let requestId=extractVercelId(headerDump);return json?(client.stdout.write(`${JSON.stringify({response:capturedBody,requestId:requestId??null},null,2)}
378
+ `),output_manager_default.debug(`Protection Bypass Response: ${protectionBypass}`),await sleep(1e3),getAutomationBypassToken(protectionBypass)}catch(error){throw output_manager_default.debug(`Failed to generate deployment protection bypass token: ${error}`),output_manager_default.note('To bypass deployment protection, create a "Protection Bypass for Automation" secret in your project settings:'),output_manager_default.log(` 1. Visit ${import_chalk81.default.cyan("https://vercel.com/dashboard")}`),output_manager_default.log(" 2. Go to your project settings \u2192 Deployment Protection"),output_manager_default.log(' 3. Generate a "Protection Bypass for Automation" secret'),output_manager_default.log(` 4. Use it with ${import_chalk81.default.cyan("--protection-bypass")} flag or set ${import_chalk81.default.cyan("VERCEL_AUTOMATION_BYPASS_SECRET")} env var`),output_manager_default.log(""),new Error("Failed to create deployment protection bypass token")}}function getAutomationBypassToken(protectionBypass){if(!protectionBypass)throw new Error("No protection bypass tokens found");let token2=Object.keys(protectionBypass).find(key=>protectionBypass[key].scope==="automation-bypass");if(!token2)throw new Error("No automation bypass token found in protection bypass settings");return token2}async function getOrCreateDeploymentProtectionToken(client,{project,org},{createIfMissing=!0}={}){if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),process.env.VERCEL_AUTOMATION_BYPASS_SECRET;if(project.protectionBypass&&Object.values(project.protectionBypass).length){let protectionBypass;try{protectionBypass=getAutomationBypassToken(project.protectionBypass)}catch(error){if(!createIfMissing)return output_manager_default.debug(`No existing automation bypass token found for project ${project.id}`),null;throw error}if(protectionBypass)return output_manager_default.debug(`Using existing protection bypass token from project settings: ${protectionBypass}`),protectionBypass}return createIfMissing?await createDeploymentProtectionToken(client,project.id,org.id):(output_manager_default.debug(`Not creating an automation bypass token for project ${project.id}`),null)}async function getDeploymentAccounts(client){if(detectExplicitScope(client))return client.config.currentTeam?[client.config.currentTeam]:[];if(isAppPrincipalEnabled())try{await getUser(client)}catch(err){if(!(err instanceof InvalidToken))throw err;let token2=await introspectToken(client).catch(()=>null);if(!token2||!resolveAppFromToken(token2))throw err;return token2.team?[token2.team.id]:[]}let currentTeam=client.config.currentTeam;try{return(await getTeams(client)).filter(team=>!team.limited).map(team=>team.id).sort((a,b)=>+(b===currentTeam)-+(a===currentTeam))}catch(err){if(err instanceof InvalidToken&&currentTeam)return[currentTeam];throw err}}async function resolveDeployment(client,selector,accountId){let hostOrId=selector.includes(".")?toHost(selector):selector,endpoint=`/v13/deployments/${encodeURIComponent(hostOrId)}`,lookup=async accountId2=>{try{let deployment2=await client.fetch(endpoint,{useCurrentTeam:!1,...accountId2?{accountId:accountId2}:{},bailOn429:!0});return deployment2?{...deployment2,ownerId:deployment2.ownerId??deployment2.team?.id}:null}catch(err){if(!isAPIError(err)||err.status!==403&&err.status!==404)throw err;return output_manager_default.debug(`Deployment lookup failed for ${hostOrId}: ${err}`),null}};if(accountId||detectExplicitScope(client))return lookup(accountId??client.config.currentTeam);let deployment=await lookup();if(deployment?.projectId&&deployment.ownerId)return deployment;let accounts;try{accounts=await getDeploymentAccounts(client)}catch(err){if(deployment?.url)return deployment;throw err}for(let account of accounts){let scoped=await lookup(account);if(scoped?.projectId&&scoped.ownerId)return scoped;deployment??=scoped}return deployment}async function getDeploymentUrlById(client,deploymentIdOrUrl,accountId){try{if(deploymentIdOrUrl.startsWith("http://")||deploymentIdOrUrl.startsWith("https://"))try{return new URL(deploymentIdOrUrl).origin}catch{return output_manager_default.debug(`Invalid deployment URL provided: ${deploymentIdOrUrl}`),null}if(deploymentIdOrUrl.includes("vercel.app"))return`https://${deploymentIdOrUrl}`;let fullDeploymentId=deploymentIdOrUrl;fullDeploymentId.startsWith("dpl_")||(fullDeploymentId=`dpl_${deploymentIdOrUrl}`);let deployment=await resolveDeployment(client,fullDeploymentId,accountId);return!deployment||!deployment.url?null:`https://${deployment.url}`}catch(error){return output_manager_default.debug(`Failed to fetch deployment by ID: ${error}`),null}}function looksLikeHostname(path3){let firstSegment=path3.split("/")[0];return firstSegment.includes(".")&&!firstSegment.startsWith(".")}function orgFromOwner(id2,slug=id2){return{type:id2.startsWith("team_")?"team":"user",id:id2,slug}}var VC_STRING_FLAGS=new Set(["--deployment","--protection-bypass"]),VC_IGNORED_STRING_FLAGS=new Set(["--scope","--team"]),VC_BOOLEAN_FLAGS=new Set(["--yes","--help","--trace","--json"]);function flagName(arg2){let eqIdx=arg2.indexOf("=");return eqIdx===-1?arg2:arg2.slice(0,eqIdx)}function flagValue(args,index){let arg2=args[index],eqIdx=arg2.indexOf("=");if(eqIdx!==-1)return arg2.slice(eqIdx+1);let next=args[index+1];return next&&!next.startsWith("-")?next:void 0}function getCurlLikeArgs(rawArgs,commandName){if(rawArgs[0]===commandName)return rawArgs.slice(1);let commandIndex=0;for(;commandIndex<rawArgs.length;){let arg2=rawArgs[commandIndex];if(!VC_IGNORED_STRING_FLAGS.has(flagName(arg2)))break;commandIndex++,!arg2.includes("=")&&commandIndex<rawArgs.length&&commandIndex++}return rawArgs[commandIndex]===commandName?rawArgs.slice(commandIndex+1):[...rawArgs]}function parseCurlLikeArgs(rawArgs,commandName){let result={target:void 0,deployment:void 0,protectionBypass:void 0,yes:!1,help:!1,trace:!1,json:!1,toolFlags:[]},args=getCurlLikeArgs(rawArgs,commandName),separatorIndex=args.indexOf("--"),beforeSeparator=separatorIndex===-1?args:args.slice(0,separatorIndex),afterSeparator=separatorIndex===-1?[]:args.slice(separatorIndex+1);for(let i=0;i<beforeSeparator.length;i++){let arg2=beforeSeparator[i],name=flagName(arg2);if(VC_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,name==="--deployment"?result.deployment=value:result.protectionBypass=value;continue}if(VC_IGNORED_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++;continue}if(VC_BOOLEAN_FLAGS.has(name)){name==="--yes"?result.yes=!0:name==="--trace"?result.trace=!0:name==="--json"?result.json=!0:result.help=!0;continue}if(!result.target&&name==="--url"){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,result.target=value;continue}!result.target&&!arg2.startsWith("-")?result.target=arg2:result.toolFlags.push(arg2)}return result.toolFlags.push(...afterSeparator),result}function setupCurlLikeCommand(client,command2,telemetryClient,options={}){let{print}=output_manager_default;if(options.allowFullUrl){let parsed=parseCurlLikeArgs(options.args??client.argv.slice(2),command2.name);if(parsed.help)return print(help(command2,{columns:client.stderr.columns})),0;let path4=parsed.target;if(telemetryClient.trackCliArgumentPath(path4),parsed.deployment&&telemetryClient.trackCliOptionDeployment(parsed.deployment),parsed.protectionBypass&&telemetryClient.trackCliOptionProtectionBypass(parsed.protectionBypass),!path4)return output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`),print(help(command2,{columns:client.stderr.columns})),2;let isFullUrl2=path4.startsWith("http://")||path4.startsWith("https://");return!isFullUrl2&&looksLikeHostname(path4)&&(isFullUrl2=!0),output_manager_default.debug(`${command2.name} flags (${parsed.toolFlags.length} args): ${JSON.stringify(parsed.toolFlags)}`),{path:isFullUrl2&&!path4.startsWith("http")?`https://${path4}`:path4,isFullUrl:isFullUrl2,deploymentFlag:parsed.deployment,protectionBypassFlag:parsed.protectionBypass,toolFlags:parsed.toolFlags,yes:parsed.yes,trace:parsed.trace,json:parsed.json}}let parsedArgs=null,flagsSpecification=getFlagsSpecification(command2.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs;if(parsedArgs.flags["--help"])return print(help(command2,{columns:client.stderr.columns})),0;parsedArgs.args[0]===command2.name&&parsedArgs.args.shift();let separatorIndex=process.argv.indexOf("--"),path3=parsedArgs.args[0];telemetryClient.trackCliArgumentPath(path3);let deploymentFlag=flags["--deployment"];deploymentFlag&&telemetryClient.trackCliOptionDeployment(deploymentFlag);let protectionBypassFlag=flags["--protection-bypass"];if(protectionBypassFlag&&telemetryClient.trackCliOptionProtectionBypass(protectionBypassFlag),!path3||path3==="--"||path3.startsWith("-"))return options.allowFullUrl?output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`):output_manager_default.error(`${getCommandName(`${command2.name} <path>`)} requires an API path (e.g., '/' or '/api/hello' or 'api/hello')`),print(help(command2,{columns:client.stderr.columns})),1;let isFullUrl=path3.startsWith("http://")||path3.startsWith("https://");if(!isFullUrl&&looksLikeHostname(path3)&&(isFullUrl=!0),isFullUrl&&!options.allowFullUrl)return output_manager_default.error("The <path> argument must be a relative API path (e.g., '/' or '/api/hello'), not a full URL."),output_manager_default.print("To target a specific deployment within the currently linked project, use the --deployment <id|url> flag."),print(help(command2,{columns:client.stderr.columns})),1;let toolFlags=separatorIndex!==-1?process.argv.slice(separatorIndex+1):[];return output_manager_default.debug(`${command2.name} flags (${toolFlags.length} args): ${JSON.stringify(toolFlags)}`),{path:isFullUrl&&!path3.startsWith("http")?`https://${path3}`:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,yes:!!flags["--yes"],trace:!!flags["--trace"],json:!!flags["--json"]}}async function resolveProjectFromUrl(client,url){let host=toHost(url);try{let deployment=await resolveDeployment(client,host);if(deployment){let link=await linkFromDeployment(client,deployment);if(link)return link}}catch(err){if(output_manager_default.debug(`Deployment lookup failed for ${host}: ${err}`),isAPIError(err)&&err.status===429)return null}try{let aliasUrl=`/now/aliases/${encodeURIComponent(host)}`;try{let alias2=await client.fetch(aliasUrl,{useCurrentTeam:!1,...detectExplicitScope(client)?{accountId:client.config.currentTeam}:{}});if(alias2.projectId&&alias2.ownerId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(alias2.projectId)}`,{accountId:alias2.ownerId}),org:orgFromOwner(alias2.ownerId)}}catch(err){output_manager_default.debug(`User alias lookup failed for ${host}: ${err}`)}for(let accountId of await getDeploymentAccounts(client))try{let alias2=await client.fetch(aliasUrl,{accountId}),projectId=alias2.projectId,ownerId=alias2.ownerId||accountId;if(projectId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`,{accountId:ownerId}),org:orgFromOwner(ownerId)}}catch(err){output_manager_default.debug(`Alias lookup failed for ${host} in ${accountId}: ${err}`)}}catch(err){output_manager_default.debug(`Team lookup failed for ${host}: ${err}`)}return null}async function getFullUrlAndToken(client,fullUrl,protectionBypassFlag){if(protectionBypassFlag)return{fullUrl,deploymentProtectionToken:protectionBypassFlag,link:null};if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),{fullUrl,deploymentProtectionToken:process.env.VERCEL_AUTOMATION_BYPASS_SECRET,link:null};let link=await resolveProjectFromUrl(client,fullUrl),deploymentProtectionToken=null;if(link)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link)}catch(err){output_manager_default.debug(`Failed to get deployment protection bypass token: ${err}`)}return{fullUrl,deploymentProtectionToken,link}}async function linkFromDeployment(client,deployment){return!deployment.projectId||!deployment.ownerId?null:{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(deployment.projectId)}`,{accountId:deployment.ownerId}),org:orgFromOwner(deployment.ownerId)}}async function resolveTargetProject(client,deployment,deploymentFlag){try{let link=await linkFromDeployment(client,deployment);return link||output_manager_default.warn(`Deployment "${deploymentFlag}" is missing project metadata; proceeding without an automatic protection bypass token.`),link}catch(err){return output_manager_default.debug(`Failed to resolve deployment project: ${err}`),output_manager_default.warn(`Failed to load project for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`),null}}async function tryGetDeployment(client,selector){try{return await resolveDeployment(client,selector)}catch(err){return output_manager_default.debug(`Failed to resolve deployment: ${err}`),null}}async function tryLinkFromSelector(client,selector){try{let deployment=await resolveDeployment(client,selector);return deployment?await linkFromDeployment(client,deployment):null}catch(err){return output_manager_default.debug(`Failed to resolve trace project context: ${err}`),null}}async function getLinkedProjectOrNull(client){try{let linked=await getLinkedProject(client,{cwd:client.cwd});return linked.status==="linked"?linked:null}catch(err){return output_manager_default.debug(`Failed to load linked project: ${err}`),null}}function hasAutomationBypassToken(project){return Object.values(project.protectionBypass??{}).some(token2=>token2.scope==="automation-bypass")}async function getDeploymentUrlAndToken(client,commandName,path3,options){let{deploymentFlag,protectionBypassFlag,autoConfirm,resolveProjectForTrace}=options,suppliedProtectionBypass=deploymentFlag?protectionBypassFlag??(process.env.VERCEL_AUTOMATION_BYPASS_SECRET||void 0):protectionBypassFlag,link=null,createProtectionBypassIfMissing=!deploymentFlag,baseUrl;if(deploymentFlag){let requestedBaseUrl=deploymentFlag.startsWith("http://")||deploymentFlag.startsWith("https://")||deploymentFlag.includes("vercel.app")?await getDeploymentUrlById(client,deploymentFlag):null,deploymentSelector=deploymentFlag.includes(".")||deploymentFlag.startsWith("dpl_")?deploymentFlag:`dpl_${deploymentFlag}`;if(suppliedProtectionBypass!==void 0){if(baseUrl=requestedBaseUrl??await getDeploymentUrlById(client,deploymentFlag)??"",!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;resolveProjectForTrace&&(link=await tryLinkFromSelector(client,deploymentSelector)??await getLinkedProjectOrNull(client))}else{let deployment=await tryGetDeployment(client,deploymentSelector);if(baseUrl=requestedBaseUrl??(deployment?.url?`https://${deployment.url}`:""),!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;deployment?(link=await resolveTargetProject(client,deployment,deploymentFlag),link&&!hasAutomationBypassToken(link.project)&&(createProtectionBypassIfMissing=(await getLinkedProjectOrNull(client))?.project.id===link.project.id)):output_manager_default.warn(`Could not resolve project information for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`)}}else{try{await getScope(client)}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return output_manager_default.error(err.message),1;throw err}let ensuredLink;try{ensuredLink=await ensureLink(commandName,client,client.cwd,{autoConfirm})}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&err.code==="NOT_AUTHORIZED")return output_manager_default.error(err.message),1;throw err}if(typeof ensuredLink=="number")return ensuredLink;let linkedProject=await getLinkedProject(client,{cwd:client.cwd});if(linkedProject.status!=="linked")return output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(" vercel link"),1;if(!linkedProject.project||!linkedProject.org)return output_manager_default.error("Failed to get project information"),1;link=ensuredLink;let preferredAlias=linkedProject.project.targets?.production?.alias?.[0],backupAlias=linkedProject.project.latestDeployments?.[0]?.url,target=preferredAlias||backupAlias;if(!target)throw new Error("No deployment URL found for the project");baseUrl=`https://${target}`}let fullUrl=`${baseUrl}${path3.startsWith("/")?path3:`/${path3}`}`;output_manager_default.debug(`${import_chalk82.default.cyan("Target URL:")} ${import_chalk82.default.bold(fullUrl)}`);let deploymentProtectionToken=suppliedProtectionBypass??null;if(suppliedProtectionBypass===void 0&&link?.project.id)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link,{createIfMissing:createProtectionBypassIfMissing})}catch(err){return output_manager_default.error(`Failed to get deployment protection bypass token: ${err instanceof Error?err.message:String(err)}`),1}return{fullUrl,deploymentProtectionToken,link}}var import_error_utils10=__toESM(require_dist(),1);import{spawn}from"child_process";import{tmpdir}from"os";import{join as join33}from"path";import{mkdtemp,readFile as readFile6,rm as rm3}from"fs/promises";async function confirmProduction(client,{deploymentTarget,yes,isTTY}){return deploymentTarget!=="production"||yes?"proceed":isTTY?await client.input.confirm("You are about to capture a trace against a production deployment. Continue?",!1)?"proceed":"declined":(output_manager_default.error("Use --yes to capture traces on production from non-interactive contexts."),"non-tty-no-yes")}import{createHash as createHash4}from"crypto";import{chmod as chmod2,mkdir,readFile as readFile5,unlink as unlink2,writeFile as writeFile5}from"fs/promises";import{dirname as dirname7,join as join32}from"path";var FALLBACK_TTL_MS=5*60*1e3,EXPIRY_BUFFER_MS=30*1e3,CACHE_SCHEMA_VERSION=1;function resolveCacheDir(override2){return override2||join32(getGlobalPathConfig(),"cache","traces")}function cacheFilename(teamId,host){let key=`${teamId??""}:${host}`;return`${createHash4("sha256").update(key).digest("hex")}.json`}function cachePath(cacheDir,teamId,host){return join32(cacheDir,cacheFilename(teamId,host))}async function readCache(path3){let raw;try{raw=await readFile5(path3,"utf8")}catch{return null}try{let parsed=JSON.parse(raw);return!parsed||typeof parsed.token!="string"||typeof parsed.expiresAt!="number"||parsed.schemaVersion!==CACHE_SCHEMA_VERSION?null:parsed}catch{return output_manager_default.debug(`Trace cookie cache file is corrupt at ${path3}; re-issuing.`),null}}async function writeCache(path3,entry2){await mkdir(dirname7(path3),{recursive:!0}),await writeFile5(path3,JSON.stringify(entry2),{mode:384}),await chmod2(path3,384)}async function issueToken(client,{teamId,projectId,hostname:hostname2}){let body=JSON.stringify({projectId,hostname:hostname2}),response=await client.fetch("/v1/projects/traces/session",{method:"POST",body,headers:{"Content-Type":"application/json"},accountId:teamId});if(!response?.token)throw new Error("Trace session response is missing a token");let expiresAt=typeof response.expiresAt=="number"?response.expiresAt:Date.now()+FALLBACK_TTL_MS;return{token:response.token,expiresAt}}async function getTraceSessionToken({client,teamId,projectId,host,evictedToken,cacheDir}){let dir=resolveCacheDir(cacheDir),hostname2=toHost(host),path3=cachePath(dir,teamId,hostname2),cached=await readCache(path3);if(cached&&evictedToken&&cached.token===evictedToken)await unlink2(path3).catch(()=>{});else if(cached&&Date.now()<cached.expiresAt-EXPIRY_BUFFER_MS)return{token:cached.token,expiresAt:cached.expiresAt,fromCache:!0};let issued=await issueToken(client,{teamId,projectId,hostname:hostname2});try{await writeCache(path3,{token:issued.token,expiresAt:issued.expiresAt,schemaVersion:CACHE_SCHEMA_VERSION})}catch(err){output_manager_default.debug(`Failed to write trace cookie cache: ${err}`)}return{token:issued.token,expiresAt:issued.expiresAt,fromCache:!1}}var TRACE_COOKIE_NAME="_vercel_tracing",SESSION_COOKIE_NAME="_vercel_session";async function lookupDeployment(client,fullUrl,accountId){let deployment=await resolveDeployment(client,fullUrl,accountId);if(!deployment)throw new Error("Deployment not found");return deployment}function resolveTeamId(link,deployment){if(link?.org.type==="team")return link.org.id;if(deployment.ownerId?.startsWith("team_"))return deployment.ownerId}function extractVercelId(headerDump){let lines=headerDump.split(/\r?\n/),lastValue;for(let line2 of lines){let idx=line2.indexOf(":");if(idx===-1)continue;line2.slice(0,idx).trim().toLowerCase()==="x-vercel-id"&&(lastValue=line2.slice(idx+1).trim())}if(!lastValue)return;let sepIdx=lastValue.lastIndexOf("::");return sepIdx===-1?lastValue:lastValue.slice(sepIdx+2)}function extractFinalStatus(headerDump){let lines=headerDump.split(/\r?\n/),lastStatus;for(let line2 of lines){let match=line2.match(/^HTTP\/[\d.]+\s+(\d{3})/);match&&(lastStatus=Number(match[1]))}return lastStatus}async function runCurlAndCaptureHeaders(curlFlags,json){let tmpDir=await mkdtemp(join33(tmpdir(),"vc-curl-trace-")),headerFile=join33(tmpDir,"headers"),flags=["--dump-header",headerFile,...curlFlags];try{let{exitCode:exitCode2,capturedBody}=await new Promise(resolve14=>{let child=spawn("curl",flags,{stdio:json?["inherit","pipe","inherit"]:"inherit",shell:!1}),buf="";json&&child.stdout&&(child.stdout.setEncoding("utf8"),child.stdout.on("data",chunk2=>{buf+=chunk2})),child.on("error",err=>{err.code==="ENOENT"?output_manager_default.error("curl command not found. Please install curl."):output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14({exitCode:1,capturedBody:buf})}),child.on("close",code2=>{resolve14({exitCode:code2??1,capturedBody:buf})})}),headerDump="";try{headerDump=await readFile6(headerFile,"utf8")}catch(err){output_manager_default.debug(`Failed to read curl header dump: ${err}`)}return{exitCode:exitCode2,headerDump,capturedBody}}finally{await rm3(tmpDir,{recursive:!0,force:!0}).catch(()=>{})}}async function trace2(client,{fullUrl,link,curlFlags,json,yes,telemetry:telemetry2}){telemetry2.trackCliFlagTrace(!0),json&&telemetry2.trackCliFlagJson(!0);let accountId=link?.org.id,deployment;try{deployment=await lookupDeployment(client,fullUrl,accountId)}catch(err){return output_manager_default.error(`Failed to look up deployment for tracing: ${err instanceof Error?err.message:String(err)}`),1}let projectId=link?.project.id??deployment.projectId;if(!projectId)return output_manager_default.error("Could not resolve project for trace session. Run `vercel link` and retry."),1;let teamId=resolveTeamId(link,deployment),userId;try{userId=client.authConfig.userId??(await getUser(client)).id}catch(err){return output_manager_default.error(`Failed to resolve user for trace session: ${(0,import_error_utils10.errorToString)(err)}`),1}let deploymentTarget=deployment.target==="production"?"production":"preview",confirmation=await confirmProduction(client,{deploymentTarget,yes,isTTY:!!client.stdin.isTTY});if(confirmation==="non-tty-no-yes")return 1;if(confirmation==="declined")return output_manager_default.log("Trace cancelled."),0;deploymentTarget==="production"&&yes&&telemetry2.trackCliFlagYesOnProduction(!0);let session;try{session=await getTraceSessionToken({client,teamId,projectId,host:fullUrl})}catch(err){return output_manager_default.error(`Failed to acquire trace session: ${err instanceof Error?err.message:String(err)}`),1}let{exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(session.token,userId,curlFlags,json);if(session.fromCache&&extractFinalStatus(headerDump)===401&&exitCode2===0){output_manager_default.debug("Trace cookie returned 401; evicting cache and retrying.");let refreshed;try{refreshed=await getTraceSessionToken({client,teamId,projectId,host:fullUrl,evictedToken:session.token})}catch(err){return output_manager_default.error(`Failed to refresh trace session after 401: ${err instanceof Error?err.message:String(err)}`),1}({exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(refreshed.token,userId,curlFlags,json))}let requestId=extractVercelId(headerDump);return json?(client.stdout.write(`${JSON.stringify({response:capturedBody,requestId:requestId??null},null,2)}
377
379
  `),requestId?exitCode2:exitCode2===0?1:exitCode2):requestId?(client.stderr.write(`
378
380
  Run \`vercel traces inspect ${requestId}\` to fetch the trace.
379
381
  `),exitCode2):(output_manager_default.error("Trace cookie was set but the response did not include an x-vercel-id header."),exitCode2===0?1:exitCode2)}async function runCurlWithCookie(token2,userId,curlFlags,json){let flagsWithCookie=["--header",`Cookie: ${TRACE_COOKIE_NAME}=${token2}; ${SESSION_COOKIE_NAME}=${userId}`,...curlFlags];return output_manager_default.debug(`Executing: curl ${flagsWithCookie.map(requoteArgs).join(" ")}`),runCurlAndCaptureHeaders(flagsWithCookie,json)}async function curl(client){return runCurl(client,{})}async function runCurl(client,{forceTrace=!1,args}){let telemetryClient=new CurlTelemetryClient({opts:{store:client.telemetryEventStore}}),setup2=setupCurlLikeCommand(client,curlCommand,telemetryClient,{allowFullUrl:!0,args});if(typeof setup2=="number")return setup2;let{path:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,json:jsonFlag}=setup2,traceFlag=forceTrace||setup2.trace,result=isFullUrl?await getFullUrlAndToken(client,path3,protectionBypassFlag):await getDeploymentUrlAndToken(client,"curl",path3,{deploymentFlag,protectionBypassFlag,autoConfirm:setup2.yes,resolveProjectForTrace:traceFlag});if(typeof result=="number")return result;let{fullUrl,deploymentProtectionToken}=result,curlFlags=[...toolFlags];return deploymentProtectionToken&&curlFlags.unshift("--header",`x-vercel-protection-bypass: ${deploymentProtectionToken}`),curlFlags.unshift("--url",fullUrl),traceFlag?trace2(client,{fullUrl,link:result.link??null,curlFlags,json:jsonFlag,yes:setup2.yes,telemetry:telemetryClient}):(output_manager_default.debug(`Executing: curl ${curlFlags.map(requoteArgs).join(" ")}`),new Promise(resolve14=>{let curlProcess=spawn2("curl",curlFlags,{stdio:"inherit",shell:!1});curlProcess.on("error",err=>{"code"in err&&err.code==="ENOENT"?(output_manager_default.error("curl command not found. Please install curl."),resolve14(1)):(output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14(1))}),curlProcess.on("close",code2=>{resolve14(code2??1)})}))}var import_chalk83=__toESM(require_source(),1);async function getProjectByCwdOrLink({autoConfirm,nonInteractive,client,commandName,cwd,projectNameOrId,forReadOnlyCommand}){if(projectNameOrId){let project=await getProjectByNameOrId(client,projectNameOrId);if(project instanceof ProjectNotFound)throw project;return project}let effectiveNonInteractive=nonInteractive??client.nonInteractive??argvHasNonInteractive(client.argv);if(forReadOnlyCommand&&effectiveNonInteractive){let resolvedCwd=await resolveProjectCwd(cwd??client.cwd),link=await getLinkedProject(client,{cwd:resolvedCwd});if(link.status==="linked"&&link.project)return link.project;if(link.status==="error"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}throw new LinkRequiredError}let linkedProject=await ensureLink(commandName,client,cwd??client.cwd,{autoConfirm,nonInteractive});if(typeof linkedProject=="number"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}return linkedProject.project}var DeployHooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls5(client,argv){let telemetry2=new DeployHooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand11.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"deploy-hooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliOptionProject(opts["--project"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching deploy hooks under ${import_chalk83.default.bold(contextName)}`);try{let project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks ls",projectNameOrId:opts["--project"],forReadOnlyCommand:!0}),hooks=project.link?.deployHooks??[];if(asJson){output_manager_default.stopSpinner();let rows2=hooks.map(h=>({id:h.id,name:h.name,ref:h.ref,url:h.url,createdAt:h.createdAt}));return client.nonInteractive?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,projectId:project.id,projectName:project.name,hooks:rows2,message:hooks.length===0?"No deploy hooks for this project.":`Listed ${hooks.length} deploy hook${hooks.length===1?"":"s"}.`,next:[{command:getCommandNamePlain("deploy-hooks create <name> --ref <branch>"),when:"Create a deploy hook"}]},null,2)}
@@ -403,7 +405,7 @@ ${import_chalk84.default.dim("Anyone with the URL can trigger a deployment. Stor
403
405
  `),output_manager_default.print(` Then import it to Vercel DNS by using:
404
406
  `),output_manager_default.print(` ${getCommandName(`dns import ${domainName} <zonefile>`)}
405
407
 
406
- `),0)}var import_chalk101=__toESM(require_source(),1);var import_chalk100=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk100.default.gray("-"),sortedCurrent[i]||import_chalk100.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk100.default.green(chars_default.tick):import_chalk100.default.red(chars_default.cross)]);return table([[import_chalk100.default.gray("Intended Nameservers"),import_chalk100.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk.projectDomains){let domains2=domainsByProjectId.get(projectDomain.projectId)??[];domains2.push(projectDomain.name),domainsByProjectId.set(projectDomain.projectId,domains2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,domains2])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains:domains2}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain2){return domain2.boughtAt?"Vercel":typeof domain2.orderedAt=="number"&&!domain2.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect8(client,argv){let telemetry2=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry2.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk101.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk101.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName});if(typeof information=="number")return information;let{domain:domain2,projects:projects2,renewalPrice,domainConfig}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain2.name,registrar:getDomainRegistrar(domain2),expiresAt:domain2.expiresAt,creator:domain2.creator.username,createdAt:domain2.createdAt,edgeNetwork:!0,renewalPrice:domain2.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain2.intendedNameservers,current:domain2.nameservers},projects:projects2.map(({project,domains:domains2})=>({name:project.name,domains:domains2})),configuration:{misconfigured:domainConfig.misconfigured??null}},null,2)}
408
+ `),0)}var import_chalk101=__toESM(require_source(),1);var import_chalk100=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk100.default.gray("-"),sortedCurrent[i]||import_chalk100.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk100.default.green(chars_default.tick):import_chalk100.default.red(chars_default.cross)]);return table([[import_chalk100.default.gray("Intended Nameservers"),import_chalk100.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk2 of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk2.projectDomains){let domains2=domainsByProjectId.get(projectDomain.projectId)??[];domains2.push(projectDomain.name),domainsByProjectId.set(projectDomain.projectId,domains2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,domains2])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains:domains2}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain2){return domain2.boughtAt?"Vercel":typeof domain2.orderedAt=="number"&&!domain2.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect8(client,argv){let telemetry2=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry2.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk101.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk101.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName});if(typeof information=="number")return information;let{domain:domain2,projects:projects2,renewalPrice,domainConfig}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain2.name,registrar:getDomainRegistrar(domain2),expiresAt:domain2.expiresAt,creator:domain2.creator.username,createdAt:domain2.createdAt,edgeNetwork:!0,renewalPrice:domain2.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain2.intendedNameservers,current:domain2.nameservers},projects:projects2.map(({project,domains:domains2})=>({name:project.name,domains:domains2})),configuration:{misconfigured:domainConfig.misconfigured??null}},null,2)}
407
409
  `),0;if(output_manager_default.log(`Domain ${domainName} found under ${import_chalk101.default.bold(contextName)} ${import_chalk101.default.gray(inspectStamp())}`),output_manager_default.print(`
408
410
  `),output_manager_default.print(import_chalk101.default.bold(` General
409
411
 
@@ -481,10 +483,10 @@ ${import_chalk109.default.yellow("!")} No exposures or metric events in this win
481
483
  `),output_manager_default.print(`${diagnosedEventRow(event)}
482
484
  `),printed+=1}}function diagnosedEventRow(event){return diagnosedRow({time:diagnosedEventCells.time(event),kind:diagnosedEventCells.kind(event),what:diagnosedEventCells.what(event),variant:diagnosedEventCells.variant(event),unit:diagnosedEventCells.unit(event),note:diagnosedEventCells.note(event)})}function diagnosedHeader(){return import_chalk109.default.dim(diagnosedRow({time:"Time",kind:"Kind",what:"What",variant:"Variant",unit:"Unit",note:"Note"}))}function diagnosedRow(cells){return[padCell(cells.time,DIAGNOSED_COLUMN_WIDTHS.time),padCell(cells.kind,DIAGNOSED_COLUMN_WIDTHS.kind),padCell(cells.what,DIAGNOSED_COLUMN_WIDTHS.what),padCell(cells.variant,DIAGNOSED_COLUMN_WIDTHS.variant),padCell(cells.unit,DIAGNOSED_COLUMN_WIDTHS.unit),cells.note].join(" ").trimEnd()}var diagnosedEventCells={time:event=>import_chalk109.default.gray(event.timestamp),kind:event=>event.kind==="exposure"?import_chalk109.default.cyan(event.kind):import_chalk109.default.magenta(event.kind),what:event=>diagnosedEventName(event),variant:event=>event.variantId?import_chalk109.default.bold(event.variantId):import_chalk109.default.dim("\u2014"),unit:event=>event.unit??import_chalk109.default.dim("\u2014"),note:event=>event.assignmentReason?import_chalk109.default.yellow(event.assignmentReason):""};function padCell(value,width){return value+" ".repeat(Math.max(0,width-strlen(value)))}function diagnosedEventName(event){return event.name??(event.kind==="exposure"?"assigned":"\u2014")}import{readFile as readFile7}from"node:fs/promises";import{resolve as resolve10}from"node:path";function getProjectNameFromFlags(flags){return flags["--project"]}function getLinkedFlagsProject(client,projectName,options){return resolveProjectContext({client,projectNameOrId:projectName,projectNotFoundHandling:options?.projectNotFoundHandling})}function isJson(flags){return flags["--format"]==="json"}function validateFormat(flags){let format3=flags["--format"];return format3===void 0||format3==="json"?!0:(output_manager_default.error("The --format option only accepts `json`."),!1)}async function resolveProject2(client,flags){let projectName=getProjectNameFromFlags(flags),link=await getLinkedFlagsProject(client,projectName);return link.status==="error"?link.exitCode:link.status==="not_linked"?(output_manager_default.error(`Your codebase isn't linked to a project. Pass --project <name-or-id>, or run ${getCommandName("link")}.`),1):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,link)}function parseSubcommand(argv,command2){try{let parsed=parseArguments(argv,getFlagsSpecification(command2.options));return validateFormat(parsed.flags)?parsed:void 0}catch(error){printError(error);return}}function requireExperimentArgument(args,usage2){let[experiment,extra]=args;if(!experiment){output_manager_default.error(`Missing required argument: experiment. Usage: ${getCommandName(usage2)}`);return}if(extra){output_manager_default.error(`Too many arguments. Usage: ${getCommandName(usage2)}`);return}return experiment}function writeJson2(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
483
485
  `)}var EXPERIMENTS_NOT_ENABLED_MESSAGE="Experiments are not enabled for this team.",EXPERIMENTS_LIMITED_PREVIEW_MESSAGE="This command is currently in limited preview and isn\u2019t enabled for your team.";function printExperimentError(client,error,json=!1){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){json||client.nonInteractive?writeJson2(client,{status:"error",reason:"experiments_not_enabled",message:EXPERIMENTS_LIMITED_PREVIEW_MESSAGE,userActionRequired:!0}):output_manager_default.error(EXPERIMENTS_LIMITED_PREVIEW_MESSAGE);return}printError(error)}function jsonResult(experiment,next,extra={}){return{status:"success",experiment,...extra,next}}function printMutationPreview(link,experiment,transition,effect){let experimentIdentifier=getExperimentIdentifier(experiment);printAlignedLabel("Project",formatProject(link.org.slug,link.project.name)),printAlignedLabel("Experiment",experimentIdentifier),printAlignedLabel("State",transition),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Effect",effect),output_manager_default.print(`
484
- `)}async function confirmMutation({client,flags,link,experiment,transition,effect,prompt}){let json=isJson(flags),yes=flags["--yes"]===!0;if(json||printMutationPreview(link,experiment,transition,effect),!yes){if(json||client.nonInteractive||!client.stdin.isTTY){let nextCommand=buildCommandWithYes(client.argv);return json||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Re-run with --yes to apply this production change.",userActionRequired:!0,next:[{command:nextCommand}]}):output_manager_default.error(`Missing required flag --yes. Re-run \`${nextCommand}\`.`),2}return await client.input.confirm(prompt,!1)?void 0:outputCanceled()}}function outputCanceled(){return output_manager_default.log("Canceled"),0}async function readAllStdin(client){if(client.stdin.isTTY)return"";let chunks=[];client.stdin.setEncoding("utf8");for await(let chunk of client.stdin)chunks.push(String(chunk));return chunks.join("")}async function readJsonObject(client,file){if(typeof file!="string"){output_manager_default.error("Missing required option --file <file>.");return}try{let source=file==="-"?await readAllStdin(client):await readFile7(resolve10(client.cwd,file),"utf8");if(!source.trim()){output_manager_default.error(file==="-"?"No JSON received on stdin for --file -.":`The file ${file} is empty.`);return}let value=JSON.parse(source);if(typeof value!="object"||value===null||Array.isArray(value)){output_manager_default.error("The JSON request body must be an object.");return}return value}catch(error){output_manager_default.error(`Failed to read experiment JSON: ${error instanceof Error?error.message:String(error)}`);return}}async function fetchExperimentContext(client,parsed,usage2){let id2=requireExperimentArgument(parsed.args,usage2);if(!id2)return 2;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiment\u2026");let experiment=await getExperiment(client,link.project.id,id2);return output_manager_default.stopSpinner(),{link,experiment}}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function mutateExperiment(client,flags,context,spinner,mutation,resultLabel){try{output_manager_default.spinner(spinner);let experiment=await mutation();output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel(resultLabel,experiment.name,{gutter:"\u2713"}),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),experiment.rampPercentage!==void 0&&printAlignedLabel("Ramp",`${experiment.rampPercentage}%`),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(flags)),1}}async function confirmAndMutateExperiment({client,flags,context,transition,effect,prompt,spinner,mutation,resultLabel}){let confirmation=await confirmMutation({client,flags,link:context.link,experiment:context.experiment,transition,effect,prompt});return confirmation!==void 0?confirmation:mutateExperiment(client,flags,context,spinner,mutation,resultLabel)}function parseRamp(flags){let ramp=flags["--ramp"];if(typeof ramp!="number"||!Number.isFinite(ramp)||ramp<0||ramp>100){output_manager_default.error("Provide --ramp as a percentage from 0 to 100.");return}return ramp}function requireExperimentState(experiment,expected,action){let states=Array.isArray(expected)?expected:[expected];return states.includes(experiment.state)?!0:(output_manager_default.error(`Cannot ${action} while the experiment is ${experiment.state}. Expected state: ${states.join(" or ")}.`),!1)}function unitKeyFromBase(experiment){let{kind,attribute}=experiment.base;return attribute==="id"&&(kind==="device"||kind==="user"||kind==="group")?`${kind}_id`:`event_data.${attribute==="id"?`${kind.replace(/[^A-Za-z0-9_]/g,"_")}Id`:attribute.replace(/[^A-Za-z0-9_]/g,"_")}`}async function runAnalyze(client,argv){let parsed=parseSubcommand(argv,analyzeSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments analyze <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,metrics2=experiment.metrics??{};if(Object.keys(metrics2).length===0)return output_manager_default.error("This experiment has no metrics to analyze."),1;let primaryMetric=typeof parsed.flags["--metric"]=="string"?parsed.flags["--metric"]:experiment.primaryMetric;if(primaryMetric&&!(primaryMetric in metrics2))return output_manager_default.error(`Metric ${primaryMetric} isn't configured. Choose one of: ${Object.keys(metrics2).join(", ")}.`),1;let epoch=experiment.rampId?experiment.epochs.find(item=>item.rampId===experiment.rampId):experiment.epochs.at(-1);if(!epoch)return output_manager_default.error("This experiment has no analysis epoch. Start it before requesting results."),1;let body={metrics:metrics2,...primaryMetric?{primaryMetric}:{},controlVariantId:experiment.controlVariantId,expectedVariantWeights:experiment.weights,excludeContaminated:parsed.flags["--exclude-contaminated"]===!0,unitKey:unitKeyFromBase(experiment),rampId:epoch.rampId,from:new Date(epoch.startedAt).toISOString(),...epoch.endedAt?{to:new Date(epoch.endedAt).toISOString()}:{}};try{output_manager_default.spinner("Analyzing experiment\u2026");let analysis=await getExperimentAnalysis(client,context.link.project.id,experiment.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment),assessment=assessExperimentAnalysis(experiment,analysis);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next,{analysis,assessment})):(printExperimentAnalysis(experiment,analysis,assessment),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runCreate(client,argv){let parsed=parseSubcommand(argv,createSubcommand4);if(!parsed)return 2;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Creating experiment\u2026");let experiment=await createExperiment(client,link.project.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel("Created",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Experiment",experiment.id),experiment.slug&&printAlignedLabel("Slug",experiment.slug),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("State",experiment.state),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runDecide(client,argv){let parsed=parseSubcommand(argv,decideSubcommand);if(!parsed)return 2;let winner=parsed.flags["--winner"],abandon=parsed.flags["--abandon"]===!0,rationale=parsed.flags["--rationale"];if(typeof winner=="string"===abandon)return output_manager_default.error("Use exactly one of --winner <variant-id> or --abandon."),2;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),2;let context=await fetchExperimentContext(client,parsed,"experiments decide <experiment> (--winner <variant-id>|--abandon) --rationale <text>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","make a decision"))return 1;if(typeof winner=="string"&&!context.experiment.variants.some(variant=>variant.id===winner))return output_manager_default.error(`Variant ${winner} isn't part of this experiment. Choose one of: ${context.experiment.variants.map(variant=>variant.id).join(", ")}.`),1;let effect=abandon?"Stop the experiment and serve control":`Stop the experiment and serve variant ${winner}`;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 completed`,effect,prompt:"Record this experiment decision?",spinner:"Recording experiment decision\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"complete",outcome:abandon?"abandon":"winner",...typeof winner=="string"?{winnerVariantId:winner}:{},rationale}),resultLabel:abandon?"Abandoned":"Completed"})}async function runDelete(client,argv){let parsed=parseSubcommand(argv,deleteSubcommand2);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments delete <experiment> --confirm <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,experimentIdentifier=getExperimentIdentifier(experiment),proof=parsed.flags["--confirm"],proofMatches=proof===experiment.id||proof===experiment.slug||proof===parsed.args[0];if(isJson(parsed.flags)||printMutationPreview(context.link,experiment,`${experiment.state} \u2192 deleted`,`Delete experiment data and release feature flag ${experiment.flagSlug}`),!proofMatches){if(isJson(parsed.flags)||client.nonInteractive||!client.stdin.isTTY){let command2=buildCommandWithGlobalFlags(client.argv,`experiments delete ${experimentIdentifier} --confirm ${experimentIdentifier}`,void 0,{preserveProject:!0});return isJson(parsed.flags)||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Deleting an experiment permanently removes its history and releases its feature flag.",userActionRequired:!0,next:[{command:command2}]}):output_manager_default.error(`Provide --confirm ${experimentIdentifier} to delete this experiment non-interactively.`),1}if(await client.input.text({message:`Type ${experimentIdentifier} to confirm deletion:`})!==experimentIdentifier)return outputCanceled()}try{output_manager_default.spinner("Deleting experiment\u2026"),await deleteExperiment(client,context.link.project.id,experiment.id),output_manager_default.stopSpinner();let next=buildDeletedNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,{status:"success",deletedExperiment:{id:experiment.id,slug:experiment.slug,name:experiment.name},releasedFlag:{id:experiment.flagId,slug:experiment.flagSlug},next}):(printAlignedLabel("Deleted",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Released Flag",experiment.flagSlug),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_chalk110=__toESM(require_source(),1);var MAX_DIAGNOSE_EVENTS=200,DEFAULT_DIAGNOSE_EVENTS=50,DIAGNOSE_LOOKBACK_MS=30*24*60*60*1e3,FOLLOW_TIMEOUT_MS=5*60*1e3,FOLLOW_POLL_INTERVAL_MS=5e3,FOLLOW_PAGE_LIMIT=200;async function followExperimentEvents({client,experiment,ownerId,projectId,filter,unitField,from,seen,json,printedSoFar=0,intervalMs=FOLLOW_POLL_INTERVAL_MS,timeoutMs=FOLLOW_TIMEOUT_MS}){let printEvent=createDiagnosedEventPrinter(printedSoFar),abortController=new AbortController,deadline=setTimeout(()=>{abortController.abort()},timeoutMs),onSigint=()=>{abortController.abort()};process.on("SIGINT",onSigint);let watermark=from,watermarkSeen=seen;try{for(;!abortController.signal.aborted&&(await sleepUnlessAborted(intervalMs,abortController.signal),!abortController.signal.aborted);){let end=new Date;if(end.getTime()<=watermark.getTime())continue;let rows;try{rows=(await queryAnalyticsEvents(client,ownerId,projectId,{filter,select:["type","eventName","eventData"],start:toWholeSecondIso(watermark),end:toWholeSecondIso(end),limit:FOLLOW_PAGE_LIMIT,order:"asc"})).events??[]}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,json),1}let events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),fresh=withoutSeen(events,watermarkSeen);if(fresh.length>0){output_manager_default.stopSpinner();for(let event of fresh)json?writeJson2(client,event):printEvent(event)}let latest=events.at(-1)?.timestamp;if(latest){let latestDate2=new Date(latest);latestDate2.getTime()>watermark.getTime()?(watermark=latestDate2,watermarkSeen=countByKey(events.filter(event=>event.timestamp===latest))):watermarkSeen=countByKey(events)}abortController.signal.aborted||output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`)}}finally{clearTimeout(deadline),process.removeListener("SIGINT",onSigint),output_manager_default.stopSpinner()}return 0}async function runDiagnose(client,argv){let parsed=parseSubcommand(argv,diagnoseSubcommand);if(!parsed)return 2;let jsonOutput=isJson(parsed.flags),fail3=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail3({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk110.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk110.default.bold("--until")}.`});let limit=validateIntegerRangeWithDefault(parsed.flags["--limit"],{flag:"--limit",min:1,max:MAX_DIAGNOSE_EVENTS,defaultValue:DEFAULT_DIAGNOSE_EVENTS});if(!limit.valid)return fail3(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail3(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail3(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail3(order);let context=await fetchExperimentContext(client,parsed,"experiments diagnose <experiment>");if(typeof context=="number")return context;let{experiment,link}=context,names=metricEventNames(experiment),requestedEvents=normalizeRepeatableStringFilters(parsed.flags["--event"]),unknownEvents=requestedEvents.filter(name=>!names.includes(name));if(unknownEvents.length>0)return fail3({valid:!1,code:"UNKNOWN_METRIC_EVENT",message:`This experiment has no metric event named ${unknownEvents.map(name=>`"${name}"`).join(", ")}. Choose from: ${names.join(", ")||"(none configured)"}.`,allowedValues:names});let wantsExposures=!!parsed.flags["--exposures"]||requestedEvents.length===0,eventNames=requestedEvents.length>0?requestedEvents:parsed.flags["--exposures"]?[]:names,limitValue=limit.value,end=until.value??new Date,window={start:toWholeSecondIso(since.value??defaultRangeStart(experiment,end)),end:toWholeSecondIso(end)},unitValue=typeof parsed.flags["--unit"]=="string"?parsed.flags["--unit"]:"",unitClause=unitValue?` AND eventData:*${unitValue.replaceAll("*","")}*`:"",branches=[wantsExposures?`type:exposure AND eventName:${quoteFilterValue(experiment.id)}${unitClause}`:void 0,eventNames.length>0?`type:event AND eventName:(${eventNames.map(quoteFilterValue).join(" OR ")})${unitClause}`:void 0].filter(branch=>branch!==void 0);if(branches.length===0)return output_manager_default.error("Nothing selected. Drop --exposures, or name a metric event with --event."),1;let followFilter=branches.length===1?branches[0]:branches.map(branch=>`(${branch})`).join(" OR "),diagnosis;try{output_manager_default.spinner("Reading experiment events\u2026");let projectId=await resolveAnalyticsProjectId(client,link.org.id,link.project.id),rows=(await queryAnalyticsEvents(client,link.org.id,projectId,{filter:followFilter,select:["type","eventName","eventData"],...window,limit:limitValue})).events??[],declaredUnitKey=rows.map(row=>parseEventData(row.eventData).unitKey).find(key=>typeof key=="string"),unitField=unitFieldFromKey(declaredUnitKey??unitKeyFromBase(experiment)),events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),exposures=events.filter(event=>event.kind==="exposure"),enrolled=exposures.filter(event=>event.assignmentReason===void 0);diagnosis={events,projectId,exposureCount:exposures.length,metricEventCount:events.length-exposures.length,enrolledUnits:new Set(enrolled.map(event=>event.unit).filter(Boolean)).size,notEnrolledExposures:exposures.length-enrolled.length,metricEventNames:names,unitField,truncated:rows.length>=limitValue,staleRampExposures:experiment.rampId?exposures.filter(event=>event.rampId!==void 0&&event.rampId!==experiment.rampId).length:0,window},output_manager_default.stopSpinner()}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,jsonOutput),1}if(jsonOutput?writeJson2(client,{status:"success",experiment:{id:experiment.id,slug:experiment.slug,state:experiment.state,rampId:experiment.rampId},diagnosis}):printExperimentDiagnosis(experiment,diagnosis,{follow:!!parsed.flags["--follow"]}),parsed.flags["--follow"]){let newest=diagnosis.events[0]?.timestamp,from=newest?new Date(newest):new Date(diagnosis.window.end),seen=newest?countByKey(diagnosis.events.filter(event=>event.timestamp===newest)):new Map;return output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`),followExperimentEvents({client,experiment,ownerId:link.org.id,projectId:diagnosis.projectId,filter:followFilter,unitField:diagnosis.unitField,from,seen,json:jsonOutput,printedSoFar:diagnosis.events.length})}return 0}function sleepUnlessAborted(ms47,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms47);signal.addEventListener("abort",settle,{once:!0})})}function printDiagnoseError(client,error,json){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){printExperimentError(client,error,json);return}if(isAPIError(error)&&error.status===402){output_manager_default.error("Reading custom events and experiment exposures requires a Pro or Enterprise plan.");return}if(isAPIError(error)&&error.status===403){output_manager_default.error("Cannot read experiment exposures. Web Analytics must be enabled for the project, and exposures are behind the `web-analytics-exposure-events` flag.");return}printExperimentError(client,error,json)}function countByKey(events){let counts=new Map;for(let event of events){let key=diagnosedEventKey(event);counts.set(key,(counts.get(key)??0)+1)}return counts}function diagnosedEventKey(event){return[event.timestamp,event.kind,event.name??"",event.unit??"",event.variantId??""].join("\0")}function withoutSeen(events,seen){let remaining=new Map(seen),fresh=[];for(let event of events){let key=diagnosedEventKey(event),outstanding=remaining.get(key)??0;if(outstanding>0){remaining.set(key,outstanding-1);continue}fresh.push(event)}return fresh}function toWholeSecondIso(date){let truncated=new Date(date);return truncated.setUTCMilliseconds(0),truncated.toISOString()}function toDiagnosedEvent(row,kind,unitField){let payload=parseEventData(row.eventData),pick=key=>typeof payload[key]=="string"?payload[key]:void 0,unit=pick(kind==="exposure"?"unitValue":unitField),variantId=pick("variantId"),rampId=pick("rampId"),assignmentReason=pick("assignmentReason");return{timestamp:row.timestamp,kind,...kind==="event"&&row.eventName?{name:row.eventName}:{},...unit?{unit}:{},...variantId?{variantId}:{},...rampId?{rampId}:{},...assignmentReason&&assignmentReason!=="experiment"?{assignmentReason}:{},...Object.keys(payload).length>0?{payload}:{}}}function parseEventData(raw){if(!raw)return{};try{let parsed=JSON.parse(raw);return parsed!==null&&typeof parsed=="object"?parsed:{}}catch{return{}}}function unitFieldFromKey(unitKey){return unitKey.startsWith("event_data.")?unitKey.slice(11):unitKey}function metricEventNames(experiment){let names=new Set,add16=value=>{typeof value=="string"&&value.length>0&&names.add(value)};for(let metric of Object.values(experiment.metrics??{}))add16(metric.eventName),add16(metric.initialEvent),add16(metric.goalEvent),add16(metric.numeratorEvent),add16(metric.denominatorEvent),Array.isArray(metric.eventNames)&&metric.eventNames.forEach(add16);return[...names]}function quoteFilterValue(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function defaultRangeStart(experiment,end){let launchedAt=experiment.launchedAt??experiment.createdAt;return new Date(Math.max(launchedAt,end.getTime()-DIAGNOSE_LOOKBACK_MS))}async function runInspect(client,argv){let parsed=parseSubcommand(argv,inspectSubcommand8);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments inspect <experiment>");if(typeof context=="number")return context;let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next)):(printExperimentDetails(context.experiment),printNextCommands(next)),0}async function runList(client,argv){let parsed=parseSubcommand(argv,listSubcommand13);if(!parsed)return 2;let state=parsed.flags["--state"];if(state!==void 0&&state!=="draft"&&state!=="running"&&state!=="completed")return output_manager_default.error("The --state option must be draft, running, or completed."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiments\u2026");let all=await listExperiments(client,link.project.id);output_manager_default.stopSpinner();let experiments2=state?all.filter(experiment=>experiment.state===state):all,next=buildListNextCommands(client);return isJson(parsed.flags)?(writeJson2(client,{status:"success",experiments:experiments2,next}),0):(experiments2.length===0?output_manager_default.log(state?`No experiments match state ${state}.`:"No experiments found."):printExperimentsTable(experiments2),printNextCommands(next),0)}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_open7=__toESM(require_open(),1);async function runOpen(client,argv){let parsed=parseSubcommand(argv,openSubcommand3);if(!parsed)return 2;let[id2,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),2;let tab=parsed.flags["--tab"]??"configuration";if(tab!=="configuration"&&tab!=="analysis")return output_manager_default.error("The --tab option must be configuration or analysis."),1;if(!id2&&parsed.flags["--tab"]!==void 0)return output_manager_default.error("The --tab option requires an experiment argument."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;let experiment;try{id2?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id2),output_manager_default.stopSpinner()):(output_manager_default.spinner("Checking experiment access\u2026"),await listExperiments(client,link.project.id),output_manager_default.stopSpinner());let base=`https://vercel.com/${encodeURIComponent(link.org.slug)}/${encodeURIComponent(link.project.name)}/flags`,url=experiment?`${base}/experiment/${encodeURIComponent(experiment.id)}/${tab}`:base;return client.stdout.isTTY?(output_manager_default.log(`Opening ${experiment?`experiment ${getExperimentIdentifier(experiment)}`:"experiments"} in your browser\u2026`),output_manager_default.log(`Visit this URL if the browser doesn't open: ${url}`),(0,import_open7.default)(url).catch(()=>{}),printNextCommands(experiment?buildExperimentNextCommands(client,experiment):buildListNextCommands(client))):client.stdout.write(`${url}
486
+ `)}async function confirmMutation({client,flags,link,experiment,transition,effect,prompt}){let json=isJson(flags),yes=flags["--yes"]===!0;if(json||printMutationPreview(link,experiment,transition,effect),!yes){if(json||client.nonInteractive||!client.stdin.isTTY){let nextCommand=buildCommandWithYes(client.argv);return json||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Re-run with --yes to apply this production change.",userActionRequired:!0,next:[{command:nextCommand}]}):output_manager_default.error(`Missing required flag --yes. Re-run \`${nextCommand}\`.`),2}return await client.input.confirm(prompt,!1)?void 0:outputCanceled()}}function outputCanceled(){return output_manager_default.log("Canceled"),0}async function readAllStdin(client){if(client.stdin.isTTY)return"";let chunks=[];client.stdin.setEncoding("utf8");for await(let chunk2 of client.stdin)chunks.push(String(chunk2));return chunks.join("")}async function readJsonObject(client,file){if(typeof file!="string"){output_manager_default.error("Missing required option --file <file>.");return}try{let source=file==="-"?await readAllStdin(client):await readFile7(resolve10(client.cwd,file),"utf8");if(!source.trim()){output_manager_default.error(file==="-"?"No JSON received on stdin for --file -.":`The file ${file} is empty.`);return}let value=JSON.parse(source);if(typeof value!="object"||value===null||Array.isArray(value)){output_manager_default.error("The JSON request body must be an object.");return}return value}catch(error){output_manager_default.error(`Failed to read experiment JSON: ${error instanceof Error?error.message:String(error)}`);return}}async function fetchExperimentContext(client,parsed,usage2){let id2=requireExperimentArgument(parsed.args,usage2);if(!id2)return 2;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiment\u2026");let experiment=await getExperiment(client,link.project.id,id2);return output_manager_default.stopSpinner(),{link,experiment}}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function mutateExperiment(client,flags,context,spinner,mutation,resultLabel){try{output_manager_default.spinner(spinner);let experiment=await mutation();output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel(resultLabel,experiment.name,{gutter:"\u2713"}),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),experiment.rampPercentage!==void 0&&printAlignedLabel("Ramp",`${experiment.rampPercentage}%`),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(flags)),1}}async function confirmAndMutateExperiment({client,flags,context,transition,effect,prompt,spinner,mutation,resultLabel}){let confirmation=await confirmMutation({client,flags,link:context.link,experiment:context.experiment,transition,effect,prompt});return confirmation!==void 0?confirmation:mutateExperiment(client,flags,context,spinner,mutation,resultLabel)}function parseRamp(flags){let ramp=flags["--ramp"];if(typeof ramp!="number"||!Number.isFinite(ramp)||ramp<0||ramp>100){output_manager_default.error("Provide --ramp as a percentage from 0 to 100.");return}return ramp}function requireExperimentState(experiment,expected,action){let states=Array.isArray(expected)?expected:[expected];return states.includes(experiment.state)?!0:(output_manager_default.error(`Cannot ${action} while the experiment is ${experiment.state}. Expected state: ${states.join(" or ")}.`),!1)}function unitKeyFromBase(experiment){let{kind,attribute}=experiment.base;return attribute==="id"&&(kind==="device"||kind==="user"||kind==="group")?`${kind}_id`:`event_data.${attribute==="id"?`${kind.replace(/[^A-Za-z0-9_]/g,"_")}Id`:attribute.replace(/[^A-Za-z0-9_]/g,"_")}`}async function runAnalyze(client,argv){let parsed=parseSubcommand(argv,analyzeSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments analyze <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,metrics2=experiment.metrics??{};if(Object.keys(metrics2).length===0)return output_manager_default.error("This experiment has no metrics to analyze."),1;let primaryMetric=typeof parsed.flags["--metric"]=="string"?parsed.flags["--metric"]:experiment.primaryMetric;if(primaryMetric&&!(primaryMetric in metrics2))return output_manager_default.error(`Metric ${primaryMetric} isn't configured. Choose one of: ${Object.keys(metrics2).join(", ")}.`),1;let epoch=experiment.rampId?experiment.epochs.find(item=>item.rampId===experiment.rampId):experiment.epochs.at(-1);if(!epoch)return output_manager_default.error("This experiment has no analysis epoch. Start it before requesting results."),1;let body={metrics:metrics2,...primaryMetric?{primaryMetric}:{},controlVariantId:experiment.controlVariantId,expectedVariantWeights:experiment.weights,excludeContaminated:parsed.flags["--exclude-contaminated"]===!0,unitKey:unitKeyFromBase(experiment),rampId:epoch.rampId,from:new Date(epoch.startedAt).toISOString(),...epoch.endedAt?{to:new Date(epoch.endedAt).toISOString()}:{}};try{output_manager_default.spinner("Analyzing experiment\u2026");let analysis=await getExperimentAnalysis(client,context.link.project.id,experiment.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment),assessment=assessExperimentAnalysis(experiment,analysis);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next,{analysis,assessment})):(printExperimentAnalysis(experiment,analysis,assessment),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runCreate(client,argv){let parsed=parseSubcommand(argv,createSubcommand4);if(!parsed)return 2;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Creating experiment\u2026");let experiment=await createExperiment(client,link.project.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(experiment,next)):(printAlignedLabel("Created",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Experiment",experiment.id),experiment.slug&&printAlignedLabel("Slug",experiment.slug),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("State",experiment.state),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runDecide(client,argv){let parsed=parseSubcommand(argv,decideSubcommand);if(!parsed)return 2;let winner=parsed.flags["--winner"],abandon=parsed.flags["--abandon"]===!0,rationale=parsed.flags["--rationale"];if(typeof winner=="string"===abandon)return output_manager_default.error("Use exactly one of --winner <variant-id> or --abandon."),2;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),2;let context=await fetchExperimentContext(client,parsed,"experiments decide <experiment> (--winner <variant-id>|--abandon) --rationale <text>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","make a decision"))return 1;if(typeof winner=="string"&&!context.experiment.variants.some(variant=>variant.id===winner))return output_manager_default.error(`Variant ${winner} isn't part of this experiment. Choose one of: ${context.experiment.variants.map(variant=>variant.id).join(", ")}.`),1;let effect=abandon?"Stop the experiment and serve control":`Stop the experiment and serve variant ${winner}`;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 completed`,effect,prompt:"Record this experiment decision?",spinner:"Recording experiment decision\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"complete",outcome:abandon?"abandon":"winner",...typeof winner=="string"?{winnerVariantId:winner}:{},rationale}),resultLabel:abandon?"Abandoned":"Completed"})}async function runDelete(client,argv){let parsed=parseSubcommand(argv,deleteSubcommand2);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments delete <experiment> --confirm <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,experimentIdentifier=getExperimentIdentifier(experiment),proof=parsed.flags["--confirm"],proofMatches=proof===experiment.id||proof===experiment.slug||proof===parsed.args[0];if(isJson(parsed.flags)||printMutationPreview(context.link,experiment,`${experiment.state} \u2192 deleted`,`Delete experiment data and release feature flag ${experiment.flagSlug}`),!proofMatches){if(isJson(parsed.flags)||client.nonInteractive||!client.stdin.isTTY){let command2=buildCommandWithGlobalFlags(client.argv,`experiments delete ${experimentIdentifier} --confirm ${experimentIdentifier}`,void 0,{preserveProject:!0});return isJson(parsed.flags)||client.nonInteractive?writeJson2(client,{status:"action_required",reason:"confirmation_required",message:"Deleting an experiment permanently removes its history and releases its feature flag.",userActionRequired:!0,next:[{command:command2}]}):output_manager_default.error(`Provide --confirm ${experimentIdentifier} to delete this experiment non-interactively.`),1}if(await client.input.text({message:`Type ${experimentIdentifier} to confirm deletion:`})!==experimentIdentifier)return outputCanceled()}try{output_manager_default.spinner("Deleting experiment\u2026"),await deleteExperiment(client,context.link.project.id,experiment.id),output_manager_default.stopSpinner();let next=buildDeletedNextCommands(client,experiment);return isJson(parsed.flags)?writeJson2(client,{status:"success",deletedExperiment:{id:experiment.id,slug:experiment.slug,name:experiment.name},releasedFlag:{id:experiment.flagId,slug:experiment.flagSlug},next}):(printAlignedLabel("Deleted",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Released Flag",experiment.flagSlug),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_chalk110=__toESM(require_source(),1);var MAX_DIAGNOSE_EVENTS=200,DEFAULT_DIAGNOSE_EVENTS=50,DIAGNOSE_LOOKBACK_MS=30*24*60*60*1e3,FOLLOW_TIMEOUT_MS=5*60*1e3,FOLLOW_POLL_INTERVAL_MS=5e3,FOLLOW_PAGE_LIMIT=200;async function followExperimentEvents({client,experiment,ownerId,projectId,filter,unitField,from,seen,json,printedSoFar=0,intervalMs=FOLLOW_POLL_INTERVAL_MS,timeoutMs=FOLLOW_TIMEOUT_MS}){let printEvent=createDiagnosedEventPrinter(printedSoFar),abortController=new AbortController,deadline=setTimeout(()=>{abortController.abort()},timeoutMs),onSigint=()=>{abortController.abort()};process.on("SIGINT",onSigint);let watermark=from,watermarkSeen=seen;try{for(;!abortController.signal.aborted&&(await sleepUnlessAborted(intervalMs,abortController.signal),!abortController.signal.aborted);){let end=new Date;if(end.getTime()<=watermark.getTime())continue;let rows;try{rows=(await queryAnalyticsEvents(client,ownerId,projectId,{filter,select:["type","eventName","eventData"],start:toWholeSecondIso(watermark),end:toWholeSecondIso(end),limit:FOLLOW_PAGE_LIMIT,order:"asc"})).events??[]}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,json),1}let events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),fresh=withoutSeen(events,watermarkSeen);if(fresh.length>0){output_manager_default.stopSpinner();for(let event of fresh)json?writeJson2(client,event):printEvent(event)}let latest=events.at(-1)?.timestamp;if(latest){let latestDate2=new Date(latest);latestDate2.getTime()>watermark.getTime()?(watermark=latestDate2,watermarkSeen=countByKey(events.filter(event=>event.timestamp===latest))):watermarkSeen=countByKey(events)}abortController.signal.aborted||output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`)}}finally{clearTimeout(deadline),process.removeListener("SIGINT",onSigint),output_manager_default.stopSpinner()}return 0}async function runDiagnose(client,argv){let parsed=parseSubcommand(argv,diagnoseSubcommand);if(!parsed)return 2;let jsonOutput=isJson(parsed.flags),fail3=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail3({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk110.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk110.default.bold("--until")}.`});let limit=validateIntegerRangeWithDefault(parsed.flags["--limit"],{flag:"--limit",min:1,max:MAX_DIAGNOSE_EVENTS,defaultValue:DEFAULT_DIAGNOSE_EVENTS});if(!limit.valid)return fail3(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail3(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail3(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail3(order);let context=await fetchExperimentContext(client,parsed,"experiments diagnose <experiment>");if(typeof context=="number")return context;let{experiment,link}=context,names=metricEventNames(experiment),requestedEvents=normalizeRepeatableStringFilters(parsed.flags["--event"]),unknownEvents=requestedEvents.filter(name=>!names.includes(name));if(unknownEvents.length>0)return fail3({valid:!1,code:"UNKNOWN_METRIC_EVENT",message:`This experiment has no metric event named ${unknownEvents.map(name=>`"${name}"`).join(", ")}. Choose from: ${names.join(", ")||"(none configured)"}.`,allowedValues:names});let wantsExposures=!!parsed.flags["--exposures"]||requestedEvents.length===0,eventNames=requestedEvents.length>0?requestedEvents:parsed.flags["--exposures"]?[]:names,limitValue=limit.value,end=until.value??new Date,window={start:toWholeSecondIso(since.value??defaultRangeStart(experiment,end)),end:toWholeSecondIso(end)},unitValue=typeof parsed.flags["--unit"]=="string"?parsed.flags["--unit"]:"",unitClause=unitValue?` AND eventData:*${unitValue.replaceAll("*","")}*`:"",branches=[wantsExposures?`type:exposure AND eventName:${quoteFilterValue(experiment.id)}${unitClause}`:void 0,eventNames.length>0?`type:event AND eventName:(${eventNames.map(quoteFilterValue).join(" OR ")})${unitClause}`:void 0].filter(branch=>branch!==void 0);if(branches.length===0)return output_manager_default.error("Nothing selected. Drop --exposures, or name a metric event with --event."),1;let followFilter=branches.length===1?branches[0]:branches.map(branch=>`(${branch})`).join(" OR "),diagnosis;try{output_manager_default.spinner("Reading experiment events\u2026");let projectId=await resolveAnalyticsProjectId(client,link.org.id,link.project.id),rows=(await queryAnalyticsEvents(client,link.org.id,projectId,{filter:followFilter,select:["type","eventName","eventData"],...window,limit:limitValue})).events??[],declaredUnitKey=rows.map(row=>parseEventData(row.eventData).unitKey).find(key=>typeof key=="string"),unitField=unitFieldFromKey(declaredUnitKey??unitKeyFromBase(experiment)),events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),exposures=events.filter(event=>event.kind==="exposure"),enrolled=exposures.filter(event=>event.assignmentReason===void 0);diagnosis={events,projectId,exposureCount:exposures.length,metricEventCount:events.length-exposures.length,enrolledUnits:new Set(enrolled.map(event=>event.unit).filter(Boolean)).size,notEnrolledExposures:exposures.length-enrolled.length,metricEventNames:names,unitField,truncated:rows.length>=limitValue,staleRampExposures:experiment.rampId?exposures.filter(event=>event.rampId!==void 0&&event.rampId!==experiment.rampId).length:0,window},output_manager_default.stopSpinner()}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,jsonOutput),1}if(jsonOutput?writeJson2(client,{status:"success",experiment:{id:experiment.id,slug:experiment.slug,state:experiment.state,rampId:experiment.rampId},diagnosis}):printExperimentDiagnosis(experiment,diagnosis,{follow:!!parsed.flags["--follow"]}),parsed.flags["--follow"]){let newest=diagnosis.events[0]?.timestamp,from=newest?new Date(newest):new Date(diagnosis.window.end),seen=newest?countByKey(diagnosis.events.filter(event=>event.timestamp===newest)):new Map;return output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`),followExperimentEvents({client,experiment,ownerId:link.org.id,projectId:diagnosis.projectId,filter:followFilter,unitField:diagnosis.unitField,from,seen,json:jsonOutput,printedSoFar:diagnosis.events.length})}return 0}function sleepUnlessAborted(ms47,signal){return signal.aborted?Promise.resolve():new Promise(resolve14=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve14()},timer=setTimeout(settle,ms47);signal.addEventListener("abort",settle,{once:!0})})}function printDiagnoseError(client,error,json){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){printExperimentError(client,error,json);return}if(isAPIError(error)&&error.status===402){output_manager_default.error("Reading custom events and experiment exposures requires a Pro or Enterprise plan.");return}if(isAPIError(error)&&error.status===403){output_manager_default.error("Cannot read experiment exposures. Web Analytics must be enabled for the project, and exposures are behind the `web-analytics-exposure-events` flag.");return}printExperimentError(client,error,json)}function countByKey(events){let counts=new Map;for(let event of events){let key=diagnosedEventKey(event);counts.set(key,(counts.get(key)??0)+1)}return counts}function diagnosedEventKey(event){return[event.timestamp,event.kind,event.name??"",event.unit??"",event.variantId??""].join("\0")}function withoutSeen(events,seen){let remaining=new Map(seen),fresh=[];for(let event of events){let key=diagnosedEventKey(event),outstanding=remaining.get(key)??0;if(outstanding>0){remaining.set(key,outstanding-1);continue}fresh.push(event)}return fresh}function toWholeSecondIso(date){let truncated=new Date(date);return truncated.setUTCMilliseconds(0),truncated.toISOString()}function toDiagnosedEvent(row,kind,unitField){let payload=parseEventData(row.eventData),pick=key=>typeof payload[key]=="string"?payload[key]:void 0,unit=pick(kind==="exposure"?"unitValue":unitField),variantId=pick("variantId"),rampId=pick("rampId"),assignmentReason=pick("assignmentReason");return{timestamp:row.timestamp,kind,...kind==="event"&&row.eventName?{name:row.eventName}:{},...unit?{unit}:{},...variantId?{variantId}:{},...rampId?{rampId}:{},...assignmentReason&&assignmentReason!=="experiment"?{assignmentReason}:{},...Object.keys(payload).length>0?{payload}:{}}}function parseEventData(raw){if(!raw)return{};try{let parsed=JSON.parse(raw);return parsed!==null&&typeof parsed=="object"?parsed:{}}catch{return{}}}function unitFieldFromKey(unitKey){return unitKey.startsWith("event_data.")?unitKey.slice(11):unitKey}function metricEventNames(experiment){let names=new Set,add16=value=>{typeof value=="string"&&value.length>0&&names.add(value)};for(let metric of Object.values(experiment.metrics??{}))add16(metric.eventName),add16(metric.initialEvent),add16(metric.goalEvent),add16(metric.numeratorEvent),add16(metric.denominatorEvent),Array.isArray(metric.eventNames)&&metric.eventNames.forEach(add16);return[...names]}function quoteFilterValue(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function defaultRangeStart(experiment,end){let launchedAt=experiment.launchedAt??experiment.createdAt;return new Date(Math.max(launchedAt,end.getTime()-DIAGNOSE_LOOKBACK_MS))}async function runInspect(client,argv){let parsed=parseSubcommand(argv,inspectSubcommand8);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments inspect <experiment>");if(typeof context=="number")return context;let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next)):(printExperimentDetails(context.experiment),printNextCommands(next)),0}async function runList(client,argv){let parsed=parseSubcommand(argv,listSubcommand13);if(!parsed)return 2;let state=parsed.flags["--state"];if(state!==void 0&&state!=="draft"&&state!=="running"&&state!=="completed")return output_manager_default.error("The --state option must be draft, running, or completed."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiments\u2026");let all=await listExperiments(client,link.project.id);output_manager_default.stopSpinner();let experiments2=state?all.filter(experiment=>experiment.state===state):all,next=buildListNextCommands(client);return isJson(parsed.flags)?(writeJson2(client,{status:"success",experiments:experiments2,next}),0):(experiments2.length===0?output_manager_default.log(state?`No experiments match state ${state}.`:"No experiments found."):printExperimentsTable(experiments2),printNextCommands(next),0)}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_open7=__toESM(require_open(),1);async function runOpen(client,argv){let parsed=parseSubcommand(argv,openSubcommand3);if(!parsed)return 2;let[id2,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),2;let tab=parsed.flags["--tab"]??"configuration";if(tab!=="configuration"&&tab!=="analysis")return output_manager_default.error("The --tab option must be configuration or analysis."),1;if(!id2&&parsed.flags["--tab"]!==void 0)return output_manager_default.error("The --tab option requires an experiment argument."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;let experiment;try{id2?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id2),output_manager_default.stopSpinner()):(output_manager_default.spinner("Checking experiment access\u2026"),await listExperiments(client,link.project.id),output_manager_default.stopSpinner());let base=`https://vercel.com/${encodeURIComponent(link.org.slug)}/${encodeURIComponent(link.project.name)}/flags`,url=experiment?`${base}/experiment/${encodeURIComponent(experiment.id)}/${tab}`:base;return client.stdout.isTTY?(output_manager_default.log(`Opening ${experiment?`experiment ${getExperimentIdentifier(experiment)}`:"experiments"} in your browser\u2026`),output_manager_default.log(`Visit this URL if the browser doesn't open: ${url}`),(0,import_open7.default)(url).catch(()=>{}),printNextCommands(experiment?buildExperimentNextCommands(client,experiment):buildListNextCommands(client))):client.stdout.write(`${url}
485
487
  `),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error),1}}async function runReseedEnrollment(client,argv){let parsed=parseSubcommand(argv,reseedEnrollmentSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments reseed-enrollment <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="completed")return output_manager_default.error("Cannot reseed a completed experiment. Return it to draft first."),1;let running=context.experiment.state==="running";return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:running?"Reassign enrollment and start a new analysis epoch":"Reassign enrollment for the next run",prompt:"Reseed enrollment for this experiment?",spinner:"Reseeding enrollment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"reseed-enrollment"}),resultLabel:"Reseeded"})}async function runRestartAnalysis(client,argv){let parsed=parseSubcommand(argv,restartAnalysisSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments restart-analysis <experiment>");return typeof context=="number"?context:requireExperimentState(context.experiment,"running","restart its analysis")?confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:"Start a new analysis epoch without changing enrollment",prompt:"Restart analysis for this experiment?",spinner:"Restarting analysis\u2026",mutation:()=>updateExperiment(client,context.link.project.id,context.experiment.id,{restartAnalysis:!0}),resultLabel:"Restarted"}):1}async function runReturnToDraft(client,argv){let parsed=parseSubcommand(argv,returnToDraftSubcommand);if(!parsed)return 2;let cause=parsed.flags["--cause"];if(cause!==void 0&&cause!=="manual"&&cause!=="guardrail"&&cause!=="srm")return output_manager_default.error("The --cause option must be manual, guardrail, or srm."),1;let reason=parsed.flags["--reason"];if(typeof reason=="string"&&reason.trim().length===0)return output_manager_default.error("The --reason option cannot be empty."),1;let context=await fetchExperimentContext(client,parsed,"experiments return-to-draft <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="draft"){let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson2(client,jsonResult(context.experiment,next,{changed:!1})):(output_manager_default.log("Experiment is already in draft."),printNextCommands(next)),0}let action={action:"return-to-draft",...cause?{cause}:{},...typeof reason=="string"?{reason}:{}};return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 draft`,effect:"Serve control and stop the active measurement window",prompt:"Return this experiment to draft?",spinner:"Returning experiment to draft\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,action),resultLabel:"Returned"})}async function runSetRamp(client,argv){let parsed=parseSubcommand(argv,setRampSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments set-ramp <experiment> --ramp <percentage>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","change its ramp"))return 1;let current=context.experiment.rampPercentage;if(ramp>context.experiment.targetPercentage)return output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1;if(ramp===current)return output_manager_default.error(`The experiment ramp is already ${ramp}%.`),1;let decreasing=current!==void 0&&ramp<current;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:`${current??"\u2014"}% \u2192 ${ramp}%${decreasing?"; start a new analysis epoch":"; keep the analysis epoch"}`,prompt:"Change this experiment ramp?",spinner:"Changing experiment ramp\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"set-ramp",rampPercentage:ramp}),resultLabel:"Changed Ramp"})}async function runStart(client,argv){let parsed=parseSubcommand(argv,startSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments start <experiment> --ramp <percentage>");return typeof context=="number"?context:requireExperimentState(context.experiment,"draft","start it")?ramp>context.experiment.targetPercentage?(output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1):confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 running`,effect:`Enroll ${ramp}% of eligible units`,prompt:"Start this experiment?",spinner:"Starting experiment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"start",rampPercentage:ramp}),resultLabel:"Started"}):1}async function runUpdate(client,argv){let parsed=parseSubcommand(argv,updateSubcommand3);if(!parsed)return 2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let context=await fetchExperimentContext(client,parsed,"experiments update <experiment> --file <file>");if(typeof context=="number")return context;let restart=parsed.flags["--restart-analysis"]===!0,keep=parsed.flags["--keep-analysis"]===!0;if(restart&&keep)return output_manager_default.error("Use either --restart-analysis or --keep-analysis, not both."),2;if("restartAnalysis"in body&&(restart||keep))return output_manager_default.error("Set restartAnalysis in the JSON file or use a command option, not both."),1;if(context.experiment.state==="running"){if(!("restartAnalysis"in body)&&!restart&&!keep)return output_manager_default.error("Updating a running experiment requires --restart-analysis or --keep-analysis."),2;"restartAnalysis"in body||(body.restartAnalysis=restart)}else if("restartAnalysis"in body||restart||keep)return output_manager_default.error("Analysis restart options only apply to a running experiment."),1;if(context.experiment.state!=="draft"){let confirmation=await confirmMutation({client,flags:parsed.flags,link:context.link,experiment:context.experiment,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:body.restartAnalysis===!0?"Update serving settings and start a new analysis epoch":context.experiment.state==="running"?"Update serving settings and keep the current analysis epoch":"Update the completed experiment configuration",prompt:"Update this experiment?"});if(confirmation!==void 0)return confirmation}return mutateExperiment(client,parsed.flags,context,"Updating experiment\u2026",()=>updateExperiment(client,context.link.project.id,context.experiment.id,body),"Updated")}var COMMAND_CONFIG29={list:getCommandAliases(listSubcommand13),inspect:getCommandAliases(inspectSubcommand8),create:getCommandAliases(createSubcommand4),update:getCommandAliases(updateSubcommand3),start:getCommandAliases(startSubcommand),"set-ramp":getCommandAliases(setRampSubcommand),"restart-analysis":getCommandAliases(restartAnalysisSubcommand),"reseed-enrollment":getCommandAliases(reseedEnrollmentSubcommand),"return-to-draft":getCommandAliases(returnToDraftSubcommand),decide:getCommandAliases(decideSubcommand),analyze:getCommandAliases(analyzeSubcommand),diagnose:getCommandAliases(diagnoseSubcommand),open:getCommandAliases(openSubcommand3),delete:getCommandAliases(deleteSubcommand2)};async function experiments(client){let telemetry2=new ExperimentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(experimentsCommand.options),{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsed.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG29),needHelp=parsed.flags["--help"];if(!subcommand)return telemetry2.trackCliFlagHelp("experiments",subcommand),output_manager_default.print(help(experimentsCommand,{columns:client.stderr.columns})),needHelp?0:2;let commands2={list:{command:listSubcommand13,run:runList},inspect:{command:inspectSubcommand8,run:runInspect},create:{command:createSubcommand4,run:runCreate},update:{command:updateSubcommand3,run:runUpdate},start:{command:startSubcommand,run:runStart},"set-ramp":{command:setRampSubcommand,run:runSetRamp},"restart-analysis":{command:restartAnalysisSubcommand,run:runRestartAnalysis},"reseed-enrollment":{command:reseedEnrollmentSubcommand,run:runReseedEnrollment},"return-to-draft":{command:returnToDraftSubcommand,run:runReturnToDraft},decide:{command:decideSubcommand,run:runDecide},analyze:{command:analyzeSubcommand,run:runAnalyze},diagnose:{command:diagnoseSubcommand,run:runDiagnose},open:{command:openSubcommand3,run:runOpen},delete:{command:deleteSubcommand2,run:runDelete}},selectedName=subcommand,selected=commands2[selectedName];return needHelp?(telemetry2.trackCliFlagHelp("experiments",subcommandOriginal),output_manager_default.print(help(selected.command,{parent:experimentsCommand,columns:client.stderr.columns})),0):(telemetry2.trackSubcommand(selectedName,Array.isArray(subcommandOriginal)?subcommandOriginal[0]??selectedName:subcommandOriginal),selected.run(client,args))}var import_chalk116=__toESM(require_source(),1);var import_chalk112=__toESM(require_source(),1);var import_chalk111=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk111.default.blue,deny:import_chalk111.default.red,challenge:import_chalk111.default.yellow,log:import_chalk111.default.magenta,rate_limit:import_chalk111.default.cyan,"rate-limit":import_chalk111.default.cyan,bypass:import_chalk111.default.green};function labelForAction(action){return action==="rate_limit"||action==="rate-limit"?"Rate Limited":action.split(/[-_]/).filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}var MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function formatCount3(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}k`:String(Math.round(n))}function pad2(n){return String(n).padStart(2,"0")}function formatUtcTime(ms47,withDate){let d=new Date(ms47),hm=`${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`;return withDate?`${MONTHS[d.getUTCMonth()]} ${d.getUTCDate()} ${hm}`:hm}function relativeTime(ts){let diff2=Date.now()-ts;return diff2<6e4?"just now":diff2<36e5?`${Math.floor(diff2/6e4)}m ago`:diff2<864e5?`${Math.floor(diff2/36e5)}h ago`:`${Math.floor(diff2/864e5)}d ago`}function formatUtcDateTime(ms47){return`${formatUtcTime(ms47,!0)} UTC (${relativeTime(ms47)})`}function colorizeDetail(detail){return detail.split(" \xB7 ").map(part=>{let color=ACTION_COLORS[part.toLowerCase().replace(/ /g,"_")];return color?color(part):part}).join(" \xB7 ")}function windowNeedsDate(startMs,endMs){return endMs-startMs>25*36e5}function granularityLabel(granularity){return"minutes"in granularity?`${granularity.minutes}m`:"hours"in granularity?`${granularity.hours}h`:`${granularity.days}d`}function formatActionTrendTable(series){let allTs=new Set;for(let s of series)for(let p of s.timeseries)allTs.add(p.timestamp);let axis=[...allTs].sort(),hasAnyTraffic=series.some(s=>s.total>0||s.timeseries.some(p=>p.value>0));if(series.length===0||axis.length===0||!hasAnyTraffic)return import_chalk111.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_chalk111.default.bold(import_chalk111.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_chalk111.default.dim,trend=s.total>0?plain:import_chalk111.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(`
486
488
  `).map(line2=>` ${line2}`.trimEnd()).join(`
487
- `)}var NO_SERVER_MESSAGE="Response Error";function apiServerMessage(error){let message=isAPIError(error)?error.serverMessage:void 0;return message&&message!==NO_SERVER_MESSAGE?message:void 0}var FIREWALL_O11Y_ALERT_TYPES=["botId_anomaly","firewallSystemRule_anomaly","firewallCustomRule_anomaly"],FIREWALL_ANOMALY_TYPE="firewall_anomaly",SYS_DOS_MITIGATION_RULE_ID="sys_dos_mitigation",SYSTEM_RULE_ANOMALY_TYPE="firewallSystemRule_anomaly",FIREWALL_ACTIVITY_PLAN_MESSAGE="Traffic and alerts need Observability Plus.",FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE="Couldn't load every alert source.";function reduceAttackAnomaly(anomaly){return Object.keys(anomaly.affectedHostMap).reduce((acc,host)=>{acc.hosts.push(host);let challenged=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return acc.challenged+=challenged,acc.denied+=denied,acc.count+=challenged+denied,acc},{hosts:[],challenged:0,denied:0,count:0})}function hostsFromAnomaly(anomaly){return Object.entries(anomaly.affectedHostMap).map(([host,data])=>{let challenged=data.ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=data.ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return{name:host,count:challenged+denied}}).filter(row=>row.count>0).sort((a,b)=>b.count-a.count)}function mapAttackAnomaly(anomaly){let reduced=reduceAttackAnomaly(anomaly),parts=["System rule"];return reduced.denied>0&&parts.push(labelForAction("deny")),reduced.challenged>0&&parts.push(labelForAction("challenge")),{id:`${anomaly.ownerId}-${anomaly.projectId}-${anomaly.startTime}`,title:"DDoS Mitigation",type:FIREWALL_ANOMALY_TYPE,startedAt:anomaly.startTime,resolvedAt:anomaly.endTime||void 0,count:reduced.count,detail:parts.join(" \xB7 "),action:reduced.denied>=reduced.challenged?"deny":"challenge",ruleId:SYS_DOS_MITIGATION_RULE_ID,host:reduced.hosts[0]}}function mapO11yAlert(alert){if(!alert.startedAt)return null;let action=alert.data?.action,ruleId=alert.data?.ruleId,detailParts=[alert.type,action?labelForAction(action):void 0,ruleId].filter(Boolean);return{id:alert.id||`${alert.type}-${alert.startedAt}`,title:alert.title||alert.type||"Firewall alert",type:alert.type||"unknown",startedAt:alert.startedAt,resolvedAt:alert.resolvedAt,count:alert.data?.count,detail:detailParts.filter(p=>p!==alert.title).join(" \xB7 ")||void 0,action,ruleId,path:alert.data?.path}}var ATTACK_STATUS_MAX_DAYS=7;async function getAttackStatus(client,opts){let query=new URLSearchParams;if(query.set("projectId",opts.projectId),query.set("teamId",opts.teamId),opts.sinceDays!==void 0){let sinceDays=Math.min(ATTACK_STATUS_MAX_DAYS,Math.max(1,Math.ceil(opts.sinceDays)));query.set("since",String(sinceDays))}return client.fetch(`/v1/security/firewall/attack-status?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})}var O11Y_ALERTS_LIMIT=200;async function getFirewallO11yAlerts(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId),query.set("from",opts.from.toISOString()),query.set("to",opts.to.toISOString()),query.set("limit",String(O11Y_ALERTS_LIMIT));for(let type of FIREWALL_O11Y_ALERT_TYPES)query.append("types",type);return(await client.fetch(`/alerts/v3/groups?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})).flatMap(g=>g.alerts??[]).map(mapO11yAlert).filter(a=>a!==null)}var ALERTS_TIMEOUT_MS=2e4;function sourceFailureReason(err){return isAPIError(err)&&err.status===408||err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?"timed out":isAPIError(err)&&err.status===402?"needs Observability Plus":isAPIError(err)&&typeof err.status=="number"?`HTTP ${err.status}`:err instanceof Error&&err.message?err.message:"unknown error"}function resolveAlertsWindow(opts){let now=Date.now(),to=opts.to??new Date(now),from=opts.from??new Date(to.getTime()-864e5*(opts.sinceDays??1)),sinceDays=opts.sinceDays??Math.max(1,Math.ceil((now-from.getTime())/864e5));return{from,to,sinceDays}}function classifyAlertSourceError(err){if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return isAPIError(err)&&err.status===402?{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}:{reason:"error",message:apiServerMessage(err)||!isAPIError(err)&&err instanceof Error&&err.message||FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}}async function getFirewallAlertsDetailed(client,opts){let{from,to,sinceDays}=resolveAlertsWindow(opts),timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,signal=AbortSignal.timeout(timeoutMs),[o11yResult,attackResult]=await Promise.allSettled([getFirewallO11yAlerts(client,{...opts,from,to,signal}),getAttackStatus(client,{...opts,sinceDays,signal})]),errors=[],o11yAlerts=[],o11y;o11yResult.status==="fulfilled"?o11yAlerts=o11yResult.value:(o11y=classifyAlertSourceError(o11yResult.reason),errors.push({source:"alerts",message:sourceFailureReason(o11yResult.reason)}));let mappedAttacks=[],attackStatus;attackResult.status==="fulfilled"?mappedAttacks=(attackResult.value.anomalies||[]).map(mapAttackAnomaly):(attackStatus=classifyAlertSourceError(attackResult.reason),errors.push({source:"attackStatus",message:sourceFailureReason(attackResult.reason)}));let resolvedCutoff=from.getTime();return{alerts:mappedAttacks.concat(o11yAlerts.filter(a=>!a.resolvedAt||a.resolvedAt>resolvedCutoff)).sort((a,b)=>!a.resolvedAt&&b.resolvedAt?-1:a.resolvedAt&&!b.resolvedAt?1:b.startedAt-a.startedAt),o11y,attackStatus,errors}}function alertsIncompleteMessage(errors){return`Attack count and alerts may be incomplete: ${errors.map(e2=>`${e2.source==="alerts"?"alerts":"attack history"} ${e2.message}`).join("; ")}.`}function countAttacksMitigated(alerts2,windowStartMs,windowEndMs){return alerts2.filter(alert=>isAttackAlert(alert)&&alertOverlapsWindow(alert,windowStartMs,windowEndMs)).length}function alertOverlapsWindow(alert,windowStartMs,windowEndMs){return alert.startedAt<=windowEndMs&&(alert.resolvedAt??Number.POSITIVE_INFINITY)>=windowStartMs}function isAttackAlert(alert){return alert.type===FIREWALL_ANOMALY_TYPE?!0:alert.type===SYSTEM_RULE_ANOMALY_TYPE&&alert.ruleId===SYS_DOS_MITIGATION_RULE_ID}var O11Y_ALERT_ID_PREFIX="al_",INSPECT_FALLBACK_DAYS=7;function isO11yAlertId(id2){return id2.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id2){let match=id2.match(/-(\d{13})$/);return match?Number(match[1]):void 0}function daysCovering(startMs,endMs){return Math.max(1,Math.ceil((endMs-startMs)/864e5))}function mapGroupAsAlert(group,alertId){let nested=(group.alerts??[]).map(mapO11yAlert).filter(a=>a!==null),hit=nested.find(a=>a.id===alertId)??nested[0];if(hit)return hit;let startedAt=group.recordedStartedAt;return startedAt?mapO11yAlert({id:alertId,title:group.title,type:group.type,startedAt,resolvedAt:group.recordedResolvedAt,data:group.alerts?.[0]?.data}):null}async function getO11yAlertById(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId);try{let group=await client.fetch(`/alerts/v3/groups/${encodeURIComponent(opts.alertId)}?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal});return mapGroupAsAlert(group,opts.alertId)}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function findFirewallAlert(client,opts){let timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,budget2=()=>AbortSignal.timeout(timeoutMs),now=Date.now();if(isO11yAlertId(opts.alertId)){let fromGroup2=await getO11yAlertById(client,{...opts,signal:budget2()});if(fromGroup2)return{alert:fromGroup2};let from=new Date(now-864e5*INSPECT_FALLBACK_DAYS),hit=(await getFirewallO11yAlerts(client,{projectId:opts.projectId,teamId:opts.teamId,from,to:new Date(now),signal:budget2()})).find(a=>a.id===opts.alertId);return hit?{alert:hit}:null}let startTime=parseLegacyAlertStartTime(opts.alertId),sinceDays=startTime?daysCovering(startTime,now)+1:INSPECT_FALLBACK_DAYS,anomaly=((await getAttackStatus(client,{projectId:opts.projectId,teamId:opts.teamId,sinceDays,signal:budget2()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return{anomalies:[]}})).anomalies||[]).find(a=>`${a.ownerId}-${a.projectId}-${a.startTime}`===opts.alertId);if(anomaly)return{alert:mapAttackAnomaly(anomaly),hosts:hostsFromAnomaly(anomaly)};let fromGroup=await getO11yAlertById(client,{...opts,signal:budget2()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return null});return fromGroup?{alert:fromGroup}:null}var MANAGED_BOT_RULE_IDS=["bot-protection","ai-bots","bot-id"],ALIASES={"bot-protection":"bot-protection","bot protection":"bot-protection",bot_protection:"bot-protection",bot_filter:"bot-protection",managed_bot_protection:"bot-protection",managed_bot_filter:"bot-protection","ai-bots":"ai-bots","ai bots":"ai-bots",ai_bots:"ai-bots",managed_ai_bots:"ai-bots","bot-id":"bot-id",botid:"bot-id",bot_id:"bot-id"},ACTIONS={"bot-protection":["off","log","challenge"],"ai-bots":["allow","log","challenge","deny"],"bot-id":["basic","deep-analysis"]},NAMES={"bot-protection":"Bot Protection","ai-bots":"AI Bots","bot-id":"BotID"},WAF_RULE_IDS={"bot-protection":"managed_bot_protection","ai-bots":"managed_ai_bots"};function resolveManagedBotRuleId(identifier){if(identifier)return ALIASES[identifier.trim().toLowerCase()]}function managedBotActions(id2){return ACTIONS[id2]}function formatManagedBotAction(action){return action==="deep-analysis"?"Deep Analysis":action.charAt(0).toUpperCase()+action.slice(1)}function botProtectionConfig(managedRules){return managedRules?.bot_filter??managedRules?.bot_protection}function currentBotProtectionAction(config){let ruleset=botProtectionConfig(config?.managedRules);return ruleset?.active?ruleset.action==="log"?"log":"challenge":"off"}function currentAiBotsAction(config){let ruleset=config?.managedRules?.ai_bots;return ruleset?.active?ruleset.action==="challenge"?"challenge":ruleset.action==="deny"?"deny":"log":"allow"}function currentBotIdAction(config){return config?.botIdEnabled?"deep-analysis":"basic"}function getManagedBotRule(config,id2){let action=id2==="bot-protection"?currentBotProtectionAction(config):id2==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id:id2,name:NAMES[id2],action,wafRuleId:WAF_RULE_IDS[id2]}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id2=>getManagedBotRule(config,id2))}function parseManagedBotAction(id2,raw){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=ACTIONS[id2];return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${NAMES[id2]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id2,action){if(id2==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id2==="bot-protection"?"bot_protection":"ai_bots";return action==="off"||action==="allow"?{action:"managedRules.update",id:patchId,value:{active:!1}}:{action:"managedRules.update",id:patchId,value:{active:!0,action}}}function suggestedManagedBotAction(rule){return rule.id==="bot-protection"?rule.action==="challenge"?"log":"challenge":rule.id==="ai-bots"?rule.action==="deny"?"allow":"deny":rule.action==="deep-analysis"?"basic":"deep-analysis"}function managedBotTrafficWarning(id2,from,to){if(id2==="ai-bots"&&to==="deny")return"AI Bots deny blocks known AI crawlers from this project.";if(id2==="bot-protection"&&from==="off"&&to==="challenge")return"Bot Protection challenge will present a verification page to non-browser traffic."}function managedBotJson(rule){return{id:rule.id,name:rule.name,action:rule.action,wafRuleId:rule.wafRuleId??null}}function projectScope(project,teamId,teamSlug){return{type:"project",projectId:project.id,teamId,...teamSlug?{teamSlug}:{},displayName:project.name}}function firewallConfigUrl(scope,path3=""){let query=new URLSearchParams;return scope.type==="project"?(query.set("projectId",scope.projectId),scope.teamId&&query.set("teamId",scope.teamId),`/v1/security/firewall/config${path3}?${query.toString()}`):(query.set("teamId",scope.teamId),`/v1/security/firewall/team-config${path3}?${query.toString()}`)}async function listFirewallConfigs(client,scope){return client.fetch(firewallConfigUrl(scope))}async function activateFirewallConfig(client,scope,configVersion){return client.fetch(firewallConfigUrl(scope,`/${configVersion}/activate`),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})}var PRIORITY_PROJECT_ENABLE_COMMAND2="project priority enable",BUY_PRO_COMMAND2="buy pro";function withGlobalFlags3(client,commandTemplate,scope,options={}){let template=scope?.type==="team"?`${commandTemplate} --team-level`:commandTemplate;return buildCommandWithGlobalFlags(client.argv,template,void 0,{globalFlags:"all",preserveProject:options.preserveProject??!0,excludeFlags:options.excludeFlags})}async function resolveFirewallScope(client,flags){if(flags["--team-level"]&&flags["--project"]){let message="Cannot specify both --team-level and --project. Use one or the other.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),2):(output_manager_default.error(message),2)}if(flags["--team-level"]){let{team}=await getScope(client);if(!team){let message="Team-level firewall requires a team scope. Personal accounts are not supported. Run `vercel switch` to select a team or pass --scope <team>.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message},1),1):(output_manager_default.error(message),1)}return{type:"team",teamId:team.id,displayName:team.slug}}let link=await requireProjectContext(client,"firewall",flags["--project"]);if(typeof link=="number")return link;let{project,org}=link;return{type:"project",projectId:project.id,teamId:org.type==="team"?org.id:void 0,teamSlug:org.type==="team"?org.slug:void 0,displayName:project.name}}function mentionsPriorityProject(message){return/priority\s+project/i.test(message)||/priority\s+tier/i.test(message)}function teamPlan(scope){return scope.teamId?teamCache.get(scope.teamId)?.billing?.plan:void 0}function priorityTeam(scope){let cached=scope.teamId?teamCache.get(scope.teamId):void 0;if(scope.type==="team")return{id:scope.teamId,slug:scope.displayName,name:cached?.name??null,scopeArg:scope.displayName};if(!scope.teamId)return null;let slug=scope.teamSlug??cached?.slug??null;return{id:scope.teamId,slug,name:cached?.name??null,scopeArg:slug??scope.teamId}}function teamLabel(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function styledCommand(command2,plain){return plain?getCommandNamePlain(command2):getCommandName(command2)}function priorityProjectFix(scope){let excludeFlags=["--non-interactive","--project","--yes","--scope","--team"],project=scope.type==="project"?{id:scope.projectId,name:scope.displayName}:null,team=priorityTeam(scope),plan=teamPlan(scope)??null,data={project,team:team&&{id:team.id,slug:team.slug,name:team.name},plan},projectToken=project?quoteArg(project.name):"<project>",scopeFlag=team?` --scope ${quoteArg(team.scopeArg)}`:"",enable6=`${PRIORITY_PROJECT_ENABLE_COMMAND2} ${projectToken}${scopeFlag}`;if(!team){let hint="Priority projects are only available on team accounts. Use --scope to specify one.";return{command:"",hint,plainHint:hint,when:hint,excludeFlags,preserveProject:!1,reason:AGENT_REASON.MISSING_SCOPE,data}}if(plan==="hobby"||plan==="oss"){let upgrade2=`${BUY_PRO_COMMAND2}${scopeFlag}`,hint=plain2=>`Priority Projects are only available on Pro or Enterprise team plans. Upgrade with ${styledCommand(upgrade2,plain2)}, then run ${styledCommand(enable6,plain2)}.`;return{command:upgrade2,hint:hint(!1),plainHint:hint(!0),when:"a person has approved upgrading the plan",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}let shown=styledCommand(enable6,!1),plain=styledCommand(enable6,!0),placeholder="Replace <project> with a project on this team.";return{command:enable6,hint:project?shown:`${shown} ${placeholder}`,plainHint:project?plain:`${plain} ${placeholder}`,when:project?"user runs this command in an interactive terminal":"Replace <project> with a project on this team.",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}function mapFirewallApiError(e2,scope,fallback){let err=e2;return scope.type==="team"&&err.status===403?err.code==="plan_not_supported"?`Team-level firewall requires an Enterprise plan (current team: "${scope.displayName}"). Pass --scope <team> or run \`vercel switch\` to target a different team.`:`You need to be a team owner to manage the team-level firewall for "${scope.displayName}".${err.message?` (${err.message})`:""}`:err.message||fallback}function priorityProjectMessage(scope,fix){let team=fix.data.team,label=team?.slug!=null?teamLabel({slug:team.slug,name:team.name}):void 0;return scope.type==="project"?label?`This rule requires a Priority project for ${scope.displayName} on team ${label}.`:`This rule requires a Priority project. ${fix.hint}`:label?`This rule requires a Priority project on team ${label}.`:"This rule requires a Priority project."}function failPriorityProjectGate(client,error,scope,opts){let serverMessage=apiServerMessage(error);if(!serverMessage||!mentionsPriorityProject(serverMessage))return null;let fix=priorityProjectFix(scope),message=priorityProjectMessage(scope,fix),payload={status:AGENT_STATUS.ERROR,reason:fix.reason,message,userActionRequired:!0,hint:fix.plainHint,retryable:!1,...fix.scope?{scope:fix.scope}:{},data:fix.data,...fix.command?{next:[{command:buildCommandWithGlobalFlags(client.argv,fix.command,packageName,{globalFlags:"all",preserveProject:!1,excludeFlags:fix.excludeFlags}),when:fix.when}]}:{}};return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,1),opts?.json?(output_manager_default.stopSpinner(),writeAgentError(client,payload),1):(output_manager_default.error(message),fix.command&&output_manager_default.log(fix.hint),1)}async function parseSubcommandArgs2(argv,command2,client,commandPath){let parsedArgs,fullPath=commandPath||command2.name;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){if(client?.nonInteractive){let rawMessage=err instanceof Error?err.message:String(err),flags=getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0});return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:rawMessage,next:[{command:getCommandNamePlain(`firewall ${fullPath} ${flags.join(" ")}`.trim()),when:"fix flags and retry"}]},2),2}return printError(err),2}return parsedArgs}async function confirmAction(client,skipConfirmation,message,details){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`${message} Re-run with --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"re-run with --yes to confirm"}]}),process.exit(1),!1):(details&&output_manager_default.print(` ${details}
489
+ `)}var NO_SERVER_MESSAGE="Response Error";function apiServerMessage(error){let message=isAPIError(error)?error.serverMessage:void 0;return message&&message!==NO_SERVER_MESSAGE?message:void 0}var FIREWALL_O11Y_ALERT_TYPES=["botId_anomaly","firewallSystemRule_anomaly","firewallCustomRule_anomaly"],FIREWALL_ANOMALY_TYPE="firewall_anomaly",SYS_DOS_MITIGATION_RULE_ID="sys_dos_mitigation",SYSTEM_RULE_ANOMALY_TYPE="firewallSystemRule_anomaly",FIREWALL_ACTIVITY_PLAN_MESSAGE="Traffic and alerts need Observability Plus.",FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE="Couldn't load every alert source.";function reduceAttackAnomaly(anomaly){return Object.keys(anomaly.affectedHostMap).reduce((acc,host)=>{acc.hosts.push(host);let challenged=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return acc.challenged+=challenged,acc.denied+=denied,acc.count+=challenged+denied,acc},{hosts:[],challenged:0,denied:0,count:0})}function hostsFromAnomaly(anomaly){return Object.entries(anomaly.affectedHostMap).map(([host,data])=>{let challenged=data.ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=data.ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return{name:host,count:challenged+denied}}).filter(row=>row.count>0).sort((a,b)=>b.count-a.count)}function mapAttackAnomaly(anomaly){let reduced=reduceAttackAnomaly(anomaly),parts=["System rule"];return reduced.denied>0&&parts.push(labelForAction("deny")),reduced.challenged>0&&parts.push(labelForAction("challenge")),{id:`${anomaly.ownerId}-${anomaly.projectId}-${anomaly.startTime}`,title:"DDoS Mitigation",type:FIREWALL_ANOMALY_TYPE,startedAt:anomaly.startTime,resolvedAt:anomaly.endTime||void 0,count:reduced.count,detail:parts.join(" \xB7 "),action:reduced.denied>=reduced.challenged?"deny":"challenge",ruleId:SYS_DOS_MITIGATION_RULE_ID,host:reduced.hosts[0]}}function mapO11yAlert(alert){if(!alert.startedAt)return null;let action=alert.data?.action,ruleId=alert.data?.ruleId,detailParts=[alert.type,action?labelForAction(action):void 0,ruleId].filter(Boolean);return{id:alert.id||`${alert.type}-${alert.startedAt}`,title:alert.title||alert.type||"Firewall alert",type:alert.type||"unknown",startedAt:alert.startedAt,resolvedAt:alert.resolvedAt,count:alert.data?.count,detail:detailParts.filter(p=>p!==alert.title).join(" \xB7 ")||void 0,action,ruleId,path:alert.data?.path}}var ATTACK_STATUS_MAX_DAYS=7;async function getAttackStatus(client,opts){let query=new URLSearchParams;if(query.set("projectId",opts.projectId),query.set("teamId",opts.teamId),opts.sinceDays!==void 0){let sinceDays=Math.min(ATTACK_STATUS_MAX_DAYS,Math.max(1,Math.ceil(opts.sinceDays)));query.set("since",String(sinceDays))}return client.fetch(`/v1/security/firewall/attack-status?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})}var O11Y_ALERTS_LIMIT=200;async function getFirewallO11yAlerts(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId),query.set("from",opts.from.toISOString()),query.set("to",opts.to.toISOString()),query.set("limit",String(O11Y_ALERTS_LIMIT));for(let type of FIREWALL_O11Y_ALERT_TYPES)query.append("types",type);return(await client.fetch(`/alerts/v3/groups?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})).flatMap(g=>g.alerts??[]).map(mapO11yAlert).filter(a=>a!==null)}var ALERTS_TIMEOUT_MS=2e4;function sourceFailureReason(err){return isAPIError(err)&&err.status===408||err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?"timed out":isAPIError(err)&&err.status===402?"needs Observability Plus":isAPIError(err)&&typeof err.status=="number"?`HTTP ${err.status}`:err instanceof Error&&err.message?err.message:"unknown error"}function resolveAlertsWindow(opts){let now=Date.now(),to=opts.to??new Date(now),from=opts.from??new Date(to.getTime()-864e5*(opts.sinceDays??1)),sinceDays=opts.sinceDays??Math.max(1,Math.ceil((now-from.getTime())/864e5));return{from,to,sinceDays}}function classifyAlertSourceError(err){if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return isAPIError(err)&&err.status===402?{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}:{reason:"error",message:apiServerMessage(err)||!isAPIError(err)&&err instanceof Error&&err.message||FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}}async function getFirewallAlertsDetailed(client,opts){let{from,to,sinceDays}=resolveAlertsWindow(opts),timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,signal=AbortSignal.timeout(timeoutMs),[o11yResult,attackResult]=await Promise.allSettled([getFirewallO11yAlerts(client,{...opts,from,to,signal}),getAttackStatus(client,{...opts,sinceDays,signal})]),errors=[],o11yAlerts=[],o11y;o11yResult.status==="fulfilled"?o11yAlerts=o11yResult.value:(o11y=classifyAlertSourceError(o11yResult.reason),errors.push({source:"alerts",message:sourceFailureReason(o11yResult.reason)}));let mappedAttacks=[],attackStatus;attackResult.status==="fulfilled"?mappedAttacks=(attackResult.value.anomalies||[]).map(mapAttackAnomaly):(attackStatus=classifyAlertSourceError(attackResult.reason),errors.push({source:"attackStatus",message:sourceFailureReason(attackResult.reason)}));let resolvedCutoff=from.getTime();return{alerts:mappedAttacks.concat(o11yAlerts.filter(a=>!a.resolvedAt||a.resolvedAt>resolvedCutoff)).sort((a,b)=>!a.resolvedAt&&b.resolvedAt?-1:a.resolvedAt&&!b.resolvedAt?1:b.startedAt-a.startedAt),o11y,attackStatus,errors}}function alertsIncompleteMessage(errors){return`Attack count and alerts may be incomplete: ${errors.map(e2=>`${e2.source==="alerts"?"alerts":"attack history"} ${e2.message}`).join("; ")}.`}function countAttacksMitigated(alerts2,windowStartMs,windowEndMs){return alerts2.filter(alert=>isAttackAlert(alert)&&alertOverlapsWindow(alert,windowStartMs,windowEndMs)).length}function alertOverlapsWindow(alert,windowStartMs,windowEndMs){return alert.startedAt<=windowEndMs&&(alert.resolvedAt??Number.POSITIVE_INFINITY)>=windowStartMs}function isAttackAlert(alert){return alert.type===FIREWALL_ANOMALY_TYPE?!0:alert.type===SYSTEM_RULE_ANOMALY_TYPE&&alert.ruleId===SYS_DOS_MITIGATION_RULE_ID}var O11Y_ALERT_ID_PREFIX="al_",INSPECT_FALLBACK_DAYS=7;function isO11yAlertId(id2){return id2.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id2){let match=id2.match(/-(\d{13})$/);return match?Number(match[1]):void 0}function daysCovering(startMs,endMs){return Math.max(1,Math.ceil((endMs-startMs)/864e5))}function mapGroupAsAlert(group,alertId){let nested=(group.alerts??[]).map(mapO11yAlert).filter(a=>a!==null),hit=nested.find(a=>a.id===alertId)??nested[0];if(hit)return hit;let startedAt=group.recordedStartedAt;return startedAt?mapO11yAlert({id:alertId,title:group.title,type:group.type,startedAt,resolvedAt:group.recordedResolvedAt,data:group.alerts?.[0]?.data}):null}async function getO11yAlertById(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId);try{let group=await client.fetch(`/alerts/v3/groups/${encodeURIComponent(opts.alertId)}?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal});return mapGroupAsAlert(group,opts.alertId)}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function findFirewallAlert(client,opts){let timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,budget2=()=>AbortSignal.timeout(timeoutMs),now=Date.now();if(isO11yAlertId(opts.alertId)){let fromGroup2=await getO11yAlertById(client,{...opts,signal:budget2()});if(fromGroup2)return{alert:fromGroup2};let from=new Date(now-864e5*INSPECT_FALLBACK_DAYS),hit=(await getFirewallO11yAlerts(client,{projectId:opts.projectId,teamId:opts.teamId,from,to:new Date(now),signal:budget2()})).find(a=>a.id===opts.alertId);return hit?{alert:hit}:null}let startTime=parseLegacyAlertStartTime(opts.alertId),sinceDays=startTime?daysCovering(startTime,now)+1:INSPECT_FALLBACK_DAYS,anomaly=((await getAttackStatus(client,{projectId:opts.projectId,teamId:opts.teamId,sinceDays,signal:budget2()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return{anomalies:[]}})).anomalies||[]).find(a=>`${a.ownerId}-${a.projectId}-${a.startTime}`===opts.alertId);if(anomaly)return{alert:mapAttackAnomaly(anomaly),hosts:hostsFromAnomaly(anomaly)};let fromGroup=await getO11yAlertById(client,{...opts,signal:budget2()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return null});return fromGroup?{alert:fromGroup}:null}var MANAGED_BOT_RULE_IDS=["bot-protection","ai-bots","bot-id"],ALIASES={"bot-protection":"bot-protection","bot protection":"bot-protection",bot_protection:"bot-protection",bot_filter:"bot-protection",managed_bot_protection:"bot-protection",managed_bot_filter:"bot-protection","ai-bots":"ai-bots","ai bots":"ai-bots",ai_bots:"ai-bots",managed_ai_bots:"ai-bots","bot-id":"bot-id",botid:"bot-id",bot_id:"bot-id"},ACTIONS={"bot-protection":["off","log","challenge"],"ai-bots":["allow","log","challenge","deny"],"bot-id":["basic","deep-analysis"]},NAMES={"bot-protection":"Bot Protection","ai-bots":"AI Bots","bot-id":"BotID"},WAF_RULE_IDS={"bot-protection":"managed_bot_protection","ai-bots":"managed_ai_bots"};function resolveManagedBotRuleId(identifier){if(identifier)return ALIASES[identifier.trim().toLowerCase()]}function managedBotActions(id2){return ACTIONS[id2]}function formatManagedBotAction(action){return action==="deep-analysis"?"Deep Analysis":action.charAt(0).toUpperCase()+action.slice(1)}function botProtectionConfig(managedRules){return managedRules?.bot_filter??managedRules?.bot_protection}function currentBotProtectionAction(config){let ruleset=botProtectionConfig(config?.managedRules);return ruleset?.active?ruleset.action==="log"?"log":"challenge":"off"}function currentAiBotsAction(config){let ruleset=config?.managedRules?.ai_bots;return ruleset?.active?ruleset.action==="challenge"?"challenge":ruleset.action==="deny"?"deny":"log":"allow"}function currentBotIdAction(config){return config?.botIdEnabled?"deep-analysis":"basic"}function getManagedBotRule(config,id2){let action=id2==="bot-protection"?currentBotProtectionAction(config):id2==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id:id2,name:NAMES[id2],action,wafRuleId:WAF_RULE_IDS[id2]}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id2=>getManagedBotRule(config,id2))}function parseManagedBotAction(id2,raw){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=ACTIONS[id2];return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${NAMES[id2]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id2,action){if(id2==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id2==="bot-protection"?"bot_protection":"ai_bots";return action==="off"||action==="allow"?{action:"managedRules.update",id:patchId,value:{active:!1}}:{action:"managedRules.update",id:patchId,value:{active:!0,action}}}function suggestedManagedBotAction(rule){return rule.id==="bot-protection"?rule.action==="challenge"?"log":"challenge":rule.id==="ai-bots"?rule.action==="deny"?"allow":"deny":rule.action==="deep-analysis"?"basic":"deep-analysis"}function managedBotTrafficWarning(id2,from,to){if(id2==="ai-bots"&&to==="deny")return"AI Bots deny blocks known AI crawlers from this project.";if(id2==="bot-protection"&&from==="off"&&to==="challenge")return"Bot Protection challenge will present a verification page to non-browser traffic."}function managedBotJson(rule){return{id:rule.id,name:rule.name,action:rule.action,wafRuleId:rule.wafRuleId??null}}function projectScope(project,teamId,teamSlug){return{type:"project",projectId:project.id,teamId,...teamSlug?{teamSlug}:{},displayName:project.name}}function firewallConfigUrl(scope,path3=""){let query=new URLSearchParams;return scope.type==="project"?(query.set("projectId",scope.projectId),scope.teamId&&query.set("teamId",scope.teamId),`/v1/security/firewall/config${path3}?${query.toString()}`):(query.set("teamId",scope.teamId),`/v1/security/firewall/team-config${path3}?${query.toString()}`)}async function listFirewallConfigs(client,scope){return client.fetch(firewallConfigUrl(scope))}async function activateFirewallConfig(client,scope,configVersion){return client.fetch(firewallConfigUrl(scope,`/${configVersion}/activate`),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})}var PRIORITY_PROJECT_ENABLE_COMMAND2="project priority enable",BUY_PRO_COMMAND2="buy pro";function withGlobalFlags3(client,commandTemplate,scope,options={}){let template=scope?.type==="team"?`${commandTemplate} --team-level`:commandTemplate;return buildCommandWithGlobalFlags(client.argv,template,void 0,{globalFlags:"all",preserveProject:options.preserveProject??!0,excludeFlags:options.excludeFlags})}async function resolveFirewallScope(client,flags){if(flags["--team-level"]&&flags["--project"]){let message="Cannot specify both --team-level and --project. Use one or the other.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),2):(output_manager_default.error(message),2)}if(flags["--team-level"]){let{team}=await getScope(client);if(!team){let message="Team-level firewall requires a team scope. Personal accounts are not supported. Run `vercel switch` to select a team or pass --scope <team>.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message},1),1):(output_manager_default.error(message),1)}return{type:"team",teamId:team.id,displayName:team.slug}}let link=await requireProjectContext(client,"firewall",flags["--project"]);if(typeof link=="number")return link;let{project,org}=link;return{type:"project",projectId:project.id,teamId:org.type==="team"?org.id:void 0,teamSlug:org.type==="team"?org.slug:void 0,displayName:project.name}}function mentionsPriorityProject(message){return/priority\s+project/i.test(message)||/priority\s+tier/i.test(message)}function teamPlan(scope){return scope.teamId?teamCache.get(scope.teamId)?.billing?.plan:void 0}function priorityTeam(scope){let cached=scope.teamId?teamCache.get(scope.teamId):void 0;if(scope.type==="team")return{id:scope.teamId,slug:scope.displayName,name:cached?.name??null,scopeArg:scope.displayName};if(!scope.teamId)return null;let slug=scope.teamSlug??cached?.slug??null;return{id:scope.teamId,slug,name:cached?.name??null,scopeArg:slug??scope.teamId}}function teamLabel(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function styledCommand(command2,plain){return plain?getCommandNamePlain(command2):getCommandName(command2)}function priorityProjectFix(scope){let excludeFlags=["--non-interactive","--project","--yes","--scope","--team"],project=scope.type==="project"?{id:scope.projectId,name:scope.displayName}:null,team=priorityTeam(scope),plan=teamPlan(scope)??null,data={project,team:team&&{id:team.id,slug:team.slug,name:team.name},plan},projectToken=project?quoteArg(project.name):"<project>",scopeFlag=team?` --scope ${quoteArg(team.scopeArg)}`:"",enable6=`${PRIORITY_PROJECT_ENABLE_COMMAND2} ${projectToken}${scopeFlag}`;if(!team){let hint="Priority projects are only available on team accounts. Use --scope to specify one.";return{command:"",hint,plainHint:hint,when:hint,excludeFlags,preserveProject:!1,reason:AGENT_REASON.MISSING_SCOPE,data}}if(plan==="hobby"||plan==="oss"){let upgrade2=`${BUY_PRO_COMMAND2}${scopeFlag}`,hint=plain2=>`Priority Projects are only available on Pro or Enterprise team plans. Upgrade with ${styledCommand(upgrade2,plain2)}, then run ${styledCommand(enable6,plain2)}.`;return{command:upgrade2,hint:hint(!1),plainHint:hint(!0),when:"a person has approved upgrading the plan",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}let shown=styledCommand(enable6,!1),plain=styledCommand(enable6,!0),placeholder="Replace <project> with a project on this team.";return{command:enable6,hint:project?shown:`${shown} ${placeholder}`,plainHint:project?plain:`${plain} ${placeholder}`,when:project?"user runs this command in an interactive terminal":"Replace <project> with a project on this team.",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}function mapFirewallApiError(e2,scope,fallback){let err=e2;return scope.type==="team"&&err.status===403?err.code==="plan_not_supported"?`Team-level firewall requires an Enterprise plan (current team: "${scope.displayName}"). Pass --scope <team> or run \`vercel switch\` to target a different team.`:`You need to be a team owner to manage the team-level firewall for "${scope.displayName}".${err.message?` (${err.message})`:""}`:err.message||fallback}function priorityProjectMessage(scope,fix){let team=fix.data.team,label=team?.slug!=null?teamLabel({slug:team.slug,name:team.name}):void 0;return scope.type==="project"?label?`This rule requires a Priority project for ${scope.displayName} on team ${label}.`:`This rule requires a Priority project. ${fix.hint}`:label?`This rule requires a Priority project on team ${label}.`:"This rule requires a Priority project."}function failPriorityProjectGate(client,error,scope,opts){let serverMessage=apiServerMessage(error);if(!serverMessage||!mentionsPriorityProject(serverMessage))return null;let fix=priorityProjectFix(scope),message=priorityProjectMessage(scope,fix),payload={status:AGENT_STATUS.ERROR,reason:fix.reason,message,userActionRequired:!0,hint:fix.plainHint,retryable:!1,...fix.scope?{scope:fix.scope}:{},data:fix.data,...fix.command?{next:[{command:buildCommandWithGlobalFlags(client.argv,fix.command,packageName,{globalFlags:"all",preserveProject:!1,excludeFlags:fix.excludeFlags}),when:fix.when}]}:{}};return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,1),opts?.json?(output_manager_default.stopSpinner(),writeAgentError(client,payload),1):(output_manager_default.error(message),fix.command&&output_manager_default.log(fix.hint),1)}function getRulePayload(flags){let legacy=flags["--json"];return legacy!==void 0&&flags["--data"]!==void 0?(output_manager_default.error("Can't use --data with --json."),2):(legacy!==void 0&&output_manager_default.warning("--json is deprecated for rule payloads. Use --data."),flags["--data"]??legacy)}async function parseSubcommandArgs2(argv,command2,client,commandPath){let parsedArgs,fullPath=commandPath||command2.name;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){if(client?.nonInteractive){let rawMessage=err instanceof Error?err.message:String(err),flags=getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0});return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:rawMessage,next:[{command:getCommandNamePlain(`firewall ${fullPath} ${flags.join(" ")}`.trim()),when:"fix flags and retry"}]},2),2}return printError(err),2}return parsedArgs}async function confirmAction(client,skipConfirmation,message,details){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`${message} Re-run with --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"re-run with --yes to confirm"}]}),process.exit(1),!1):(details&&output_manager_default.print(` ${details}
488
490
  `),await client.input.confirm(message,!1))}function firewallPermissionMessage(action,projectName){return`You don't have permission to ${action} for ${projectName}. Ask a team owner to grant access.`}function failFirewall(client,opts){let reason=opts.reason??AGENT_REASON.INVALID_ARGUMENTS,exitCode2=getExitCodeForReason(reason);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:opts.message,...opts.fix?.hint?{hint:opts.fix.hint}:{},next:[...opts.fix?.command?[{command:withGlobalFlags3(client,opts.fix.command,void 0,{excludeFlags:opts.fix.excludeFlags,preserveProject:opts.fix.preserveProject}),...opts.fix.when?{when:opts.fix.when}:{}}]:[],...opts.nextCommand?[{command:withGlobalFlags3(client,opts.nextCommand)}]:[]]},exitCode2),exitCode2):(output_manager_default.error(opts.message),opts.fix&&output_manager_default.log(opts.fix.hint),exitCode2)}function failFirewallObservabilityPlan(client,error,projectName){let message=apiServerMessage(error)??FIREWALL_ACTIVITY_PLAN_MESSAGE,fix=clientObservabilityPlanRecovery(client,error,message,projectName);return failFirewall(client,{message,fix,reason:AGENT_REASON.API_ERROR})}function refuseManagedBotMutation(client,scope,identifier,verb){if(scope.type!=="project")return null;let id2=resolveManagedBotRuleId(identifier);if(!id2)return null;let command2=`firewall rules edit ${id2} --action <action>`;return failFirewall(client,{message:`Can't ${verb} "${identifier}". That's a managed bot rule.`,reason:AGENT_REASON.INVALID_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk112.default.cyan(withGlobalFlags3(client,command2,scope))} to change it.`,when:"change the managed bot rule instead"}})}function isRetryableApiError(error){return isAPIError(error)&&(error.status>=500||error.status===429)}function failFirewallApi(client,e2,opts){if(isAPIError(e2)&&(e2.status===401||e2.status===403))return failFirewall(client,{message:firewallPermissionMessage(opts.permissionAction,opts.projectName),reason:AGENT_REASON.PERMISSION_DENIED});if(e2 instanceof Error&&(e2.name==="TimeoutError"||e2.name==="AbortError")){let job=opts.timeoutJob??"firewall data";return failFirewall(client,{message:`Timed out waiting for ${job}. Re-run the command \u2014 the next try is usually faster.`,nextCommand:opts.nextCommand,reason:AGENT_REASON.API_ERROR})}let msg=e2 instanceof Error&&e2.message?e2.message:opts.fallback;return failFirewall(client,{message:msg,nextCommand:isRetryableApiError(e2)?opts.nextCommand:void 0,reason:AGENT_REASON.API_ERROR})}function outputJson2(client,data){output_manager_default.stopSpinner(),client.stdout.write(JSON.stringify(data,null,2)+`
489
491
  `)}async function detectExistingDraft(client,scope){let{draft}=await listFirewallConfigs(client,scope);return draft!==null&&draft.changes.length>0}async function offerAutoPublish(client,scope,hadExistingDraft,opts){if(output_manager_default.print(`
490
492
  ${import_chalk112.default.gray(`This change is staged. Run ${import_chalk112.default.cyan(withGlobalFlags3(client,"firewall publish",scope))} to make it live, or ${import_chalk112.default.cyan(withGlobalFlags3(client,"firewall discard",scope))} to undo.`)}
@@ -603,10 +605,10 @@ ${formatRuleExpanded(previewRule)}
603
605
  `),opts.skipPrompts)return createFromGenerated(client,scope,currentRule,opts);for(;;){let choice=await client.input.select({message:"What would you like to do?",choices:[{value:"create",name:"Create this rule"},{value:"edit-ai",name:"Edit with AI (describe changes)"},{value:"edit-manual",name:"Edit manually (step by step)"},{value:"discard",name:"Discard"}]});if(choice==="create")return createFromGenerated(client,scope,currentRule,opts);if(choice==="edit-ai"){let editPrompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."});output_manager_default.spinner("Regenerating rule...");try{let response=await generateFirewallRule(client,project.id,{prompt:editPrompt,currentRule},{teamId});if(output_manager_default.stopSpinner(),response.error||!response.rule){output_manager_default.error(`AI could not update the rule: ${response.error||"No rule returned"}`);continue}currentRule=response.rule;let updatedPreview={...currentRule,id:"(AI-generated)"};output_manager_default.print(`
604
606
  ${formatRuleExpanded(updatedPreview)}
605
607
 
606
- `);continue}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let error=e2;output_manager_default.error(`Failed to regenerate: ${error.message||"Unknown error"}`);continue}}if(choice==="edit-manual"){let prePopulated={...currentRule,id:"(new)"},modified=await runInteractiveEditLoop2(client,prePopulated);if(!modified)continue;return createFromGenerated(client,scope,modified,opts)}if(choice==="discard")return output_manager_default.log("Discarded"),0}}async function createFromGenerated(client,scope,rule,opts){let createStamp=stamp_default();output_manager_default.spinner("Staging rule");try{let hadExistingDraft=await detectExistingDraft(client,scope);return await patchFirewallDraft(client,scope,{action:"rules.insert",id:null,value:{name:rule.name,description:rule.description,active:rule.active!==!1,conditionGroup:rule.conditionGroup,action:rule.action}}),output_manager_default.log(`${import_chalk135.default.cyan("Success!")} Rule "${import_chalk135.default.bold(rule.name)}" staged ${import_chalk135.default.gray(createStamp())}`),printActionImpactWarning(rule.action),await offerAutoPublish(client,scope,hadExistingDraft,{skipPrompts:opts.skipPrompts}),0}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let msg=e2.message||"Failed to stage rule";return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"staging_failed",message:msg,next:[{command:withGlobalFlags3(client,"firewall rules add --yes"),when:"try again"}]},1),output_manager_default.error(msg),1}}async function add8(client,argv){let parsed=await parseSubcommandArgs2(argv,rulesAddSubcommand3,client,"rules add");if(typeof parsed=="number")return parsed;let aiPrompt=parsed.flags["--ai"],jsonInput=parsed.flags["--json"],conditionFlags=parsed.flags["--condition"];if([aiPrompt,jsonInput,conditionFlags].filter(Boolean).length>1)return output_manager_default.error("Cannot use --ai, --json, and --condition together. Use only one mode."),1;if(aiPrompt){if(parsed.flags["--team-level"])return output_manager_default.error("AI mode is not available with --team-level. Use --json or --condition flags instead."),1;if(client.nonInteractive||!client.stdin.isTTY)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"ai_not_available",message:"AI mode is not available in non-interactive mode. AI-generated rules require human review before staging. Use --json or --condition flags instead.",next:[{command:withGlobalFlags3(client,`firewall rules add "Name" --condition '{"type":"path","op":"pre","value":"/api"}' --action deny --yes`),when:"create with flags"},{command:withGlobalFlags3(client,`firewall rules add --json '{"name":"...","conditionGroup":[...],"action":{...}}' --yes`),when:"create with JSON"}]}),output_manager_default.error("AI mode is not available in non-interactive mode. Use --json or --condition flags instead."),1;let scope=await resolveFirewallScope(client,parsed.flags);return typeof scope=="number"?scope:scope.type==="team"?(output_manager_default.error("AI mode is not available with --team-level. Use --json or --condition flags instead."),1):handleAIAdd(client,{id:scope.projectId,name:scope.displayName},scope.teamId,{prompt:aiPrompt,name:parsed.args[0],skipPrompts:!!parsed.flags["--yes"],teamSlug:scope.teamSlug})}if(jsonInput)return handleJsonAdd(client,parsed,jsonInput);if(conditionFlags)return handleFlagAdd(client,parsed,conditionFlags);if(client.stdin.isTTY&&!client.nonInteractive){let scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;let mode=await client.input.select({message:"How would you like to create the rule?",choices:[...scope.type==="project"?[{value:"ai",name:"Describe what you want (AI-powered)"}]:[],{value:"manual",name:"Build manually (step by step)"},{value:"json",name:"Paste JSON"}]});if(mode==="ai"&&scope.type==="project")return handleAIAdd(client,{id:scope.projectId,name:scope.displayName},scope.teamId,{skipPrompts:!1,teamSlug:scope.teamSlug});if(mode==="json"){let jsonStr=await client.input.text({message:"Paste the JSON rule definition:"});return handleJsonAdd(client,parsed,jsonStr)}return addInteractive(client,scope,{skipPrompts:!!parsed.flags["--yes"]})}return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_flags",message:"No rule definition provided. Use --json or --condition flags.",next:[{command:withGlobalFlags3(client,`firewall rules add "Name" --condition '{"type":"path","op":"pre","value":"/api"}' --action deny --yes`),when:"create with flags"},{command:withGlobalFlags3(client,`firewall rules add --json '{"name":"Name","conditionGroup":[...],"action":{"mitigate":{"action":"deny"}}}' --yes`),when:"create with JSON"}]}),output_manager_default.error("Interactive mode is not available. Use --ai, --json, or --condition flags to create a rule."),2}async function handleJsonAdd(client,parsed,jsonStr){let ruleData;try{ruleData=JSON.parse(jsonStr)}catch{return output_manager_default.error("Invalid JSON. Please provide a valid JSON object."),2}if(!ruleData.name||typeof ruleData.name!="string")return output_manager_default.error('JSON must include a "name" field (string).'),1;if(!ruleData.conditionGroup||!Array.isArray(ruleData.conditionGroup))return output_manager_default.error('JSON must include a "conditionGroup" field (array).'),1;for(let i=0;i<ruleData.conditionGroup.length;i++){let group=ruleData.conditionGroup[i];if(!group.conditions||!Array.isArray(group.conditions))return output_manager_default.error(`conditionGroup[${i}] must have a "conditions" array.`),1;for(let j=0;j<group.conditions.length;j++){let cond=group.conditions[j];if(!cond.type||typeof cond.type!="string")return output_manager_default.error(`conditionGroup[${i}].conditions[${j}] must have a "type" field.`),1;if(!cond.op||typeof cond.op!="string")return output_manager_default.error(`conditionGroup[${i}].conditions[${j}] must have an "op" field.`),1}}if(!ruleData.action||typeof ruleData.action!="object")return output_manager_default.error('JSON must include an "action" field (object).'),1;let actionObj=ruleData.action;if(!actionObj.mitigate||typeof actionObj.mitigate!="object")return output_manager_default.error('action must have a "mitigate" field. Example: { "mitigate": { "action": "deny" } }'),1;let mitigateObj=actionObj.mitigate;if(!mitigateObj.action||typeof mitigateObj.action!="string")return output_manager_default.error('action.mitigate must have an "action" field (string). Valid: deny, challenge, rate_limit, log, redirect.'),1;if(ruleData.name.length>160)return output_manager_default.error("Rule name must be 160 characters or less."),1;if(ruleData.description&&ruleData.description.length>256)return output_manager_default.error("Rule description must be 256 characters or less."),1;if(ruleData.conditionGroup.length>25)return output_manager_default.error("Maximum 25 condition groups allowed."),1;let rule={name:ruleData.name,description:ruleData.description,active:ruleData.active!==!1,conditionGroup:ruleData.conditionGroup,action:ruleData.action};return createRule2(client,parsed,rule)}async function handleFlagAdd(client,parsed,conditionFlags){let name=parsed.args[0];if(!name)return output_manager_default.error(`Missing rule name. Provide as the first argument: ${import_chalk136.default.cyan(withGlobalFlags3(client,'firewall rules add "Rule name" --condition ...'))}`),1;if(name.length>160)return output_manager_default.error("Rule name must be 160 characters or less."),1;let rawArgs=parsed.flags["--condition"];if(!rawArgs||rawArgs.length===0)return output_manager_default.error("At least one --condition is required."),2;let hasOr=parsed.flags["--or"],conditionGroups;if(hasOr){let interleaved=[],condValues=[...rawArgs],condIdx=0;for(let arg2 of client.argv)arg2==="--or"?interleaved.push("--or"):(arg2==="--condition"||arg2.startsWith("--condition="))&&condIdx<condValues.length&&(interleaved.push(condValues[condIdx]),condIdx++);let result=parseConditionFlags(interleaved);if(typeof result=="string")return output_manager_default.error(result),1;conditionGroups=result.groups}else{let result=parseConditionFlags(rawArgs);if(typeof result=="string")return output_manager_default.error(result),1;conditionGroups=result.groups}let actionType=parsed.flags["--action"];if(!actionType)return output_manager_default.error(`Missing --action. Valid actions: ${VALID_ACTIONS.join(", ")}`),1;if(!VALID_ACTIONS.includes(actionType))return output_manager_default.error(`Invalid action "${actionType}". Valid actions: ${VALID_ACTIONS.join(", ")}`),1;let action=buildActionFromFlags(parsed.flags,actionType);if(typeof action=="string")return output_manager_default.error(action),1;let description=parsed.flags["--description"];if(description&&description.length>256)return output_manager_default.error("Rule description must be 256 characters or less."),1;let active=!parsed.flags["--disabled"];return createRule2(client,parsed,{name,description,active,conditionGroup:conditionGroups,action})}async function createRule2(client,parsed,rule){let scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;let reserved=refuseManagedBotMutation(client,scope,rule.name,"add a custom rule named");if(reserved!==null)return reserved;let previewRule={...rule,id:"(new)"};if(output_manager_default.print(`
608
+ `);continue}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let error=e2;output_manager_default.error(`Failed to regenerate: ${error.message||"Unknown error"}`);continue}}if(choice==="edit-manual"){let prePopulated={...currentRule,id:"(new)"},modified=await runInteractiveEditLoop2(client,prePopulated);if(!modified)continue;return createFromGenerated(client,scope,modified,opts)}if(choice==="discard")return output_manager_default.log("Discarded"),0}}async function createFromGenerated(client,scope,rule,opts){let createStamp=stamp_default();output_manager_default.spinner("Staging rule");try{let hadExistingDraft=await detectExistingDraft(client,scope);return await patchFirewallDraft(client,scope,{action:"rules.insert",id:null,value:{name:rule.name,description:rule.description,active:rule.active!==!1,conditionGroup:rule.conditionGroup,action:rule.action}}),output_manager_default.log(`${import_chalk135.default.cyan("Success!")} Rule "${import_chalk135.default.bold(rule.name)}" staged ${import_chalk135.default.gray(createStamp())}`),printActionImpactWarning(rule.action),await offerAutoPublish(client,scope,hadExistingDraft,{skipPrompts:opts.skipPrompts}),0}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let msg=e2.message||"Failed to stage rule";return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"staging_failed",message:msg,next:[{command:withGlobalFlags3(client,"firewall rules add --yes"),when:"try again"}]},1),output_manager_default.error(msg),1}}async function add8(client,argv){let parsed=await parseSubcommandArgs2(argv,rulesAddSubcommand3,client,"rules add");if(typeof parsed=="number")return parsed;let aiPrompt=parsed.flags["--ai"],jsonInput=getRulePayload(parsed.flags);if(typeof jsonInput=="number")return jsonInput;let conditionFlags=parsed.flags["--condition"];if([aiPrompt,jsonInput,conditionFlags].filter(Boolean).length>1)return output_manager_default.error("Cannot use --ai, --data, and --condition together. Use only one mode."),1;if(aiPrompt){if(parsed.flags["--team-level"])return output_manager_default.error("AI mode is not available with --team-level. Use --data or --condition flags instead."),1;if(client.nonInteractive||!client.stdin.isTTY)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"ai_not_available",message:"AI mode is not available in non-interactive mode. AI-generated rules require human review before staging. Use --data or --condition flags instead.",next:[{command:withGlobalFlags3(client,`firewall rules add "Name" --condition '{"type":"path","op":"pre","value":"/api"}' --action deny --yes`),when:"create with flags"},{command:withGlobalFlags3(client,`firewall rules add --data '{"name":"...","conditionGroup":[...],"action":{...}}' --yes`),when:"create with JSON"}]}),output_manager_default.error("AI mode is not available in non-interactive mode. Use --data or --condition flags instead."),1;let scope=await resolveFirewallScope(client,parsed.flags);return typeof scope=="number"?scope:scope.type==="team"?(output_manager_default.error("AI mode is not available with --team-level. Use --data or --condition flags instead."),1):handleAIAdd(client,{id:scope.projectId,name:scope.displayName},scope.teamId,{prompt:aiPrompt,name:parsed.args[0],skipPrompts:!!parsed.flags["--yes"],teamSlug:scope.teamSlug})}if(jsonInput)return handleJsonAdd(client,parsed,jsonInput);if(conditionFlags)return handleFlagAdd(client,parsed,conditionFlags);if(client.stdin.isTTY&&!client.nonInteractive){let scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;let mode=await client.input.select({message:"How would you like to create the rule?",choices:[...scope.type==="project"?[{value:"ai",name:"Describe what you want (AI-powered)"}]:[],{value:"manual",name:"Build manually (step by step)"},{value:"json",name:"Paste JSON"}]});if(mode==="ai"&&scope.type==="project")return handleAIAdd(client,{id:scope.projectId,name:scope.displayName},scope.teamId,{skipPrompts:!1,teamSlug:scope.teamSlug});if(mode==="json"){let jsonStr=await client.input.text({message:"Paste the JSON rule definition:"});return handleJsonAdd(client,parsed,jsonStr)}return addInteractive(client,scope,{skipPrompts:!!parsed.flags["--yes"]})}return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_flags",message:"No rule definition provided. Use --data or --condition flags.",next:[{command:withGlobalFlags3(client,`firewall rules add "Name" --condition '{"type":"path","op":"pre","value":"/api"}' --action deny --yes`),when:"create with flags"},{command:withGlobalFlags3(client,`firewall rules add --data '{"name":"Name","conditionGroup":[...],"action":{"mitigate":{"action":"deny"}}}' --yes`),when:"create with JSON"}]}),output_manager_default.error("Interactive mode is not available. Use --ai, --data, or --condition flags to create a rule."),2}async function handleJsonAdd(client,parsed,jsonStr){let ruleData;try{ruleData=JSON.parse(jsonStr)}catch{return output_manager_default.error("Invalid JSON. Please provide a valid JSON object."),2}if(!ruleData.name||typeof ruleData.name!="string")return output_manager_default.error('JSON must include a "name" field (string).'),1;if(!ruleData.conditionGroup||!Array.isArray(ruleData.conditionGroup))return output_manager_default.error('JSON must include a "conditionGroup" field (array).'),1;for(let i=0;i<ruleData.conditionGroup.length;i++){let group=ruleData.conditionGroup[i];if(!group.conditions||!Array.isArray(group.conditions))return output_manager_default.error(`conditionGroup[${i}] must have a "conditions" array.`),1;for(let j=0;j<group.conditions.length;j++){let cond=group.conditions[j];if(!cond.type||typeof cond.type!="string")return output_manager_default.error(`conditionGroup[${i}].conditions[${j}] must have a "type" field.`),1;if(!cond.op||typeof cond.op!="string")return output_manager_default.error(`conditionGroup[${i}].conditions[${j}] must have an "op" field.`),1}}if(!ruleData.action||typeof ruleData.action!="object")return output_manager_default.error('JSON must include an "action" field (object).'),1;let actionObj=ruleData.action;if(!actionObj.mitigate||typeof actionObj.mitigate!="object")return output_manager_default.error('action must have a "mitigate" field. Example: { "mitigate": { "action": "deny" } }'),1;let mitigateObj=actionObj.mitigate;if(!mitigateObj.action||typeof mitigateObj.action!="string")return output_manager_default.error('action.mitigate must have an "action" field (string). Valid: deny, challenge, rate_limit, log, redirect.'),1;if(ruleData.name.length>160)return output_manager_default.error("Rule name must be 160 characters or less."),1;if(ruleData.description&&ruleData.description.length>256)return output_manager_default.error("Rule description must be 256 characters or less."),1;if(ruleData.conditionGroup.length>25)return output_manager_default.error("Maximum 25 condition groups allowed."),1;let rule={name:ruleData.name,description:ruleData.description,active:ruleData.active!==!1,conditionGroup:ruleData.conditionGroup,action:ruleData.action};return createRule2(client,parsed,rule)}async function handleFlagAdd(client,parsed,conditionFlags){let name=parsed.args[0];if(!name)return output_manager_default.error(`Missing rule name. Provide as the first argument: ${import_chalk136.default.cyan(withGlobalFlags3(client,'firewall rules add "Rule name" --condition ...'))}`),1;if(name.length>160)return output_manager_default.error("Rule name must be 160 characters or less."),1;let rawArgs=parsed.flags["--condition"];if(!rawArgs||rawArgs.length===0)return output_manager_default.error("At least one --condition is required."),2;let hasOr=parsed.flags["--or"],conditionGroups;if(hasOr){let interleaved=[],condValues=[...rawArgs],condIdx=0;for(let arg2 of client.argv)arg2==="--or"?interleaved.push("--or"):(arg2==="--condition"||arg2.startsWith("--condition="))&&condIdx<condValues.length&&(interleaved.push(condValues[condIdx]),condIdx++);let result=parseConditionFlags(interleaved);if(typeof result=="string")return output_manager_default.error(result),1;conditionGroups=result.groups}else{let result=parseConditionFlags(rawArgs);if(typeof result=="string")return output_manager_default.error(result),1;conditionGroups=result.groups}let actionType=parsed.flags["--action"];if(!actionType)return output_manager_default.error(`Missing --action. Valid actions: ${VALID_ACTIONS.join(", ")}`),1;if(!VALID_ACTIONS.includes(actionType))return output_manager_default.error(`Invalid action "${actionType}". Valid actions: ${VALID_ACTIONS.join(", ")}`),1;let action=buildActionFromFlags(parsed.flags,actionType);if(typeof action=="string")return output_manager_default.error(action),1;let description=parsed.flags["--description"];if(description&&description.length>256)return output_manager_default.error("Rule description must be 256 characters or less."),1;let active=!parsed.flags["--disabled"];return createRule2(client,parsed,{name,description,active,conditionGroup:conditionGroups,action})}async function createRule2(client,parsed,rule){let scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;let reserved=refuseManagedBotMutation(client,scope,rule.name,"add a custom rule named");if(reserved!==null)return reserved;let previewRule={...rule,id:"(new)"};if(output_manager_default.print(`
607
609
  ${formatRuleExpanded(previewRule)}
608
610
 
609
- `),!await confirmAction(client,parsed.flags["--yes"],"Create this rule?"))return output_manager_default.log("Canceled"),0;let createStamp=stamp_default();output_manager_default.spinner("Staging rule");try{let hadExistingDraft=await detectExistingDraft(client,scope);return await patchFirewallDraft(client,scope,{action:"rules.insert",id:null,value:rule}),output_manager_default.log(`${import_chalk136.default.cyan("Success!")} Rule "${import_chalk136.default.bold(rule.name)}" staged ${import_chalk136.default.gray(createStamp())}`),printActionImpactWarning(rule.action),await offerAutoPublish(client,scope,hadExistingDraft,{skipPrompts:parsed.flags["--yes"]}),0}catch(e2){let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let msg=mapFirewallApiError(e2,scope,"Failed to stage rule");return client.nonInteractive?(outputAgentError(client,{status:"error",reason:"api_error",message:msg,next:[{command:withGlobalFlags3(client,"firewall rules add --yes",scope)}]}),1):(output_manager_default.error(msg),1)}}var import_chalk138=__toESM(require_source(),1);var import_chalk137=__toESM(require_source(),1);var UNSUPPORTED_FLAGS=["--ai","--json","--condition","--name","--description","--duration","--enabled","--disabled","--rate-limit-algo","--rate-limit-window","--rate-limit-requests","--rate-limit-keys","--rate-limit-action","--redirect-url","--redirect-permanent","--or"];async function editManagedBotRule(client,opts){let used=UNSUPPORTED_FLAGS.filter(flag=>{let value=opts.flags[flag];return Array.isArray(value)?value.length>0:!!value});if(used.length>0){let command2=`firewall rules edit ${opts.id} --action <action>`;return failFirewall(client,{message:`Can't use ${used.join(", ")} on managed bot rules. Use --action.`,reason:AGENT_REASON.INVALID_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk137.default.cyan(withGlobalFlags3(client,command2,opts.scope))} to change it.`,when:"edit with --action"}})}let current=getManagedBotRule(opts.config,opts.id),rawAction=opts.flags["--action"],hasActionFlag=!!rawAction;if(!rawAction){if(client.nonInteractive||!client.stdin.isTTY){let command2=`firewall rules edit ${opts.id} --action <action>`;return failFirewall(client,{message:`Specify --action for ${current.name}. Run ${import_chalk137.default.cyan(withGlobalFlags3(client,`firewall rules inspect ${opts.id}`,opts.scope))} to see the current value.`,reason:AGENT_REASON.MISSING_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk137.default.cyan(withGlobalFlags3(client,command2,opts.scope))}.`,when:"set --action"}})}output_manager_default.print(`
611
+ `),!await confirmAction(client,parsed.flags["--yes"],"Create this rule?"))return output_manager_default.log("Canceled"),0;let createStamp=stamp_default();output_manager_default.spinner("Staging rule");try{let hadExistingDraft=await detectExistingDraft(client,scope);return await patchFirewallDraft(client,scope,{action:"rules.insert",id:null,value:rule}),output_manager_default.log(`${import_chalk136.default.cyan("Success!")} Rule "${import_chalk136.default.bold(rule.name)}" staged ${import_chalk136.default.gray(createStamp())}`),printActionImpactWarning(rule.action),await offerAutoPublish(client,scope,hadExistingDraft,{skipPrompts:parsed.flags["--yes"]}),0}catch(e2){let priority2=failPriorityProjectGate(client,e2,scope);if(priority2!==null)return priority2;let msg=mapFirewallApiError(e2,scope,"Failed to stage rule");return client.nonInteractive?(outputAgentError(client,{status:"error",reason:"api_error",message:msg,next:[{command:withGlobalFlags3(client,"firewall rules add --yes",scope)}]}),1):(output_manager_default.error(msg),1)}}var import_chalk138=__toESM(require_source(),1);var import_chalk137=__toESM(require_source(),1);var UNSUPPORTED_FLAGS=["--ai","--data","--json","--condition","--name","--description","--duration","--enabled","--disabled","--rate-limit-algo","--rate-limit-window","--rate-limit-requests","--rate-limit-keys","--rate-limit-action","--redirect-url","--redirect-permanent","--or"];async function editManagedBotRule(client,opts){let used=UNSUPPORTED_FLAGS.filter(flag=>{let value=opts.flags[flag];return Array.isArray(value)?value.length>0:!!value});if(used.length>0){let command2=`firewall rules edit ${opts.id} --action <action>`;return failFirewall(client,{message:`Can't use ${used.join(", ")} on managed bot rules. Use --action.`,reason:AGENT_REASON.INVALID_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk137.default.cyan(withGlobalFlags3(client,command2,opts.scope))} to change it.`,when:"edit with --action"}})}let current=getManagedBotRule(opts.config,opts.id),rawAction=opts.flags["--action"],hasActionFlag=!!rawAction;if(!rawAction){if(client.nonInteractive||!client.stdin.isTTY){let command2=`firewall rules edit ${opts.id} --action <action>`;return failFirewall(client,{message:`Specify --action for ${current.name}. Run ${import_chalk137.default.cyan(withGlobalFlags3(client,`firewall rules inspect ${opts.id}`,opts.scope))} to see the current value.`,reason:AGENT_REASON.MISSING_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk137.default.cyan(withGlobalFlags3(client,command2,opts.scope))}.`,when:"set --action"}})}output_manager_default.print(`
610
612
  ${formatManagedBotRuleDetail(current)}
611
613
 
612
614
  `),rawAction=await client.input.select({message:"Action?",choices:managedBotActions(opts.id).map(action=>({value:action,name:formatManagedBotAction(action)}))})}let parsedAction=parseManagedBotAction(opts.id,rawAction);if("error"in parsedAction){let command2=`firewall rules edit ${opts.id} --action <action>`;return failFirewall(client,{message:parsedAction.error,reason:AGENT_REASON.INVALID_ARGUMENTS,fix:{command:command2,hint:`Use ${import_chalk137.default.cyan(withGlobalFlags3(client,command2,opts.scope))}.`,when:"set a valid --action"}})}if(parsedAction.action===current.action)return output_manager_default.log(`No changes detected. ${current.name} is already ${formatManagedBotAction(current.action)}.`),0;if(opts.id==="bot-id"&&parsedAction.action==="deep-analysis")try{let{team}=await getScope(client);if(team?.billing?.plan==="hobby")return failFirewall(client,{message:"BotID Deep Analysis is not available on the Hobby plan.",reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED})}catch{}let warning2=managedBotTrafficWarning(opts.id,current.action,parsedAction.action);if(hasActionFlag&&output_manager_default.print(`
@@ -614,11 +616,11 @@ ${formatManagedBotRuleDetail({...current,action:parsedAction.action})}
614
616
 
615
617
  `),!await confirmAction(client,opts.flags["--yes"],`Save ${current.name} \u2192 ${formatManagedBotAction(parsedAction.action)}?`,warning2))return output_manager_default.log("Canceled"),0;let editStamp=stamp_default();output_manager_default.spinner("Staging changes");try{let hadExistingDraft=await detectExistingDraft(client,opts.scope);return await patchFirewallDraft(client,opts.scope,buildManagedBotPatch(opts.id,parsedAction.action)),output_manager_default.log(`${import_chalk137.default.cyan("Success!")} ${current.name} updated to ${import_chalk137.default.bold(formatManagedBotAction(parsedAction.action))} and staged ${import_chalk137.default.gray(editStamp())}`),opts.id==="bot-id"&&parsedAction.action==="deep-analysis"&&output_manager_default.print(`
616
618
  ${import_chalk137.default.dim("Install the BotID SDK in your app:")} ${import_chalk137.default.cyan("npm i botid")}
617
- `),await offerAutoPublish(client,opts.scope,hadExistingDraft,{skipPrompts:opts.flags["--yes"]}),0}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,opts.scope);if(priority2!==null)return priority2;let command2=`firewall rules edit ${opts.id} --action ${parsedAction.action}`;return failFirewall(client,{message:mapFirewallApiError(e2,opts.scope,"Failed to stage bot rule changes"),nextCommand:command2,reason:AGENT_REASON.API_ERROR})}}async function edit3(client,argv){let parsed=await parseSubcommandArgs2(argv,rulesEditSubcommand2,client,"rules edit");if(typeof parsed=="number")return parsed;let identifier=parsed.args[0],scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;output_manager_default.spinner(`Fetching rules for ${import_chalk138.default.bold(scope.displayName)}`);let{active,draft}=await listFirewallConfigs(client,scope),config=draft??active,currentRules=draft?.rules||active?.rules||[],managedRules=scope.type==="project"?getManagedBotRules(config):[];if(!identifier){if(output_manager_default.stopSpinner(),client.nonInteractive||!client.stdin.isTTY)return output_manager_default.error(`Missing required argument: <name-or-id>. Run ${import_chalk138.default.cyan(withGlobalFlags3(client,"firewall rules list",scope))} to see all rules.`),2;if(currentRules.length===0&&managedRules.length===0)return output_manager_default.error("No custom rules configured. Create one first with `vercel firewall rules add`."),1;let selectedId=await client.input.select({message:"Select a rule to edit:",choices:[...managedRules.map(r=>({value:r.id,name:`${r.name} \u2014 ${formatManagedBotAction(r.action)} (${r.id})`})),...currentRules.map(r=>({value:r.id,name:`${r.name} [${r.active?"Enabled":"Disabled"}] \u2014 ${formatActionDisplay(r.action)}`}))]}),selectedManaged=resolveManagedBotRuleId(selectedId);if(selectedManaged)return editManagedBotRule(client,{id:selectedManaged,flags:parsed.flags,scope,config});let selected=currentRules.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("No rule selected"),1;identifier=selected.id}let managedId=scope.type==="project"?resolveManagedBotRuleId(identifier):void 0;if(managedId)return output_manager_default.stopSpinner(),editManagedBotRule(client,{id:managedId,flags:parsed.flags,scope,config});let matches=resolveRule(currentRules,identifier);if(matches.length===0)return output_manager_default.error(`No rule found for "${identifier}". Run ${import_chalk138.default.cyan(withGlobalFlags3(client,"firewall rules list",scope))} to view all rules.`),1;let originalRule=matches[0];if(matches.length>1){if(output_manager_default.stopSpinner(),client.nonInteractive||!client.stdin.isTTY)return output_manager_default.error(`Multiple rules match "${identifier}". Specify the full rule ID to disambiguate.`),1;let selectedId=await client.input.select({message:`Multiple rules match "${identifier}". Select one:`,choices:matches.map(r=>({value:r.id,name:`${r.name} [${r.active?"Enabled":"Disabled"}] (${r.id})`}))}),selected=matches.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("No rule selected"),1;originalRule=selected}output_manager_default.stopSpinner();let aiPrompt=parsed.flags["--ai"],jsonInput=parsed.flags["--json"],conditionFlags=parsed.flags["--condition"];if([aiPrompt,jsonInput,conditionFlags].filter(Boolean).length>1)return output_manager_default.error("Cannot use --ai, --json, and --condition together. Use only one mode."),1;if(aiPrompt)return scope.type==="team"?(output_manager_default.error("AI mode is not available with --team-level. Use --json or flag-based editing instead."),1):client.nonInteractive||!client.stdin.isTTY?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"ai_not_available",message:"AI mode is not available in non-interactive mode. AI-generated changes require human review. Use --json or flag-based editing instead.",next:[{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --action challenge --yes`),when:"edit with flags"},{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --json '{"name":"...","conditionGroup":[...],"action":{...}}' --yes`),when:"edit with JSON"}]}),output_manager_default.error("AI mode is not available in non-interactive mode. Use --json or flag-based editing instead."),1):handleAIEdit(client,{id:scope.projectId,name:scope.displayName},scope.teamId,originalRule,{prompt:aiPrompt,skipPrompts:!!parsed.flags["--yes"]});if(jsonInput)return handleJsonEdit(client,parsed,originalRule,jsonInput,scope);if(conditionFlags||parsed.flags["--action"]||parsed.flags["--name"]||parsed.flags["--description"]!==void 0||parsed.flags["--duration"]||parsed.flags["--enabled"]||parsed.flags["--disabled"]||parsed.flags["--rate-limit-algo"]||parsed.flags["--rate-limit-window"]||parsed.flags["--rate-limit-requests"]||parsed.flags["--rate-limit-keys"]||parsed.flags["--rate-limit-action"]||parsed.flags["--redirect-url"]||parsed.flags["--redirect-permanent"])return handleFlagEdit(client,parsed,originalRule,argv,scope);if(client.stdin.isTTY&&!client.nonInteractive){if(output_manager_default.print(`
619
+ `),await offerAutoPublish(client,opts.scope,hadExistingDraft,{skipPrompts:opts.flags["--yes"]}),0}catch(e2){output_manager_default.stopSpinner();let priority2=failPriorityProjectGate(client,e2,opts.scope);if(priority2!==null)return priority2;let command2=`firewall rules edit ${opts.id} --action ${parsedAction.action}`;return failFirewall(client,{message:mapFirewallApiError(e2,opts.scope,"Failed to stage bot rule changes"),nextCommand:command2,reason:AGENT_REASON.API_ERROR})}}async function edit3(client,argv){let parsed=await parseSubcommandArgs2(argv,rulesEditSubcommand2,client,"rules edit");if(typeof parsed=="number")return parsed;let identifier=parsed.args[0],scope=await resolveFirewallScope(client,parsed.flags);if(typeof scope=="number")return scope;output_manager_default.spinner(`Fetching rules for ${import_chalk138.default.bold(scope.displayName)}`);let{active,draft}=await listFirewallConfigs(client,scope),config=draft??active,currentRules=draft?.rules||active?.rules||[],managedRules=scope.type==="project"?getManagedBotRules(config):[];if(!identifier){if(output_manager_default.stopSpinner(),client.nonInteractive||!client.stdin.isTTY)return output_manager_default.error(`Missing required argument: <name-or-id>. Run ${import_chalk138.default.cyan(withGlobalFlags3(client,"firewall rules list",scope))} to see all rules.`),2;if(currentRules.length===0&&managedRules.length===0)return output_manager_default.error("No custom rules configured. Create one first with `vercel firewall rules add`."),1;let selectedId=await client.input.select({message:"Select a rule to edit:",choices:[...managedRules.map(r=>({value:r.id,name:`${r.name} \u2014 ${formatManagedBotAction(r.action)} (${r.id})`})),...currentRules.map(r=>({value:r.id,name:`${r.name} [${r.active?"Enabled":"Disabled"}] \u2014 ${formatActionDisplay(r.action)}`}))]}),selectedManaged=resolveManagedBotRuleId(selectedId);if(selectedManaged)return editManagedBotRule(client,{id:selectedManaged,flags:parsed.flags,scope,config});let selected=currentRules.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("No rule selected"),1;identifier=selected.id}let managedId=scope.type==="project"?resolveManagedBotRuleId(identifier):void 0;if(managedId)return output_manager_default.stopSpinner(),editManagedBotRule(client,{id:managedId,flags:parsed.flags,scope,config});let matches=resolveRule(currentRules,identifier);if(matches.length===0)return output_manager_default.error(`No rule found for "${identifier}". Run ${import_chalk138.default.cyan(withGlobalFlags3(client,"firewall rules list",scope))} to view all rules.`),1;let originalRule=matches[0];if(matches.length>1){if(output_manager_default.stopSpinner(),client.nonInteractive||!client.stdin.isTTY)return output_manager_default.error(`Multiple rules match "${identifier}". Specify the full rule ID to disambiguate.`),1;let selectedId=await client.input.select({message:`Multiple rules match "${identifier}". Select one:`,choices:matches.map(r=>({value:r.id,name:`${r.name} [${r.active?"Enabled":"Disabled"}] (${r.id})`}))}),selected=matches.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("No rule selected"),1;originalRule=selected}output_manager_default.stopSpinner();let aiPrompt=parsed.flags["--ai"],jsonInput=getRulePayload(parsed.flags);if(typeof jsonInput=="number")return jsonInput;let conditionFlags=parsed.flags["--condition"];if([aiPrompt,jsonInput,conditionFlags].filter(Boolean).length>1)return output_manager_default.error("Cannot use --ai, --data, and --condition together. Use only one mode."),1;if(aiPrompt)return scope.type==="team"?(output_manager_default.error("AI mode is not available with --team-level. Use --data or flag-based editing instead."),1):client.nonInteractive||!client.stdin.isTTY?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"ai_not_available",message:"AI mode is not available in non-interactive mode. AI-generated changes require human review. Use --data or flag-based editing instead.",next:[{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --action challenge --yes`),when:"edit with flags"},{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --data '{"name":"...","conditionGroup":[...],"action":{...}}' --yes`),when:"edit with JSON"}]}),output_manager_default.error("AI mode is not available in non-interactive mode. Use --data or flag-based editing instead."),1):handleAIEdit(client,{id:scope.projectId,name:scope.displayName},scope.teamId,originalRule,{prompt:aiPrompt,skipPrompts:!!parsed.flags["--yes"]});if(jsonInput)return handleJsonEdit(client,parsed,originalRule,jsonInput,scope);if(conditionFlags||parsed.flags["--action"]||parsed.flags["--name"]||parsed.flags["--description"]!==void 0||parsed.flags["--duration"]||parsed.flags["--enabled"]||parsed.flags["--disabled"]||parsed.flags["--rate-limit-algo"]||parsed.flags["--rate-limit-window"]||parsed.flags["--rate-limit-requests"]||parsed.flags["--rate-limit-keys"]||parsed.flags["--rate-limit-action"]||parsed.flags["--redirect-url"]||parsed.flags["--redirect-permanent"])return handleFlagEdit(client,parsed,originalRule,argv,scope);if(client.stdin.isTTY&&!client.nonInteractive){if(output_manager_default.print(`
618
620
  ${import_chalk138.default.bold("Current rule:")}
619
621
  `),output_manager_default.print(`${formatRuleExpanded(originalRule)}
620
622
 
621
- `),await client.input.select({message:"How would you like to edit this rule?",choices:[...scope.type==="project"?[{value:"ai",name:"Describe changes (AI-powered)"}]:[],{value:"manual",name:"Edit manually (field by field)"}]})==="ai"&&scope.type==="project")return handleAIEdit(client,{id:scope.projectId,name:scope.displayName},scope.teamId,originalRule,{skipPrompts:!1});let modified=await runInteractiveEditLoop2(client,originalRule);return modified?JSON.stringify(modified)===JSON.stringify(originalRule)?(output_manager_default.log("No changes detected."),0):saveEdit(client,scope,originalRule,modified,parsed,{skipConfirm:!0}):(output_manager_default.log("Canceled"),0)}return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_flags",message:"No edit flags provided. Use --json, --condition, --action, --name, etc.",next:[{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --action challenge --yes`),when:"edit with flags"},{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --json '{"name":"...","conditionGroup":[...],"action":{"mitigate":{"action":"deny"}}}' --yes`),when:"edit with JSON"}]}),output_manager_default.error("Interactive mode is not available. Use --json or flag-based editing."),2}async function handleAIEdit(client,project,teamId,originalRule,opts){let prompt=opts.prompt;if(!prompt){if(!client.stdin.isTTY||client.nonInteractive)return output_manager_default.error("--ai requires a description."),1;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."})}let currentRule=JSON.parse(JSON.stringify(originalRule));for(;;){output_manager_default.spinner("Generating changes with AI...");try{let response=await generateFirewallRule(client,project.id,{prompt,currentRule},{teamId});if(output_manager_default.stopSpinner(),response.error){if(client.stdin.isTTY&&!client.nonInteractive&&!opts.skipPrompts){if(await client.input.select({message:`AI could not update the rule: ${response.error}`,choices:[{value:"retry",name:"Try again with a different description"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."});continue}return output_manager_default.error(`AI could not update the rule: ${response.error}`),1}if(!response.rule){if(client.stdin.isTTY&&!client.nonInteractive&&!opts.skipPrompts){if(await client.input.select({message:"AI did not return a rule.",choices:[{value:"retry",name:"Try again with a different description"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."});continue}return output_manager_default.error("AI did not return a rule."),1}currentRule={...response.rule,id:originalRule.id};break}catch(e2){output_manager_default.stopSpinner();let error=e2;if(!client.stdin.isTTY||client.nonInteractive)return output_manager_default.error(error.message||"Failed to generate changes"),1;if(await client.input.select({message:`Generation failed: ${error.message||"Unknown error"}`,choices:[{value:"retry",name:"Try again"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0}}if(output_manager_default.print(`
623
+ `),await client.input.select({message:"How would you like to edit this rule?",choices:[...scope.type==="project"?[{value:"ai",name:"Describe changes (AI-powered)"}]:[],{value:"manual",name:"Edit manually (field by field)"}]})==="ai"&&scope.type==="project")return handleAIEdit(client,{id:scope.projectId,name:scope.displayName},scope.teamId,originalRule,{skipPrompts:!1});let modified=await runInteractiveEditLoop2(client,originalRule);return modified?JSON.stringify(modified)===JSON.stringify(originalRule)?(output_manager_default.log("No changes detected."),0):saveEdit(client,scope,originalRule,modified,parsed,{skipConfirm:!0}):(output_manager_default.log("Canceled"),0)}return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_flags",message:"No edit flags provided. Use --data, --condition, --action, --name, etc.",next:[{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --action challenge --yes`),when:"edit with flags"},{command:withGlobalFlags3(client,`firewall rules edit "${identifier}" --data '{"name":"...","conditionGroup":[...],"action":{"mitigate":{"action":"deny"}}}' --yes`),when:"edit with JSON"}]}),output_manager_default.error("Interactive mode is not available. Use --data or flag-based editing."),2}async function handleAIEdit(client,project,teamId,originalRule,opts){let prompt=opts.prompt;if(!prompt){if(!client.stdin.isTTY||client.nonInteractive)return output_manager_default.error("--ai requires a description."),1;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."})}let currentRule=JSON.parse(JSON.stringify(originalRule));for(;;){output_manager_default.spinner("Generating changes with AI...");try{let response=await generateFirewallRule(client,project.id,{prompt,currentRule},{teamId});if(output_manager_default.stopSpinner(),response.error){if(client.stdin.isTTY&&!client.nonInteractive&&!opts.skipPrompts){if(await client.input.select({message:`AI could not update the rule: ${response.error}`,choices:[{value:"retry",name:"Try again with a different description"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."});continue}return output_manager_default.error(`AI could not update the rule: ${response.error}`),1}if(!response.rule){if(client.stdin.isTTY&&!client.nonInteractive&&!opts.skipPrompts){if(await client.input.select({message:"AI did not return a rule.",choices:[{value:"retry",name:"Try again with a different description"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0;prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."});continue}return output_manager_default.error("AI did not return a rule."),1}currentRule={...response.rule,id:originalRule.id};break}catch(e2){output_manager_default.stopSpinner();let error=e2;if(!client.stdin.isTTY||client.nonInteractive)return output_manager_default.error(error.message||"Failed to generate changes"),1;if(await client.input.select({message:`Generation failed: ${error.message||"Unknown error"}`,choices:[{value:"retry",name:"Try again"},{value:"cancel",name:"Cancel"}]})==="cancel")return output_manager_default.log("Canceled"),0}}if(output_manager_default.print(`
622
624
  ${formatRuleExpanded(currentRule)}
623
625
 
624
626
  `),opts.skipPrompts)return saveEdit(client,projectScope(project,teamId),originalRule,currentRule,{flags:{"--yes":!0}});for(;;){let choice;try{choice=await client.input.select({message:"What would you like to do?",choices:[{value:"save",name:"Save changes"},{value:"edit-ai",name:"Edit with AI (describe more changes)"},{value:"edit-manual",name:"Edit manually (field by field)"},{value:"discard",name:"Discard"}]})}catch{return 1}if(choice==="save")return saveEdit(client,projectScope(project,teamId),originalRule,currentRule,{flags:{}},{skipConfirm:!0});if(choice==="edit-ai"){prompt=await client.input.text({message:"Describe the changes you want:",validate:val=>val.trim()?!0:"Please describe the changes."}),output_manager_default.spinner("Regenerating...");try{let response=await generateFirewallRule(client,project.id,{prompt,currentRule},{teamId});if(output_manager_default.stopSpinner(),response.error||!response.rule){output_manager_default.error(`AI could not update the rule: ${response.error||"No rule returned"}`);continue}currentRule={...response.rule,id:originalRule.id},output_manager_default.print(`
@@ -950,7 +952,7 @@ Re-run with --installation-id to select one, e.g.:
950
952
  vercel ${commandName} ${slug} --installation-id ${result.installations[0].id}`),1}if(result.kind!=="provisioned"){let fallback=result;telemetry2.trackMarketplaceEvent("marketplace_install_flow_web_fallback",{...baseProps,reason:fallback.reason??fallback.kind,auto_provision_result_kind:fallback.kind,auto_provision_result_reason:fallback.reason,auto_provision_error_message:fallback.error_message}),output_manager_default.debug(`Fallback required - kind: ${fallback.kind}`),output_manager_default.debug(`Fallback URL from API: ${fallback.url}`);let projectLink=await getLinkedProjectField(client,options.noConnect,"name");if(projectLink.exitCode!==void 0)return projectLink.exitCode;let missingRequired=(mergedParsingSchema.required??[]).filter(key=>{if(key in metadata||key in installationMetadata)return!1;let prop=mergedParsingSchema.properties[key];return prop&&!isServerHandledRegion(prop)});if(missingRequired.length>0){let examples=missingRequired.map(key=>{let prop=mergedParsingSchema.properties[key],exampleVal=(prop?getVisibleOptions(prop):void 0)?.[0]??"<value>";return`-m ${key}=${exampleVal}`});return output_manager_default.error(`Missing required metadata: ${missingRequired.join(", ")}.`),output_manager_default.log(` Provide ${examples.join(" ")} to provision directly from the CLI.`),output_manager_default.log(` Run \`vercel ${commandName} ${integration.slug} --help\` for all metadata options.`),1}let url=new URL(fallback.url);url.searchParams.set("defaultResourceName",resourceName),url.searchParams.set("source","cli"),Object.keys(metadata).length>0&&url.searchParams.set("metadata",JSON.stringify(metadata)),Object.keys(installationMetadata).length>0&&url.searchParams.set("installationMetadata",JSON.stringify(installationMetadata)),projectLink.value&&url.searchParams.set("projectSlug",projectLink.value),options.billingPlanId&&url.searchParams.set("planId",options.billingPlanId),options.environments?.length&&url.searchParams.set("environment",options.environments.join(","));let setupMessage=fallback.error_message?`Additional setup required: ${fallback.error_message}`:"Additional setup required.";return outputActionRequired(client,{status:"action_required",reason:AGENT_REASON.INTEGRATION_SETUP_REQUIRED,message:`${setupMessage} Finish setup for "${integration.name}" in the browser at verification_uri. This command does not wait for it in non-interactive mode.`,verification_uri:url.href,userActionRequired:!0,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration list",packageName,{prependGlobalFlags:!0}),when:"Confirm the resource exists after setup is finished in the browser"}]}),output_manager_default.log(setupMessage),output_manager_default.log("Opening browser to finish setup..."),output_manager_default.log(`Visit this URL if the browser does not open: ${url.href}`),(0,import_open14.default)(url.href).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),1}let provisioned=result;telemetry2.trackMarketplaceEvent("marketplace_checkout_provisioning_completed",{...baseProps,resource_id:provisioned.resource.id}),output_manager_default.debug(`Provisioned resource: ${JSON.stringify(provisioned.resource,null,2)}`),output_manager_default.debug(`Installation: ${JSON.stringify(provisioned.installation,null,2)}`),output_manager_default.debug(`Billing plan: ${JSON.stringify(provisioned.billingPlan,null,2)}`),output_manager_default.success(`${product.name} successfully provisioned: ${import_chalk221.default.bold(resourceName)}`);let isSandbox=provisioned.resource.ownership==="sandbox";if(isSandbox&&!options.noClaim)if(telemetry2.trackCliFlagClaim(options.claim),telemetry2.trackCliFlagNoClaim(options.noClaim),options.claim||client.stdin.isTTY&&!options.asJson){let runClaim=!!options.claim;if(!runClaim&&client.stdin.isTTY&&(runClaim=await client.input.confirm(`${import_chalk221.default.bold(resourceName)} is a sandbox resource. Claim it now?`,!0)),runClaim)try{let targetResource=(await getResources(client)).find(r=>r.id===provisioned.resource.id);targetResource?await runClaimForResource(client,targetResource,{suppressActionRequired:!0}):output_manager_default.warn(`Could not locate the newly provisioned resource. Run \`${packageName} integration resource claim ${resourceName}\` to claim it.`)}catch(error){output_manager_default.warn(`Failed to start claim flow: ${error.message}. Run \`${packageName} integration resource claim ${resourceName}\` to retry.`)}}else output_manager_default.log(`Sandbox resource \u2014 claim it with: ${import_chalk221.default.cyan(`vercel integration resource claim ${resourceName}`)}`);else isSandbox&&options.noClaim&&(telemetry2.trackCliFlagNoClaim(options.noClaim),output_manager_default.log(`Sandbox resource \u2014 claim it later with: ${import_chalk221.default.cyan(`vercel integration resource claim ${resourceName}`)}`));let guideCommand=`vercel integration guide ${integration.products.length>1?`${integration.slug}/${product.slug}`:integration.slug}`;output_manager_default.log(indent_default(`Guide: Run ${import_chalk221.default.cyan(`\`${guideCommand}\``)} for getting started guides and code snippets`,4));let setupResult=await postProvisionSetup(client,resourceName,provisioned.resource.id,contextName,{...options,integrationSlug:integration.slug,installationId:provisioned.installation.id,onProjectConnected:projectId=>{telemetry2.trackMarketplaceEvent("marketplace_project_connected",{...baseProps,project_id:projectId,resource_id:provisioned.resource.id})},onProjectConnectFailed:(projectId,error)=>{telemetry2.trackMarketplaceEvent("marketplace_project_connect_failed",{...baseProps,project_id:projectId,resource_id:provisioned.resource.id,error_message:error.message})}}),skills2=resolveProductSkills(product),failedSkills=[];if(skills2.length){options.asJson||output_manager_default.spinner(`Installing agent skills for ${product.name}...`);let skillsTelemetryMetadata=JSON.stringify({origin:"vercel-cli",flow:"integration-install",integration:integration.slug,product:product.slug});for(let skill of skills2){let args=["--yes","skills","add",skill.repoUrl,...skill.skill?["--skill",skill.skill]:[],"--yes","--metadata",skillsTelemetryMetadata],result2=await(0,import_execa2.default)("npx",args,{cwd:client.cwd,stdio:"pipe",reject:!1});result2.exitCode!==0&&(failedSkills.push(skill),output_manager_default.debug(`skills add failed: ${result2.stderr}`),options.asJson||output_manager_default.warn(`Failed to install ${skill.skill??skill.repoUrl}. Run it manually: ${import_chalk221.default.cyan(skill.command)}`))}let installed2=skills2.length-failedSkills.length;if(installed2>0&&!options.asJson){let marketplaceUrl=integration.products.length>1?`https://vercel.com/marketplace/${integration.slug}/${product.slug}`:`https://vercel.com/marketplace/${integration.slug}`;output_manager_default.log(`Installed ${installed2} agent skill${installed2===1?"":"s"} for ${import_chalk221.default.bold(product.name)}`),output_manager_default.log(indent_default(`Learn more: ${output_manager_default.link(marketplaceUrl,marketplaceUrl,{fallback:!1})}`,2))}}if(options.asJson){let warnings=[];setupResult.connectError&&warnings.push(`Failed to connect to project: ${setupResult.connectError}`),setupResult.connected&&!setupResult.envPulled&&!options.noEnvPull&&warnings.push(ENV_PULL_FAILED_MESSAGE);for(let skill of failedSkills)warnings.push(`Failed to install ${skill.skill??skill.repoUrl}. Run it manually: ${skill.command}`);let jsonOutput={resource:{id:provisioned.resource.id,name:provisioned.resource.name,status:provisioned.resource.status,externalResourceId:provisioned.resource.externalResourceId,...provisioned.resource.ownership&&{ownership:provisioned.resource.ownership}},integration:{id:provisioned.integration.id,slug:provisioned.integration.slug,name:provisioned.integration.name},product:{id:provisioned.product.id,slug:provisioned.product.slug,name:provisioned.product.name},installation:{id:provisioned.installation.id},billingPlan:provisioned.billingPlan?{id:provisioned.billingPlan.id,name:provisioned.billingPlan.name,type:provisioned.billingPlan.type}:null,dashboardUrl:setupResult.dashboardUrl,ssoUrl:{integration:buildSSOLink(team,provisioned.installation.id),resource:buildSSOLink(team,provisioned.installation.id,provisioned.resource.externalResourceId)},project:setupResult.project??null,connected:setupResult.connected,connectError:setupResult.connectError??null,environments:setupResult.environments,envPulled:setupResult.envPulled,guideCommand,skills:skills2.map(skill=>({...skill,installed:!failedSkills.includes(skill)})),warnings};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
951
953
  `),setupResult.connectError?0:setupResult.exitCode}return setupResult.exitCode}async function add9(client,args,flags,commandName){let resourceNameArg=flags["--name"],metadataFlags=flags["--metadata"],billingPlanId=flags["--plan"],prefix=flags["--prefix"];if(prefix!==void 0&&!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(prefix))return output_manager_default.error("Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."),2;let installationId=flags["--installation-id"],formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error("Cannot install more than one integration at a time"),2;let rawArg=args[0];if(!rawArg){let message="You must pass an integration slug";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message,hint:`Example: \`${packageName} integration add <integration-slug>\`. Run \`${packageName} integration discover\` to find slugs.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration discover",packageName,{prependGlobalFlags:!0}),when:"List available marketplace integrations and slugs"},{command:buildCommandWithGlobalFlags(client.argv,"integration add neon",packageName,{prependGlobalFlags:!0}),when:"Install after replacing neon with a slug from discover"}]},2),output_manager_default.error(message),2}let integrationSlug,productSlug,slashIndex=rawArg.indexOf("/");if(slashIndex!==-1){if(integrationSlug=rawArg.substring(0,slashIndex),productSlug=rawArg.substring(slashIndex+1),!integrationSlug||!productSlug)return output_manager_default.error("Invalid format. Expected: <integration-name>/<product-slug>"),2}else integrationSlug=rawArg;let environments=flags["--environment"],claimFlag=flags["--claim"],noClaimFlag=flags["--no-claim"];return claimFlag&&noClaimFlag?(output_manager_default.error("Cannot use both --claim and --no-claim."),2):await addAutoProvision(client,integrationSlug,resourceNameArg,{productSlug,metadata:metadataFlags,billingPlanId,installationId,noConnect:flags["--no-connect"],noEnvPull:flags["--no-env-pull"],environments,prefix,commandName,asJson,claim:claimFlag,noClaim:noClaimFlag})}var import_chalk222=__toESM(require_source(),1);function formatProductHelp(integrationSlug,products,commandName="integration add"){let lines=[];lines.push(""),lines.push(` ${import_chalk222.default.dim("Available products for")} "${import_chalk222.default.bold(integrationSlug)}"${import_chalk222.default.dim(":")}`),lines.push("");let maxSlugLen=Math.max(...products.map(p=>p.slug.length));for(let product of products){let paddedSlug=product.slug.padEnd(maxSlugLen);lines.push(` ${import_chalk222.default.cyan(paddedSlug)} ${product.name}`)}return lines.push(""),lines.push(` ${import_chalk222.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk222.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/<product-slug>`)}`),lines.push(""),lines.join(`
952
954
  `)}var import_chalk223=__toESM(require_source(),1);function formatBillingPlansHelp(productName,plans){let enabledPlans=plans.filter(p=>!p.disabled);if(enabledPlans.length===0)return"";let lines=[];lines.push(""),lines.push(` ${import_chalk223.default.dim("Available billing plans for")} "${import_chalk223.default.bold(productName)}"${import_chalk223.default.dim(":")}`),lines.push("");let maxIdLen=Math.max(...enabledPlans.map(p=>p.id.length));for(let plan of enabledPlans){let paddedId=plan.id.padEnd(maxIdLen),cost=plan.cost?import_chalk223.default.dim(` (${plan.cost})`):"";lines.push(` ${import_chalk223.default.cyan(paddedId)} ${plan.name}${cost}`)}return lines.push(""),lines.push(` ${import_chalk223.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk223.default.cyan(`--plan ${enabledPlans[0].id}`)}`),lines.push(""),lines.join(`
953
- `)}var import_chalk224=__toESM(require_source(),1);function formatDynamicExamples(integrationSlug,products,commandName="integration add"){let lines=[];if(lines.push(""),lines.push(` ${import_chalk224.default.dim("Examples:")}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install ${integrationSlug}`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}`)}`),products.length>1){let firstProduct=products[0];lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install a specific product`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/${firstProduct.slug}`)}`)}lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a custom resource name`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --name my-resource`)}`);let metadataExample=buildMetadataExample(integrationSlug,products,commandName);return metadataExample&&(lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with metadata`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${metadataExample}`)}`)),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a specific billing plan`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --plan pro`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install and connect to specific environments only`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} -e production -e preview`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install without connecting to the current project`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-connect`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install without pulling environment variables`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-env-pull`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a prefix for environment variable names`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --prefix NEON2_`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Output as JSON`),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --json`)}`),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --format json`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install using a specific installation`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --installation-id <id>`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Claim a sandbox resource immediately after provisioning`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --claim`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Skip the offer to claim a sandbox resource`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-claim`)}`),lines.push(""),lines.join(`
955
+ `)}var import_chalk224=__toESM(require_source(),1);function formatDynamicExamples(integrationSlug,products,commandName="integration add"){let lines=[];if(lines.push(""),lines.push(` ${import_chalk224.default.dim("Examples:")}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install ${integrationSlug}`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}`)}`),products.length>1){let firstProduct=products[0];lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install a specific product`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/${firstProduct.slug}`)}`)}lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a custom resource name`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --name my-resource`)}`);let metadataExample=buildMetadataExample(integrationSlug,products,commandName);return metadataExample&&(lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with metadata`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${metadataExample}`)}`)),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a specific billing plan`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --plan pro`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install and connect to specific environments only`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} -e production -e preview`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install without connecting to the current project`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-connect`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install without pulling environment variables`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-env-pull`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install with a prefix for environment variable names`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --prefix NEON2_`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Output as JSON`),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --json`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Install using a specific installation`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --installation-id <id>`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Claim a sandbox resource immediately after provisioning`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --claim`)}`),lines.push(""),lines.push(` ${import_chalk224.default.dim("-")} Skip the offer to claim a sandbox resource`),lines.push(""),lines.push(` ${import_chalk224.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-claim`)}`),lines.push(""),lines.join(`
954
956
  `)}function buildMetadataExample(integrationSlug,products,commandName){for(let product of products){let schema=product.metadataSchema;if(!schema)continue;let flags=[];for(let[key,prop]of Object.entries(schema.properties))if(!isHiddenOnCreate(prop)){if(prop.type==="boolean")flags.push(`-m ${key}=true`);else if(prop.type==="array"){let visible=getVisibleOptions(prop);visible&&visible.length>0&&flags.push(`-m "${key}=${visible.slice(0,2).join(",")}"`)}else{let visible=getVisibleOptions(prop);visible&&visible.length>0&&flags.push(`-m ${key}=${visible[0]}`)}if(flags.length>=2)break}if(flags.length>0){let slug=products.length>1?`${integrationSlug}/${product.slug}`:integrationSlug;return`${packageName} ${commandName} ${slug} ${flags.join(" ")}`}}}async function fetchBillingPlans(client,integration,product,metadata){let searchParams=new URLSearchParams;return searchParams.set("metadata",JSON.stringify(metadata)),client.fetch(`/v1/integrations/integration/${integration.id}/products/${product.id}/plans?${searchParams}`,{json:!0})}async function printAddDynamicHelp(client,rawArg,baseCommand,printHelp,commandName){if(!rawArg)return!1;let integrationSlug=rawArg.split("/")[0],productSlug=rawArg.includes("/")?rawArg.split("/")[1]:void 0;try{let integration=await fetchIntegration(client,integrationSlug),products=integration.products??[];printHelp({...baseCommand,examples:[]}),client.stdout.write(formatDynamicExamples(integrationSlug,products,commandName)),products.length>1&&client.stdout.write(formatProductHelp(integrationSlug,products,commandName));for(let product of products){let mergedSchema=mergeMetadataSchemas(product.metadataSchema,integration.metadataSchema);if(mergedSchema){let metadataProductSlug=products.length>1?product.slug:void 0;client.stdout.write(formatMetadataSchemaHelp(mergedSchema,integrationSlug,metadataProductSlug))}}let productsToShow=productSlug?products.filter(p=>p.slug===productSlug):products;for(let product of productsToShow)try{let{plans}=await fetchBillingPlans(client,integration,product,{});client.stdout.write(formatBillingPlansHelp(product.name,plans))}catch(err){output_manager_default.debug(`Failed to fetch billing plans for ${product.slug}: ${err}`)}return!0}catch(err){return output_manager_default.debug(`Failed to fetch integration for dynamic help: ${err}`),!1}}var InstallTelemetryClient=class extends TelemetryClient{};async function install(client){let flagsSpecification=getFlagsSpecification(addSubcommand6.options),parsed;try{parsed=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsed,telemetry2=new InstallTelemetryClient({opts:{store:client.telemetryEventStore}});return flags["--help"]?(telemetry2.trackCliFlagHelp("install"),await printAddDynamicHelp(client,args[1],installCommand,c=>client.stdout.write(help(c,{columns:client.stderr.columns})),"install")||client.stdout.write(help(installCommand,{columns:client.stderr.columns})),0):add9(client,args.slice(1),flags,"install")}var IntegrationTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandAcceptTerms(actual){this.trackCliSubcommand({subcommand:"accept-terms",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInstallations(actual){this.trackCliSubcommand({subcommand:"installations",value:actual})}trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandBalance(actual){this.trackCliSubcommand({subcommand:"balance",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandGuide(actual){this.trackCliSubcommand({subcommand:"guide",value:actual})}trackCliSubcommandResource(actual){this.trackCliSubcommand({subcommand:"resource",value:actual})}};var import_chalk225=__toESM(require_source(),1);async function fetchInstallationPrepaymentInfo(client,installationId){return await client.fetch(`/v1/integrations/installations/${installationId}/billing/balance`,{json:!0})}async function getBalanceInformation(client,installationId){output_manager_default.spinner("Retrieving balance info\u2026",500);try{let prepaymentInfo=await fetchInstallationPrepaymentInfo(client,installationId);if(output_manager_default.stopSpinner(),!prepaymentInfo){output_manager_default.error("No balance information found for this integration");return}return prepaymentInfo}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch balance info: ${error.message}`);return}}async function fetchMarketplaceIntegrations(client,slug){let searchParams=new URLSearchParams;return searchParams.set("view","account"),searchParams.set("installationType","marketplace"),searchParams.set("integrationIdOrSlug",slug),await client.fetch(`/v2/integrations/configurations?${searchParams}`,{json:!0})}async function getFirstConfiguration(client,integrationSlug){let configurations=await fetchMarketplaceIntegrations(client,integrationSlug);return configurations.length>0?configurations[0]:void 0}var IntegrationBalanceTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"name",value:known?v:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function balance(client){let telemetry2=new IntegrationBalanceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(balanceSubcommand.options);try{parsedArguments=parseArguments(client.argv.slice(3),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),parsedArguments.args.length>2)return output_manager_default.error("Cannot specify more than one integration at a time"),2;let integrationSlug=parsedArguments.args[1];if(!integrationSlug)return output_manager_default.error("You must pass an integration slug"),2;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id;let installation=await getBalanceInstallationId(client,integrationSlug,telemetry2);if(installation===void 0)return 1;let installationId=installation.id,resources=await getResourcesForInstallation(client,installationId);if(resources===void 0)return 1;let prepaymentInfo=await getBalanceInformation(client,installationId);if(prepaymentInfo===void 0)return 1;if(asJson){output_manager_default.stopSpinner();let jsonData=buildJsonOutput(prepaymentInfo,resources,integrationSlug);return client.stdout.write(`${JSON.stringify(jsonData,null,2)}
955
957
  `),0}return outputBalanceInformation(prepaymentInfo,resources,integrationSlug),0}async function getBalanceInstallationId(client,integrationSlug,telemetry2){let knownIntegrationSlug=!1;output_manager_default.spinner("Retrieving installation\u2026",500);try{let installation=await getFirstConfiguration(client,integrationSlug);if(!installation){output_manager_default.stopSpinner(),output_manager_default.error("No installations found for this integration");return}return knownIntegrationSlug=!0,installation}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch installations: ${error.message}`);return}finally{telemetry2.trackCliArgumentIntegration(integrationSlug,knownIntegrationSlug)}}async function getResourcesForInstallation(client,installationId){output_manager_default.spinner("Retrieving resources\u2026",500);try{let resources=(await getResources(client)).filter(resource=>resource.product?.integrationConfigurationId===installationId);return output_manager_default.stopSpinner(),resources}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch resources: ${error.message}`);return}}function buildJsonOutput(prepaymentInfo,resources,integrationSlug){let balances=prepaymentInfo.balances.map(balance2=>({resourceName:balance2.resourceId?resources.find(r=>r.externalResourceId===balance2.resourceId)?.name??balance2.resourceId:"installation",resourceId:balance2.resourceId??null,amountInCents:balance2.currencyValueInCents,amount:formattedCurrency(balance2.currencyValueInCents)})),thresholds=prepaymentInfo.thresholds.map(threshold=>({resourceName:threshold.resourceId?resources.find(r=>r.externalResourceId===threshold.resourceId)?.name??threshold.resourceId:"installation",resourceId:threshold.resourceId??null,minimumAmountInCents:threshold.minimumAmountInCents,minimumAmount:formattedCurrency(threshold.minimumAmountInCents),purchaseAmountInCents:threshold.purchaseAmountInCents,purchaseAmount:formattedCurrency(threshold.purchaseAmountInCents)}));return{integration:integrationSlug,balances,thresholds}}function outputBalanceInformation(prepaymentInfo,resources,integrationSlug){let hasBalances=prepaymentInfo.balances.length>0,hasThresholds=prepaymentInfo.thresholds.length>0;if(hasBalances||output_manager_default.log("No balances found for this integration"),hasThresholds||output_manager_default.log("No thresholds found for this integration"),!hasBalances&&!hasThresholds)return 0;let mappings={};for(let balance2 of prepaymentInfo.balances){let resourceName=balance2.resourceId?resources.find(r=>r.externalResourceId===balance2.resourceId)?.name??balance2.resourceId:"installation";mappings[balance2.resourceId??"installation"]={balance:balance2,resourceName}}for(let threshold of prepaymentInfo.thresholds){let mapping=mappings[threshold.resourceId??"installation"];if(mapping)mapping.threshold=threshold;else{let resourceName=threshold.resourceId?resources.find(r=>r.externalResourceId===threshold.resourceId)?.name??threshold.resourceId:"installation";mappings[threshold.resourceId??"installation"]={threshold,resourceName}}}output_manager_default.log(`${import_chalk225.default.bold(`Balances and thresholds for ${integrationSlug}`)}:`);for(let key in mappings){let mapping=mappings[key],name=mapping.resourceName,balance2=mapping.balance,threshold=mapping.threshold;output_manager_default.log(`\u25CF ${name}`),balance2&&output_manager_default.log(` Balance: ${formattedCurrency(balance2.currencyValueInCents)}`),threshold&&output_manager_default.log(` Threshold: Spend ${formattedCurrency(threshold.purchaseAmountInCents)} if balance goes below ${formattedCurrency(threshold.minimumAmountInCents)}`)}}function formattedCurrency(amountInCents){return Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(amountInCents/100)}var IntegrationResourceTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreateThreshold(actual){this.trackCliSubcommand({subcommand:"create-threshold",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}trackCliSubcommandClaim(actual){this.trackCliSubcommand({subcommand:"claim",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}};var import_chalk226=__toESM(require_source(),1);var IntegrationResourceConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentProject(v){v&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function connect2(client,argv){let telemetry2=new IntegrationResourceConnectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(connectSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"],prefix=parsedArguments.flags["--prefix"],environmentsFlag=parsedArguments.flags["--environment"];if(telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliOptionPrefix(prefix),telemetry2.trackCliOptionEnvironment(environmentsFlag),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;if(parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),2;if(parsedArguments.args.length>2)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource connect <resource> [project]`."),2;if(prefix!==void 0&&!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(prefix))return output_manager_default.error("Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."),2;if(!skipConfirmation&&(client.nonInteractive||!client.stdin.isTTY)){let retryCommand=buildCommandWithYes(client.argv);return outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Connecting a resource requires confirmation. Re-run with --yes.",next:[{command:retryCommand}]},1),output_manager_default.error(`Connecting a resource without a terminal requires --yes. Re-run: ${retryCommand}`),2}let environments=environmentsFlag?.length?environmentsFlag:[...VALID_ENVIRONMENTS],resourceReference=parsedArguments.args[0],specifiedProject=parsedArguments.args[1];telemetry2.trackCliArgumentResource(resourceReference),telemetry2.trackCliArgumentProject(specifiedProject);let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving resource\u2026",500);let resources=await getResources(client),targetedResource=resources.find(resource=>resource.name===resourceReference)??resources.find(resource=>resource.id===resourceReference);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`No resource ${import_chalk226.default.bold(resourceReference)} found.`),1;let projectName=specifiedProject;if(!projectName&&(projectName=await getLinkedProject(client).then(result=>{if(result.status==="linked")return result.project.name}),!projectName))return output_manager_default.error("No project linked. Either use `vc link` to link a project, or specify the project name."),1;if(targetedResource.projectsMetadata?.find(p=>p.name===projectName))return output_manager_default.error(`Project ${import_chalk226.default.bold(projectName)} is already connected to resource ${import_chalk226.default.bold(targetedResource.name)}.`),output_manager_default.log(`To change environments or env var prefix, disconnect first: \`vercel integration resource disconnect ${targetedResource.name} ${projectName}\``),1;output_manager_default.spinner("Resolving project\u2026",500);let project=await getProjectByNameOrId(client,projectName);if(output_manager_default.stopSpinner(),project instanceof ProjectNotFound)return output_manager_default.error(`No project ${import_chalk226.default.bold(projectName)} found.`),1;let environmentResult=await resolveProjectEnvironments(client,project,environments);if(!environmentResult.valid)return output_manager_default.fatal(environmentResult.error),1;let connectionEnvironments=environmentResult.environments;if(!skipConfirmation&&(output_manager_default.log(`The resource ${import_chalk226.default.bold(targetedResource.name)} will be connected to project ${import_chalk226.default.bold(projectName)} (environments: ${environments.join(", ")}).`),!await client.input.confirm(`${import_chalk226.default.cyan("Connect?")}`,!0)))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Connecting resource\u2026",500),await connectResourceToProject(client,project.id,targetedResource.id,connectionEnvironments,prefix!==void 0?{envVarPrefix:prefix}:void 0)}catch(error){if(output_manager_default.stopSpinner(),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=environments.length===1?`vercel env rm ${varName} ${environments[0]}`:`vercel env rm ${varName}`;return output_manager_default.error(`Cannot connect: env var ${import_chalk226.default.bold(varName)} already exists on project ${import_chalk226.default.bold(projectName)} in one of the target environments (${environments.join(", ")}).`),prefix===void 0?output_manager_default.log(`Re-run with \`--prefix <PREFIX>_\` to namespace the new variables, or remove the existing one with \`${envRmCmd}\`.`):output_manager_default.log(`Prefix \`${prefix}\` did not avoid the collision. Try a different prefix or run \`${envRmCmd}\`.`),1}}return output_manager_default.error(`A problem occurred while connecting: ${error.message}`),1}return asJson?(output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({resource:targetedResource.name,connected:!0,project:projectName,environments},null,2)}
956
958
  `),0):(output_manager_default.success(`Connected ${import_chalk226.default.bold(targetedResource.name)} to ${import_chalk226.default.bold(projectName)} (${environments.join(", ")})`),0)}var import_chalk227=__toESM(require_source(),1);var IntegrationResourceCreateThresholdTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentMinimum(v){v&&this.trackCliArgument({arg:"minimum",value:this.redactedValue})}trackCliArgumentSpend(v){v&&this.trackCliArgument({arg:"spend",value:this.redactedValue})}trackCliArgumentLimit(v){v&&this.trackCliArgument({arg:"limit",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};async function updateThreshold(client,installationId,resourceId,billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata){return await client.fetch(`/v1/integrations/installations/${installationId}/resources/${resourceId}/billing/threshold`,{method:"POST",json:!0,body:{billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata:JSON.stringify(metadata)}})}async function updateInstallationThreshold(client,installationId,billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata){await client.fetch(`/v1/integrations/installations/${installationId}/billing/threshold/batch`,{method:"POST",json:!1,headers:{"content-type":"application/json; charset=utf-8"},body:JSON.stringify([{billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata:JSON.stringify(metadata)}])})}async function createThreshold(client,argv){let telemetry2=new IntegrationResourceCreateThresholdTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(createThresholdSubcommand.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let args;try{args=parseCreateThresholdArguments(parsedArguments.args,telemetry2)}catch(error){return output_manager_default.error(error.message),2}let skipConfirmWithYes=parsedArguments.flags["--yes"];telemetry2.trackCliFlagYes(skipConfirmWithYes);let{resourceName,minimum,spend,limit}=args,{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving resource\u2026",500);let targetedResource=(await getResources(client)).find(resource=>resource.name===resourceName);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`The resource ${import_chalk227.default.bold(resourceName)} was not found.`),1;if(!targetedResource.product?.integrationConfigurationId)return output_manager_default.error(`The resource ${import_chalk227.default.bold(resourceName)} does not have an integration configuration.`),1;if(targetedResource.billingPlan?.type!=="prepayment")return output_manager_default.error(`The resource ${import_chalk227.default.bold(resourceName)} is not a prepayment-based resource.`),1;let minimumSpend=parseFloat(targetedResource.billingPlan.minimumAmount??"0.50")*100;if(minimumSpend>spend)return output_manager_default.error(`The spend amount $${spend/100} is below your billing plan's minimum amount of $${minimumSpend/100}.`),1;let maximumSpend=parseFloat(targetedResource.billingPlan.maximumAmount??"1000000")*100;if(targetedResource.billingPlan.maximumAmount!==void 0&&maximumSpend<spend)return output_manager_default.error(`The spend amount $${spend/100} is above your billing plan's maximum amount of $${maximumSpend/100}.`),1;let prepaymentInfo=await getBalanceInformation(client,targetedResource.product.integrationConfigurationId);return prepaymentInfo===void 0?1:targetedResource.billingPlan.scope!=="resource"?(output_manager_default.log(`The resource ${import_chalk227.default.bold(resourceName)} uses an installation-level balance.`),await updateThresholdForInstallation({client,resource:targetedResource,prepaymentInfo,minimum,spend,limit,skipConfirmWithYes:!!skipConfirmWithYes})):await updateThresholdForResource({client,resource:targetedResource,prepaymentInfo,minimum,spend,limit,skipConfirmWithYes:!!skipConfirmWithYes})}function parseCreateThresholdArguments(passedArgs,telemetry2){if(passedArgs.length<4)throw new Error("Missing arguments. See `--help` for details.");if(passedArgs.length>4)throw new Error("Too many arguments. See `--help` for details.");let args=passedArgs.slice(0,4);telemetry2.trackCliArgumentResource(args[0]),telemetry2.trackCliArgumentMinimum(args[1]),telemetry2.trackCliArgumentSpend(args[2]),telemetry2.trackCliArgumentLimit(args[3]);let resourceName=args[0],minimum=Math.round(Number.parseFloat(args[1])*100),spend=Math.round(Number.parseFloat(args[2])*100),limit=Math.round(Number.parseFloat(args[3])*100);if(isNaN(minimum))throw new Error('Minimum is an invalid number format. Minimum must be a positive number (ex. "5.75")');if(isNaN(spend))throw new Error('Spend is an invalid number format. Spend must be a positive number (ex. "10.99").');if(isNaN(limit))throw new Error('Limit is an invalid number format. Limit must be a positive number (ex. "1000").');if(minimum<0)throw new Error("Minimum cannot be negative.");if(spend<0)throw new Error("Spend cannot be negative.");if(limit<0)throw new Error("Limit cannot be negative.");if(minimum>spend)throw new Error("Minimum cannot be greater than spend.");if(minimum>limit)throw new Error("Minimum cannot be greater than limit.");if(limit<spend)throw new Error("Limit cannot be less than spend.");return{resourceName,minimum,spend,limit}}async function updateThresholdForResource(props){let existingThreshold=props.prepaymentInfo.thresholds.find(threshold=>threshold.resourceId===props.resource.externalResourceId),existingBalance=props.prepaymentInfo.balances.find(balance2=>balance2.resourceId===props.resource.externalResourceId);return handleUpdateThreshold({client:props.client,resource:props.resource,minimum:props.minimum,spend:props.spend,limit:props.limit,existingThreshold,existingBalance,skipConfirmWithYes:props.skipConfirmWithYes,isInstallationLevel:!1})}async function updateThresholdForInstallation(props){let existingThreshold=props.prepaymentInfo.thresholds.find(threshold=>threshold.resourceId===void 0),existingBalance=props.prepaymentInfo.balances.find(balance2=>balance2.resourceId===void 0);return handleUpdateThreshold({client:props.client,resource:props.resource,minimum:props.minimum,spend:props.spend,limit:props.limit,existingThreshold,existingBalance,skipConfirmWithYes:props.skipConfirmWithYes,isInstallationLevel:!0})}async function handleUpdateThreshold(props){if(props.resource.billingPlan?.type!=="prepayment")return output_manager_default.log(`The resource ${import_chalk227.default.bold(props.resource.name)} is not a prepayment-based resource.`),0;if(!props.resource.product?.integrationConfigurationId)return output_manager_default.log(`The resource ${import_chalk227.default.bold(props.resource.name)} does not have an integration configuration.`),0;if(!props.skipConfirmWithYes&&!props.client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;let entityTextReference=props.isInstallationLevel?`installation ${import_chalk227.default.bold(props.resource.product?.name)}`:`resource ${import_chalk227.default.bold(props.resource.name)}`;if(props.existingThreshold&&!(props.skipConfirmWithYes||await props.client.input.confirm(`The ${entityTextReference} already has a threshold. (minimum: $${props.existingThreshold.minimumAmountInCents/100}, spend: $${props.existingThreshold.purchaseAmountInCents/100}, limit: ${props.existingThreshold.maximumAmountPerPeriodInCents?`$${props.existingThreshold.maximumAmountPerPeriodInCents/100}`:"none set"}). Do you want to overwrite it?`,!0)))return output_manager_default.log("Aborting\u2026"),0;if(props.existingBalance&&props.existingBalance.currencyValueInCents<props.minimum&&!(props.skipConfirmWithYes||await props.client.input.confirm(`The minimum threshold is higher than the current balance of $${props.existingBalance.currencyValueInCents/100}. Are you sure?`,!0)))return output_manager_default.log("Aborting\u2026"),0;if(!(props.skipConfirmWithYes||await props.client.input.confirm(`Are you sure you want to create a threshold for the ${entityTextReference} with minimum $${props.minimum/100}, spend $${props.spend/100}, and limit $${props.limit/100}?`,!0)))return output_manager_default.log("Aborting\u2026"),0;let metadata=JSON.parse(props.existingThreshold?.metadata??"{}");return output_manager_default.spinner("Creating threshold\u2026",500),props.isInstallationLevel?await updateInstallationThreshold(props.client,props.resource.product.integrationConfigurationId,props.resource.billingPlan.id,props.minimum,props.spend,props.limit,metadata):await updateThreshold(props.client,props.resource.product.integrationConfigurationId,props.resource.id,props.resource.billingPlan.id,props.minimum,props.spend,props.limit,metadata),output_manager_default.stopSpinner(),output_manager_default.success(`Threshold for ${entityTextReference} created successfully.`),0}var import_chalk228=__toESM(require_source(),1);async function disconnectResourceFromProject(client,resource,connection){return client.fetch(`/v1/storage/stores/${resource.id}/connections/${connection.id}`,{json:!0,method:"DELETE"})}async function disconnectResourceFromAllProjects(client,resource){return client.fetch(`/v1/storage/stores/${resource.id}/connections`,{json:!0,method:"DELETE"})}var IntegrationResourceDisconnectTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentProject(v){v&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var CancelledError=class extends Error{},FailedError=class extends Error{};async function disconnect2(client,argv){let telemetry2=new IntegrationResourceDisconnectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(disconnectSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"];if(telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;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)return output_manager_default.error("You must specify a resource. See `--help` for details."),2;if(parsedArguments.args.length>2)return output_manager_default.error("Cannot specify more than one project at a time. Use `--all` to disconnect the specified resource from all projects."),1;let shouldDisconnectAll=parsedArguments.flags["--all"],isProjectSpecified=parsedArguments.args.length===2;if(isProjectSpecified&&shouldDisconnectAll)return output_manager_default.error("Cannot specify a project while using the `--all` flag."),2;let resourceReference=parsedArguments.args[0],specifiedProject;isProjectSpecified&&(specifiedProject=parsedArguments.args[1]),telemetry2.trackCliArgumentResource(resourceReference),telemetry2.trackCliArgumentProject(specifiedProject),telemetry2.trackCliFlagYes(skipConfirmation),telemetry2.trackCliFlagAll(shouldDisconnectAll),output_manager_default.spinner("Retrieving resource\u2026",500);let resources=await getResources(client),targetedResource=resources.find(resource=>resource.name===resourceReference)??resources.find(resource=>resource.id===resourceReference);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`No resource ${import_chalk228.default.bold(resourceReference)} found.`),1;if(parsedArguments.flags["--all"]){try{await handleDisconnectAllProjects(client,targetedResource,!!parsedArguments.flags["--yes"],asJson)}catch(error){if(error instanceof CancelledError)return output_manager_default.log(error.message),0;if(error instanceof FailedError)return output_manager_default.error(error.message),1;throw error}if(asJson){let projects2=targetedResource.projectsMetadata?.map(project=>project.name)??[];client.stdout.write(`${JSON.stringify({resource:targetedResource.name,disconnected:!0,projects:projects2},null,2)}
@@ -1037,11 +1039,11 @@ ${hint}`,json:{...base,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The reques
1037
1039
  See ${getCommandName("logs runtime --help")} for filter fields and examples.`}function usedLegacyOptions(flags){return legacyLogsOptions.map(option=>option.name).filter(name=>flags[`--${name}`]!==void 0)}function getLegacyOptionError(flags){if(flags["--search"]!==void 0)return`--search was replaced by --query, which uses a new KQL-inspired syntax.
1038
1040
  See ${getCommandName("logs runtime --help")} or ${getCommandName("logs requests --help")} for filter fields and examples.`;if(flags["--branch"]!==void 0)return"--branch is no longer supported. Remove it from the command.";let requestId=flags["--request-id"];if(requestId!==void 0){let value=SIMPLE_VALUE.test(requestId)?requestId:"<request-id>";return`--request-id was removed. Use ${filterCommand(`requestId:"${value}"`)}.`}let levels=flags["--level"];if(levels!==void 0){let values=levels.every(level=>SIMPLE_VALUE.test(level))?levels:["error"];return`--level was removed. Use ${filterCommand(alternatives("level",values))}.`}let sources=flags["--source"];if(sources!==void 0)return sourceReplacement(sources);let statusCode=flags["--status-code"];if(statusCode!==void 0)return`--status-code was removed. Use ${filterCommand(statusFilter(statusCode.trim()),"requests")}.`;if(flags["--expand"]!==void 0)return"--expand was removed. Full runtime messages are shown by default; remove the option.";for(let flag of["--no-branch","--no-follow"])if(flags[flag]!==void 0)return`${flag} was removed and has no effect. Remove it from the command.`}function quoteFilterValue2(value){return JSON.stringify(value)}function composeFilter({source,deploymentId,environment,filter}){let clauses=[];if(deploymentId&&clauses.push(`deploymentId:${quoteFilterValue2(deploymentId)}`),environment&&clauses.push(`environment:${quoteFilterValue2(environment)}`),clauses.push(...source.fixedFilters),filter&&clauses.push(filter),clauses.length!==0)return clauses.map(clause=>`(${clause})`).join(" AND ")}function fetchEventPages2(client,query,limit,startCursor){return fetchEventPages(client,{event:query.source.event,ownerId:query.teamId,projectIds:[query.projectId],timeRange:{start:query.timeRange.start.toISOString(),end:query.timeRange.end.toISOString()},filter:query.filter,select:query.source.select,queryReason:query.source.queryReason},limit,startCursor)}var import_build_utils2=__toESM(require_build_utils(),1);var NOT_LINKED_MESSAGE=`Your codebase isn't linked to a project on Vercel. Run ${getCommandName("link")}, or select a team and project with --scope <team> --project <name>.`;function fail(reason,error,exitCode2=1){return{error,exitCode:exitCode2,reason}}async function readLink(client,project){let orgId=(0,import_build_utils2.getPlatformEnv)("ORG_ID"),projectId=(0,import_build_utils2.getPlatformEnv)("PROJECT_ID");if(orgId&&projectId)return{link:{orgId,projectId}};if(orgId||projectId){let present=orgId?"`VERCEL_ORG_ID`":"`VERCEL_PROJECT_ID`",missing=orgId?"`VERCEL_PROJECT_ID`":"`VERCEL_ORG_ID`";return fail(AGENT_REASON.INVALID_CONFIGURATION,`You specified ${present} but you forgot to specify ${missing}. You need to specify both to select a custom project.`)}let path3=await resolveProjectCwd(client.cwd);if(project){let selected=await getProjectLink(client,path3,project,!0);if(selected)return{link:{orgId:selected.orgId,projectId:selected.projectId}}}let link=await getProjectLink(client,path3);return{link:link?{orgId:link.orgId,projectId:link.projectId}:null}}async function teamLabel2(client,teamId){try{return(await getTeamByIdOrSlug(client,teamId,{useCurrentTeam:!1})).slug||teamId}catch(err){return output_manager_default.debug(`Could not fetch team ${teamId}: ${err}`),teamId}}function isTeamId(ownerId){return ownerId.startsWith("team_")}var PERSONAL_ACCOUNT_MESSAGE="Logs are available for team-owned projects only. Select a team with --scope <team>.";async function resolveLogsTarget(client,{project:projectOption,deployment:deploymentOption,quiet=!1}){let spinner=message=>{quiet||output_manager_default.spinner(message,1e3)},explicitScope=detectExplicitScope(client),explicitTeamId=explicitScope?client.config.currentTeam:void 0;if(explicitScope&&!explicitTeamId)return fail(AGENT_REASON.MISSING_SCOPE,PERSONAL_ACCOUNT_MESSAGE);let replacesLinkedProject=!!(projectOption||deploymentOption),link=null;if(!(explicitTeamId&&replacesLinkedProject)){let linkResult=await readLink(client,projectOption);if("error"in linkResult)return linkResult;link=linkResult.link}let teamId=explicitTeamId??link?.orgId;if(!teamId)return fail(AGENT_REASON.NOT_LINKED,NOT_LINKED_MESSAGE);if(!isTeamId(teamId))return fail(AGENT_REASON.MISSING_SCOPE,PERSONAL_ACCOUNT_MESSAGE);if(!replacesLinkedProject){if(!link)return fail(AGENT_REASON.NOT_LINKED,NOT_LINKED_MESSAGE);if(link.orgId!==teamId){let[requested,linked]=await Promise.all([teamLabel2(client,teamId),teamLabel2(client,link.orgId)]);return fail(AGENT_REASON.TARGET_CONFLICT,`This directory is linked to a project in team ${linked}, but ${requested} was selected.
1039
1041
  Select a project in ${requested} with --project <name>, select the linked team with --scope ${linked}, or run ${getCommandName("link")} to relink.`)}}client.config.currentTeam=teamId;let labelPromise=teamLabel2(client,teamId),deploymentId,deploymentProjectId;if(deploymentOption){let label2=await labelPromise;spinner(`Resolving deployment "${deploymentOption}"`);try{let deployment=await getDeployment(client,label2,deploymentOption);deploymentId=deployment.id,deploymentProjectId=deployment.projectId}catch(err){if(err instanceof DeploymentNotFound||err instanceof DeploymentPermissionDenied)return fail(AGENT_REASON.NOT_FOUND,`Deployment not found: ${deploymentOption} under ${label2}`);if(err instanceof InvalidDeploymentId)return fail(AGENT_REASON.NOT_FOUND,`Invalid deployment ID or URL: ${deploymentOption}`);throw err}finally{output_manager_default.stopSpinner()}if(!deploymentProjectId)return fail(AGENT_REASON.NOT_FOUND,`Deployment ${deploymentOption} is not associated with a project.`)}let projectIdOrName=projectOption??deploymentProjectId??link?.projectId;if(!projectIdOrName)return fail(AGENT_REASON.NOT_LINKED,NOT_LINKED_MESSAGE);spinner("Retrieving project\u2026");let project;try{project=await getProjectByNameOrId(client,projectIdOrName,teamId)}finally{output_manager_default.stopSpinner()}let label=await labelPromise;return project instanceof ProjectNotFound?!projectOption&&!deploymentProjectId?fail(AGENT_REASON.PROJECT_NOT_FOUND,`The linked project ${projectIdOrName} was not found under ${label}. Run ${getCommandName("link")} to relink, or select a project with --project <name>.`):fail(AGENT_REASON.PROJECT_NOT_FOUND,`Project not found: ${projectIdOrName} under ${label}`):deploymentProjectId&&project.id!==deploymentProjectId?fail(AGENT_REASON.TARGET_CONFLICT,`Deployment ${deploymentOption} does not belong to project ${project.name}. Remove --deployment or --project.`):{target:{teamId,teamLabel:label,projectId:project.id,projectName:project.name,deploymentId}}}var import_ms26=__toESM(require_ms(),1);function parseBound(flag,value,now){try{return parseTimeFlag(value,now)}catch{return`Invalid time format "${value}" for ${flag}. Use a relative duration (1h, 30m, 2d), an ISO 8601 datetime, or now.`}}function resolveLogsTimeRange({since,until,now,wholeSeconds}){let end=until!==void 0?parseBound("--until",until,now):new Date(now);if(typeof end=="string")return{error:end};let start=since!==void 0?parseBound("--since",since,now):new Date(end.getTime()-(0,import_ms26.default)(DEFAULT_WINDOW));if(typeof start=="string")return{error:start};let range=wholeSeconds?{start:floorToSecond(start),end:floorToSecond(end)}:{start,end};return range.start.getTime()>=range.end.getTime()?{error:[`The time range is empty: the start (${range.start.toISOString()}) must be before the end (${range.end.toISOString()}).`,"Use --since to set an earlier start."].join(`
1040
- `)}:{range}}function floorToSecond(date){return new Date(Math.floor(date.getTime()/1e3)*1e3)}var COMMAND_CONFIG53={runtime:getCommandAliases(runtimeSubcommand),requests:getCommandAliases(requestsSubcommand)},SUBCOMMAND_METADATA={runtime:runtimeSubcommand,requests:requestsSubcommand},SOURCE_TITLES={runtime:"Runtime logs",requests:"CDN requests"},CONTINUATION_CONFLICTS=["--project","--deployment","--environment","--query","--since","--until"];function looksLikeDeployment(value){return value.startsWith("dpl_")||value.includes(".")||/^https?:\/\//i.test(value)}function deploymentHost(value){try{return new URL(value).hostname}catch{return value}}function argvRequestsJson(argv){let args=argv.slice(2);for(let[index,arg2]of args.entries()){if(arg2==="--")break;if(arg2==="--json")return!0;if(arg2.startsWith("--json=")){if(arg2.slice(7).toLowerCase()!=="false")return!0;continue}if(arg2.toLowerCase()==="--format=json"||arg2.startsWith("-F=")&&arg2.slice(3).toLowerCase()==="json"||(arg2==="--format"||arg2==="-F")&&args[index+1]?.toLowerCase()==="json")return!0}return!1}function isRemovedJsonShorthandError(err){return isArgumentError(err)&&err.invalidOption==="-j"}function argvHasScopeFlag(argv){for(let arg2 of argv.slice(2)){if(arg2==="--")break;if(arg2==="--scope"||arg2==="--team"||arg2==="-S"||arg2==="-T"||arg2.startsWith("--scope=")||arg2.startsWith("--team="))return!0}return!1}function positionalError(value,explicitSource){let sourcePart=explicitSource?` ${explicitSource}`:"";return looksLikeDeployment(value)?`Select a deployment with --deployment: ${getCommandName(`logs${sourcePart} --deployment ${quoteArg(deploymentHost(value))}`)}`:explicitSource?`Unexpected argument "${value}". ${getCommandName(`logs ${explicitSource}`)} takes no arguments.`:`Unknown data source "${value}". Use runtime or requests. See ${getCommandName("logs --help")}.`}function isClosedOutputError(err){return err instanceof Error&&(err.code==="EPIPE"||err.message==="Output stream closed.")}function streamGapMessage(interval){return`Results omit ${sanitize(interval.start)} to ${sanitize(interval.end)}: data for this period is unavailable to this query.`}async function logs2(client){let commandStart=Date.now(),telemetry2=new LogsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification([...logsCommand.options,...legacyLogsOptions]))}catch(err){let removedShorthand=isRemovedJsonShorthandError(err);removedShorthand&&telemetry2.trackCliLegacyOption("j");let message=removedShorthand?"-j was removed. Use --json or --format json.":err instanceof Error?err.message:String(err);return client.nonInteractive||argvRequestsJson(client.argv)?writeJsonError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:"vercel logs --help"}]}):removedShorthand?(output_manager_default.error(message),2):(printError(err),output_manager_default.print(`Run ${getCommandName("logs --help")} for usage.
1041
- `),2)}let{flags}=parsedArguments,formatResult=validateJsonOutput(flags),json=!!flags["--json"]||formatResult.valid&&formatResult.jsonOutput||argvRequestsJson(client.argv)||client.nonInteractive,{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG53),explicitSource=subcommand==="runtime"||subcommand==="requests"?subcommand:void 0;if(flags["--help"])return telemetry2.trackCliFlagHelp("logs",explicitSource&&subcommandOriginal),output_manager_default.print(help(explicitSource?SUBCOMMAND_METADATA[explicitSource]:logsCommand,{parent:explicitSource?logsCommand:void 0,columns:client.stderr.columns})),0;let nextOption=flags["--next"],trimmedNext=nextOption?.trim(),continuation=trimmedNext?decodeContinuation(trimmedNext):void 0,continuationSource=continuation?sourceForEvent(continuation.event):void 0,sourceName=explicitSource??continuationSource?.name??"runtime";sourceName==="requests"?telemetry2.trackCliSubcommandRequests(subcommandOriginal):telemetry2.trackCliSubcommandRuntime(subcommandOriginal);let projectOption=flags["--project"],deploymentOption=flags["--deployment"],environmentOption=flags["--environment"],queryOption=flags["--query"],sinceOption=flags["--since"],untilOption=flags["--until"],limitOption=flags["--limit"];telemetry2.trackCliOptionProject(projectOption),telemetry2.trackCliOptionDeployment(deploymentOption),telemetry2.trackCliOptionEnvironment(environmentOption),telemetry2.trackCliOptionQuery(queryOption),telemetry2.trackCliOptionSince(sinceOption),telemetry2.trackCliOptionUntil(untilOption),telemetry2.trackCliOptionLimit(limitOption),telemetry2.trackCliOptionNext(nextOption),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagFollow(flags["--follow"]);let fail3=(reason,message,exitCode2,extra={})=>(output_manager_default.stopSpinner(),json?writeJsonError(client,{status:"error",reason,message,...extra},exitCode2):(output_manager_default.error(message),exitCode2??(reason===AGENT_REASON.INVALID_ARGUMENTS?2:1))),usageError2=message=>fail3(AGENT_REASON.INVALID_ARGUMENTS,message,2),failUnexpected=err=>{if(output_manager_default.stopSpinner(),!json)return printError(err),1;let failure=describeLogsApiError(client,err,sourceName);return failure?writeJsonError(client,failure.json,failure.exitCode):writeJsonError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:(0,import_error_utils19.errorToString)(err)})};if(!formatResult.valid)return usageError2(formatResult.error);let legacyOptions=usedLegacyOptions(flags);for(let name of legacyOptions)telemetry2.trackCliLegacyOption(name);let legacyError=getLegacyOptionError(flags);if(legacyError)return usageError2(legacyError);if(args.length>0)return telemetry2.trackCliArgumentPositional(looksLikeDeployment(args[0])?"deployment":"unknown"),usageError2(positionalError(args[0],explicitSource));let upfrontWarnings=[],warn=(reason,message,data)=>{json?upfrontWarnings.push(warningLine({reason,message,data})):output_manager_default.warning(message)};flags["--follow"]&&warn("deprecated","--follow is deprecated and no longer streams logs. Showing a bounded result; remove --follow.");let limit;if(typeof limitOption=="number"&&Number.isInteger(limitOption)&&limitOption>MAX_LIMIT)limit=MAX_LIMIT,warn("limit_clamped",`--limit ${limitOption} is above the maximum of ${MAX_LIMIT}. Using ${MAX_LIMIT}.`,{requested:limitOption,limit:MAX_LIMIT});else{let limitResult=validateIntegerRangeWithDefault(limitOption,{flag:"--limit",min:1,max:MAX_LIMIT,defaultValue:DEFAULT_LIMIT});if(!limitResult.valid)return usageError2(limitResult.message);limit=limitResult.value}let plan;if(nextOption!==void 0){let planResult=await planContinuation();if(typeof planResult=="number")return planResult;plan=planResult}else{let planResult=await planQuery();if(typeof planResult=="number")return planResult;plan=planResult}async function planContinuation(){if(!trimmedNext)return usageError2("--next must not be empty.");let invalidCursor=`--next is not a valid cursor. Use the pagination.next value from the summary of a previous ${getCommandName("logs --json")} run.`;if(!continuation||!continuationSource)return usageError2(invalidCursor);let parsed=parseContinuation(continuation);if(!parsed)return usageError2(invalidCursor);if(explicitSource&&explicitSource!==continuationSource.name)return usageError2(`The --next cursor continues a ${continuationSource.name} query. Use ${getCommandName("logs --next <cursor>")} without "${explicitSource}".`);for(let flag of CONTINUATION_CONFLICTS)if(flags[flag]!==void 0)return usageError2(`${flag} can't be combined with --next. The cursor keeps the original target, filter, and time window.`);if(argvHasScopeFlag(client.argv)&&client.config.currentTeam!==continuation.ownerId)return usageError2("The --next cursor belongs to a different team than --scope. Remove --scope to use the team in the cursor.");let{teamId,projectId,timeRange:timeRange2}=parsed;return{source:continuationSource,teamId,projectId,timeRange:timeRange2,filter:continuation.filter,startCursor:continuation.cursor,context:async()=>{let[label,project]=await Promise.all([teamLabel2(client,teamId),getProjectByNameOrId(client,projectId,teamId).catch(()=>null)]),projectName=project&&!(project instanceof ProjectNotFound)?project.name:projectId;return`${SOURCE_TITLES[continuationSource.name]} for ${label}/${projectName} (continued), ${formatWindow(timeRange2)}`}}}async function planQuery(){let source2=logsSources[sourceName],filter=queryOption?.trim();if(queryOption!==void 0&&!filter)return usageError2("--query must not be empty.");let environment=environmentOption?.trim();if(environmentOption!==void 0&&!environment)return usageError2("--environment must not be empty.");let deployment=deploymentOption?.trim();if(deploymentOption!==void 0&&!deployment)return usageError2("--deployment must not be empty.");let project=projectOption?.trim();if(projectOption!==void 0&&!project)return usageError2("--project must not be empty.");let timeRangeResult=resolveLogsTimeRange({since:sinceOption,until:untilOption,now:commandStart,wholeSeconds:source2.wholeSecondBounds});if("error"in timeRangeResult)return usageError2(timeRangeResult.error);let timeRange2=timeRangeResult.range,targetResult;try{targetResult=await resolveLogsTarget(client,{project,deployment:deployment&&deploymentHost(deployment),quiet:json})}catch(err){return failUnexpected(err)}if("error"in targetResult)return fail3(targetResult.reason,targetResult.error,targetResult.exitCode);let{target}=targetResult;return{source:source2,teamId:target.teamId,projectId:target.projectId,timeRange:timeRange2,filter:composeFilter({source:source2,deploymentId:target.deploymentId,environment,filter}),context:async()=>{let details=[target.deploymentId?`deployment ${target.deploymentId}`:void 0,environment?`environment ${environment}`:void 0].filter(Boolean);return`${SOURCE_TITLES[source2.name]} for ${target.teamLabel}/${target.projectName}`+(details.length>0?` (${details.join(", ")})`:"")+`, ${formatWindow(timeRange2)}`}}}let{source,timeRange}=plan,serializedTimeRange=serializeTimeRange(timeRange),tokenFor=cursor2=>encodeContinuation({event:source.event,ownerId:plan.teamId,projectIds:[plan.projectId],timeRange:serializedTimeRange,...plan.filter!==void 0?{filter:plan.filter}:{},order:"desc",cursor:cursor2}),write=async text4=>{try{return await writeWithBackpressure(client.stdout,text4),!0}catch(err){if(isClosedOutputError(err))return!1;throw err}};json||output_manager_default.print(import_chalk252.default.dim(`${await plan.context()}
1042
- `));let pages=fetchEventPages2(client,{source,teamId:plan.teamId,projectId:plan.projectId,timeRange,filter:plan.filter},limit,plan.startCursor),renderer=json?void 0:createRenderer(source.name,timeRange),excludedIntervals=new Map,written=0,pagesFetched=0,resumeCursor=plan.startCursor,result;try{if(upfrontWarnings.length>0&&!await write(upfrontWarnings.join("")))return 0;for(;;){!json&&pagesFetched===0&&output_manager_default.spinner(`Fetching ${source.recordsLabel}\u2026`,1e3);let next;try{next=await pages.next()}catch(err){return reportFetchFailure(err)}if(output_manager_default.stopSpinner(),pagesFetched+=1,next.done){result=next.value;break}for(let interval of next.value.excludedIntervals)excludedIntervals.set(`${interval.start}/${interval.end}`,interval);let{events}=next.value,chunk="";if(renderer){written===0&&events.length>0&&(chunk+=`${renderer.header()}
1043
- `);for(let event of events)chunk+=`${renderer.row(event)}
1044
- `}else for(let event of events)chunk+=recordLine2(source.recordType,event);if(chunk&&!await write(chunk))return 0;written+=events.length,resumeCursor=next.value.nextCursor??void 0}let intervals=sortIntervals(excludedIntervals.values()),nextToken=result.nextCursor?tokenFor(result.nextCursor):null;if(json){let tail=intervals.map(interval=>warningLine({reason:"stream_gap",message:streamGapMessage(interval),data:{start:interval.start,end:interval.end}})).join("")+summaryLine({recordsReturned:written,timeRange:serializedTimeRange,pagination:{hasMore:result.hasMore,next:nextToken},excludedIntervals:intervals});return await write(tail),0}for(let interval of intervals)output_manager_default.warning(streamGapMessage(interval));if(written===0){let notes=[`No ${source.recordsLabel} found in this window. Use an earlier --since to search further back.`];source.fixedFilters.includes(BACKGROUND_FUNCTION_EXCLUSION)&&notes.push("Background function executions are always excluded."),output_manager_default.print(import_chalk252.default.dim(`${notes.join(`
1042
+ `)}:{range}}function floorToSecond(date){return new Date(Math.floor(date.getTime()/1e3)*1e3)}var COMMAND_CONFIG53={runtime:getCommandAliases(runtimeSubcommand),requests:getCommandAliases(requestsSubcommand)},SUBCOMMAND_METADATA={runtime:runtimeSubcommand,requests:requestsSubcommand},SOURCE_TITLES={runtime:"Runtime logs",requests:"CDN requests"},CONTINUATION_CONFLICTS=["--project","--deployment","--environment","--query","--since","--until"];function looksLikeDeployment(value){return value.startsWith("dpl_")||value.includes(".")||/^https?:\/\//i.test(value)}function deploymentHost(value){try{return new URL(value).hostname}catch{return value}}function argvRequestsJson(argv){let args=argv.slice(2);for(let[index,arg2]of args.entries()){if(arg2==="--")break;if(arg2==="--json")return!0;if(arg2.startsWith("--json=")){if(arg2.slice(7).toLowerCase()!=="false")return!0;continue}if(arg2.toLowerCase()==="--format=json"||arg2.startsWith("-F=")&&arg2.slice(3).toLowerCase()==="json"||(arg2==="--format"||arg2==="-F")&&args[index+1]?.toLowerCase()==="json")return!0}return!1}function isRemovedJsonShorthandError(err){return isArgumentError(err)&&err.invalidOption==="-j"}function argvHasScopeFlag(argv){for(let arg2 of argv.slice(2)){if(arg2==="--")break;if(arg2==="--scope"||arg2==="--team"||arg2==="-S"||arg2==="-T"||arg2.startsWith("--scope=")||arg2.startsWith("--team="))return!0}return!1}function positionalError(value,explicitSource){let sourcePart=explicitSource?` ${explicitSource}`:"";return looksLikeDeployment(value)?`Select a deployment with --deployment: ${getCommandName(`logs${sourcePart} --deployment ${quoteArg(deploymentHost(value))}`)}`:explicitSource?`Unexpected argument "${value}". ${getCommandName(`logs ${explicitSource}`)} takes no arguments.`:`Unknown data source "${value}". Use runtime or requests. See ${getCommandName("logs --help")}.`}function isClosedOutputError(err){return err instanceof Error&&(err.code==="EPIPE"||err.message==="Output stream closed.")}function streamGapMessage(interval){return`Results omit ${sanitize(interval.start)} to ${sanitize(interval.end)}: data for this period is unavailable to this query.`}async function logs2(client){let commandStart=Date.now(),telemetry2=new LogsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification([...logsCommand.options,...legacyLogsOptions]))}catch(err){let removedShorthand=isRemovedJsonShorthandError(err);removedShorthand&&telemetry2.trackCliLegacyOption("j");let message=removedShorthand?"-j was removed. Use --json.":err instanceof Error?err.message:String(err);return client.nonInteractive||argvRequestsJson(client.argv)?writeJsonError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:"vercel logs --help"}]}):removedShorthand?(output_manager_default.error(message),2):(printError(err),output_manager_default.print(`Run ${getCommandName("logs --help")} for usage.
1043
+ `),2)}let{flags}=parsedArguments,formatResult=validateJsonOutput(flags),json=!!flags["--json"]||formatResult.valid&&formatResult.jsonOutput||argvRequestsJson(client.argv)||client.nonInteractive,{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG53),explicitSource=subcommand==="runtime"||subcommand==="requests"?subcommand:void 0;if(flags["--help"])return telemetry2.trackCliFlagHelp("logs",explicitSource&&subcommandOriginal),output_manager_default.print(help(explicitSource?SUBCOMMAND_METADATA[explicitSource]:logsCommand,{parent:explicitSource?logsCommand:void 0,columns:client.stderr.columns})),0;let nextOption=flags["--next"],trimmedNext=nextOption?.trim(),continuation=trimmedNext?decodeContinuation(trimmedNext):void 0,continuationSource=continuation?sourceForEvent(continuation.event):void 0,sourceName=explicitSource??continuationSource?.name??"runtime";sourceName==="requests"?telemetry2.trackCliSubcommandRequests(subcommandOriginal):telemetry2.trackCliSubcommandRuntime(subcommandOriginal);let projectOption=flags["--project"],deploymentOption=flags["--deployment"],environmentOption=flags["--environment"],queryOption=flags["--query"],sinceOption=flags["--since"],untilOption=flags["--until"],limitOption=flags["--limit"];telemetry2.trackCliOptionProject(projectOption),telemetry2.trackCliOptionDeployment(deploymentOption),telemetry2.trackCliOptionEnvironment(environmentOption),telemetry2.trackCliOptionQuery(queryOption),telemetry2.trackCliOptionSince(sinceOption),telemetry2.trackCliOptionUntil(untilOption),telemetry2.trackCliOptionLimit(limitOption),telemetry2.trackCliOptionNext(nextOption),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagFollow(flags["--follow"]);let fail3=(reason,message,exitCode2,extra={})=>(output_manager_default.stopSpinner(),json?writeJsonError(client,{status:"error",reason,message,...extra},exitCode2):(output_manager_default.error(message),exitCode2??(reason===AGENT_REASON.INVALID_ARGUMENTS?2:1))),usageError3=message=>fail3(AGENT_REASON.INVALID_ARGUMENTS,message,2),failUnexpected=err=>{if(output_manager_default.stopSpinner(),!json)return printError(err),1;let failure=describeLogsApiError(client,err,sourceName);return failure?writeJsonError(client,failure.json,failure.exitCode):writeJsonError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:(0,import_error_utils19.errorToString)(err)})};if(!formatResult.valid)return usageError3(formatResult.error);let legacyOptions=usedLegacyOptions(flags);for(let name of legacyOptions)telemetry2.trackCliLegacyOption(name);let legacyError=getLegacyOptionError(flags);if(legacyError)return usageError3(legacyError);if(args.length>0)return telemetry2.trackCliArgumentPositional(looksLikeDeployment(args[0])?"deployment":"unknown"),usageError3(positionalError(args[0],explicitSource));let upfrontWarnings=[],warn=(reason,message,data)=>{json?upfrontWarnings.push(warningLine({reason,message,data})):output_manager_default.warning(message)};flags["--follow"]&&warn("deprecated","--follow is deprecated and no longer streams logs. Showing a bounded result; remove --follow.");let limit;if(typeof limitOption=="number"&&Number.isInteger(limitOption)&&limitOption>MAX_LIMIT)limit=MAX_LIMIT,warn("limit_clamped",`--limit ${limitOption} is above the maximum of ${MAX_LIMIT}. Using ${MAX_LIMIT}.`,{requested:limitOption,limit:MAX_LIMIT});else{let limitResult=validateIntegerRangeWithDefault(limitOption,{flag:"--limit",min:1,max:MAX_LIMIT,defaultValue:DEFAULT_LIMIT});if(!limitResult.valid)return usageError3(limitResult.message);limit=limitResult.value}let plan;if(nextOption!==void 0){let planResult=await planContinuation();if(typeof planResult=="number")return planResult;plan=planResult}else{let planResult=await planQuery();if(typeof planResult=="number")return planResult;plan=planResult}async function planContinuation(){if(!trimmedNext)return usageError3("--next must not be empty.");let invalidCursor=`--next is not a valid cursor. Use the pagination.next value from the summary of a previous ${getCommandName("logs --json")} run.`;if(!continuation||!continuationSource)return usageError3(invalidCursor);let parsed=parseContinuation(continuation);if(!parsed)return usageError3(invalidCursor);if(explicitSource&&explicitSource!==continuationSource.name)return usageError3(`The --next cursor continues a ${continuationSource.name} query. Use ${getCommandName("logs --next <cursor>")} without "${explicitSource}".`);for(let flag of CONTINUATION_CONFLICTS)if(flags[flag]!==void 0)return usageError3(`${flag} can't be combined with --next. The cursor keeps the original target, filter, and time window.`);if(argvHasScopeFlag(client.argv)&&client.config.currentTeam!==continuation.ownerId)return usageError3("The --next cursor belongs to a different team than --scope. Remove --scope to use the team in the cursor.");let{teamId,projectId,timeRange:timeRange2}=parsed;return{source:continuationSource,teamId,projectId,timeRange:timeRange2,filter:continuation.filter,startCursor:continuation.cursor,context:async()=>{let[label,project]=await Promise.all([teamLabel2(client,teamId),getProjectByNameOrId(client,projectId,teamId).catch(()=>null)]),projectName=project&&!(project instanceof ProjectNotFound)?project.name:projectId;return`${SOURCE_TITLES[continuationSource.name]} for ${label}/${projectName} (continued), ${formatWindow(timeRange2)}`}}}async function planQuery(){let source2=logsSources[sourceName],filter=queryOption?.trim();if(queryOption!==void 0&&!filter)return usageError3("--query must not be empty.");let environment=environmentOption?.trim();if(environmentOption!==void 0&&!environment)return usageError3("--environment must not be empty.");let deployment=deploymentOption?.trim();if(deploymentOption!==void 0&&!deployment)return usageError3("--deployment must not be empty.");let project=projectOption?.trim();if(projectOption!==void 0&&!project)return usageError3("--project must not be empty.");let timeRangeResult=resolveLogsTimeRange({since:sinceOption,until:untilOption,now:commandStart,wholeSeconds:source2.wholeSecondBounds});if("error"in timeRangeResult)return usageError3(timeRangeResult.error);let timeRange2=timeRangeResult.range,targetResult;try{targetResult=await resolveLogsTarget(client,{project,deployment:deployment&&deploymentHost(deployment),quiet:json})}catch(err){return failUnexpected(err)}if("error"in targetResult)return fail3(targetResult.reason,targetResult.error,targetResult.exitCode);let{target}=targetResult;return{source:source2,teamId:target.teamId,projectId:target.projectId,timeRange:timeRange2,filter:composeFilter({source:source2,deploymentId:target.deploymentId,environment,filter}),context:async()=>{let details=[target.deploymentId?`deployment ${target.deploymentId}`:void 0,environment?`environment ${environment}`:void 0].filter(Boolean);return`${SOURCE_TITLES[source2.name]} for ${target.teamLabel}/${target.projectName}`+(details.length>0?` (${details.join(", ")})`:"")+`, ${formatWindow(timeRange2)}`}}}let{source,timeRange}=plan,serializedTimeRange=serializeTimeRange(timeRange),tokenFor=cursor2=>encodeContinuation({event:source.event,ownerId:plan.teamId,projectIds:[plan.projectId],timeRange:serializedTimeRange,...plan.filter!==void 0?{filter:plan.filter}:{},order:"desc",cursor:cursor2}),write=async text4=>{try{return await writeWithBackpressure(client.stdout,text4),!0}catch(err){if(isClosedOutputError(err))return!1;throw err}};json||output_manager_default.print(import_chalk252.default.dim(`${await plan.context()}
1044
+ `));let pages=fetchEventPages2(client,{source,teamId:plan.teamId,projectId:plan.projectId,timeRange,filter:plan.filter},limit,plan.startCursor),renderer=json?void 0:createRenderer(source.name,timeRange),excludedIntervals=new Map,written=0,pagesFetched=0,resumeCursor=plan.startCursor,result;try{if(upfrontWarnings.length>0&&!await write(upfrontWarnings.join("")))return 0;for(;;){!json&&pagesFetched===0&&output_manager_default.spinner(`Fetching ${source.recordsLabel}\u2026`,1e3);let next;try{next=await pages.next()}catch(err){return reportFetchFailure(err)}if(output_manager_default.stopSpinner(),pagesFetched+=1,next.done){result=next.value;break}for(let interval of next.value.excludedIntervals)excludedIntervals.set(`${interval.start}/${interval.end}`,interval);let{events}=next.value,chunk2="";if(renderer){written===0&&events.length>0&&(chunk2+=`${renderer.header()}
1045
+ `);for(let event of events)chunk2+=`${renderer.row(event)}
1046
+ `}else for(let event of events)chunk2+=recordLine2(source.recordType,event);if(chunk2&&!await write(chunk2))return 0;written+=events.length,resumeCursor=next.value.nextCursor??void 0}let intervals=sortIntervals(excludedIntervals.values()),nextToken=result.nextCursor?tokenFor(result.nextCursor):null;if(json){let tail=intervals.map(interval=>warningLine({reason:"stream_gap",message:streamGapMessage(interval),data:{start:interval.start,end:interval.end}})).join("")+summaryLine({recordsReturned:written,timeRange:serializedTimeRange,pagination:{hasMore:result.hasMore,next:nextToken},excludedIntervals:intervals});return await write(tail),0}for(let interval of intervals)output_manager_default.warning(streamGapMessage(interval));if(written===0){let notes=[`No ${source.recordsLabel} found in this window. Use an earlier --since to search further back.`];source.fixedFilters.includes(BACKGROUND_FUNCTION_EXCLUSION)&&notes.push("Background function executions are always excluded."),output_manager_default.print(import_chalk252.default.dim(`${notes.join(`
1045
1047
  `)}
1046
1048
  `))}return result.hasMore&&(output_manager_default.log(`More ${source.recordsLabel} matched.`),nextToken&&output_manager_default.print(`Next page:
1047
1049
  ${getCommandName(`logs --next ${nextToken}`)}
@@ -1127,7 +1129,7 @@ Starting setup...
1127
1129
  `),output_manager_default.print("\u2500".repeat(50)+`
1128
1130
  `),summary.forEach(line2=>output_manager_default.print(`${line2}
1129
1131
  `)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
1130
- `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG54={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG54),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-PQZAACV2.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-DI4FF2ZM.js")).default;return queryFn(client,telemetry2)}}}var import_chalk253=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk253.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_chalk253.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk253.default.gray(microfrontendsStamp())}`,emoji("success"))}
1132
+ `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG54={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG54),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-ZJASGDRI.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-MYKQOBG3.js")).default;return queryFn(client,telemetry2)}}}var import_chalk253=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk253.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_chalk253.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk253.default.gray(microfrontendsStamp())}`,emoji("success"))}
1131
1133
  `),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk254=__toESM(require_source(),1);import{writeFile as writeFile6}from"fs/promises";import{existsSync as existsSync3}from"fs";import{join as join36}from"path";async function ensureMicrofrontendsContext(client,options){let link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm:options?.autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link;if(org.type!=="team")return output_manager_default.error("Microfrontends are only available for teams."),1;client.config.currentTeam=org.id;let{team}=await getScope(client);return team?{project,org,team,repoRoot}:(output_manager_default.error("Microfrontends are only available for teams."),1)}async function fetchMicrofrontendsGroups(client,teamId){output_manager_default.spinner("Fetching microfrontends groups\u2026");let response=await client.fetch(`/v1/microfrontends/groups?teamId=${teamId}`,{method:"GET"});return output_manager_default.stopSpinner(),response}function validateDefaultRoute(path3){if(!path3||!path3.startsWith("/"))return"Route must start with /";if(/\s/.test(path3))return"Route must not contain spaces";if(path3.includes("?")||path3.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path3,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path3){return!path3||!path3.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path3)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk254.default.bold(teamSlug)}.`),output_manager_default.log("");let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsGroupsPerTeam,maxMicrofrontendsPerGroup}=groupsResponse,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(groups.length>=maxMicrofrontendsGroupsPerTeam){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends group limit for ${planName}. Upgrade to Pro to create more groups.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Maximum number of microfrontends groups (${maxMicrofrontendsGroupsPerTeam}) reached.`),1}let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),2;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),2;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),2}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),2;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route;if(routeFromFlag)route=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),2;route=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk254.default.bold("Billing")),output_manager_default.log(` ${import_chalk254.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk254.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk254.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk254.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk254.default.green(`${freeRemaining} free`)+", "+import_chalk254.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk254.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk254.default.bold("Request fee:")} ${import_chalk254.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_chalk254.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_chalk254.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_chalk254.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_chalk254.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_chalk254.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+`
1132
1134
  `,"utf-8"),output_manager_default.success(`Created ${import_chalk254.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_chalk254.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_chalk255=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2,totalAfter=existingMfeProjectCount+1,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(isLimitedPlan&&totalAfter>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}output_manager_default.log(`Adding project ${import_chalk255.default.bold(project.name)} to a microfrontends group on ${import_chalk255.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_chalk255.default.bold("Billing")),output_manager_default.log(` ${import_chalk255.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk255.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk255.default.yellow("$250.00/month"):projectFee=import_chalk255.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk255.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk255.default.bold("Request fee:")} ${import_chalk255.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_chalk255.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk255.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_chalk255.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_chalk256=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk256.default.bold(project.name)} from microfrontends group ${import_chalk256.default.bold(projectGroup.group.name)} on ${import_chalk256.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_chalk256.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk257=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk257.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_chalk257.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_chalk257.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_chalk257.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_chalk257.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk258=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),2;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},2),2;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects2=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects2.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),2;let configFile=resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects2.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects:projects2};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
1133
1135
  `),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_chalk258.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_CONFIG55={"create-group":getCommandAliases(createGroupSubcommand),"add-to-group":getCommandAliases(addToGroupSubcommand),"remove-from-group":getCommandAliases(removeFromGroupSubcommand),"delete-group":getCommandAliases(deleteGroupSubcommand),"inspect-group":getCommandAliases(inspectGroupSubcommand),pull:getCommandAliases(pullSubcommand)};async function main28(client){let telemetry2=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry2.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry2.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry2.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry2.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry2.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry2.trackCliSubcommandPull(subcommandOriginal),pull2(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_open17=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
@@ -1138,7 +1140,7 @@ Starting setup...
1138
1140
  `;lines.push("Features are grouped by the lowest plan that includes them. Values are from the latest public pricing table."),lines.push("");for(let plan of PLANS){let features=result.features[plan];if(lines.push(formatPlanHeader(plan)),features.length===0){lines.push(""),lines.push(" None"),lines.push("");continue}let currentCategory="",headerShown=!1;for(let feature of features){let{standalone}=feature;feature.category!==currentCategory&&(currentCategory=feature.category,headerShown=!1,lines.push("")),!standalone&&!headerShown&&(lines.push(` ${import_chalk259.default.bold(currentCategory)}`),headerShown=!0);let marker=feature.availableOnCurrentPlan===!1?import_chalk259.default.dim(" [not on current plan]"):"",indent3=standalone?" ":" ";lines.push(`${indent3}${padName(feature.name)}${feature.values[plan]}${marker}`)}lines.push("")}return`${lines.join(`
1139
1141
  `)}
1140
1142
  `}function formatQueryMatches(result){let lines=[`Matching features (${result.summary.matched}):`,""],currentPlan=result.team?.normalizedPlan??null;for(let plan of PLANS)for(let feature of result.features[plan]){lines.push(import_chalk259.default.bold(feature.name)),lines.push(` Category: ${feature.section} / ${feature.category}`),feature.description&&lines.push(` Description: ${feature.description}`);for(let column of PLANS){let current=currentPlan===column?` ${import_chalk259.default.cyan("\u2190 current plan")}`:"",availability=feature.available[column]?feature.values[column]:"Not available";lines.push(` ${planSwatch()}${PLAN_LABEL[column]}: ${availability}${current}`)}feature.availableOnCurrentPlan===null?lines.push(" Available on current plan: unknown"):lines.push(` Available on ${formatPlanLabel(result.team?.plan??"")}: ${feature.availableOnCurrentPlan?"yes":"no"}`),lines.push("")}return lines}function formatCurrentPlan(plan){return PLAN_COLOR.bold(formatPlanLabel(plan))}function formatPlanHeader(plan){let title6=` ${PLAN_LABEL[plan].toUpperCase()} `,rule="\u2501".repeat(48);return[PLAN_COLOR.bold.inverse(title6),PLAN_COLOR(rule),import_chalk259.default.dim(PLAN_SCOPE[plan])].join(`
1141
- `)}function planSwatch(){return PLAN_COLOR.bold("\u2588 ")}function padName(name){return name.length>=42?`${name} `:name.padEnd(42)}var ALLOWED_PRICING_HOSTS=new Set(["vercel.com","www.vercel.com"]);function isAllowedPricingUrl(url){try{let parsed=new URL(url);return parsed.protocol==="https:"&&ALLOWED_PRICING_HOSTS.has(parsed.hostname)&&parsed.pathname==="/pricing.md"&&parsed.username===""&&parsed.password===""}catch{return!1}}var PricingResponseTooLargeError=class extends Error{constructor(){super("Pricing response exceeded the size limit"),this.name="PricingResponseTooLargeError"}};async function readBoundedText(response,maxBytes=524288){let contentLength=response.headers.get("content-length");if(contentLength){let bytes5=Number(contentLength);if(Number.isFinite(bytes5)&&bytes5>maxBytes)throw new PricingResponseTooLargeError}if(!response.body)throw new Error("Pricing response returned an empty body.");let reader=response.body.getReader(),chunks=[],totalBytes=0;for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),new PricingResponseTooLargeError;chunks.push(value)}}let buffer=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)buffer.set(chunk,offset),offset+=chunk.byteLength;return new TextDecoder().decode(buffer)}var PRICING_URL="https://vercel.com/pricing.md",FETCH_TIMEOUT_MS=1e4,MAX_REDIRECTS=3,UNEXPECTED_PRICING_RESPONSE="Failed to parse Vercel pricing. Unexpected response.";async function pricing(client){let telemetry2=new PricingTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(pricingCommand.options),jsonFromArgv=wantsMachineReadableOutput(pricingCommand.name,client.argv),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return jsonFromArgv||shouldEmitNonInteractiveCommandError(client)?fail2(client,!0,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:(0,import_error_utils20.errorToString)(error)}):(printError(error,client),1)}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("pricing"),output_manager_default.print(help(pricingCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return fail2(client,jsonFromArgv,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error});let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let queryParts=parsedArgs.args.slice(1);telemetry2.trackCliArgumentQuery(queryParts.length>0?queryParts:void 0);let query=queryParts.join(" ").trim()||null,teamInfo=await maybeResolveTeamPlan(client),machineOutput=asJson||shouldEmitNonInteractiveCommandError(client);machineOutput||output_manager_default.spinner("Fetching Vercel pricing\u2026");let fetched=await fetchPricingMarkdown(client,asJson);if(machineOutput||output_manager_default.stopSpinner(),!fetched)return 1;let currentPlan=teamInfo?.normalizedPlan??null,allFeatures=parsePricingMarkdown(fetched.markdown);if(!isValidPricingTable(allFeatures))return fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE}),1;let matched=query?allFeatures.filter(feature=>featureMatchesQuery(feature,query)):allFeatures,grouped=splitFeaturesByMinPlan(withCurrentPlanAvailability(matched,currentPlan)),result={plan:teamInfo?.plan??null,team:teamInfo,source:fetched.source,query,summary:{total:allFeatures.length,matched:matched.length,availableOnCurrentPlan:currentPlan?matched.filter(feature=>feature.available[currentPlan]).length:null,unavailableOnCurrentPlan:currentPlan?matched.filter(feature=>!feature.available[currentPlan]).length:null,hobby:grouped.hobby.length,pro:grouped.pro.length,enterprise:grouped.enterprise.length},features:grouped};return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
1143
+ `)}function planSwatch(){return PLAN_COLOR.bold("\u2588 ")}function padName(name){return name.length>=42?`${name} `:name.padEnd(42)}var ALLOWED_PRICING_HOSTS=new Set(["vercel.com","www.vercel.com"]);function isAllowedPricingUrl(url){try{let parsed=new URL(url);return parsed.protocol==="https:"&&ALLOWED_PRICING_HOSTS.has(parsed.hostname)&&parsed.pathname==="/pricing.md"&&parsed.username===""&&parsed.password===""}catch{return!1}}var PricingResponseTooLargeError=class extends Error{constructor(){super("Pricing response exceeded the size limit"),this.name="PricingResponseTooLargeError"}};async function readBoundedText(response,maxBytes=524288){let contentLength=response.headers.get("content-length");if(contentLength){let bytes5=Number(contentLength);if(Number.isFinite(bytes5)&&bytes5>maxBytes)throw new PricingResponseTooLargeError}if(!response.body)throw new Error("Pricing response returned an empty body.");let reader=response.body.getReader(),chunks=[],totalBytes=0;for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),new PricingResponseTooLargeError;chunks.push(value)}}let buffer=new Uint8Array(totalBytes),offset=0;for(let chunk2 of chunks)buffer.set(chunk2,offset),offset+=chunk2.byteLength;return new TextDecoder().decode(buffer)}var PRICING_URL="https://vercel.com/pricing.md",FETCH_TIMEOUT_MS=1e4,MAX_REDIRECTS=3,UNEXPECTED_PRICING_RESPONSE="Failed to parse Vercel pricing. Unexpected response.";async function pricing(client){let telemetry2=new PricingTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(pricingCommand.options),jsonFromArgv=wantsMachineReadableOutput(pricingCommand.name,client.argv),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return jsonFromArgv||shouldEmitNonInteractiveCommandError(client)?fail2(client,!0,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:(0,import_error_utils20.errorToString)(error)}):(printError(error,client),1)}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("pricing"),output_manager_default.print(help(pricingCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return fail2(client,jsonFromArgv,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error});let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let queryParts=parsedArgs.args.slice(1);telemetry2.trackCliArgumentQuery(queryParts.length>0?queryParts:void 0);let query=queryParts.join(" ").trim()||null,teamInfo=await maybeResolveTeamPlan(client),machineOutput=asJson||shouldEmitNonInteractiveCommandError(client);machineOutput||output_manager_default.spinner("Fetching Vercel pricing\u2026");let fetched=await fetchPricingMarkdown(client,asJson);if(machineOutput||output_manager_default.stopSpinner(),!fetched)return 1;let currentPlan=teamInfo?.normalizedPlan??null,allFeatures=parsePricingMarkdown(fetched.markdown);if(!isValidPricingTable(allFeatures))return fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE}),1;let matched=query?allFeatures.filter(feature=>featureMatchesQuery(feature,query)):allFeatures,grouped=splitFeaturesByMinPlan(withCurrentPlanAvailability(matched,currentPlan)),result={plan:teamInfo?.plan??null,team:teamInfo,source:fetched.source,query,summary:{total:allFeatures.length,matched:matched.length,availableOnCurrentPlan:currentPlan?matched.filter(feature=>feature.available[currentPlan]).length:null,unavailableOnCurrentPlan:currentPlan?matched.filter(feature=>!feature.available[currentPlan]).length:null,hobby:grouped.hobby.length,pro:grouped.pro.length,enterprise:grouped.enterprise.length},features:grouped};return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
1142
1144
  `),0):(output_manager_default.print(formatPricing(result)),0)}function resolveTeamPlan(team,user){let plan=team?.billing?.plan||user?.billing?.plan||"hobby";return team?{id:team.id,slug:team.slug,name:team.name,plan,normalizedPlan:normalizePlan(plan)}:{id:user?.id??null,slug:"Personal Account",name:user?.username||user?.email||"Personal Account",plan,normalizedPlan:normalizePlan(plan)}}async function maybeResolveTeamPlan(client){if(!client.authConfig.token)return null;try{let scope=await getScope(client,{resolveLocalScope:!0});return resolveTeamPlan(scope.team,scope.user)}catch(error){return output_manager_default.debug(`Unable to resolve current team plan: ${(0,import_error_utils20.errorToString)(error)}`),null}}async function fetchPricingMarkdown(client,asJson){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let url=PRICING_URL;for(let i=0;i<=MAX_REDIRECTS;i++){if(!isAllowedPricingUrl(url)){fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}let response=await fetch2(url,{redirect:"manual",headers:{accept:"text/markdown, text/plain;q=0.9, */*;q=0.8","user-agent":ua_default},signal:controller.signal});if(response.status>=300&&response.status<400){await response.body?.cancel().catch(()=>{});let location=response.headers.get("location");if(!location){fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}try{url=new URL(location,url).href}catch{fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}continue}if(!response.ok){await response.body?.cancel().catch(()=>{}),fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}let markdown=await readBoundedText(response);if(!markdown.includes("| Hobby |")||!markdown.includes("| Pro |")){fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}return{markdown,source:url}}fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}catch(error){fail2(client,asJson,{reason:AGENT_REASON.API_ERROR,message:error instanceof PricingResponseTooLargeError?UNEXPECTED_PRICING_RESPONSE:"Failed to fetch Vercel pricing. Check your connection and try again."});return}finally{clearTimeout(timeout)}}function fail2(client,asJson,payload){return asJson||shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:payload.reason,message:payload.message}):output_manager_default.error(payload.message),1}var import_chalk260=__toESM(require_source(),1),import_ms27=__toESM(require_ms(),1);var ProjectAddTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}};async function add11(client,argv){let telemetryClient=new ProjectAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand8.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args}=parsedArgs;if(args.length!==1){if(output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk260.default.cyan(`${getCommandName("project create <name>")}`)}`),args.length>1){let example=import_chalk260.default.cyan(`${getCommandName(`project create "${args.join(" ")}"`)}`);output_manager_default.log(`If your project name has spaces, make sure to wrap it in quotes. Example:
1143
1145
  ${example} `)}return 2}let start=Date.now(),[name]=args;telemetryClient.trackCliArgumentName(name);try{await createProject(client,{name})}catch(err){if(isAPIError(err)&&err.code==="too_many_projects")return output_manager_default.prettyError(err),1;if(!(isAPIError(err)&&err.status===409))throw err}let elapsed2=(0,import_ms27.default)(Date.now()-start),contextName=await getContextName(client);return output_manager_default.log(`${import_chalk260.default.cyan("Success!")} Project ${import_chalk260.default.bold(name.toLowerCase())} added (${import_chalk260.default.bold(contextName)}) ${import_chalk260.default.gray(`[${elapsed2}]`)}`),0}var import_chalk261=__toESM(require_source(),1);async function accessSummary(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(accessSummarySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}if(parsedArgs.args.length>1)return output_manager_default.error("Invalid number of arguments. Usage: `vercel project access-summary [name]`"),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,summary;try{let project=await getProjectByCwdOrLink({client,commandName:"project access-summary",projectNameOrId:parsedArgs.args[0],forReadOnlyCommand:!0});summary=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/members/summary`)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"access-summary"}),printError(err),1}if(asJson)return client.stdout.write(`${JSON.stringify(summary,null,2)}
1144
1146
  `),0;let entries=Object.entries(summary).sort(([a],[b])=>a.localeCompare(b));if(entries.length===0)return output_manager_default.log("No summary data returned."),0;let rows=[["Role","Count"].map(h=>(0,import_chalk261.gray)(h)),...entries.map(([role,count2])=>[role,String(count2)])];return client.stderr.write(`${table(rows,{hsep:3})}
@@ -1208,14 +1210,14 @@ ${err}`),1)}}var import_chalk274=__toESM(require_source(),1);async function setS
1208
1210
  `),0):(output_manager_default.log(`Speed Insights is ${result.value?"enabled":"disabled"} for ${project.name}.`),0)}async function speedInsights(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(speedInsightsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let firstArg=parsedArgs.args[0],hasActionWord=firstArg==="enable"||firstArg==="disable",action=firstArg==="disable"?"disable":"enable",projectNameOrId=hasActionWord?parsedArgs.args[1]:firstArg;if((hasActionWord?parsedArgs.args.slice(2):parsedArgs.args.slice(1)).length>0)return output_manager_default.error(`Invalid number of arguments. Usage: \`vercel project speed-insights ${hasActionWord?`${action} `:""}[name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project speed-insights ${action}${projectNameOrId?` ${projectNameOrId}`:""}${globalFlags.length?` ${globalFlags.join(" ")}`:""}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:action==="enable"?"Enabling Speed Insights adds a paid feature to this project and will incur charges on your account. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.":"Disabling Speed Insights stops performance data collection for this project. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.",userActionRequired:!0,hint:action==="enable"?"Surface this to the user; enabling a paid feature cannot be automated.":"Surface this to the user; disabling Speed Insights requires interactive confirmation.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error(action==="enable"?"This command must be run interactively because enabling Speed Insights incurs charges.":"This command must be run interactively to disable Speed Insights."),1}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project speed-insights",projectNameOrId,forReadOnlyCommand:!0})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"speed-insights"}),printError(err),1}if(action==="disable")return output_manager_default.print(prependEmoji(`Disabling Speed Insights for ${import_chalk274.default.bold(project.name)} will stop performance data collection for this project.
1209
1211
  `,emoji("warning"))),await client.input.confirm(`Disable Speed Insights for ${project.name}?`,!1)?setSpeedInsights(client,project,!1,asJson):(output_manager_default.log("Canceled"),0);let isHobby=!1;try{let{team,user}=await getScope(client);isHobby=(team?.billing?.plan??user?.billing?.plan)==="hobby"}catch{isHobby=!1}return output_manager_default.print(prependEmoji(isHobby?`On the Hobby plan, Speed Insights is only available for one project.
1210
1212
  `:`Enabling Speed Insights for ${import_chalk274.default.bold(project.name)} will incur charges on your account.
1211
- `,emoji("warning"))),await client.input.confirm(`Enable Speed Insights for ${project.name}?`,!1)?setSpeedInsights(client,project,!0,asJson):(output_manager_default.log("Canceled"),0)}var import_chalk275=__toESM(require_source(),1);var LIMITS_DOCS_URL="https://vercel.com/docs/analytics/limits-and-pricing";async function isHobbyPlan(client){try{let{team,user}=await getScope(client);return(team?.billing?.plan??user?.billing?.plan)==="hobby"}catch(err){return output_manager_default.debug(`Failed to resolve billing plan: ${err instanceof Error?err.message:String(err)}`),!1}}async function setWebAnalytics(client,project,enabled,asJson){let result;try{let query=new URLSearchParams({projectId:project.id});result=await client.fetch(`/web/insights/toggle?${query.toString()}`,{method:"POST",json:!0,body:{value:enabled}})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"web-analytics"}),printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled:result.value,projectId:project.id,projectName:project.name},null,2)}
1212
- `),0):(output_manager_default.log(result.value?`Web Analytics is enabled for ${project.name}.`:`Web Analytics is disabled for ${project.name}.`),0)}async function webAnalytics(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(webAnalyticsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let firstArg=parsedArgs.args[0],hasActionWord=firstArg==="enable"||firstArg==="disable",action=firstArg==="disable"?"disable":"enable",projectNameOrId=hasActionWord?parsedArgs.args[1]:firstArg;if((hasActionWord?parsedArgs.args.slice(2):parsedArgs.args.slice(1)).length>0)return output_manager_default.error(`Invalid number of arguments. Usage: \`vercel project web-analytics ${hasActionWord?`${action} `:""}[name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,isHobby=action==="enable"?await isHobbyPlan(client):!1;if(!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project web-analytics ${action}${projectNameOrId?` ${projectNameOrId}`:""}${globalFlags.length?` ${globalFlags.join(" ")}`:""}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:action==="disable"?"Disabling Web Analytics stops data collection for this project. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.":isHobby?`Web Analytics is free with limits documented on ${LIMITS_DOCS_URL}. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.`:"Enabling Web Analytics adds a paid feature to this project and will incur charges on your account. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.",userActionRequired:!0,hint:action==="disable"?"Surface this to the user; disabling Web Analytics requires interactive confirmation.":isHobby?"Surface this to the user; enabling Web Analytics requires interactive confirmation.":"Surface this to the user; enabling a paid feature cannot be automated.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error(action==="disable"?"This command must be run interactively to disable Web Analytics.":isHobby?"This command must be run interactively to enable Web Analytics.":"This command must be run interactively because enabling Web Analytics incurs charges."),1}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project web-analytics",projectNameOrId,forReadOnlyCommand:!0})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"web-analytics"}),printError(err),1}return action==="disable"?(output_manager_default.print(prependEmoji(`Disabling Web Analytics for ${import_chalk275.default.bold(project.name)} will stop data collection for this project.
1213
- `,emoji("warning"))),await client.input.confirm(`Disable Web Analytics for ${project.name}?`,!1)?setWebAnalytics(client,project,!1,asJson):(output_manager_default.log("Canceled"),0)):(isHobby?output_manager_default.print(`Web Analytics is free for ${import_chalk275.default.bold(project.name)} with limits documented on ${LIMITS_DOCS_URL}.
1214
- `):output_manager_default.print(prependEmoji(`Enabling Web Analytics for ${import_chalk275.default.bold(project.name)} will incur charges on your account.
1215
- `,emoji("warning"))),await client.input.confirm(`Enable Web Analytics for ${project.name}?`,!1)?setWebAnalytics(client,project,!0,asJson):(output_manager_default.log("Canceled"),0))}var import_chalk276=__toESM(require_source(),1);async function setObservability(client,project,enabled,asJson){try{await client.fetch(`/v1/observability/manage/configuration/projects/${encodeURIComponent(project.id)}`,{method:"PUT",json:!0,body:{disabled:!enabled}})}catch(err){if(isAPIError(err)){if(err.status===403)return output_manager_default.error(err.serverMessage||`You do not have permission to ${enabled?"enable":"disable"} Observability Plus for this project.`),1;if(err.status===404||err.status===402)return output_manager_default.error(err.serverMessage||`Observability Plus could not be ${enabled?"enabled":"disabled"} for ${project.name}. It may not be available on your current plan.`),err.link&&output_manager_default.log(`Learn more: ${err.link}`),1}return printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled,projectId:project.id,projectName:project.name},null,2)}
1216
- `),0):(output_manager_default.log(`Observability Plus is ${enabled?"enabled":"disabled"} for ${project.name}.`),0)}async function observability(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(observabilitySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let action=parsedArgs.args[0];if(action!=="enable"&&action!=="disable")return output_manager_default.error("Invalid arguments. Usage: `vercel project observability enable|disable [name]`"),2;if(parsedArgs.args.length>2)return output_manager_default.error(`Invalid number of arguments. Usage: \`vercel project observability ${action} [name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,nameArg=parsedArgs.args[1];if(!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project observability ${action}${nameArg?` ${nameArg}`:""}${globalFlags.length?` ${globalFlags.join(" ")}`:""}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:action==="enable"?"Enabling Observability Plus adds a paid feature to this project and will incur charges on your account. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.":"Disabling Observability Plus turns off enhanced observability for this project. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.",userActionRequired:!0,hint:action==="enable"?"Surface this to the user; enabling a paid feature cannot be automated.":"Surface this to the user; disabling Observability Plus requires interactive confirmation.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error(action==="enable"?"This command must be run interactively because enabling Observability Plus incurs charges.":"This command must be run interactively to disable Observability Plus."),1}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project observability",projectNameOrId:nameArg,forReadOnlyCommand:!0})}catch(error){return printError(error),1}if(action==="disable")return output_manager_default.print(prependEmoji(`Disabling Observability Plus for ${import_chalk276.default.bold(project.name)} will turn off enhanced observability for this project.
1217
- `,emoji("warning"))),await client.input.confirm(`Disable Observability Plus for ${project.name}?`,!1)?setObservability(client,project,!1,asJson):(output_manager_default.log("Canceled"),0);let{team}=await getScope(client);return team?team.billing?.plan==="hobby"?(output_manager_default.error("Observability Plus requires an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")}.`),1):(output_manager_default.print(prependEmoji(`Enabling Observability Plus for ${import_chalk276.default.bold(project.name)} will incur charges on your account.
1218
- `,emoji("warning"))),await client.input.confirm(`Enable Observability Plus for ${project.name}?`,!1)?setObservability(client,project,!0,asJson):(output_manager_default.log("Canceled"),0)):(output_manager_default.error("Observability Plus requires a team. Use --scope to specify one."),1)}var import_chalk277=__toESM(require_source(),1);var PRODUCT="Priority project";function teamLabel3(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function emitJsonError(client,asJson,payload,exitCode2){return asJson?(shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,exitCode2),writeAgentError(client,payload),!0):!1}function apiErrorReason(err){return err.code==="plan_not_supported"?AGENT_REASON.PLAN_UPGRADE_REQUIRED:err.status===403?"forbidden":err.status===402?"payment_required":err.status===401?"not_authorized":err.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR}function thrownErrorPayload(error){if(isAPIError(error))return{status:AGENT_STATUS.ERROR,reason:apiErrorReason(error),message:error.serverMessage||error.message};let message=error instanceof Error?error.message:String(error);return error instanceof ProjectNotFound?{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PROJECT_NOT_FOUND,message}:error instanceof LinkRequiredError?{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message}:{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message}}function failUsage(client,asJson,message){return emitJsonError(client,asJson,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2)||output_manager_default.error(message),2}async function setPriority(client,project,enabled,asJson){try{await client.fetch(`/v1/security/priority?projectId=${encodeURIComponent(project.id)}`,{method:"POST",body:{enabled},accountId:project.accountId})}catch(err){if(isAPIError(err)){let message=err.serverMessage||`${PRODUCT} could not be ${enabled?"enabled":"disabled"} for ${project.name}.`,upgradeHint=err.code==="plan_not_supported"&&enabled?`Upgrade with ${getCommandName(`${BUY_PRO_COMMAND} --scope ${quoteArg(project.accountId)}`)}.`:void 0;return emitJsonError(client,asJson,{status:AGENT_STATUS.ERROR,reason:apiErrorReason(err),message,...upgradeHint?{hint:upgradeHint}:{}},1)||(output_manager_default.error(message),upgradeHint&&output_manager_default.log(upgradeHint)),1}return emitJsonError(client,asJson,thrownErrorPayload(err),1)||printError(err,client),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled,projectId:project.id,projectName:project.name},null,2)}
1213
+ `,emoji("warning"))),await client.input.confirm(`Enable Speed Insights for ${project.name}?`,!1)?setSpeedInsights(client,project,!0,asJson):(output_manager_default.log("Canceled"),0)}var import_chalk275=__toESM(require_source(),1);var import_build_utils3=__toESM(require_build_utils(),1);var TEAM_SLUG_PATTERN=/^[a-z0-9][a-z0-9-]*$/;function projectTeamId(project){return project.accountId?.startsWith("team_")?project.accountId:void 0}async function isHobbyProject(client,project){try{let teamId=projectTeamId(project);return(teamId?(await getTeamByIdOrSlug(client,teamId,{useCurrentTeam:!1})).billing?.plan:(await getUser(client)).billing?.plan)==="hobby"}catch(err){return output_manager_default.debug(`Failed to resolve the project's billing plan: ${err instanceof Error?err.message:String(err)}`),!1}}function explicitAccountConflict(client,project){let orgId=(0,import_build_utils3.getPlatformEnv)("ORG_ID");return orgId&&orgId!==project.accountId?!0:scopeFlagPassed(client.argv)&&client.config.currentTeam!==projectTeamId(project)}function teamNamed(client,teamId){return scopeFlagPassed(client.argv)||(0,import_build_utils3.getPlatformEnv)("ORG_ID")===teamId}async function scopeValue(client,teamId){try{let team=await getTeamByIdOrSlug(client,teamId,{useCurrentTeam:!1});if(team.slug&&TEAM_SLUG_PATTERN.test(team.slug))return team.slug}catch(err){output_manager_default.debug(`Failed to resolve team ${teamId}: ${err instanceof Error?err.message:String(err)}`)}return teamId}async function projectLabel(client,project){let teamId=projectTeamId(project);return teamId?`${project.name} on team ${await scopeValue(client,teamId)}`:project.name}async function warnIfOutsideCurrentTeam(client,project){let currentTeam=client.config.currentTeam;if(!currentTeam||currentTeam===project.accountId)return;let teamId=projectTeamId(project),owner=teamId?`team ${await scopeValue(client,teamId)}`:"your personal account";output_manager_default.warn(`${project.name} belongs to ${owner}, not your current team. Using ${owner}.`)}async function refuseExplicitAccountConflict(client,opts){if(!explicitAccountConflict(client,opts.project))return;let teamId=projectTeamId(opts.project),ownerScope=teamId?await scopeValue(client,teamId):void 0,owner=ownerScope?`team ${ownerScope}`:"a personal account",message=`${opts.consequence} --scope or VERCEL_ORG_ID names a different account than the project's owner, ${owner}. Nothing was changed.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFLICT,message,userActionRequired:!0,hint:ownerScope?`Check that the project link is correct. To act on ${owner}, pass --scope ${ownerScope} or set VERCEL_ORG_ID to that team's ID, once the user approves.`:"Check that the project link is correct, then run the command without --scope or VERCEL_ORG_ID."},1),output_manager_default.error(message),{kind:"refused",exitCode:1}}async function resolveProjectFeatureConsent(client,opts){let teamId=projectTeamId(opts.project),conflict=await refuseExplicitAccountConflict(client,opts);if(conflict)return conflict;let needsTeam=opts.billable&&teamId!==void 0&&!teamNamed(client,teamId);if(opts.yes&&!needsTeam)return{kind:"granted"};if(canPrompt(client))return{kind:"prompt",team:teamId?await scopeValue(client,teamId):void 0};let scope=needsTeam&&teamId?await scopeValue(client,teamId):void 0,missing=[...opts.yes?[]:["--yes"],...scope?["--scope"]:[]],nextCommand=buildCommandWithGlobalFlags(client.argv,`${opts.command} ${opts.action}${opts.projectArg?` ${quoteArg(opts.projectArg)}`:""} --yes${scope?` --scope ${scope}`:""}`),confirmWith=missing.join(" and "),message=`${opts.consequence} Confirm with ${confirmWith} to continue. Nothing was changed.`,reason=opts.yes?AGENT_REASON.MISSING_SCOPE:AGENT_REASON.CONFIRMATION_REQUIRED;return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message,userActionRequired:!0,missing,hint:"Ask the user to approve this change before running the next command. Do not add --yes without their approval.",next:[{command:nextCommand,when:`Only after the user approves the change${scope?` to team ${scope}`:""}`}]},1),output_manager_default.error(`${message}
1214
+
1215
+ Once approved, run:
1216
+ ${nextCommand}`),{kind:"refused",exitCode:1}}async function setWebAnalytics(client,project,enabled,asJson){let result;try{let query=new URLSearchParams({projectId:project.id});result=await client.fetch(`/web/insights/toggle?${query.toString()}`,{method:"POST",json:!0,body:{value:enabled},accountId:project.accountId})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"web-analytics"}),printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled:result.value,projectId:project.id,projectName:project.name},null,2)}
1217
+ `),0):(output_manager_default.log(`Web Analytics is ${result.value?"enabled":"disabled"} for ${await projectLabel(client,project)}.`),0)}async function webAnalytics(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(webAnalyticsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let firstArg=parsedArgs.args[0],hasActionWord=firstArg==="enable"||firstArg==="disable",action=firstArg==="disable"?"disable":"enable",projectNameOrId=hasActionWord?parsedArgs.args[1]:firstArg;if((hasActionWord?parsedArgs.args.slice(2):parsedArgs.args.slice(1)).length>0)return output_manager_default.error(`Invalid number of arguments. Usage: \`vercel project web-analytics ${hasActionWord?`${action} `:""}[name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,project;try{project=await getProjectByCwdOrLink({client,commandName:"project web-analytics",projectNameOrId,forReadOnlyCommand:!0})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"web-analytics"}),printError(err),1}if(action==="enable"){let conflict=await refuseExplicitAccountConflict(client,{project,consequence:`Can't enable Web Analytics for ${project.name}.`});return conflict?conflict.exitCode:(asJson||await warnIfOutsideCurrentTeam(client,project),setWebAnalytics(client,project,!0,asJson))}let isHobby=await isHobbyProject(client,project),consequence=`Disabling Web Analytics for ${project.name} will stop data collection for this project.`,consent=await resolveProjectFeatureConsent(client,{command:"project web-analytics",action,projectArg:projectNameOrId,project,billable:!isHobby,yes:!!parsedArgs.flags["--yes"],consequence});if(consent.kind==="refused")return consent.exitCode;if((consent.kind==="prompt"||!asJson)&&output_manager_default.print(prependEmoji(`Disabling Web Analytics for ${import_chalk275.default.bold(project.name)} will stop data collection for this project.
1218
+ `,emoji("warning"))),consent.kind==="prompt"){let target=`${project.name}${consent.team?` on team ${consent.team}`:""}`;if(!await client.input.confirm(`Disable Web Analytics for ${target}?`,!1))return output_manager_default.log("Canceled"),0}return setWebAnalytics(client,project,!1,asJson)}var import_chalk276=__toESM(require_source(),1);async function setObservability(client,project,enabled,asJson){try{await client.fetch(`/v1/observability/manage/configuration/projects/${encodeURIComponent(project.id)}`,{method:"PUT",json:!0,body:{disabled:!enabled},accountId:project.accountId})}catch(err){if(isAPIError(err)){if(err.status===403)return output_manager_default.error(err.serverMessage||`You do not have permission to ${enabled?"enable":"disable"} Observability Plus for this project.`),1;if(err.status===404||err.status===402)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PLAN_LIMIT,message:`Couldn't ${enabled?"enable":"disable"} Observability Plus for ${await projectLabel(client,project)}. It may not be available on the current plan.`,userActionRequired:!0,hint:"Observability Plus needs a Pro or Enterprise team with the Observability Plus add-on. Ask a team owner to check the team's plan, then retry.",...err.serverMessage&&{data:{apiMessage:err.serverMessage}}},1),output_manager_default.error(err.serverMessage||`Observability Plus could not be ${enabled?"enabled":"disabled"} for ${project.name}. It may not be available on your current plan.`),err.link&&output_manager_default.log(`Learn more: ${err.link}`),1}return printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled,projectId:project.id,projectName:project.name},null,2)}
1219
+ `),0):(output_manager_default.log(`Observability Plus is ${enabled?"enabled":"disabled"} for ${await projectLabel(client,project)}.`),0)}async function observability(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(observabilitySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let action=parsedArgs.args[0];if(action!=="enable"&&action!=="disable")return output_manager_default.error("Invalid arguments. Usage: `vercel project observability enable|disable [name]`"),2;if(parsedArgs.args.length>2)return output_manager_default.error(`Invalid number of arguments. Usage: \`vercel project observability ${action} [name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,nameArg=parsedArgs.args[1],project;try{project=await getProjectByCwdOrLink({client,commandName:"project observability",projectNameOrId:nameArg,forReadOnlyCommand:!0})}catch(error){return printError(error),1}if(action==="enable"){let conflict=await refuseExplicitAccountConflict(client,{project,consequence:`Can't enable Observability Plus for ${project.name}.`});return conflict?conflict.exitCode:(asJson||await warnIfOutsideCurrentTeam(client,project),setObservability(client,project,!0,asJson))}let consent=await resolveProjectFeatureConsent(client,{command:"project observability",action,projectArg:nameArg,project,billable:!0,yes:!!parsedArgs.flags["--yes"],consequence:`Disabling Observability Plus for ${project.name} will turn off enhanced observability for this project.`});if(consent.kind==="refused")return consent.exitCode;if((consent.kind==="prompt"||!asJson)&&output_manager_default.print(prependEmoji(`Disabling Observability Plus for ${import_chalk276.default.bold(project.name)} will turn off enhanced observability for this project.
1220
+ `,emoji("warning"))),consent.kind==="prompt"){let target=`${project.name}${consent.team?` on team ${consent.team}`:""}`;if(!await client.input.confirm(`Disable Observability Plus for ${target}?`,!1))return output_manager_default.log("Canceled"),0}return setObservability(client,project,!1,asJson)}var import_chalk277=__toESM(require_source(),1);var PRODUCT="Priority project";function teamLabel3(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function emitJsonError(client,asJson,payload,exitCode2){return asJson?(shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,exitCode2),writeAgentError(client,payload),!0):!1}function apiErrorReason(err){return err.code==="plan_not_supported"?AGENT_REASON.PLAN_UPGRADE_REQUIRED:err.status===403?"forbidden":err.status===402?"payment_required":err.status===401?"not_authorized":err.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR}function thrownErrorPayload(error){if(isAPIError(error))return{status:AGENT_STATUS.ERROR,reason:apiErrorReason(error),message:error.serverMessage||error.message};let message=error instanceof Error?error.message:String(error);return error instanceof ProjectNotFound?{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PROJECT_NOT_FOUND,message}:error instanceof LinkRequiredError?{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message}:{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message}}function failUsage(client,asJson,message){return emitJsonError(client,asJson,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2)||output_manager_default.error(message),2}async function setPriority(client,project,enabled,asJson){try{await client.fetch(`/v1/security/priority?projectId=${encodeURIComponent(project.id)}`,{method:"POST",body:{enabled},accountId:project.accountId})}catch(err){if(isAPIError(err)){let message=err.serverMessage||`${PRODUCT} could not be ${enabled?"enabled":"disabled"} for ${project.name}.`,upgradeHint=err.code==="plan_not_supported"&&enabled?`Upgrade with ${getCommandName(`${BUY_PRO_COMMAND} --scope ${quoteArg(project.accountId)}`)}.`:void 0;return emitJsonError(client,asJson,{status:AGENT_STATUS.ERROR,reason:apiErrorReason(err),message,...upgradeHint?{hint:upgradeHint}:{}},1)||(output_manager_default.error(message),upgradeHint&&output_manager_default.log(upgradeHint)),1}return emitJsonError(client,asJson,thrownErrorPayload(err),1)||printError(err,client),1}return asJson?(client.stdout.write(`${JSON.stringify({enabled,projectId:project.id,projectName:project.name},null,2)}
1219
1221
  `),0):(output_manager_default.log(`${PRODUCT} is ${enabled?"enabled":"disabled"} for ${project.name}.`),0)}function refuseEnablePlan(client,asJson,message,fix,reason=AGENT_REASON.PLAN_UPGRADE_REQUIRED){let payload={status:AGENT_STATUS.ERROR,reason,message,userActionRequired:!0,hint:fix?.hint,...fix?.command?{next:[{command:buildCommandWithGlobalFlags(client.argv,fix.command,void 0,{excludeFlags:["--non-interactive","--project","--yes",...fix.excludeFlags??[]]}),...fix.when?{when:fix.when}:{}}]}:{next:void 0}};return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,1),asJson?(writeAgentError(client,payload),1):(output_manager_default.error(message),fix?.hint&&output_manager_default.log(fix.hint),1)}async function enableableTeam(client,project,asJson){let accountId=project.accountId;if(!accountId?.startsWith("team_"))return refuseEnablePlan(client,asJson,`${PRODUCT} is only available on team accounts. Use --scope to specify one.`,void 0,AGENT_REASON.MISSING_SCOPE);let team;try{team=await getTeamByIdOrSlug(client,accountId,{useCurrentTeam:!1})}catch(error){return emitJsonError(client,asJson,thrownErrorPayload(error),1)||printError(error,client),1}return isProOrEnterprisePlan(team.billing?.plan)?team.billing?.status==="trialing"?refuseEnablePlan(client,asJson,`${PRODUCT} is not available during the Pro trial period.`):team:refuseEnablePlan(client,asJson,"Priority Projects are only available on Pro or Enterprise team plans.",targetRecovery(buyProFix(`Upgrade with ${getCommandName(BUY_PRO_COMMAND)}, then run ${getCommandName(PRIORITY_PROJECT_ENABLE_COMMAND)}.`),{projectName:project.name,scope:team.slug}))}async function priority(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(prioritySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),emitJsonError(client,wantsMachineReadableOutput(void 0,argv),{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2)||printError(error,client),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return failUsage(client,!1,formatResult.error);let asJson=formatResult.jsonOutput,action=parsedArgs.args[0];if(action!=="enable"&&action!=="disable")return failUsage(client,asJson,"Invalid arguments. Usage: `vercel project priority enable|disable [name]`");if(parsedArgs.args.length>2)return failUsage(client,asJson,`Invalid number of arguments. Usage: \`vercel project priority ${action} [name]\``);let nameArg=parsedArgs.args[1],project;try{project=await getProjectByCwdOrLink({client,commandName:"project priority",projectNameOrId:nameArg,forReadOnlyCommand:!0})}catch(error){return emitJsonError(client,asJson,thrownErrorPayload(error),1)||printError(error,client),1}let team;if(action==="enable"){let checked=await enableableTeam(client,project,asJson);if(typeof checked=="number")return checked;team=checked}else if(project.accountId?.startsWith("team_"))try{team=await getTeamByIdOrSlug(client,project.accountId,{useCurrentTeam:!1})}catch(error){return emitJsonError(client,asJson,thrownErrorPayload(error),1)||printError(error,client),1}if(!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project priority ${action}${nameArg?` ${nameArg}`:""}${globalFlags.length?` ${globalFlags.join(" ")}`:""}`.trim()),target=team?`${project.name} on team ${team.slug}`:project.name,required={status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:action==="enable"?`Upgrading ${target} to Priority adds a paid feature and will incur charges on your account. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.`:`Removing Priority from ${target} turns off additional bot signals for this project. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.`,userActionRequired:!0,hint:action==="enable"?"Surface this to the user; enabling a paid feature cannot be automated.":"Surface this to the user; removing Priority requires interactive confirmation.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]};return shouldEmitNonInteractiveCommandError(client)&&outputActionRequired(client,required,1),asJson?(client.stdout.write(`${JSON.stringify(required,null,2)}
1220
1222
  `),1):(output_manager_default.error(action==="enable"?"This command must be run interactively because upgrading to Priority incurs charges.":"This command must be run interactively to remove Priority."),1)}return action==="disable"?(output_manager_default.print(prependEmoji(`Removing Priority from ${import_chalk277.default.bold(project.name)}${team?` on team ${import_chalk277.default.bold(teamLabel3(team))}`:""} turns off its additional bot signals.
1221
1223
  `,emoji("warning"))),await client.input.confirm(`Remove Priority from ${project.name}${team?` on ${team.slug}`:""}?`,!1)?setPriority(client,project,!1,asJson):(output_manager_default.log("Canceled"),0)):team?(output_manager_default.print(prependEmoji(`Upgrading ${import_chalk277.default.bold(project.name)} on team ${import_chalk277.default.bold(teamLabel3(team))} to Priority will incur charges on your account.
@@ -1226,7 +1228,8 @@ ${err}`),1)}}var import_chalk274=__toESM(require_source(),1);async function setS
1226
1228
  `),0;if(output_manager_default.log(`${import_chalk278.default.bold("Protection settings")} for ${import_chalk278.default.cyan(project.name)} (${project.id})`),Object.keys(slice).length===0)return output_manager_default.log("No deployment protection fields returned for this project."),0;for(let[k,v]of Object.entries(slice))output_manager_default.log(`${import_chalk278.default.cyan(`${k}:`)} ${JSON.stringify(v)}`);return 0}var COMMAND_CONFIG56={inspect:getCommandAliases(inspectSubcommand12),list:getCommandAliases(listSubcommand18),members:getCommandAliases(membersSubcommand),accessGroups:getCommandAliases(accessGroupsSubcommand),add:getCommandAliases(addSubcommand8),"access-summary":getCommandAliases(accessSummarySubcommand),checks:getCommandAliases(checksSubcommand),protection:getCommandAliases(protectionSubcommand),update:getCommandAliases(updateSubcommand8),rename:getCommandAliases(renameSubcommand),remove:getCommandAliases(removeSubcommand13),token:getCommandAliases(tokenSubcommand2),speedInsights:getCommandAliases(speedInsightsSubcommand),webAnalytics:getCommandAliases(webAnalyticsSubcommand),pause:getCommandAliases(pauseSubcommand),"dangerously-delete-immutable-static-asset":getCommandAliases(dangerouslyDeleteImmutableStaticAssetSubcommand),observability:getCommandAliases(observabilitySubcommand),priority:getCommandAliases(prioritySubcommand),resume:getCommandAliases(resumeSubcommand)};async function main29(client){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(projectCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("project"),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:projectCommand,columns:client.stderr.columns})),0}parsedArgs.args[1]||(subcommand="list");let exitCode2;switch(subcommand){case"inspect":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(inspectSubcommand12);telemetry2.trackCliSubcommandInspect(subcommandOriginal),exitCode2=await inspect17(client,args);break;case"list":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(listSubcommand18);telemetry2.trackCliSubcommandList(subcommandOriginal),exitCode2=await list21(client,args);break;case"add":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(addSubcommand8);telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"project add","project create"),exitCode2=await add11(client,args);break;case"access-summary":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessSummarySubcommand);telemetry2.trackCliSubcommandAccessSummary(subcommandOriginal),exitCode2=await accessSummary(client,args);break;case"checks":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(checksSubcommand);telemetry2.trackCliSubcommandChecks(args[0]==="add"?"checks add":args[0]==="remove"||args[0]==="rm"?"checks remove":subcommandOriginal),exitCode2=await checks(client,args);break;case"members":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(membersSubcommand);telemetry2.trackCliSubcommandMembers(args[0]==="add"?"members add":args[0]==="remove"||args[0]==="rm"?"members remove":subcommandOriginal),exitCode2=await members(client,args);break;case"accessGroups":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessGroupsSubcommand);telemetry2.trackCliSubcommandAccessGroups(subcommandOriginal),exitCode2=await accessGroups(client,args);break;case"protection":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(protectionSubcommand);telemetry2.trackCliSubcommandProtection(args[0]==="enable"?"protection enable":args[0]==="disable"?"protection disable":subcommandOriginal),exitCode2=await protection(client,args);break;case"webAnalytics":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(webAnalyticsSubcommand);telemetry2.trackCliSubcommandWebAnalytics(args[0]==="enable"?"web-analytics enable":args[0]==="disable"?"web-analytics disable":subcommandOriginal),exitCode2=await webAnalytics(client,args);break;case"speedInsights":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(speedInsightsSubcommand);telemetry2.trackCliSubcommandSpeedInsights(args[0]==="enable"?"speed-insights enable":args[0]==="disable"?"speed-insights disable":subcommandOriginal),exitCode2=await speedInsights(client,args);break;case"pause":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(pauseSubcommand);telemetry2.trackCliSubcommandPause(subcommandOriginal),exitCode2=await pause2(client,args);break;case"dangerously-delete-immutable-static-asset":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(dangerouslyDeleteImmutableStaticAssetSubcommand);telemetry2.trackCliSubcommandDangerouslyDeleteImmutableStaticAsset(subcommandOriginal),exitCode2=await dangerouslyDeleteImmutableStaticAsset(client,args);break;case"observability":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(observabilitySubcommand);telemetry2.trackCliSubcommandObservability(args[0]==="enable"?"observability enable":args[0]==="disable"?"observability disable":subcommandOriginal),exitCode2=await observability(client,args);break;case"priority":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(prioritySubcommand);telemetry2.trackCliSubcommandPriority(args[0]==="enable"?"priority enable":args[0]==="disable"?"priority disable":subcommandOriginal),exitCode2=await priority(client,args);break;case"resume":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(resumeSubcommand);telemetry2.trackCliSubcommandResume(subcommandOriginal),exitCode2=await resume2(client,args);break;case"token":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(tokenSubcommand2);telemetry2.trackCliSubcommandToken(subcommandOriginal),exitCode2=await getOidcToken(client,args);break;case"rename":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(renameSubcommand);telemetry2.trackCliSubcommandRename(subcommandOriginal),exitCode2=await rename(client,args);break;case"update":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(updateSubcommand8);telemetry2.trackCliSubcommandUpdate(subcommandOriginal),exitCode2=await update6(client,args);break;case"remove":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(removeSubcommand13);telemetry2.trackCliSubcommandRemove(subcommandOriginal),exitCode2=await rm9(client,args);break;default:{if(handleCommandTypo({client,command:parsedArgs.args[1],availableCommands:projectCommand.subcommands}))return 2;let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForProjectsCli);if(fallback!==null){exitCode2=fallback;break}return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),2}}return exitCode2===0&&await autoInstallVercelPlugin(client),exitCode2}var import_ms33=__toESM(require_ms(),1);var import_error_utils21=__toESM(require_dist(),1);var import_chalk282=__toESM(require_source(),1);var import_chalk279=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,contextName=await getContextName(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk279.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk279.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk279.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk279.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms32=__toESM(require_ms(),1);var import_chalk281=__toESM(require_source(),1);var import_ms31=__toESM(require_ms(),1);var import_chalk280=__toESM(require_source(),1);function renderAliasStatus(status6){return status6==="completed"?import_chalk280.default.green(status6):status6==="failed"?import_chalk280.default.red(status6):status6==="skipped"?import_chalk280.default.gray(status6):import_chalk280.default.yellow(status6)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms31.default)("3m"),promoteTimeout=Date.now()+(0,import_ms31.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;if(projectCheck.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage)return output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),0;continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),0;if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk281.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk281.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk281.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk281.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk282.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),0):timeout!==void 0&&(0,import_ms32.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk282.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),0):await promoteStatus({client,contextName,deployment,project,timeout})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var promote_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{columns:client.stderr.columns})),0;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms33.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand3,{columns:client.stderr.columns,parent:promoteCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout})}return telemetry2.trackCliArgumentUrlOrDeploymentId(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes})}catch(err){if((0,import_error_utils21.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};var import_chalk284=__toESM(require_source(),1),import_client=__toESM(require_dist3(),1);var import_chalk283=__toESM(require_source(),1);async function getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}){let{config}=client;if(!isValidName(deployIdOrUrl))throw new Error(`The provided argument "${deployIdOrUrl}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default.spinner(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk283.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployIdOrUrl)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason.message);team=teamResult.value,deployment=deploymentResult.value,output_manager_default.log(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk283.default.bold(contextName)}\u2026`)}finally{output_manager_default.stopSpinner()}if(deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk283.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk283.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}return deployment}var import_error_utils22=__toESM(require_dist(),1);var RedeployTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}trackCliOptionTarget(target){target&&this.trackCliArgument({arg:"target",value:this.redactedTargetName(target)})}};async function redeploy(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(redeployCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new RedeployTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("redeploy"),output_manager_default.print(help(redeployCommand,{columns:client.stderr.columns})),0;let deployIdOrUrl=parsedArgs.args[1];if(!deployIdOrUrl)return output_manager_default.error(`Missing required deployment id or url: ${getCommandName("redeploy <deployment-id-or-url>")}`),1;telemetry2.trackCliArgumentUrlOrDeploymentId(deployIdOrUrl),telemetry2.trackCliFlagNoWait(parsedArgs.flags["--no-wait"]),telemetry2.trackCliOptionTarget(parsedArgs.flags["--target"]);let contextName=await getContextName(client),noWait=!!parsedArgs.flags["--no-wait"],targetArgument=parsedArgs.flags["--target"];try{let fromDeployment=await getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}),target,customEnvironmentSlugOrId;targetArgument?targetArgument==="staging"||targetArgument==="production"?target=targetArgument:targetArgument==="preview"?target=void 0:targetArgument?(customEnvironmentSlugOrId=targetArgument,target=void 0):target=fromDeployment.target:(target=fromDeployment.target??void 0,customEnvironmentSlugOrId=fromDeployment.customEnvironment?.id);let customEnvironment;if(fromDeployment?.projectId&&customEnvironmentSlugOrId){let customEnvironments=await getCustomEnvironments(client,fromDeployment.projectId);customEnvironment=pickCustomEnvironment(customEnvironments,customEnvironmentSlugOrId)}if(customEnvironmentSlugOrId&&!customEnvironment)return output_manager_default.error(`The provided argument "${targetArgument}" is not a valid target environment.`),2;fromDeployment.prebuilt&&fromDeployment.manualProvisioning===void 0&&output_manager_default.warning([`Deployment ${fromDeployment.id} is a prebuilt deployment. Redeploying reuses its prebuilt output, so it is not rebuilt from source and will not use the latest environment variables or project settings.`,`To use the latest settings, create a new deployment instead: run ${getCommandName("pull")}, ${getCommandName("build")}, and ${getCommandName("deploy --prebuilt")} with the same target flags (for example ${import_chalk284.default.bold("--prod")}).`,`Learn More: ${link_default("https://vercel.com/docs/cli/deploy#prebuilt")}`].join(`
1227
1229
  `));let deployStamp=stamp_default();output_manager_default.spinner(`Redeploying project ${fromDeployment.id}`,0);let deployment=await client.fetch("/v13/deployments?forceNew=1",{body:{deploymentId:fromDeployment.id,meta:{action:"redeploy"},name:fromDeployment.name,target,customEnvironmentSlugOrId},method:"POST"});output_manager_default.stopSpinner();let previewUrl=`https://${deployment.url}`,isProdDeployment=target==="production";if(customEnvironmentSlugOrId&&customEnvironment&&(isProdDeployment=customEnvironment.type==="production"),printAlignedLabel("Inspect",import_chalk284.default.cyan(deployment.inspectorUrl)),printAlignedLabel(isProdDeployment?"Production":"Preview",import_chalk284.default.cyan(previewUrl),isProdDeployment&&noWait?{gutter:"\u25B2"}:{}),client.stdout.isTTY||client.stdout.write(`https://${deployment.url}`),!noWait){output_manager_default.spinner(deployment.readyState==="QUEUED"?"Queued\u2026":"Building\u2026",0);let project,rollingRelease2;if(deployment.projectId&&deployment.projectId!=""&&(project=await getProjectByNameOrId(client,deployment.projectId),rollingRelease2=project?.rollingRelease),deployment.readyState==="READY"&&deployment.aliasAssigned&&!rollingRelease2){if(output_manager_default.spinner("Completing\u2026",0),deployment.target==="production"&&deployment.alias&&deployment.alias.length>0){output_manager_default.stopSpinner();let prodUrl=`https://${deployment.alias[0]}`;printAlignedLabel("Aliased",import_chalk284.default.cyan(prodUrl),{gutter:"\u25B2"})}}else try{let clientOptions={dispatcher:getFetchDispatcher(),apiUrl:client.apiUrl,debug:output_manager_default.debugEnabled,path:"",teamId:fromDeployment.team?.id,token:client.authConfig.token,userAgent:ua_default};for await(let event of(0,import_client.checkDeploymentStatus)(deployment,clientOptions))if(event.type==="building")output_manager_default.spinner("Building\u2026",0);else if(event.type==="ready"&&rollingRelease2){output_manager_default.spinner("Releasing\u2026",0),output_manager_default.stopSpinner(),deployment=event.payload;break}else if(event.type==="ready"&&(!event.payload.checksState||event.payload.checksState==="completed"))output_manager_default.spinner("Completing\u2026",0);else if(event.type==="checks-running")output_manager_default.spinner("Running Checks\u2026",0);else if(event.type==="alias-assigned"||event.type==="checks-conclusion-failed"){if(output_manager_default.stopSpinner(),event.type==="alias-assigned"&&!Array.isArray(event.payload)&&event.payload.target==="production"&&event.payload.alias&&event.payload.alias.length>0){let prodUrl=`https://${event.payload.alias[0]}`;printAlignedLabel("Aliased",import_chalk284.default.cyan(prodUrl),{gutter:"\u25B2"})}deployment=event.payload;break}else{if(event.type==="canceled")return output_manager_default.stopSpinner(),output_manager_default.print(`The deployment has been canceled.
1228
1230
  `),1;if(event.type==="error")throw output_manager_default.stopSpinner(),await new Now({client,currentTeam:fromDeployment.team?.id}).handleDeploymentError(event.payload,{env:{}})}}catch(err){output_manager_default.prettyError(err),process.exit(1)}}return printDeploymentStatus(client,deployment,deployStamp,noWait,!1)}catch(err){return output_manager_default.prettyError(err),(0,import_error_utils22.isErrnoException)(err)&&err.code==="ERR_INVALID_TEAM"&&output_manager_default.error(`Use ${import_chalk284.default.bold("vc switch")} to change your current team`),1}}var import_chalk285=__toESM(require_source(),1),import_pluralize24=__toESM(require_pluralize(),1);function withGlobalFlags4(client,commandTemplate){return withGlobalFlags(client,commandTemplate,{preserveProject:!0})}async function parseSubcommandArgs3(argv,command2){let parsedArgs;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){return printError(err),2}return parsedArgs}async function confirmAction2(client,skipConfirmation,message,details){return skipConfirmation?!0:(details&&output_manager_default.print(` ${details}
1229
- `),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search:search3,page,perPage=50,versionId,diff:diff2}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId),versionId&&params.set("versionId",versionId),diff2?params.set("diff",diff2===!0?"true":diff2):(params.set("per_page",perPage.toString()),search3&&params.set("q",search3),page&&params.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list22(client,argv){let parsed=await parseSubcommandArgs3(argv,listSubcommand19);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],page=flags["--next"]??flags["--page"],perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--version"],versionId,versionName,useDiff=!1;if(staging){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk285.default.bold(project.name)}. Run ${import_chalk285.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search3&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --version flags together"),2;output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),version2=versions2.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version2)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk285.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=version2.id,versionName=version2.name||version2.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk285.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search:search3,page,perPage,versionId,diff:useDiff});if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk285.default.bold(versionName||"")} ${import_chalk285.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
1231
+ `),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search:search3,page,perPage=50,versionId,diff:diff2}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId),versionId&&params.set("versionId",versionId),diff2?params.set("diff",diff2===!0?"true":diff2):(params.set("per_page",perPage.toString()),search3&&params.set("q",search3),page&&params.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list22(client,argv){let parsed=await parseSubcommandArgs3(argv,listSubcommand19);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],page=flags["--next"]??flags["--page"],perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--version"],asJson=!!flags["--json"],versionId,versionName,useDiff=!1;if(staging){asJson||output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk285.default.bold(project.name)}. Run ${import_chalk285.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search3&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --version flags together"),2;asJson||output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),version2=versions2.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version2)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk285.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=version2.id,versionName=version2.name||version2.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk285.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),asJson||output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search:search3,page,perPage,versionId,diff:useDiff});if(asJson){let next=pagination&&pagination.page<pagination.numPages?pagination.page+1:null;return client.stdout.write(`${JSON.stringify({redirects,pagination:{next}},null,2)}
1232
+ `),0}if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk285.default.bold(versionName||"")} ${import_chalk285.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
1230
1233
  No changes from production version
1231
1234
  `):(added.length>0&&(output_manager_default.print(`
1232
1235
  ${import_chalk285.default.bold(import_chalk285.default.green(`Added (${added.length}):`))}
@@ -1236,7 +1239,8 @@ ${err}`),1)}}var import_chalk274=__toESM(require_source(),1);async function setS
1236
1239
  ${import_chalk285.default.gray(`${unchanged.length} redirect${unchanged.length===1?"":"s"} unchanged`)}
1237
1240
  `),output_manager_default.print(`
1238
1241
  `))}else{let resultMessage=`${(0,import_pluralize24.default)("Redirect",redirects.length,!0)} found for ${import_chalk285.default.bold(project.name)}`;versionName&&(resultMessage+=` ${import_chalk285.default.gray(`(version: ${versionName})`)}`),search3&&(resultMessage+=` matching "${search3}"`),pagination&&(resultMessage+=` ${import_chalk285.default.gray(`(page ${pagination.page} of ${pagination.numPages})`)}`),resultMessage+=` ${import_chalk285.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),client.nonInteractive&&redirects.length===0&&!staging&&!versionIdFlag&&output_manager_default.log(` ${withGlobalFlags4(client,"redirects list")} shows production redirects only. If you added redirects but do not see them here, they may still be staged only\u2014run ${withGlobalFlags4(client,"redirects list --staging")} to view staged changes.`),redirects.length>0&&(output_manager_default.print(formatRedirectsTable(redirects)),output_manager_default.print(`
1239
- `))}if(pagination&&pagination.page<pagination.numPages){let command2=`redirects list --next ${pagination.page+1}`;search3&&(command2+=` --search "${search3}"`),perPage&&(command2+=` --limit ${perPage}`),output_manager_default.log(`To display the next page, run ${withGlobalFlags4(client,command2)}`)}return 0}function formatRedirectsTable(redirects,actionSymbol){let rows=redirects.map(redirect=>{let status6=redirect.statusCode||(redirect.permanent?308:307),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk285.default.green:actionSymbol==="-"?import_chalk285.default.red:s=>s;return[colorFn(`${prefix} ${redirect.source}`),colorFn(`${redirect.destination}`),colorFn(status6.toString())]});return formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])}var import_chalk286=__toESM(require_source(),1),import_ms34=__toESM(require_ms(),1),import_pluralize25=__toESM(require_pluralize(),1);async function listVersions2(client,argv){let parsed=await parseSubcommandArgs3(argv,listVersionsSubcommand);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,lsStamp=stamp_default();output_manager_default.spinner(`Fetching redirect versions for ${import_chalk286.default.bold(project.name)}`);let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),sortedVersions=sortVersions(versions2).slice(0,20);return output_manager_default.log(`${(0,import_pluralize25.default)("Version",sortedVersions.length,!0)} found for ${import_chalk286.default.bold(project.name)} ${import_chalk286.default.gray(lsStamp())}`),sortedVersions.length>0&&(output_manager_default.print(formatVersionsTable(sortedVersions)),output_manager_default.print(`
1242
+ `))}if(pagination&&pagination.page<pagination.numPages){let command2=`redirects list --next ${pagination.page+1}`;search3&&(command2+=` --search "${search3}"`),perPage&&(command2+=` --limit ${perPage}`),output_manager_default.log(`To display the next page, run ${withGlobalFlags4(client,command2)}`)}return 0}function formatRedirectsTable(redirects,actionSymbol){let rows=redirects.map(redirect=>{let status6=redirect.statusCode||(redirect.permanent?308:307),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk285.default.green:actionSymbol==="-"?import_chalk285.default.red:s=>s;return[colorFn(`${prefix} ${redirect.source}`),colorFn(`${redirect.destination}`),colorFn(status6.toString())]});return formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])}var import_chalk286=__toESM(require_source(),1),import_ms34=__toESM(require_ms(),1),import_pluralize25=__toESM(require_pluralize(),1);async function listVersions2(client,argv){let parsed=await parseSubcommandArgs3(argv,listVersionsSubcommand);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,lsStamp=stamp_default(),asJson=!!parsed.flags["--json"];asJson||output_manager_default.spinner(`Fetching redirect versions for ${import_chalk286.default.bold(project.name)}`);let{versions:versions2}=await getRedirectVersions(client,project.id,teamId);if(asJson)return client.stdout.write(`${JSON.stringify({versions:versions2},null,2)}
1243
+ `),0;let sortedVersions=sortVersions(versions2).slice(0,20);return output_manager_default.log(`${(0,import_pluralize25.default)("Version",sortedVersions.length,!0)} found for ${import_chalk286.default.bold(project.name)} ${import_chalk286.default.gray(lsStamp())}`),sortedVersions.length>0&&(output_manager_default.print(formatVersionsTable(sortedVersions)),output_manager_default.print(`
1240
1244
  `)),0}function sortVersions(versions2){return versions2.slice().sort((a,b)=>a.isStaging&&!b.isStaging?-1:!a.isStaging&&b.isStaging?1:a.isLive&&!b.isLive?-1:!a.isLive&&b.isLive?1:b.lastModified-a.lastModified)}function formatVersionsTable(versions2){let now=Date.now(),rows=versions2.map(version2=>{let age=(0,import_ms34.default)(now-version2.lastModified),status6="";version2.isStaging?status6=import_chalk286.default.yellow("Staging"):version2.isLive?status6=import_chalk286.default.green("Live"):status6=import_chalk286.default.gray("Previous");let name=version2.name||import_chalk286.default.gray("(unnamed)"),redirectCountStr=version2.redirectCount!==void 0&&version2.redirectCount!==null?version2.redirectCount.toString():import_chalk286.default.gray("-");return[status6,name,version2.id,redirectCountStr,version2.createdBy||import_chalk286.default.gray("(unknown)"),import_chalk286.default.gray(age+" ago")]});return formatTable(["Status","Name","ID","Redirects","Created By","Age"],["l","l","l","r","l","l"],[{rows}])}var import_chalk287=__toESM(require_source(),1);async function putRedirects(client,projectId,redirects,teamId,name){let url="/v1/bulk-redirects",body={projectId,redirects};return teamId&&(body.teamId=teamId),name&&(body.name=name),await client.fetch(url,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)})}async function updateRedirectVersion(client,projectId,versionId,action,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:versionId,action})})}async function add12(client,argv){let parsed=await parseSubcommandArgs3(argv,addSubcommand9);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{versions:versions2}=await getRedirectVersions(client,project.id,teamId),existingStagingVersion=versions2.find(v=>v.isStaging),{args,flags}=parsed,skipPrompts=flags["--yes"]||client.nonInteractive;if(client.nonInteractive&&(!args[0]||!args[1])){let sourcePart=args[0]||"<source>",destPart=args[1]!==void 0&&args[1]!==""?args[1]:"<destination>",flagParts=buildRedirectsSuggestionFlags(client.argv.slice(2),"add"),cmd2=getCommandNamePlain(`redirects add ${sourcePart} ${destPart} ${flagParts.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`In non-interactive mode source and destination are required. Run: ${cmd2}`,next:[{command:cmd2,when:"to add a redirect"}]},2),2}let source;if(args[0]){if(source=args[0],!isValidUrl(source))return output_manager_default.error("Source must be a relative path (starting with /) or an absolute URL"),2}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),2;output_manager_default.log(`Add a new redirect
1241
1245
  `),source=await client.input.text({message:"What is the source URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Source URL cannot be empty"})}let destination;if(args[1]){if(destination=args[1],!isValidUrl(destination))return output_manager_default.error("Destination must be a relative path (starting with /) or an absolute URL"),2}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),2;args[0]||output_manager_default.log(`Add a new redirect
1242
1246
  `),destination=await client.input.text({message:"What is the destination URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Destination URL cannot be empty"})}let statusCode;if(flags["--status"]){if(statusCode=flags["--status"],![301,302,307,308].includes(statusCode))return output_manager_default.error("Status code must be 301, 302, 307, or 308"),1}else skipPrompts?statusCode=307:statusCode=await client.input.select({message:"Select the status code:",choices:[{name:"307 - Temporary Redirect (preserves request method)",value:307},{name:"308 - Permanent Redirect (preserves request method)",value:308},{name:"301 - Moved Permanently (cached by browsers)",value:301},{name:"302 - Found (temporary redirect, not cached)",value:302}]});let caseSensitive;flags["--case-sensitive"]!==void 0?caseSensitive=flags["--case-sensitive"]:skipPrompts?caseSensitive=!1:caseSensitive=await client.input.confirm("Should the redirect be case sensitive?",!1);let preserveQueryParams;flags["--preserve-query-params"]!==void 0?preserveQueryParams=flags["--preserve-query-params"]:skipPrompts?preserveQueryParams=!1:preserveQueryParams=await client.input.confirm("Should query parameters be preserved?",!1);let versionName;if(flags["--name"]){if(versionName=flags["--name"],versionName&&versionName.length>256)return output_manager_default.error("Name must be 256 characters or less"),1}else skipPrompts?versionName=void 0:await client.input.confirm("Do you want to provide a name for this version?",!1)&&(versionName=await client.input.text({message:"Version name (max 256 characters):",validate:val=>val&&val.length>256?"Name must be 256 characters or less":!0}),versionName||(versionName=void 0));let addStamp=stamp_default();output_manager_default.spinner("Adding redirect");let{alias:alias2,version:version2}=await putRedirects(client,project.id,[{source,destination,statusCode,caseSensitive,preserveQueryParams}],teamId,versionName);if(client.nonInteractive){output_manager_default.stopSpinner();let testUrl=alias2?source.startsWith("/")?`https://${alias2}${source}`:`https://${alias2}`:void 0,fullArgs=client.argv.slice(2),afterAdd=getArgsAfterRedirectsSubcommand(fullArgs,"add"),globalFlags=getRedirectGlobalFlagsOnly(afterAdd),flagsSuffix=globalFlags.length>0?` ${globalFlags.join(" ")}`:"",listStagingCmd=getCommandNamePlain(`redirects list --staging${flagsSuffix}`.trim()),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterAdd),promoteCmd=getCommandNamePlain(`redirects promote ${version2.id} ${promoteFlagParts.join(" ")}`.trim()),jsonOutput={status:AGENT_STATUS.OK,redirect:{source,destination,statusCode,caseSensitive,preserveQueryParams},version:{id:version2.id,name:version2.name||version2.id},...alias2&&{alias:alias2,testUrl},stagingOnly:!0,inProduction:!1,message:`Redirect was added to a staging version only\u2014not live in production yet. \`vercel redirects list\` (without --staging) shows production redirects only, so you may see 0 until you promote. Use ${listStagingCmd} to see staged redirects including this one, then ${promoteCmd} to promote this staging version to production.`,next:[{command:listStagingCmd,when:"To list staged redirects (includes this redirect)"},{command:promoteCmd,when:"To promote this staging version to production"}]};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
@@ -1308,7 +1312,9 @@ ${import_chalk291.default.gray("No changes detected from current production vers
1308
1312
  `)}),0}function readConfirmation4(deployments,projects2){return new Promise(resolve14=>{if(deployments.length>0){output_manager_default.log(`The following ${(0,import_pluralize26.default)("deployment",deployments.length,deployments.length>1)} will be permanently removed:`);let deploymentTable=table(deployments.map(depl=>{let time=import_chalk292.default.gray(`${(0,import_ms35.default)(Date.now()-depl.createdAt)} ago`),url=depl.url?import_chalk292.default.underline(`https://${depl.url}`):"";return[` ${depl.id}`,url,time]}),{align:["l","r","l"],hsep:6});output_manager_default.print(`${deploymentTable}
1309
1313
  `)}for(let depl of deployments)for(let{alias:alias2}of depl.aliases)output_manager_default.warn(`${import_chalk292.default.underline(`https://${alias2}`)} is an alias for ${import_chalk292.default.bold(depl.url)} and will be removed`);if(projects2.length>0){output_manager_default.print(`The following ${(0,import_pluralize26.default)("project",projects2.length,projects2.length>1)} will be permanently removed, including all ${projects2.length>1?"their":"its"} deployments and aliases:
1310
1314
  `);for(let project of projects2)output_manager_default.print(`${import_chalk292.default.gray("-")} ${import_chalk292.default.bold(project.name)}
1311
- `)}output_manager_default.print(`${import_chalk292.default.bold.red("> Are you sure?")} ${import_chalk292.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize26.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize26.default)("project",projects2.length,!0)}`:`${(0,import_pluralize26.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize26.default)("project",projects2.length,!0)}`}var import_error_utils23=__toESM(require_dist(),1),import_ms38=__toESM(require_ms(),1);var import_chalk294=__toESM(require_source(),1);var import_ms37=__toESM(require_ms(),1);var import_chalk293=__toESM(require_source(),1);var import_ms36=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms36.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms36.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk293.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk293.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk293.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk293.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms37.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk294.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),0;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms38.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils23.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms39=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms39.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG58={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),inspect:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,inspect:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2.startsWith("--cwd=")){let cwdPath=arg2.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg2==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg2.startsWith("--project=")){let projectName=arg2.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg2);continue}if(arg2==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg2,args[i+1]),i++);continue}preservedParts.push(arg2),listParts.push(arg2)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG58),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),0;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),2;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),2;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),2;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),2;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),2;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),2;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="fetch"&&warnDeprecatedSubcommand(client,"rolling-release fetch","rolling-release inspect");let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk295=__toESM(require_source(),1),import_pluralize27=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand20,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),2}let versionId,versionName,useDiff=!1;if(production){output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk295.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk295.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk295.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk295.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search3,filter,versionId,diff:useDiff});if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk295.default.bold(versionName||"")} ${import_chalk295.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
1315
+ `)}output_manager_default.print(`${import_chalk292.default.bold.red("> Are you sure?")} ${import_chalk292.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize26.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize26.default)("project",projects2.length,!0)}`:`${(0,import_pluralize26.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize26.default)("project",projects2.length,!0)}`}var import_error_utils23=__toESM(require_dist(),1),import_ms38=__toESM(require_ms(),1);var import_chalk294=__toESM(require_source(),1);var import_ms37=__toESM(require_ms(),1);var import_chalk293=__toESM(require_source(),1);var import_ms36=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms36.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms36.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk293.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk293.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk293.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk293.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms37.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk294.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),0;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms38.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils23.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms39=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms39.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG58={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),inspect:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,inspect:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2.startsWith("--cwd=")){let cwdPath=arg2.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg2==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg2.startsWith("--project=")){let projectName=arg2.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg2);continue}if(arg2==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg2,args[i+1]),i++);continue}preservedParts.push(arg2),listParts.push(arg2)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG58),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),0;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),2;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),2;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),2;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),2;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),2;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),2;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="fetch"&&warnDeprecatedSubcommand(client,"rolling-release fetch","rolling-release inspect");let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});subcommandFlags?.flags["--json"]?client.stdout.write(`${JSON.stringify({rollingRelease:result},null,2)}
1316
+ `):output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk295=__toESM(require_source(),1),import_pluralize27=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand20,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search3=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"],asJson=!!flags["--json"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),2}let versionId,versionName,useDiff=!1;if(production){asJson||output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk295.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){asJson||output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk295.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk295.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){asJson||output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk295.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search3&&(spinnerMessage+=` matching "${search3}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),asJson||output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search3,filter,versionId,diff:useDiff});if(asJson)return client.stdout.write(`${JSON.stringify({routes:routes2,version:version2,limit:limit??null},null,2)}
1317
+ `),0;if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk295.default.bold(versionName||"")} ${import_chalk295.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
1312
1318
  No changes from production version
1313
1319
  `):(added.length>0&&(output_manager_default.print(`
1314
1320
  ${import_chalk295.default.bold(import_chalk295.default.green(`Added (${added.length}):`))}
@@ -1323,14 +1329,16 @@ ${import_chalk291.default.gray("No changes detected from current production vers
1323
1329
  `)),limit&&limit.maxRoutes>0){let utilization=limit.currentRoutes/limit.maxRoutes;if(utilization>=.8){let usageColor=utilization>=1?import_chalk295.default.red:import_chalk295.default.yellow;output_manager_default.print(` ${usageColor(`Routes Usage: ${limit.currentRoutes}/${limit.maxRoutes}`)}
1324
1330
 
1325
1331
  `)}}}return 0}function formatRoutesTable(routes2,actionSymbol){let rows=routes2.map((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),status6=rule.enabled===!1?import_chalk295.default.red("Disabled"):import_chalk295.default.green("Enabled"),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk295.default.green:actionSymbol==="-"?import_chalk295.default.red:actionSymbol==="~"?import_chalk295.default.yellow:s=>s,position=actionSymbol?"":`${index+1}`;return[colorFn(`${prefix} ${position}`).trim(),colorFn(truncate(rule.name,30)+(rule.staged?import_chalk295.default.yellow(" (draft)"):"")),colorFn(truncate(rule.route.src,40)),colorFn(typeLabels),status6]});return formatTable(["#","Name","Path Pattern","Actions","Status"],["r","l","l","l","l"],[{rows}])}function truncate(str,maxLength){return str.length<=maxLength?str:str.slice(0,maxLength-3)+"..."}function formatExpandedRoutes(routes2){let lines=[""];return routes2.forEach((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),syntaxLabel=getSrcSyntaxLabel(rule),statusText=rule.enabled===!1?import_chalk295.default.red("Disabled"):import_chalk295.default.green("Enabled"),stagedText=rule.staged?import_chalk295.default.yellow(" (staged)"):"";if(lines.push(` ${import_chalk295.default.bold(`${index+1}. ${rule.name}`)}${stagedText} ${import_chalk295.default.gray(`[${rule.id}]`)}`),lines.push(` ${import_chalk295.default.cyan("Status:")} ${statusText}`),lines.push(` ${import_chalk295.default.cyan("Type:")} ${typeLabels}`),rule.description&&lines.push(` ${import_chalk295.default.cyan("Desc:")} ${rule.description}`),lines.push(` ${import_chalk295.default.cyan("Source:")} ${rule.route.src}`),lines.push(` ${import_chalk295.default.cyan("Syntax:")} ${syntaxLabel}`),rule.route.dest&&lines.push(` ${import_chalk295.default.cyan("Dest:")} ${rule.route.dest}`),rule.route.status&&lines.push(` ${import_chalk295.default.cyan("Code:")} ${rule.route.status}`),rule.route.headers&&Object.keys(rule.route.headers).length>0){lines.push(` ${import_chalk295.default.cyan("Response Headers:")}`);for(let[key,value]of Object.entries(rule.route.headers))lines.push(` ${key}: ${value}`)}if(rule.route.transforms&&rule.route.transforms.length>0){lines.push(` ${import_chalk295.default.cyan("Transforms:")}`);for(let transform of rule.route.transforms)lines.push(` ${formatTransform(transform)}`)}if(rule.route.has&&rule.route.has.length>0){lines.push(` ${import_chalk295.default.cyan("Has conditions:")}`);for(let condition of rule.route.has)lines.push(` ${formatCondition(condition)}`)}if(rule.route.missing&&rule.route.missing.length>0){lines.push(` ${import_chalk295.default.cyan("Does not have conditions:")}`);for(let condition of rule.route.missing)lines.push(` ${formatCondition(condition)}`)}lines.push("")}),lines.join(`
1326
- `)}var import_chalk296=__toESM(require_source(),1),import_ms40=__toESM(require_ms(),1);async function listVersions3(client,argv){let parsed=await parseSubcommandArgs(argv,listVersionsSubcommand2,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,count2=flags["--count"];if(count2!==void 0&&(count2<1||count2>100))return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:"Count must be between 1 and 100",next:[{command:withGlobalFlags2(client,"routes list-versions --count 20")}]}),process.exit(1)),output_manager_default.error("Count must be between 1 and 100"),2;let lsStamp=stamp_default();output_manager_default.spinner(`Fetching route versions for ${import_chalk296.default.bold(project.name)}`);let{versions:versions2}=await getRouteVersions(client,project.id,{teamId,count:count2});return output_manager_default.log(`Route versions for ${import_chalk296.default.bold(project.name)} ${import_chalk296.default.gray(lsStamp())}`),versions2.length===0?(output_manager_default.log(`
1332
+ `)}var import_chalk296=__toESM(require_source(),1),import_ms40=__toESM(require_ms(),1);async function listVersions3(client,argv){let parsed=await parseSubcommandArgs(argv,listVersionsSubcommand2,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,count2=flags["--count"];if(count2!==void 0&&(count2<1||count2>100))return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:"Count must be between 1 and 100",next:[{command:withGlobalFlags2(client,"routes list-versions --count 20")}]}),process.exit(1)),output_manager_default.error("Count must be between 1 and 100"),2;let asJson=!!flags["--json"],lsStamp=stamp_default();asJson||output_manager_default.spinner(`Fetching route versions for ${import_chalk296.default.bold(project.name)}`);let{versions:versions2}=await getRouteVersions(client,project.id,{teamId,count:count2});return asJson?(client.stdout.write(`${JSON.stringify({versions:versions2},null,2)}
1333
+ `),0):(output_manager_default.log(`Route versions for ${import_chalk296.default.bold(project.name)} ${import_chalk296.default.gray(lsStamp())}`),versions2.length===0?(output_manager_default.log(`
1327
1334
  No versions found
1328
1335
  `),0):(output_manager_default.print(formatVersionsTable2(versions2)),output_manager_default.print(`
1329
- `),0)}function formatVersionsTable2(versions2){let rows=versions2.map(version2=>{let status6="";version2.isStaging?status6=import_chalk296.default.yellow("Staging"):version2.isLive?status6=import_chalk296.default.green("Live"):status6=import_chalk296.default.gray("Previous");let id2=version2.id.slice(0,12),routeCount=version2.ruleCount!==void 0?version2.ruleCount.toString():"-",age=getRelativeTime(version2.lastModified);return[status6,id2,routeCount,age]});return formatTable(["Status","ID","Routes","Age"],["l","l","r","l"],[{rows}])}function getRelativeTime(timestamp2){let diff2=Date.now()-timestamp2;return diff2<1e3?"just now":(0,import_ms40.default)(diff2,{long:!0})+" ago"}var import_chalk297=__toESM(require_source(),1);async function inspect18(client,argv){let parsed=await parseSubcommandArgs(argv,inspectSubcommand13,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags,args}=parsed,teamId=org.type==="team"?org.id:void 0,showDiff=flags["--diff"],identifier=args[0]==="inspect"?args[1]:args[0];if(!identifier)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Route name or ID is required. Pass a single route name or ID as the first argument after inspect.",next:[{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"replace <name-or-id> with route name or ID from routes list"},{command:withGlobalFlags2(client,"routes list"),when:"to list routes and copy an exact name or id"}]},2),2):(output_manager_default.error(`Missing route name or ID. Usage: ${import_chalk297.default.cyan(withGlobalFlags2(client,"routes inspect <name-or-id>"))}`),2);let inspectStamp=stamp_default();output_manager_default.spinner(`Searching for route "${identifier}" in ${import_chalk297.default.bold(project.name)}`);let{routes:routes2}=await getRoutes(client,project.id,{teamId,search:identifier}),exactMatch=routes2.find(r=>r.id===identifier||r.name.toLowerCase()===identifier.toLowerCase()),route;if(exactMatch)route=exactMatch;else{if(routes2.length===0)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_FOUND,message:`No route found matching "${identifier}".`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to list routes and pick an exact name or id"}]},1),1):(output_manager_default.error(`No route found matching "${identifier}". Run ${import_chalk297.default.cyan(withGlobalFlags2(client,"routes list"))} to see all routes.`),1);if(routes2.length===1)route=routes2[0];else{if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.AMBIGUOUS_ROUTE,message:`Multiple routes match "${identifier}" (${routes2.length} matches). Pass an exact route name or ID; non-interactive mode cannot prompt for a choice.`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to see route names and ids, then inspect with a unique id"},{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"retry with a single unique name or id"}]},1),1;output_manager_default.log(`Found ${routes2.length} routes matching "${identifier}" ${import_chalk297.default.gray(inspectStamp())}`);let selectedId=await client.input.select({message:"Select a route to inspect:",choices:routes2.map(r=>({value:r.id,name:`${r.name} ${import_chalk297.default.gray(`(${r.route.src})`)}`}))});if(!selectedId)return output_manager_default.error("No route selected"),1;let selected=routes2.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("Selected route not found"),1;route=selected}}return output_manager_default.log(`Route found in ${import_chalk297.default.bold(project.name)} ${import_chalk297.default.gray(inspectStamp())}`),showDiff?await showRouteDiff(client,project.id,teamId,route):(output_manager_default.print(formatRouteDetails(route)),0)}async function showRouteDiff(client,projectId,teamId,stagingRoute){let{versions:versions2}=await getRouteVersions(client,projectId,{teamId}),productionVersion=versions2.find(v=>v.isLive);if(!productionVersion)return output_manager_default.log("No production version found. Showing current route."),output_manager_default.print(formatRouteDetails(stagingRoute)),0;let{routes:productionRoutes}=await getRoutes(client,projectId,{teamId,versionId:productionVersion.id}),productionRoute=productionRoutes.find(r=>r.id===stagingRoute.id);return productionRoute?(output_manager_default.print(formatRouteDiff(stagingRoute,productionRoute)),0):(output_manager_default.print(`
1336
+ `),0))}function formatVersionsTable2(versions2){let rows=versions2.map(version2=>{let status6="";version2.isStaging?status6=import_chalk296.default.yellow("Staging"):version2.isLive?status6=import_chalk296.default.green("Live"):status6=import_chalk296.default.gray("Previous");let id2=version2.id.slice(0,12),routeCount=version2.ruleCount!==void 0?version2.ruleCount.toString():"-",age=getRelativeTime(version2.lastModified);return[status6,id2,routeCount,age]});return formatTable(["Status","ID","Routes","Age"],["l","l","r","l"],[{rows}])}function getRelativeTime(timestamp2){let diff2=Date.now()-timestamp2;return diff2<1e3?"just now":(0,import_ms40.default)(diff2,{long:!0})+" ago"}var import_chalk297=__toESM(require_source(),1);async function inspect18(client,argv){let parsed=await parseSubcommandArgs(argv,inspectSubcommand13,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags,args}=parsed,teamId=org.type==="team"?org.id:void 0,showDiff=flags["--diff"],asJson=!!flags["--json"],identifier=args[0]==="inspect"?args[1]:args[0];if(!identifier)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Route name or ID is required. Pass a single route name or ID as the first argument after inspect.",next:[{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"replace <name-or-id> with route name or ID from routes list"},{command:withGlobalFlags2(client,"routes list"),when:"to list routes and copy an exact name or id"}]},2),2):(output_manager_default.error(`Missing route name or ID. Usage: ${import_chalk297.default.cyan(withGlobalFlags2(client,"routes inspect <name-or-id>"))}`),2);let inspectStamp=stamp_default();asJson||output_manager_default.spinner(`Searching for route "${identifier}" in ${import_chalk297.default.bold(project.name)}`);let{routes:routes2}=await getRoutes(client,project.id,{teamId,search:identifier}),exactMatch=routes2.find(r=>r.id===identifier||r.name.toLowerCase()===identifier.toLowerCase()),route;if(exactMatch)route=exactMatch;else{if(routes2.length===0)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_FOUND,message:`No route found matching "${identifier}".`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to list routes and pick an exact name or id"}]},1),1):(output_manager_default.error(`No route found matching "${identifier}". Run ${import_chalk297.default.cyan(withGlobalFlags2(client,"routes list"))} to see all routes.`),1);if(routes2.length===1)route=routes2[0];else{if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.AMBIGUOUS_ROUTE,message:`Multiple routes match "${identifier}" (${routes2.length} matches). Pass an exact route name or ID; non-interactive mode cannot prompt for a choice.`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to see route names and ids, then inspect with a unique id"},{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"retry with a single unique name or id"}]},1),1;if(asJson)return output_manager_default.error(`Multiple routes match "${identifier}" (${routes2.length} matches). Pass an exact route name or ID.`),1;output_manager_default.log(`Found ${routes2.length} routes matching "${identifier}" ${import_chalk297.default.gray(inspectStamp())}`);let selectedId=await client.input.select({message:"Select a route to inspect:",choices:routes2.map(r=>({value:r.id,name:`${r.name} ${import_chalk297.default.gray(`(${r.route.src})`)}`}))});if(!selectedId)return output_manager_default.error("No route selected"),1;let selected=routes2.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("Selected route not found"),1;route=selected}}if(asJson){let productionRoute=showDiff?(await getProductionRoute(client,project.id,teamId,route.id)).route??null:void 0;return client.stdout.write(`${JSON.stringify({route,productionRoute},null,2)}
1337
+ `),0}return output_manager_default.log(`Route found in ${import_chalk297.default.bold(project.name)} ${import_chalk297.default.gray(inspectStamp())}`),showDiff?await showRouteDiff(client,project.id,teamId,route):(output_manager_default.print(formatRouteDetails(route)),0)}async function getProductionRoute(client,projectId,teamId,routeId){let{versions:versions2}=await getRouteVersions(client,projectId,{teamId}),version2=versions2.find(v=>v.isLive);if(!version2)return{};let{routes:routes2}=await getRoutes(client,projectId,{teamId,versionId:version2.id});return{version:version2,route:routes2.find(r=>r.id===routeId)}}async function showRouteDiff(client,projectId,teamId,stagingRoute){let{version:productionVersion,route:productionRoute}=await getProductionRoute(client,projectId,teamId,stagingRoute.id);return productionVersion?productionRoute?(output_manager_default.print(formatRouteDiff(stagingRoute,productionRoute)),0):(output_manager_default.print(`
1330
1338
  ${import_chalk297.default.bold(stagingRoute.name)} ${import_chalk297.default.green("(new)")}
1331
1339
  `),output_manager_default.print(` ${import_chalk297.default.gray(stagingRoute.id)}
1332
1340
  `),output_manager_default.print(` ${import_chalk297.default.green("This route does not exist in production yet.")}
1333
- `),output_manager_default.print(formatRouteDetails(stagingRoute)),0)}function diffField(label,oldVal,newVal){return oldVal===newVal?newVal?` ${import_chalk297.default.cyan(label)} ${newVal}`:"":!oldVal&&newVal?`${import_chalk297.default.green("+")} ${import_chalk297.default.cyan(label)} ${newVal}`:oldVal&&!newVal?`${import_chalk297.default.red("-")} ${import_chalk297.default.cyan(label)} ${import_chalk297.default.strikethrough(oldVal)}`:`${import_chalk297.default.yellow("~")} ${import_chalk297.default.cyan(label)} ${import_chalk297.default.red(oldVal)} \u2192 ${import_chalk297.default.green(newVal)}`}function formatRouteDiff(staging,production){let lines=[""];if(!(JSON.stringify(normalizeForComparison(staging))!==JSON.stringify(normalizeForComparison(production))))return lines.push(` ${import_chalk297.default.bold(staging.name)}`),lines.push(` ${import_chalk297.default.gray(staging.id)}`),lines.push(""),lines.push(` ${import_chalk297.default.gray("No staged changes for this route.")}`),lines.push(""),lines.push(import_chalk297.default.bold(" Route Configuration")),lines.join(`
1341
+ `),output_manager_default.print(formatRouteDetails(stagingRoute)),0):(output_manager_default.log("No production version found. Showing current route."),output_manager_default.print(formatRouteDetails(stagingRoute)),0)}function diffField(label,oldVal,newVal){return oldVal===newVal?newVal?` ${import_chalk297.default.cyan(label)} ${newVal}`:"":!oldVal&&newVal?`${import_chalk297.default.green("+")} ${import_chalk297.default.cyan(label)} ${newVal}`:oldVal&&!newVal?`${import_chalk297.default.red("-")} ${import_chalk297.default.cyan(label)} ${import_chalk297.default.strikethrough(oldVal)}`:`${import_chalk297.default.yellow("~")} ${import_chalk297.default.cyan(label)} ${import_chalk297.default.red(oldVal)} \u2192 ${import_chalk297.default.green(newVal)}`}function formatRouteDiff(staging,production){let lines=[""];if(!(JSON.stringify(normalizeForComparison(staging))!==JSON.stringify(normalizeForComparison(production))))return lines.push(` ${import_chalk297.default.bold(staging.name)}`),lines.push(` ${import_chalk297.default.gray(staging.id)}`),lines.push(""),lines.push(` ${import_chalk297.default.gray("No staged changes for this route.")}`),lines.push(""),lines.push(import_chalk297.default.bold(" Route Configuration")),lines.join(`
1334
1342
  `)+`
1335
1343
  `+formatRouteDetails(staging);let typeLabels=getRouteTypeLabel(staging),syntaxLabel=getSrcSyntaxLabel(staging);lines.push(` ${import_chalk297.default.bold(staging.name)} ${import_chalk297.default.yellow("(modified)")}`),lines.push(` ${import_chalk297.default.gray(staging.id)}`),lines.push(""),production.description!==staging.description?(!production.description&&staging.description?lines.push(`${import_chalk297.default.green("+")} ${import_chalk297.default.cyan("Description:")} ${staging.description}`):production.description&&!staging.description?lines.push(`${import_chalk297.default.red("-")} ${import_chalk297.default.cyan("Description:")} ${import_chalk297.default.strikethrough(production.description)}`):lines.push(`${import_chalk297.default.yellow("~")} ${import_chalk297.default.cyan("Description:")} ${import_chalk297.default.red(production.description)} \u2192 ${import_chalk297.default.green(staging.description)}`),lines.push("")):staging.description&&(lines.push(` ${staging.description}`),lines.push(""));let prodStatusText=production.enabled===!1?"Disabled":"Enabled",stagingStatusText=staging.enabled===!1?"Disabled":"Enabled";lines.push(diffField("Status:",prodStatusText,stagingStatusText)||` ${import_chalk297.default.cyan("Status:")} ${stagingStatusText}`),lines.push(` ${import_chalk297.default.cyan("Type:")} ${typeLabels}`),lines.push(""),lines.push(import_chalk297.default.bold(" Route Configuration"));let srcLine=diffField("Source:",production.route.src,staging.route.src);lines.push(srcLine||` ${import_chalk297.default.cyan("Source:")} ${staging.route.src}`),lines.push(` ${import_chalk297.default.cyan("Syntax:")} ${syntaxLabel}`);let destLine=diffField("Destination:",production.route.dest,staging.route.dest);destLine?lines.push(destLine):staging.route.dest&&lines.push(` ${import_chalk297.default.cyan("Destination:")} ${staging.route.dest}`);let prodStatus=production.route.status?String(production.route.status):void 0,stagingStatus=staging.route.status?String(staging.route.status):void 0,statusLine=diffField("HTTP Status:",prodStatus,stagingStatus);statusLine?lines.push(statusLine):staging.route.status&&lines.push(` ${import_chalk297.default.cyan("HTTP Status:")} ${staging.route.status}`);let prodHeaders=production.route.headers??{},stagingHeaders=staging.route.headers??{},allHeaderKeys=new Set([...Object.keys(prodHeaders),...Object.keys(stagingHeaders)]);if(allHeaderKeys.size>0){lines.push(""),lines.push(import_chalk297.default.bold(" Response Headers"));for(let key of allHeaderKeys){let prodVal=prodHeaders[key],stagingVal=stagingHeaders[key];prodVal===stagingVal?lines.push(` ${import_chalk297.default.cyan(key+":")} ${stagingVal}`):prodVal?stagingVal?lines.push(`${import_chalk297.default.yellow("~")} ${import_chalk297.default.cyan(key+":")} ${import_chalk297.default.red(prodVal)} \u2192 ${import_chalk297.default.green(stagingVal)}`):lines.push(`${import_chalk297.default.red("-")} ${import_chalk297.default.cyan(key+":")} ${import_chalk297.default.strikethrough(prodVal)}`):lines.push(`${import_chalk297.default.green("+")} ${import_chalk297.default.cyan(key+":")} ${stagingVal}`)}}let prodTransforms=production.route.transforms??[],stagingTransforms=staging.route.transforms??[];if(prodTransforms.length>0||stagingTransforms.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Transforms"));let prodKeys=prodTransforms.map(transformKey),stagingKeys=stagingTransforms.map(transformKey);for(let i=0;i<stagingTransforms.length;i++){let key=stagingKeys[i],prodIdx=prodKeys.indexOf(key);if(prodIdx===-1)lines.push(`${import_chalk297.default.green("+")} ${formatTransform(stagingTransforms[i])}`);else{let prodArgs=stringifyArgs(prodTransforms[prodIdx].args),stagingArgs=stringifyArgs(stagingTransforms[i].args);prodArgs!==stagingArgs?lines.push(`${import_chalk297.default.yellow("~")} ${formatTransform(stagingTransforms[i])} ${import_chalk297.default.gray(`(was: ${prodArgs})`)}`):lines.push(` ${formatTransform(stagingTransforms[i])}`)}}for(let i=0;i<prodTransforms.length;i++){let key=prodKeys[i];stagingKeys.includes(key)||lines.push(`${import_chalk297.default.red("-")} ${import_chalk297.default.strikethrough(formatTransformPlain(prodTransforms[i]))}`)}}let prodHas=production.route.has??[],stagingHas=staging.route.has??[];(prodHas.length>0||stagingHas.length>0)&&(lines.push(""),lines.push(import_chalk297.default.bold(" Has Conditions")),diffConditions(lines,prodHas,stagingHas));let prodMissing=production.route.missing??[],stagingMissing=staging.route.missing??[];return(prodMissing.length>0||stagingMissing.length>0)&&(lines.push(""),lines.push(import_chalk297.default.bold(" Does Not Have Conditions")),diffConditions(lines,prodMissing,stagingMissing)),lines.push(""),lines.join(`
1336
1344
  `)}function normalizeForComparison(rule){return{name:rule.name,description:rule.description,enabled:rule.enabled,route:rule.route}}function transformKey(t){let key=isTargetTransform(t)?typeof t.target.key=="string"?t.target.key:JSON.stringify(t.target.key):stringifyArgs(t.args);return`${t.type}:${t.op}:${key}`}function stringifyArgs(args){return args===void 0?"":typeof args=="string"?args:Array.isArray(args)?args.join(", "):JSON.stringify(args)}function formatTransformPlain(transform){let typeLabel=TRANSFORM_TYPE_LABELS[transform.type]??transform.type,key=isTargetTransform(transform)?typeof transform.target.key=="string"?transform.target.key:JSON.stringify(transform.target.key):"path",parts=[`[${typeLabel}]`,transform.op,key];if(transform.args!==void 0&&transform.op!=="delete"){let argsStr=Array.isArray(transform.args)?transform.args.join(", "):transform.args;parts.push(`= ${argsStr}`)}return parts.join(" ")}function conditionKey(c){return JSON.stringify({type:c.type,key:c.key,value:c.value})}function diffConditions(lines,prodConditions,stagingConditions){let prodKeys=prodConditions.map(conditionKey),stagingKeys=stagingConditions.map(conditionKey);for(let cond of stagingConditions){let key=conditionKey(cond);prodKeys.includes(key)?lines.push(` ${formatCondition(cond)}`):lines.push(`${import_chalk297.default.green("+")} ${formatCondition(cond)}`)}for(let cond of prodConditions){let key=conditionKey(cond);stagingKeys.includes(key)||lines.push(`${import_chalk297.default.red("-")} ${formatCondition(cond)}`)}}function formatRouteDetails(rule){let lines=[""],typeLabels=getRouteTypeLabel(rule),syntaxLabel=getSrcSyntaxLabel(rule),statusText=rule.enabled===!1?import_chalk297.default.red("Disabled"):import_chalk297.default.green("Enabled");lines.push(` ${import_chalk297.default.bold(rule.name)}`),lines.push(` ${import_chalk297.default.gray(rule.id)}`),lines.push(""),rule.description&&(lines.push(` ${rule.description}`),lines.push("")),lines.push(` ${import_chalk297.default.cyan("Status:")} ${statusText}`),rule.staged===!0?lines.push(` ${import_chalk297.default.cyan("State:")} ${import_chalk297.default.yellow("Staged (not yet published)")}`):rule.staged===!1&&lines.push(` ${import_chalk297.default.cyan("State:")} ${import_chalk297.default.green("Published")}`),lines.push(` ${import_chalk297.default.cyan("Type:")} ${typeLabels}`),lines.push(""),lines.push(import_chalk297.default.bold(" Route Configuration")),lines.push(` ${import_chalk297.default.cyan("Source:")} ${rule.route.src}`),lines.push(` ${import_chalk297.default.cyan("Syntax:")} ${syntaxLabel}`),rule.route.dest&&lines.push(` ${import_chalk297.default.cyan("Destination:")} ${rule.route.dest}`),rule.route.status&&lines.push(` ${import_chalk297.default.cyan("HTTP Status:")} ${rule.route.status}`);let responseHeaderSets=Object.entries(rule.route.headers??{}),allTransforms=rule.route.transforms??[],responseHeaderTransforms=allTransforms.filter(t=>t.type==="response.headers"),requestHeaderTransforms=allTransforms.filter(t=>t.type==="request.headers"),requestQueryTransforms=allTransforms.filter(t=>t.type==="request.query"),requestPathTransforms=allTransforms.filter(t=>t.type==="request.path");if(responseHeaderSets.length>0||responseHeaderTransforms.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Response Headers"));for(let[key,value]of responseHeaderSets)lines.push(` ${import_chalk297.default.yellow("set")} ${import_chalk297.default.cyan(key)} = ${value}`);for(let t of responseHeaderTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestHeaderTransforms.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Request Headers"));for(let t of requestHeaderTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestQueryTransforms.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Request Query"));for(let t of requestQueryTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestPathTransforms.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Request Path"));for(let t of requestPathTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(rule.route.has&&rule.route.has.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Has Conditions"));for(let condition of rule.route.has)lines.push(` ${formatCondition(condition)}`)}if(rule.route.missing&&rule.route.missing.length>0){lines.push(""),lines.push(import_chalk297.default.bold(" Does Not Have Conditions"));for(let condition of rule.route.missing)lines.push(` ${formatCondition(condition)}`)}return lines.push(""),lines.join(`
@@ -1361,7 +1369,7 @@ ${import_chalk291.default.gray("No changes detected from current production vers
1361
1369
  `),output_manager_default.print(` ${import_chalk298.default.gray("ID:")} ${route.id}
1362
1370
  `),output_manager_default.print(`
1363
1371
  ${import_chalk298.default.bold("Staging version:")} ${version2.id}
1364
- `),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_CONFIG59={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG59),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-NRJCMP4B.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-KJMVCQ7C.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-FVXIP7NX.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-666GPFHE.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-P4AXRPMF.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-VPGLK5KL.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-4NSLHSHF.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-WM4EZHD4.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-RUQPJMOG.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG59)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var import_ms42=__toESM(require_ms(),1);var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFor(duration){duration&&this.trackCliOption({option:"for",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="schedule_already_active"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.SCHEDULE_ALREADY_ACTIVE,message:context.name?`Schedule ${context.namespace}/${context.name} is already enabled without an end time. Disable it first, then enable it with --until or --for.`:"The schedule is already enabled without an end time. Disable it first, then enable it with --until or --for.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes","--until","--for"]}),when:"Disable the schedule before enabling it with an end time"}]}}}if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,activeUntil}){return this.changeState(name,namespace,"enable",activeUntil===void 0?void 0:{until:activeUntil})}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action,body){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0,...body&&{body}});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var import_ms41=__toESM(require_ms(),1),MAX_IDENTIFIER_LENGTH2=256,IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/,MAX_QUEUE_TOPIC_LENGTH=256,QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/,MAX_JITTER_MINUTES=15,LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>MAX_IDENTIFIER_LENGTH2)return`${label} must be at most ${MAX_IDENTIFIER_LENGTH2} characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>MAX_QUEUE_TOPIC_LENGTH||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>MAX_JITTER_MINUTES?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var UNIX_MILLISECONDS_PATTERN=/^\d+$/,ISO_DATE_PATTERN=/^(\d{4})-(\d{2})-(\d{2})/,DURATION_PATTERN=/^\d+(?:\.\d+)?\s*[a-z]+$/i;function parseEnableUntil(until,duration,now=Date.now()){if(until!==void 0&&duration!==void 0)return{valid:!1,error:"`--until` and `--for` cannot be used together."};if(duration!==void 0){let durationMs=DURATION_PATTERN.test(duration.trim())?(0,import_ms41.default)(duration.trim()):void 0;return durationMs===void 0||!(durationMs>0)?{valid:!1,error:"`--for` must be a duration such as 30m, 5h, or 10s."}:{valid:!0,value:now+durationMs}}if(until===void 0)return{valid:!0,value:void 0};let untilMs,isoDate=ISO_DATE_PATTERN.exec(until);if(UNIX_MILLISECONDS_PATTERN.test(until))untilMs=Number(until);else if(isoDate){let[,year,month,day]=isoDate.map(Number),daysInMonth=new Date(Date.UTC(year,month,0)).getUTCDate();untilMs=day>=1&&day<=daysInMonth?Date.parse(until):NaN}else return{valid:!1,error:DURATION_PATTERN.test(until.trim())?`\`--until\` must be a time, not a duration. Use \`--for ${until.trim()}\` instead.`:"`--until` must be an ISO 8601 time or Unix milliseconds."};return Number.isFinite(untilMs)?untilMs<=now?{valid:!1,error:"`--until` must be in the future."}:{valid:!0,value:untilMs}:{valid:!1,error:"`--until` must be an ISO 8601 time or Unix milliseconds."}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
1372
+ `),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_CONFIG59={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG59),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-CALU7PMG.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-LV744KVD.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-7GKPLJNR.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-N7WZSMD4.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-IU6GZK4H.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-BSOJAVDV.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-EDLEZCAF.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-7KOACNT7.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-2DN52DNW.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG59)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var import_ms42=__toESM(require_ms(),1);var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFor(duration){duration&&this.trackCliOption({option:"for",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="schedule_already_active"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.SCHEDULE_ALREADY_ACTIVE,message:context.name?`Schedule ${context.namespace}/${context.name} is already enabled without an end time. Disable it first, then enable it with --until or --for.`:"The schedule is already enabled without an end time. Disable it first, then enable it with --until or --for.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes","--until","--for"]}),when:"Disable the schedule before enabling it with an end time"}]}}}if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,activeUntil}){return this.changeState(name,namespace,"enable",activeUntil===void 0?void 0:{until:activeUntil})}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action,body){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0,...body&&{body}});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var import_ms41=__toESM(require_ms(),1),MAX_IDENTIFIER_LENGTH2=256,IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/,MAX_QUEUE_TOPIC_LENGTH=256,QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/,MAX_JITTER_MINUTES=15,LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>MAX_IDENTIFIER_LENGTH2)return`${label} must be at most ${MAX_IDENTIFIER_LENGTH2} characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>MAX_QUEUE_TOPIC_LENGTH||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>MAX_JITTER_MINUTES?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var UNIX_MILLISECONDS_PATTERN=/^\d+$/,ISO_DATE_PATTERN=/^(\d{4})-(\d{2})-(\d{2})/,DURATION_PATTERN=/^\d+(?:\.\d+)?\s*[a-z]+$/i;function parseEnableUntil(until,duration,now=Date.now()){if(until!==void 0&&duration!==void 0)return{valid:!1,error:"`--until` and `--for` cannot be used together."};if(duration!==void 0){let durationMs=DURATION_PATTERN.test(duration.trim())?(0,import_ms41.default)(duration.trim()):void 0;return durationMs===void 0||!(durationMs>0)?{valid:!1,error:"`--for` must be a duration such as 30m, 5h, or 10s."}:{valid:!0,value:now+durationMs}}if(until===void 0)return{valid:!0,value:void 0};let untilMs,isoDate=ISO_DATE_PATTERN.exec(until);if(UNIX_MILLISECONDS_PATTERN.test(until))untilMs=Number(until);else if(isoDate){let[,year,month,day]=isoDate.map(Number),daysInMonth=new Date(Date.UTC(year,month,0)).getUTCDate();untilMs=day>=1&&day<=daysInMonth?Date.parse(until):NaN}else return{valid:!1,error:DURATION_PATTERN.test(until.trim())?`\`--until\` must be a time, not a duration. Use \`--for ${until.trim()}\` instead.`:"`--until` must be an ISO 8601 time or Unix milliseconds."};return Number.isFinite(untilMs)?untilMs<=now?{valid:!1,error:"`--until` must be in the future."}:{valid:!0,value:untilMs}:{valid:!1,error:"`--until` must be an ISO 8601 time or Unix milliseconds."}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
1365
1373
  `)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand4:action==="disable"?disableSubcommand4:invokeSubcommand,usage2=`schedules ${action} <name>`,telemetry2=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,enableFlags=flags;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,usage2);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionUntil(enableFlags["--until"]),telemetry2.trackCliOptionFor(enableFlags["--for"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage2);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage2,flags);if(!outputMode.valid)return outputMode.exitCode;let activeUntil=parseEnableUntil(enableFlags["--until"],enableFlags["--for"]);if(!activeUntil.valid)return invalidScheduleArguments(client,usage2,activeUntil.error);if(flags["--local"]&&activeUntil.value!==void 0)return invalidScheduleArguments(client,usage2,"Cannot combine --local with --until or --for. Local Schedules does not support enabling a schedule until a time.");let schedulesClient=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedulesClient=="number")return schedulesClient;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedule;try{action==="enable"?schedule=await schedulesClient.enable({...identifier,activeUntil:activeUntil.value}):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let pastTense=action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked",enabledUntil=schedule?.activeUntil??activeUntil.value,message=action==="enable"&&enabledUntil!==void 0?`${pastTense} schedule ${identifier.namespace}/${identifier.name} until ${new Date(enabledUntil).toISOString()} (in ${(0,import_ms42.default)(Math.max(enabledUntil-Date.now(),1e3),{long:!0})}).`:`${pastTense} schedule ${identifier.namespace}/${identifier.name}.`;if(schedule)return writeScheduleMutationResult(client,schedule,message,outputMode.json);if(outputMode.json){let result=client.nonInteractive?{status:AGENT_STATUS.OK,message}:{invoked:!0,name:identifier.name,namespace:identifier.namespace};client.stdout.write(`${JSON.stringify(result,null,2)}
1366
1374
  `)}else output_manager_default.success(message);return 0}var SchedulesCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionCron(cron){cron&&this.trackCliOption({option:"cron",value:this.redactedValue})}trackCliOptionAt(at){at&&this.trackCliOption({option:"at",value:this.redactedValue})}trackCliOptionTimezone(timezone){timezone&&this.trackCliOption({option:"timezone",value:timezone})}trackCliOptionJitter(jitter){jitter!==void 0&&this.trackCliOption({option:"jitter",value:String(jitter)})}trackCliOptionTopic(topic){topic&&this.trackCliOption({option:"topic",value:this.redactedValue})}trackCliOptionPayload(payload){payload!==void 0&&this.trackCliOption({option:"payload",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE13="schedules create <name> --cron <expression> --topic <topic>";async function create6(client,argv){let telemetry2=new SchedulesCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(createSubcommand6.options))}catch(error){return invalidScheduleArguments(client,USAGE13,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE13);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionCron(flags["--cron"]),telemetry2.trackCliOptionAt(flags["--at"]),telemetry2.trackCliOptionTimezone(flags["--timezone"]),telemetry2.trackCliOptionJitter(flags["--jitter"]),telemetry2.trackCliOptionTopic(flags["--topic"]),telemetry2.trackCliOptionPayload(flags["--payload"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE13);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!0);if(!expression.valid)return invalidScheduleArguments(client,USAGE13,expression.error);let topic=flags["--topic"];if(!topic?.trim())return invalidScheduleArguments(client,USAGE13,"A target queue topic is required. Use `--topic`.");let topicError=validateScheduleQueueTopic(topic);if(topicError)return invalidScheduleArguments(client,USAGE13,topicError);let jitter=parseCreateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE13,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE13,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE13,payload.error);let outputMode=parseScheduleOutput(client,USAGE13,flags);if(!outputMode.valid)return outputMode.exitCode;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await schedules.create({name:identifier.name,namespace:identifier.namespace,expression:expression.value,target:{topic},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...jitter.value!==void 0&&{jitter:jitter.value},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"create",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Created schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var SchedulesDeleteTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE14="schedules delete <name> --yes";async function deleteSchedule(client,argv){let telemetry2=new SchedulesDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(deleteSubcommand4.options))}catch(error){return invalidScheduleArguments(client,USAGE14,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE14);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE14);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,USAGE14,flags);if(!outputMode.valid)return outputMode.exitCode;let skipConfirmation=flags["--yes"]??!1;if(client.nonInteractive&&!skipConfirmation)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:flags["--local"]?"Deleting a local schedule requires confirmation. Re-run with `--yes`.":"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:flags["--local"]?scheduleCommandWithGlobalFlags(client,`schedules delete ${quoteArg(identifier.name)} --namespace ${quoteArg(identifier.namespace)} --yes`):buildCommandWithYes(client.argv)}]},1),1;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;let target=flags["--local"]?"local schedule":"schedule";if(!skipConfirmation&&!await client.input.confirm(`Delete ${target} ${identifier.namespace}/${identifier.name}? This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;outputMode.json||output_manager_default.spinner("Deleting schedule\u2026");let deletedScheduleId;try{deletedScheduleId=(await schedules.delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted ${target} ${identifier.namespace}/${identifier.name}.`;if(outputMode.json){let deleted={name:identifier.name,namespace:identifier.namespace,scheduleId:deletedScheduleId},result=client.nonInteractive?{status:AGENT_STATUS.OK,deleted,message}:{deleted:!0,...deleted};client.stdout.write(`${JSON.stringify(result,null,2)}
1367
1375
  `)}else output_manager_default.success(message);return 0}var import_chalk299=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"List schedule executions with valid options"}]}),2):(output_manager_default.fatal(message),2)}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExecutionStatus(status6){return status6==="succeeded"?import_chalk299.default.green("Succeeded"):status6==="failed"?import_chalk299.default.red("Failed"):import_chalk299.default.gray("Unavailable")}function formatPercentage3(value){return value===null?import_chalk299.default.gray("-"):`${Number((value*100).toFixed(2))}%`}function formatDuration3(value){return value===null?import_chalk299.default.gray("-"):value<1e3?`${Math.round(value)}ms`:value<6e4?`${Number((value/1e3).toFixed(1))}s`:`${Number((value/6e4).toFixed(1))}m`}function formatInvocationCount(value){return`${value} invocation${value===1?"":"s"}`}function executionMetrics(metrics2){return[formatAlignedLabel("Range",`${formatDate(metrics2.from)} \u2013 ${formatDate(metrics2.to)}`),formatAlignedLabel("Recorded",formatInvocationCount(metrics2.recordedInvocations)),formatAlignedLabel("Failed",formatInvocationCount(metrics2.failedInvocations)),formatAlignedLabel("Error Rate",formatPercentage3(metrics2.errorRate)),formatAlignedLabel("Avg Duration",formatDuration3(metrics2.averageDurationMs))].join(`
@@ -1472,12 +1480,13 @@ Common cases:
1472
1480
  \u2022 Create a new classic token in the dashboard (Account \u2192 Settings \u2192 Tokens) with access to your personal account / full token permissions.
1473
1481
  \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,rerun2,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:rerun2,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),2}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 create "My token"`'},2),output_manager_default.error('Token name is required. Example: `vercel tokens create "My token"`'),2;if(args.length>1)return output_manager_default.error("Too many arguments. Pass a single token name."),2;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 rerun2=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,rerun2,"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 rerun2=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,rerun2,"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)}
1474
1482
  `),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),2}let id2=parsedArgs.args[0];if(!id2)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"}]},2),output_manager_default.error("Token id is required. Example: `vercel tokens rm tok_abc123`"),2;if(parsedArgs.args.length>1)return output_manager_default.error("Too many arguments. Pass a single token id."),2;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(id2)}`,{method:"DELETE",useCurrentTeam:!1}),asJson?(client.stdout.write(`${JSON.stringify({ok:!0,id:id2},null,2)}
1475
- `),0):(output_manager_default.success(`Removed token ${id2}`),0)}var TokensTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG66={add:["add","create"],remove:["rm","remove","delete"],ls:["ls","list"]};async function main35(client){let parsedArgs,flagsSpecification=getFlagsSpecification(tokensCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new TokensTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("tokens"),output_manager_default.print(help(tokensCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:tokensCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(addSubcommand12)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"tokens add","tokens create"),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(listSubcommand25)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls10(client,args))}}async function tokenPass(client){let originalArgv=[...client.argv],tokens=tokensAfterCommand(originalArgv),commandIndex=originalArgv.length-tokens.length-1,{args}=getSubcommand7(tokens,{setup:["setup"]}),forwarded=[...originalArgv.slice(2,commandIndex),"--token-pass",...args];client.setArgv([...originalArgv.slice(0,2),"ai-gateway","coding-agents","setup",...forwarded]);try{return await codingAgentsSetup(client,forwarded)}finally{client.setArgv(originalArgv)}}var import_chalk324=__toESM(require_source(),1);async function status4(client){let enabled=client.config.telemetry?.enabled!==!1,status6=enabled?import_chalk324.default.green("Enabled"):import_chalk324.default.red("Disabled");output_manager_default.print(`
1483
+ `),0):(output_manager_default.success(`Removed token ${id2}`),0)}var TokensTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG66={add:["add","create"],remove:["rm","remove","delete"],ls:["ls","list"]};async function main35(client){let parsedArgs,flagsSpecification=getFlagsSpecification(tokensCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new TokensTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("tokens"),output_manager_default.print(help(tokensCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:tokensCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("tokens",subcommandOriginal),printHelp(addSubcommand12)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"tokens add","tokens create"),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(listSubcommand25)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls10(client,args))}}async function tokenPass(client){let originalArgv=[...client.argv],tokens=tokensAfterCommand(originalArgv),commandIndex=originalArgv.length-tokens.length-1,{args}=getSubcommand7(tokens,{setup:["setup"]}),forwarded=[...originalArgv.slice(2,commandIndex),"--token-pass",...args];client.setArgv([...originalArgv.slice(0,2),"ai-gateway","coding-agents","setup",...forwarded]);try{return await codingAgentsSetup(client,forwarded)}finally{client.setArgv(originalArgv)}}var import_chalk324=__toESM(require_source(),1);async function status4(client,asJson=!1){let enabled=client.config.telemetry?.enabled!==!1;if(asJson)return client.stdout.write(`${JSON.stringify({telemetry:{enabled}},null,2)}
1484
+ `),0;let status6=enabled?import_chalk324.default.green("Enabled"):import_chalk324.default.red("Disabled");output_manager_default.print(`
1476
1485
  `),output_manager_default.log(`${import_chalk324.default.bold("Telemetry status")}: ${status6}
1477
1486
  `);let learnMoreMessage=`
1478
1487
 
1479
1488
  Learn more: ${import_chalk324.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}},client.writeToConfigFile(),await status4(client),0}async function disable5(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!1}},client.writeToConfigFile(),await status4(client),0}import{randomUUID as randomUUID3}from"node:crypto";function configPreference(value){return value===void 0?"unset":value?"enabled":"disabled"}function getConfigTelemetryEvents(config){return[{key:"config_auto_update",value:configPreference(config.updates?.auto)},{key:"config_bypass_min_release_age",value:configPreference(config.updates?.bypassMinReleaseAge)},{key:"config_use_native_binary",value:configPreference(config.useNativeBinary)},{key:"config_credential_storage",value:config.credStorage??"unset"}]}import{createHash as createHash5,randomUUID as randomUUID2}from"node:crypto";import{mkdir as mkdir2,readFile as readFile10,realpath,rename as rename2,rm as rm11,writeFile as writeFile7}from"node:fs/promises";import{dirname as dirname8,join as join40,resolve as resolve13}from"node:path";function getPackageManagerInstallCommand(context,version2="latest"){if(context.upgradeCommand===void 0)throw context.upgradeError;return context.upgradeCommand.includes("@latest")?context.upgradeCommand.replace("@latest",`@${version2}`):context.upgradeCommand}async function resolvePackageManagerContext(version2,runtime,options){try{let info=await getUpdateCommandInfo(void 0,options.signal);return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:info.packageManager,packageManagerAssumed:info.assumed,global:info.global,upgradeCommand:info.command}}catch(error){if(options.signal?.aborted)throw error;let upgradeError=error instanceof Error?error:new Error("Could not detect a supported global npm, pnpm, Yarn, or Bun installation of Vercel CLI. Update it with the package manager that installed it.");return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:void 0,packageManagerAssumed:!1,global:void 0,upgradeCommand:void 0,upgradeError}}}async function getVersionContext(options={}){let version2=pkg_default.version,runtime=isNativeBinaryInstall()?"native":"node";if(await isCurlInstall()){let installRoot=getInstallRoot(),state=await readNativeInstallState(installRoot);return{version:version2,runtime:"native",manager:"installer",canSwitchVersions:!0,installRoot,track:state?.track,slot:state?.slot,activeVersion:state?.version,pendingProduction:state?.pendingProduction,prBuild:state?.track==="pr"&&state.pr?{number:state.pr,sha:state.buildSha}:void 0}}return resolvePackageManagerContext(version2,runtime,options)}function describeRuntime(context){return context.runtime==="native"?"native binary":"Node.js"}function describeManager(context){if(context.manager==="installer")return`Vercel installer (${context.installRoot})`;if(context.global===void 0)return"package manager (unsupported installation)";let scope=context.global?"global":"local";return context.packageManagerAssumed?`package manager (assumed ${context.packageManager}, ${scope})`:`package manager (${context.packageManager}, ${scope})`}var VERSION_CONTEXT_TIMEOUT_MS=1e4;function getVersionContextTelemetryEvents(context){let events=[{key:"version_context_status",value:context.status},{key:"version_context_source",value:context.source}];return context.status!=="resolved"||(events.push({key:"version_context_runtime",value:context.runtime},{key:"version_context_manager",value:context.manager}),context.manager==="installer"?events.push({key:"version_context_track",value:context.track},{key:"version_context_slot",value:context.slot}):events.push({key:"version_context_package_manager",value:context.packageManager},{key:"version_context_package_manager_assumed",value:String(context.packageManagerAssumed)},{key:"version_context_global",value:String(context.global)})),events}async function collectVersionContextForTelemetry(timeoutMs=VERSION_CONTEXT_TIMEOUT_MS){let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new Error("Version context collection timed out"))},timeoutMs);timeout.unref();try{let context=await getVersionContext({signal:controller.signal});return context.manager==="installer"?{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,track:context.track??"legacy",slot:context.slot??"legacy"}:{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,packageManager:context.packageManager??"unknown",packageManagerAssumed:context.packageManagerAssumed,global:context.global??"unknown"}}catch{return{status:controller.signal.aborted?"cancelled":"error",source:"detected"}}finally{clearTimeout(timeout)}}var VERSION_CONTEXT_CACHE_MAX_AGE_MS=7*24*60*60*1e3,VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS=60*60*1e3,VERSION_CONTEXT_CACHE_SCHEMA_VERSION=1,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS=20,VERSION_CONTEXT_CACHE_LOCK_WAIT_MS=250;function isResolvedVersionContext(value){if(!value||typeof value!="object")return!1;let context=value;return context.status!=="resolved"||context.source!=="detected"&&context.source!=="cache"||context.runtime!=="native"&&context.runtime!=="node"?!1:context.manager==="installer"?(context.track==="production"||context.track==="pr"||context.track==="legacy")&&(context.slot==="a"||context.slot==="b"||context.slot==="legacy"):context.manager==="package-manager"&&typeof context.packageManagerAssumed=="boolean"&&typeof context.packageManager=="string"&&(typeof context.global=="boolean"||context.global==="unknown")}function isVersionContext(value){if(isResolvedVersionContext(value))return!0;if(!value||typeof value!="object")return!1;let context=value;return(context.status==="cancelled"||context.status==="error")&&(context.source==="detected"||context.source==="cache")}async function readVersionContextCache(filePath){try{let value=JSON.parse(await readFile10(filePath,"utf8"));if(value.schemaVersion===VERSION_CONTEXT_CACHE_SCHEMA_VERSION&&value.installations&&typeof value.installations=="object")return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:value.installations}}catch{}return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:{}}}async function writeVersionContextCache(filePath,cache){let temporaryPath=`${filePath}.${process.pid}.${randomUUID2()}.tmp`;try{await mkdir2(dirname8(filePath),{recursive:!0}),await writeFile7(temporaryPath,`${JSON.stringify(cache,null,2)}
1480
- `,{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 join40(globalConfigDirectory,"telemetry-version-context.json")}async function getVersionContextInstallationKey(){let runtime=isNativeBinaryInstall()?"native":"node",entrypoint=runtime==="native"?process.execPath:process.argv[1],canonicalEntrypoint=await realpath(entrypoint).catch(()=>resolve13(entrypoint));return createHash5("sha256").update(`${runtime}\0${canonicalEntrypoint}`).digest("hex")}async function collectCachedVersionContextForTelemetry({cacheFilePath=getVersionContextCacheFilePath(),failureMaxAgeMs=VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS,installationKey,maxAgeMs=VERSION_CONTEXT_CACHE_MAX_AGE_MS,now=Date.now,timeoutMs=VERSION_CONTEXT_TIMEOUT_MS}={}){let key=installationKey??await getVersionContextInstallationKey(),currentTime=now(),initialCache=await readVersionContextCache(cacheFilePath),initialContext=getFreshContext(initialCache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(initialContext)return initialContext;try{return await withDirectoryLock(`${cacheFilePath}.lock`,async()=>{let cache=await readVersionContextCache(cacheFilePath),contextAfterLock=getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(contextAfterLock)return contextAfterLock;let context=await collectVersionContextForTelemetry(timeoutMs);try{cache.installations[key]={collectedAt:currentTime,context:{...context,source:"detected"}},cache.installations=boundedInstallations(cache.installations),await writeVersionContextCache(cacheFilePath,cache)}catch{}return context},{waitMs:VERSION_CONTEXT_CACHE_LOCK_WAIT_MS,retryMs:25,abandonedAfterMs:3e4,busyMessage:()=>"Version context cache is busy"})}catch{let cache=await readVersionContextCache(cacheFilePath);return getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs)??{status:"cancelled",source:"detected"}}}var TELEMETRY_FLUSH_TIMEOUT_MS=1e4;async function flush(client,args,{timeoutMs=TELEMETRY_FLUSH_TIMEOUT_MS}={}){let url=process.env.VERCEL_TELEMETRY_BRIDGE_URL||"https://telemetry.vercel.com/api/vercel-cli/v1/events",{headers,body,invocationId}=JSON.parse(args[0]),versionContext=await collectCachedVersionContextForTelemetry().catch(()=>({status:"error",source:"detected"})),firstEvent=body[0],contextEvents=[...getVersionContextTelemetryEvents(versionContext),...getConfigTelemetryEvents(client.config)];for(let event of contextEvents)body.push({id:randomUUID3(),event_time:Date.now(),team_id:firstEvent?.team_id,user_id:firstEvent?.user_id,project_id:firstEvent?.project_id,...event});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),response;try{response=await fetch2(url,{method:"POST",headers,body:JSON.stringify(body.map(event=>invocationId&&event.invocation_id==null?{...event,invocation_id:invocationId}:event)),signal:controller.signal});let status6=response.status,wasRecorded=(response.headers.get("x-vercel-cli-tracked")||"")==="1";return status6===204?wasRecorded?process.stderr.write("Telemetry event tracked"):process.stderr.write("Telemetry event ignored"):process.stderr.write(`Failed to send telemetry events. Unexpected response from telemetry server: ${status6}`),0}catch(error){return error instanceof Error&&process.stderr.write(`Failed to send telemetry events. ${error.message}`),1}finally{response?.body?.cancel().catch(()=>{}),clearTimeout(timeout)}}var TelemetryTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(_){}trackCliSubcommandFlush(_){}};var import_chalk325=__toESM(require_source(),1);var COMMAND_CONFIG67={status:getCommandAliases(statusSubcommand6),enable:getCommandAliases(enableSubcommand5),disable:getCommandAliases(disableSubcommand5),flush:getCommandAliases(flushSubcommand)};async function telemetry(client){let telemetryClient=new TelemetryTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(telemetryCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG67),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:telemetryCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("telemetry",subcommand),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(statusSubcommand6),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status4(client));case"flush":return flush(client,args);case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(enableSubcommand5),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable5(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(disableSubcommand5),0):disable5(client);default:{let errorMessage2=parsedArguments.args.length!==2?"Invalid number of arguments":"Invalid subcommand";return output_manager_default.print(`${import_chalk325.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
1489
+ `,{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 join40(globalConfigDirectory,"telemetry-version-context.json")}async function getVersionContextInstallationKey(){let runtime=isNativeBinaryInstall()?"native":"node",entrypoint=runtime==="native"?process.execPath:process.argv[1],canonicalEntrypoint=await realpath(entrypoint).catch(()=>resolve13(entrypoint));return createHash5("sha256").update(`${runtime}\0${canonicalEntrypoint}`).digest("hex")}async function collectCachedVersionContextForTelemetry({cacheFilePath=getVersionContextCacheFilePath(),failureMaxAgeMs=VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS,installationKey,maxAgeMs=VERSION_CONTEXT_CACHE_MAX_AGE_MS,now=Date.now,timeoutMs=VERSION_CONTEXT_TIMEOUT_MS}={}){let key=installationKey??await getVersionContextInstallationKey(),currentTime=now(),initialCache=await readVersionContextCache(cacheFilePath),initialContext=getFreshContext(initialCache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(initialContext)return initialContext;try{return await withDirectoryLock(`${cacheFilePath}.lock`,async()=>{let cache=await readVersionContextCache(cacheFilePath),contextAfterLock=getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(contextAfterLock)return contextAfterLock;let context=await collectVersionContextForTelemetry(timeoutMs);try{cache.installations[key]={collectedAt:currentTime,context:{...context,source:"detected"}},cache.installations=boundedInstallations(cache.installations),await writeVersionContextCache(cacheFilePath,cache)}catch{}return context},{waitMs:VERSION_CONTEXT_CACHE_LOCK_WAIT_MS,retryMs:25,abandonedAfterMs:3e4,busyMessage:()=>"Version context cache is busy"})}catch{let cache=await readVersionContextCache(cacheFilePath);return getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs)??{status:"cancelled",source:"detected"}}}var TELEMETRY_FLUSH_TIMEOUT_MS=1e4;async function flush(client,args,{timeoutMs=TELEMETRY_FLUSH_TIMEOUT_MS}={}){let url=process.env.VERCEL_TELEMETRY_BRIDGE_URL||"https://telemetry.vercel.com/api/vercel-cli/v1/events",{headers,body,invocationId}=JSON.parse(args[0]),versionContext=await collectCachedVersionContextForTelemetry().catch(()=>({status:"error",source:"detected"})),firstEvent=body[0],contextEvents=[...getVersionContextTelemetryEvents(versionContext),...getConfigTelemetryEvents(client.config)];for(let event of contextEvents)body.push({id:randomUUID3(),event_time:Date.now(),team_id:firstEvent?.team_id,user_id:firstEvent?.user_id,project_id:firstEvent?.project_id,...event});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),response;try{response=await fetch2(url,{method:"POST",headers,body:JSON.stringify(body.map(event=>invocationId&&event.invocation_id==null?{...event,invocation_id:invocationId}:event)),signal:controller.signal});let status6=response.status,wasRecorded=(response.headers.get("x-vercel-cli-tracked")||"")==="1";return status6===204?wasRecorded?process.stderr.write("Telemetry event tracked"):process.stderr.write("Telemetry event ignored"):process.stderr.write(`Failed to send telemetry events. Unexpected response from telemetry server: ${status6}`),0}catch(error){return error instanceof Error&&process.stderr.write(`Failed to send telemetry events. ${error.message}`),1}finally{response?.body?.cancel().catch(()=>{}),clearTimeout(timeout)}}var TelemetryTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(_){}trackCliSubcommandFlush(_){}};var import_chalk325=__toESM(require_source(),1);var COMMAND_CONFIG67={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;try{let argv=client.argv.slice(2),{subcommand:typed}=getSubcommand7(parseArguments(argv,getFlagsSpecification(telemetryCommand.options),{permissive:!0}).args.slice(1),COMMAND_CONFIG67);parsedArguments=parseArguments(argv,getFlagsSpecification([...telemetryCommand.options,...typed==="status"?statusSubcommand6.options:[]]))}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG67),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:telemetryCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("telemetry",subcommand),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(statusSubcommand6),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status4(client,!!parsedArguments.flags["--json"]));case"flush":return flush(client,args);case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(enableSubcommand5),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable5(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(disableSubcommand5),0):disable5(client);default:{let errorMessage2=parsedArguments.args.length!==2?"Invalid number of arguments":"Invalid subcommand";return output_manager_default.print(`${import_chalk325.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
1481
1490
  `),output_manager_default.print(help(telemetryCommand,{columns:client.stderr.columns})),2}}}var TracesTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2,kind="requestId"){id2&&this.trackCliArgument({arg:kind,value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliOptionEnvironment(value){this.trackRedactedOption("environment",value)}trackCliOptionService(value){this.trackRedactedOption("service",value)}trackCliOptionName(value){this.trackRedactedOption("name",value)}trackCliOptionKind(value){this.trackRedactedOption("kind",value)}trackCliOptionStatus(value){this.trackRedactedOption("status",value)}trackCliOptionDeploymentId(value){this.trackRedactedOption("deployment-id",value)}trackCliOptionRequestId(value){this.trackRedactedOption("request-id",value)}trackCliOptionTraceId(value){this.trackRedactedOption("trace-id",value)}trackCliOptionSpanId(value){this.trackRedactedOption("span-id",value)}trackCliFlagRoot(root){root&&this.trackCliFlag("root")}trackCliOptionSince(value){this.trackRedactedOption("since",value)}trackCliOptionUntil(value){this.trackRedactedOption("until",value)}trackCliOptionLimit(value){value!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionQuery(value){this.trackRedactedOption("query",value)}trackCliOptionColumns(value){this.trackRedactedOption("columns",value)}trackCliOptionNext(value){this.trackRedactedOption("next",value)}trackRedactedOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackCliOptionView(view){view&&this.trackCliOption({option:"view",value:view})}};var import_chalk326=__toESM(require_source(),1),import_open20=__toESM(require_open(),1);var OBSERVABILITY_API_URL="https://vercel.com/api/observability-api/",QUERY_REASON_HEADER2="x-vercel-observability-query-reason",QUERY_REASON="cli/traces-get",QueryEngineResponseError=class extends Error{constructor(message){super(message),this.name="QueryEngineResponseError"}};async function fetchTrace({client,teamId,projectId,requestId,traceId}){let traceUrl=new URL(traceId!==void 0?`v1/traces/${encodeURIComponent(traceId)}`:`v1/traces/requests/${encodeURIComponent(requestId)}`,OBSERVABILITY_API_URL);traceUrl.searchParams.set("teamId",teamId),traceUrl.searchParams.set("projectId",projectId);let response=await client.fetch(traceUrl.href,{headers:{[QUERY_REASON_HEADER2]:QUERY_REASON}});return{trace:mapTrace(response),partial:isRecord4(response.meta)&&response.meta.partial===!0}}function mapTrace(response){if(!isRecord4(response)||typeof response.traceId!="string"||!Array.isArray(response.spans))throw new QueryEngineResponseError("Observability API returned an invalid resolved trace.");return{traceId:response.traceId,...typeof response.rootSpanId=="string"?{rootSpanId:response.rootSpanId}:{},spans:response.spans.map(mapSpan)}}function mapSpan(value){if(!isRecord4(value)||typeof value.spanId!="string")throw new QueryEngineResponseError("Observability API returned an invalid trace span.");if(typeof value.name!="string"||typeof value.durationMs!="number")throw new QueryEngineResponseError("Observability API returned an invalid trace span.");let timestamp2=parseTimestamp(value.timestamp),attributes=isRecord4(value.attributes)?value.attributes:void 0,status6=isRecord4(value.status)?value.status:void 0,statusCode=status6?.code==="ERROR"?1:0,statusMessage=typeof status6?.message=="string"?status6.message:void 0;return{spanId:value.spanId,...typeof value.parentSpanId=="string"&&value.parentSpanId?{parentSpanId:value.parentSpanId}:{},name:value.name,duration:durationTuple(value.durationMs),startTime:timestampTuple(timestamp2),...attributes?{attributes}:{},status:{code:statusCode,...statusMessage?{message:statusMessage}:{}}}}function parseTimestamp(value){if(typeof value!="string")throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");let timestamp2=Date.parse(value);if(!Number.isFinite(timestamp2))throw new QueryEngineResponseError("Observability API returned an invalid trace timestamp.");return timestamp2}function durationTuple(durationMs){let nanoseconds=Math.round(durationMs*1e6);if(!Number.isSafeInteger(nanoseconds)||nanoseconds<0)throw new QueryEngineResponseError("Observability API returned an invalid span duration.");return[Math.floor(nanoseconds/1e9),nanoseconds%1e9]}function timestampTuple(timestampMs){let seconds=Math.floor(timestampMs/1e3);return[seconds,(timestampMs-seconds*1e3)*1e6]}function isRecord4(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var ATTR_HINT_KEYS=["http.url","http.target","db.statement","http.status_code"];function tupleToUs(tuple){if(!tuple||tuple.length!==2)return null;let[seconds,nanoseconds]=tuple;return typeof seconds!="number"||typeof nanoseconds!="number"?null:seconds*1e6+nanoseconds/1e3}function getDurationUs(span){let us=tupleToUs(span.duration);return us===null?null:us<0?0:us}function getStartTimeUs(span){return tupleToUs(span.startTime)}function readAttrString(attributes,key){let value=attributes?.[key];if(typeof value=="string")return value;if(typeof value=="number")return String(value)}function resolveRootSpan(trace3){if(trace3.spans.length!==0){if(trace3.rootSpanId){let match=trace3.spans.find(span=>span.spanId===trace3.rootSpanId);if(match)return match}return trace3.spans[0]}}function compareByStart(a,b){let startA=getStartTimeUs(a),startB=getStartTimeUs(b);return startA===null&&startB===null?0:startA===null?1:startB===null?-1:startA-startB}function analyze(trace3){let root=resolveRootSpan(trace3),rootDurationUs=root?getDurationUs(root):null,rootStartUs=root?getStartTimeUs(root):null,spansById=new Map;for(let span of trace3.spans)spansById.set(span.spanId,span);let childrenByParent=new Map;for(let span of trace3.spans){if(!span.parentSpanId||!spansById.has(span.parentSpanId))continue;let list30=childrenByParent.get(span.parentSpanId);list30?list30.push(span):childrenByParent.set(span.parentSpanId,[span])}for(let list30 of childrenByParent.values())list30.sort(compareByStart);let spanInfo=new Map;for(let span of trace3.spans){let durationUs=getDurationUs(span),children=childrenByParent.get(span.spanId)??[],childTotalUs=0;for(let child of children){let cd=getDurationUs(child);cd!==null&&(childTotalUs+=cd)}let selfTimeUs=durationUs===null?null:Math.max(0,durationUs-childTotalUs),startOffsetUs=null;if(rootStartUs!==null){let startUs=getStartTimeUs(span);startUs!==null&&(startOffsetUs=Math.max(0,startUs-rootStartUs))}spanInfo.set(span.spanId,{span,durationUs,selfTimeUs,startOffsetUs})}let visited=new Set,treeOrder=[],truncatedAtDepth=!1;root&&(truncatedAtDepth=walkTree(root,0,childrenByParent,visited,treeOrder)||truncatedAtDepth);let orphanOrder=[],orphanRoots=trace3.spans.filter(span=>!visited.has(span.spanId)&&(!span.parentSpanId||!spansById.has(span.parentSpanId))).sort(compareByStart);for(let orphan of orphanRoots)truncatedAtDepth=walkTree(orphan,0,childrenByParent,visited,orphanOrder)||truncatedAtDepth;for(let span of trace3.spans)visited.has(span.spanId)||(orphanOrder.push({span,depth:0}),visited.add(span.spanId));let errorSpans=trace3.spans.filter(span=>span.status?.code===1),byName=new Map;for(let span of trace3.spans){let name=span.name||"<unnamed>",durationUs=getDurationUs(span)??0,entry2=byName.get(name);entry2?(entry2.count+=1,entry2.totalUs+=durationUs):byName.set(name,{count:1,totalUs:durationUs})}let repeatedOps=[];for(let[name,{count:count2,totalUs}]of byName)count2>=2&&repeatedOps.push({name,count:count2,totalUs,perCallUs:totalUs/count2});return repeatedOps.sort((a,b)=>b.totalUs-a.totalUs),{trace:trace3,root,rootDurationUs,rootStartUs,spanInfo,treeOrder,orphanOrder,errorSpans,repeatedOps,truncatedAtDepth}}function walkTree(span,depth,childrenByParent,visited,out){if(visited.has(span.spanId))return!1;if(visited.add(span.spanId),depth>=256)return out.push({span,depth}),!0;out.push({span,depth});let truncated=!1,children=childrenByParent.get(span.spanId)??[];for(let child of children)truncated=walkTree(child,depth+1,childrenByParent,visited,out)||truncated;return truncated}var UNKNOWN="<unknown>",UNNAMED="<unnamed>",ATTR_VALUE_MAX_LEN=80,TRACE_ID_MAX_LEN=13;function renderMarkdown(trace3,options){let analysis=analyze(trace3),sections=[];return sections.push(renderHeader(analysis,options)),analysis.errorSpans.length>0&&sections.push(renderErrors(analysis)),analysis.repeatedOps.length>0&&sections.push(renderRepeatedOps(analysis)),sections.push(renderTree(analysis)),`${sections.join(`
1482
1491
 
1483
1492
  `)}
@@ -1490,12 +1499,12 @@ Learn more: ${import_chalk324.default.cyan("https://vercel.com/docs/cli/about-te
1490
1499
  `),0;client.stdout.write(renderMarkdown(trace3,{requestId}));try{let resolved=await resolveDashboardScope({client,scopeFlag,projectName:scope.projectName,linkedProject});if("error"in resolved)output_manager_default.warn(resolved.error);else{let url=buildDashboardUrl({...resolved,traceId:trace3.traceId,view});output_manager_default.log(`View trace: ${url}`)}}catch(err){output_manager_default.print(`${import_chalk326.default.yellow("!")} Failed to resolve the dashboard URL. Use --open to retry.
1491
1500
  `),output_manager_default.debug(String(err))}return output_manager_default.log("Run with --json for full trace data."),0}var import_chalk327=__toESM(require_source(),1);import{z as z8}from"zod";var import_ms44=__toESM(require_ms(),1);import{z as z7}from"zod";var DEFAULT_LIMIT5=100,MAX_LIMIT6=1e3,SPAN_EVENT="vercel.span",SPAN_SELECT=["span","resource"],QUERY_REASON2="cli/traces-search",SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z7.iso.datetime({offset:!0}),timeInputSchema=z7.union([isoDateTimeSchema,z7.iso.date()]),TIME_FORMAT_HINT="Use a duration with units such as 100ms or 30m, an ISO timestamp, or YYYY-MM-DD at midnight UTC.",CONTINUATION_CONFLICTS2=["--project","--environment","--service","--name","--kind","--status","--deployment-id","--request-id","--trace-id","--span-id","--root","--since","--until","--query"];async function resolveSpanSearchScope(client,project){if(project!==void 0){let scope2=await resolveConfigScope(client,{project});return"exitCode"in scope2?scope2:{ownerId:scope2.teamId,projectIds:[scope2.projectId]}}let scope;try{scope=await getScope(client,{resolveLocalScope:!0})}catch(error){return{exitCode:handleTracingApiError(client,error)}}return scope.isCrossTeamRepo&&!scope.localOrgId&&!scope.explicitScopeProvided&&(!scope.app||scope.user)?{exitCode:invalidArguments(client,"This repository has projects across multiple teams. Pass `--scope <team>` or run from a linked project directory.")}:scope.team?{ownerId:scope.team.id}:{exitCode:invalidArguments(client,"A team scope is required. Pass `--scope <team>` or run `vercel switch <team>`.")}}function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms44.default)(value);if(duration!==void 0&&(duration<=0||!/[a-z]/i.test(value))||duration===void 0&&!timeInputSchema.safeParse(value).success)return null;let date=new Date(duration===void 0?value:now-duration);return Number.isFinite(date.getTime())?date:null}catch{return null}}function buildFilter(flags,spanKind){let clauses=["NOT (service.name:vercel.* AND span.kind:1)"],query=flags["--query"];typeof query=="string"&&clauses.push(`(${query.trim()})`),spanKind!==void 0&&clauses.push(`span.kind:${spanKind}`),flags["--root"]&&clauses.push("span.isRoot:1");let filters=[["--environment","environment"],["--service","service.name"],["--name","span.name"],["--status","span.status.code"],["--deployment-id","deployment.id"],["--request-id","request.id"],["--trace-id","trace.id"],["--span-id","span.id"]];for(let[flag,dimension]of filters){let rawValue=flags[flag];if(typeof rawValue!="string")continue;let value=flag==="--status"?{error:"Error",ok:"Ok",unset:"Unset"}[rawValue]:rawValue.trim();clauses.push(`${dimension}:${JSON.stringify(value)}`)}return clauses.join(" AND ")}function trackSpanQueryOptions(flags,telemetry2){telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliOptionService(flags["--service"]),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionKind(flags["--kind"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionDeploymentId(flags["--deployment-id"]),telemetry2.trackCliOptionRequestId(flags["--request-id"]),telemetry2.trackCliOptionTraceId(flags["--trace-id"]),telemetry2.trackCliOptionSpanId(flags["--span-id"]),telemetry2.trackCliFlagRoot(flags["--root"]),telemetry2.trackCliOptionSince(flags["--since"]),telemetry2.trackCliOptionUntil(flags["--until"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionQuery(flags["--query"]),telemetry2.trackCliOptionNext(flags["--next"])}async function resolveSpanQuery(client,flags,telemetry2){let project=flags["--project"],environment=flags["--environment"]?.trim().toLowerCase(),status6=flags["--status"]?.trim().toLowerCase(),query=flags["--query"];if(trackSpanQueryOptions(flags,telemetry2),environment!==void 0&&!["production","preview"].includes(environment))return{exitCode:invalidArguments(client,"`--environment` must be one of: production, preview.")};if(status6!==void 0&&!["error","ok","unset"].includes(status6))return{exitCode:invalidArguments(client,"`--status` must be one of: error, ok, unset.")};for(let flag of["--service","--name","--deployment-id","--request-id","--trace-id","--span-id"])if(flags[flag]!==void 0&&flags[flag]?.trim()==="")return{exitCode:invalidArguments(client,`\`${flag}\` must not be empty.`)};if(query!==void 0&&query.trim()==="")return{exitCode:invalidArguments(client,"`--query` must not be empty.")};let spanKind;if(flags["--kind"]!==void 0){let value=flags["--kind"].trim().toUpperCase();if(spanKind=/^[0-5]$/.test(value)?Number(value):SPAN_KINDS.indexOf(value.replace(/^SPAN_KIND_/,"")),spanKind===-1)return{exitCode:invalidArguments(client,"`--kind` must be one of: UNSPECIFIED (0), INTERNAL (1), SERVER (2), CLIENT (3), PRODUCER (4), CONSUMER (5).")}}let limit=parseSpanLimit(client,flags["--limit"]);if(typeof limit!="number")return limit;let now=Date.now(),start=parseTime(flags["--since"]??"1h",now),end=flags["--until"]!==void 0?parseTime(flags["--until"],now):new Date(now);if(!start)return{exitCode:invalidArguments(client,`Invalid time format for \`--since\`. ${TIME_FORMAT_HINT}`)};if(!end)return{exitCode:invalidArguments(client,`Invalid time format for \`--until\`. ${TIME_FORMAT_HINT}`)};if(start.getTime()>=end.getTime())return{exitCode:invalidArguments(client,"`--since` must be earlier than `--until`.")};if(end.getTime()-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"The requested time range must not exceed 30 days.")};if(now-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"`--since` must be within the last 30 days.")};let scope=await resolveSpanSearchScope(client,project);return"exitCode"in scope?scope:{scope,timeRange:{start:start.toISOString(),end:end.toISOString()},filter:buildFilter({...flags,"--environment":environment,"--status":status6},spanKind),limit}}function parseSpanLimit(client,value){let limitResult=validateIntegerRangeWithDefault(value,{flag:"--limit",min:1,max:MAX_LIMIT6,defaultValue:DEFAULT_LIMIT5});return limitResult.valid?limitResult.value:{exitCode:invalidArguments(client,limitResult.message)}}function isCanonicalTimestamp(value){let date=new Date(value);return Number.isFinite(date.getTime())&&date.toISOString()===value}function resolveSpanContinuation(client,flags,telemetry2){trackSpanQueryOptions(flags,telemetry2);let token2=flags["--next"]?.trim();if(!token2)return{exitCode:invalidArguments(client,"`--next` must not be empty.")};let continuation=decodeContinuation(token2),projectIds=continuation?.projectIds??[];if(!continuation||continuation.event!==SPAN_EVENT||continuation.order!=="desc"||projectIds.length>1||!isCanonicalTimestamp(continuation.timeRange.start)||!isCanonicalTimestamp(continuation.timeRange.end)||continuation.timeRange.start>=continuation.timeRange.end)return{exitCode:invalidArguments(client,`\`--next\` is not a valid cursor. Use the pagination.next value from the summary of a previous ${getCommandName("traces search --json")} run.`)};for(let flag of CONTINUATION_CONFLICTS2)if(flags[flag]!==void 0)return{exitCode:invalidArguments(client,`\`${flag}\` can't be combined with \`--next\`. The cursor keeps the original filters and time window.`)};if(scopeFlagPassed(client.argv)&&client.config.currentTeam!==continuation.ownerId)return{exitCode:invalidArguments(client,"The `--next` cursor belongs to a different team than `--scope`. Remove `--scope` to use the team in the cursor.")};let limit=parseSpanLimit(client,flags["--limit"]);return typeof limit!="number"?limit:{scope:{ownerId:continuation.ownerId,...projectIds.length===1?{projectIds:[projectIds[0]]}:{}},timeRange:continuation.timeRange,filter:continuation.filter??"",limit,startCursor:continuation.cursor}}function spanEventsRequest(query){return{event:SPAN_EVENT,ownerId:query.scope.ownerId,...query.scope.projectIds?{projectIds:query.scope.projectIds}:{},timeRange:query.timeRange,...query.filter?{filter:query.filter}:{},select:SPAN_SELECT,queryReason:QUERY_REASON2,bailOn429:!0}}function spanContinuationToken(query,cursor2){return encodeContinuation({event:SPAN_EVENT,ownerId:query.scope.ownerId,...query.scope.projectIds?{projectIds:query.scope.projectIds}:{},timeRange:query.timeRange,...query.filter?{filter:query.filter}:{},order:"desc",cursor:cursor2})}function addSpanQueryIssueDetails(err){if(isAPIError(err)){let issues=z7.array(z7.object({path:z7.string(),message:z7.string()})).safeParse(err.issues);if(issues.success&&issues.data.length>0){let details=issues.data.map(issue2=>`${issue2.path}: ${issue2.message}`).join(", ");err.serverMessage=`${err.serverMessage}: ${details}`,(err.status===400||err.status===422)&&issues.data.some(issue2=>issue2.path==="filter")&&(err.serverMessage+=". Filter error positions refer to the generated filter, including CLI-added clauses."),err.message=`${err.serverMessage} (${err.status})`}}}var INVALID_RESPONSE_MESSAGE="The Observability API returned an invalid span search response.",spanSchema=z8.object({span:z8.object({startTime:isoDateTimeSchema,traceId:z8.string(),id:z8.string(),parentSpanId:z8.string().nullable(),isRoot:z8.number(),traceState:z8.string(),name:z8.string(),kind:z8.string(),status:z8.object({code:z8.string(),message:z8.string()}),duration:z8.number(),attributes:z8.record(z8.string(),z8.unknown()),events:z8.array(z8.object({name:z8.string(),timestamp:isoDateTimeSchema,attributes:z8.record(z8.string(),z8.unknown())})).optional(),links:z8.array(z8.object({traceId:z8.string(),spanId:z8.string(),traceState:z8.string(),attributes:z8.record(z8.string(),z8.unknown())})).optional()}).passthrough(),resource:z8.object({attributes:z8.record(z8.string(),z8.unknown())})}),spansSchema=z8.array(spanSchema);function formatDuration4(durationMs){if(durationMs===0)return"0ms";if(durationMs<1e-6)return"<1ns";let units=[[1e-6,"ns"],[.001,"\u03BCs"],[1,"ms"],[1e3,"s"],[6e4,"m"],[36e5,"h"],[864e5,"d"]],index=units.length-1;for(;durationMs<units[index][0];)index--;let value=Number((durationMs/units[index][0]).toFixed(1));return index<units.length-1&&value>=Math.round(units[index+1][0]/units[index][0])&&(index++,value=Number((durationMs/units[index][0]).toFixed(1))),`${value}${units[index][1]}`}function cell2(value){return value||"-"}function stringAttribute(attributes,key){let value=attributes[key];return typeof value=="string"?value:null}var spanColumns={"span.startTime":{header:"TIME",format:event=>new Date(event.span.startTime).toISOString()},"span.duration":{header:"DURATION",format:event=>formatDuration4(event.span.duration)},"span.name":{header:"SPAN NAME",format:event=>ellipsis(cell2(event.span.name),60)},"span.status.code":{header:"STATUS",format:event=>event.span.status.code.toUpperCase()==="ERROR"?import_chalk327.default.red("ERROR"):cell2(event.span.status.code.toUpperCase())},"service.name":{header:"SERVICE NAME",format:event=>{let serviceName=stringAttribute(event.resource.attributes,"service.name");return serviceName?.startsWith("vercel.")?`\u25B2 ${serviceName}`:cell2(serviceName)}},environment:{header:"ENVIRONMENT",format:event=>cell2(stringAttribute(event.resource.attributes,"deployment.environment.name"))},"request.id":{header:"REQUEST ID",format:event=>stringAttribute(event.span.attributes,"vercel.request_id")?.split("::").at(-1)||"-"},"trace.id":{header:"TRACE ID",format:event=>cell2(event.span.traceId)},"span.id":{header:"SPAN ID",format:event=>cell2(event.span.id)},"parent.id":{header:"PARENT ID",format:event=>cell2(event.span.parentSpanId)},"span.kind":{header:"SPAN KIND",format:event=>SPAN_KINDS.find((kind,index)=>event.span.kind===String(index)||event.span.kind.toUpperCase()===kind)??cell2(event.span.kind)}};function printSpans(client,spans,columns){if(spans.length===0){client.stdout.write(`No spans found for this period.
1492
1501
  `);return}client.stdout.write(`${table([columns.map(column=>column.header),...spans.map(span=>columns.map(column=>column.format(span)))])}
1493
- `)}async function search2(client,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(searchSubcommand3.options))}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{flags}=parsedArgs,json=!!(flags["--json"]||client.nonInteractive),columnsOption=flags["--columns"];if(telemetry2.trackCliOptionColumns(columnsOption),parsedArgs.args.slice(2).length>0)return trackSpanQueryOptions(flags,telemetry2),invalidArguments(client,`Unexpected argument: ${parsedArgs.args.slice(2)[0]}.`);let columns=Object.values(spanColumns).filter(column=>column!==spanColumns["span.kind"]&&column!==spanColumns["request.id"]&&column!==spanColumns.environment);if(columnsOption!==void 0){if(json)return invalidArguments(client,"`--columns` cannot be combined with `--json` or `--non-interactive`.");let names=columnsOption.split(",").map(name=>name.trim());if(names.some(name=>!Object.hasOwn(spanColumns,name)))return invalidArguments(client,`Invalid column selection. Available columns: ${Object.keys(spanColumns).join(", ")}.`);if(new Set(names).size!==names.length)return invalidArguments(client,"Columns cannot repeat. List each column once.");columns=names.map(name=>spanColumns[name])}let resolved=flags["--next"]!==void 0?resolveSpanContinuation(client,flags,telemetry2):await resolveSpanQuery(client,flags,telemetry2);if("exitCode"in resolved)return resolved.exitCode;let query=resolved,interactionOverride=explicitInteractionOverride(client.argv),nextPageArgs=token2=>["traces search",`--next ${token2}`,...json?["--json"]:[],...interactionOverride?[interactionOverride]:[],...flags["--limit"]!==void 0?[`--limit ${flags["--limit"]}`]:[],...columnsOption!==void 0?[`--columns ${quoteArg(columnsOption)}`]:[]].join(" "),pages=fetchEventPages(client,spanEventsRequest(query),query.limit,query.startCursor),spans=[],excludedIntervals=new Map,received=0,resumeCursor=query.startCursor,result;for(json||output_manager_default.spinner("Searching spans\u2026");;){let page;try{page=await pages.next()}catch(err){return reportFailure2(err)}if(page.done){result=page.value;break}let parsed=spansSchema.safeParse(page.value.events);if(!parsed.success)return reportFailure2(new InvalidEventsResponseError);for(let interval of page.value.excludedIntervals)excludedIntervals.set(`${interval.start}/${interval.end}`,interval);json?client.stdout.write(page.value.events.map(event=>recordLine("span",event)).join("")):spans.push(...parsed.data),received+=page.value.events.length,resumeCursor=page.value.nextCursor??void 0}json||output_manager_default.stopSpinner();let intervals=sortIntervals(excludedIntervals.values()),nextToken=result.nextCursor?spanContinuationToken(query,result.nextCursor):null;if(json)return client.stdout.write(summaryLine({recordsReturned:received,timeRange:query.timeRange,pagination:{hasMore:result.hasMore,next:nextToken},excludedIntervals:intervals})),0;return printSpans(client,spans,columns),intervals.length>0&&output_manager_default.warning("Results omit part of this window: some data is unavailable to this query. Use --json to see the excluded intervals."),result.hasMore&&(output_manager_default.log("More spans matched."),nextToken?output_manager_default.print(`Next page:
1502
+ `)}async function search2(client,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),{...getFlagsSpecification(searchSubcommand3.options),"-j":"--json"})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{flags}=parsedArgs,json=!!(flags["--json"]||client.nonInteractive),columnsOption=flags["--columns"];if(telemetry2.trackCliOptionColumns(columnsOption),parsedArgs.args.slice(2).length>0)return trackSpanQueryOptions(flags,telemetry2),invalidArguments(client,`Unexpected argument: ${parsedArgs.args.slice(2)[0]}.`);let columns=Object.values(spanColumns).filter(column=>column!==spanColumns["span.kind"]&&column!==spanColumns["request.id"]&&column!==spanColumns.environment);if(columnsOption!==void 0){if(json)return invalidArguments(client,"`--columns` cannot be combined with `--json` or `--non-interactive`.");let names=columnsOption.split(",").map(name=>name.trim());if(names.some(name=>!Object.hasOwn(spanColumns,name)))return invalidArguments(client,`Invalid column selection. Available columns: ${Object.keys(spanColumns).join(", ")}.`);if(new Set(names).size!==names.length)return invalidArguments(client,"Columns cannot repeat. List each column once.");columns=names.map(name=>spanColumns[name])}let resolved=flags["--next"]!==void 0?resolveSpanContinuation(client,flags,telemetry2):await resolveSpanQuery(client,flags,telemetry2);if("exitCode"in resolved)return resolved.exitCode;let query=resolved,interactionOverride=explicitInteractionOverride(client.argv),nextPageArgs=token2=>["traces search",`--next ${token2}`,...json?["--json"]:[],...interactionOverride?[interactionOverride]:[],...flags["--limit"]!==void 0?[`--limit ${flags["--limit"]}`]:[],...columnsOption!==void 0?[`--columns ${quoteArg(columnsOption)}`]:[]].join(" "),pages=fetchEventPages(client,spanEventsRequest(query),query.limit,query.startCursor),spans=[],excludedIntervals=new Map,received=0,resumeCursor=query.startCursor,result;for(json||output_manager_default.spinner("Searching spans\u2026");;){let page;try{page=await pages.next()}catch(err){return reportFailure2(err)}if(page.done){result=page.value;break}let parsed=spansSchema.safeParse(page.value.events);if(!parsed.success)return reportFailure2(new InvalidEventsResponseError);for(let interval of page.value.excludedIntervals)excludedIntervals.set(`${interval.start}/${interval.end}`,interval);json?client.stdout.write(page.value.events.map(event=>recordLine("span",event)).join("")):spans.push(...parsed.data),received+=page.value.events.length,resumeCursor=page.value.nextCursor??void 0}json||output_manager_default.stopSpinner();let intervals=sortIntervals(excludedIntervals.values()),nextToken=result.nextCursor?spanContinuationToken(query,result.nextCursor):null;if(json)return client.stdout.write(summaryLine({recordsReturned:received,timeRange:query.timeRange,pagination:{hasMore:result.hasMore,next:nextToken},excludedIntervals:intervals})),0;return printSpans(client,spans,columns),intervals.length>0&&output_manager_default.warning("Results omit part of this window: some data is unavailable to this query. Use --json to see the excluded intervals."),result.hasMore&&(output_manager_default.log("More spans matched."),nextToken?output_manager_default.print(`Next page:
1494
1503
  ${getCommandName(nextPageArgs(nextToken))}
1495
1504
  `):output_manager_default.print(`Narrow the query or increase --limit to see the rest.
1496
1505
  `)),0;function reportFailure2(err){json||output_manager_default.stopSpinner(),err instanceof InvalidEventsResponseError&&(err=new Error(INVALID_RESPONSE_MESSAGE)),addSpanQueryIssueDetails(err),query.startCursor&&received===0&&isAPIError(err)&&err.status===400&&(err.serverMessage=`${err.serverMessage}. The cursor may have expired. Run the search again without --next.`,err.message=`${err.serverMessage} (${err.status})`);let retryToken=received>0&&resumeCursor&&!(err instanceof RecordTooLargeError)?spanContinuationToken(query,resumeCursor):null;if(json&&received>0)return writeJsonError(client,{status:"error",reason:tracingErrorReason(err),message:tracingErrorMessage(err),...isAPIError(err)&&err.status===429?getErrorRecovery(err,client):{},data:progressFor(query,received,retryToken,excludedIntervals),...retryToken?{next:[{command:getCommandNamePlain(nextPageArgs(retryToken)),when:"Retry the failed page"}]}:{}},1);!json&&spans.length>0&&printSpans(client,spans,columns);let exitCode2=handleTracingApiError(client,err);return received>0&&(output_manager_default.error(`Output is incomplete: ${received} spans were printed before the failure.`),retryToken&&output_manager_default.print(`Retry the failed page:
1497
1506
  ${getCommandName(nextPageArgs(retryToken))}
1498
- `)),exitCode2}}function explicitInteractionOverride(argv){let args=argv.slice(2),end=args.indexOf("--");for(let arg2 of end===-1?args:args.slice(0,end)){if(arg2==="--non-interactive=false")return"--non-interactive=false";if(arg2==="--non-interactive"||arg2.startsWith("--non-interactive="))return"--non-interactive"}}function progressFor(query,received,retryToken,excludedIntervals){return{recordsReturned:received,outputIncomplete:!0,timeRange:query.timeRange,pagination:{hasMore:!0,next:retryToken},excludedIntervals:sortIntervals(excludedIntervals.values())}}var COMMAND_CONFIG68={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA2={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG68),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-CIM647OM.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA2[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):(subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"traces get","traces inspect"),get5(client,telemetry2))}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,client.writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function installProductionRelease({version:requested,skipIfCurrent=!1,currentVersion=pkg_default.version,track}={}){let pinned=requested&&requested!=="latest"?requested:void 0,version2=pinned;try{if(output_manager_default.spinner("Checking for updates\u2026",0),pinned){let available=await listAvailableVersions(packageName).catch(()=>{});if(available&&!available.includes(pinned))return output_manager_default.stopSpinner(),output_manager_default.error(`Version ${pinned} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}else version2=await resolveLatestNativeVersion();let target=version2,current=!((track??(await readActivePointer(getInstallRoot()).catch(()=>{}))?.track)==="pr")&&import_semver.default.valid(currentVersion)?currentVersion:void 0;return skipIfCurrent&&current&&import_semver.default.gte(current,target)?(output_manager_default.stopSpinner(),output_manager_default.log(`No upgrade available. Vercel CLI is already up to date (v${current}).`),0):(await installAndActivateProductionVersion(target),output_manager_default.stopSpinner(),!current||import_semver.default.gt(target,current)?output_manager_default.success(`Upgraded Vercel CLI to v${target}.`):(output_manager_default.success(`Vercel CLI v${target} is active.`),import_semver.default.lt(target,current)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
1507
+ `)),exitCode2}}function explicitInteractionOverride(argv){let args=argv.slice(2),end=args.indexOf("--");for(let arg2 of end===-1?args:args.slice(0,end)){if(arg2==="--non-interactive=false")return"--non-interactive=false";if(arg2==="--non-interactive"||arg2.startsWith("--non-interactive="))return"--non-interactive"}}function progressFor(query,received,retryToken,excludedIntervals){return{recordsReturned:received,outputIncomplete:!0,timeRange:query.timeRange,pagination:{hasMore:!0,next:retryToken},excludedIntervals:sortIntervals(excludedIntervals.values())}}var COMMAND_CONFIG68={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA2={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG68),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-JEHKUQMZ.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA2[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):(subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"traces get","traces inspect"),get5(client,telemetry2))}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,client.writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function installProductionRelease({version:requested,skipIfCurrent=!1,currentVersion=pkg_default.version,track}={}){let pinned=requested&&requested!=="latest"?requested:void 0,version2=pinned;try{if(output_manager_default.spinner("Checking for updates\u2026",0),pinned){let available=await listAvailableVersions(packageName).catch(()=>{});if(available&&!available.includes(pinned))return output_manager_default.stopSpinner(),output_manager_default.error(`Version ${pinned} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}else version2=await resolveLatestNativeVersion();let target=version2,current=!((track??(await readActivePointer(getInstallRoot()).catch(()=>{}))?.track)==="pr")&&import_semver.default.valid(currentVersion)?currentVersion:void 0;return skipIfCurrent&&current&&import_semver.default.gte(current,target)?(output_manager_default.stopSpinner(),output_manager_default.log(`No upgrade available. Vercel CLI is already up to date (v${current}).`),0):(await installAndActivateProductionVersion(target),output_manager_default.stopSpinner(),!current||import_semver.default.gt(target,current)?output_manager_default.success(`Upgraded Vercel CLI to v${target}.`):(output_manager_default.success(`Vercel CLI v${target} is active.`),import_semver.default.lt(target,current)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
1499
1508
  ${CURL_INSTALL_COMMAND}`)),0)}catch(error){output_manager_default.stopSpinner();let reason=error instanceof Error?error.message:String(error);return output_manager_default.fatal(version2?`Failed to install Vercel CLI v${version2}: ${reason}`:`Failed to resolve the latest Vercel CLI version: ${reason}`),output_manager_default.log(`To reinstall the CLI manually, run:
1500
1509
  ${CURL_INSTALL_COMMAND}`),1}}var import_semver2=__toESM(require_semver(),1);async function upgrade(client){try{return await runUpgrade(client)}catch(error){return printError(error),1}}async function runUpgrade(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(upgradeCommand.options),telemetry2=new UpgradeTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_semver2.default.valid(targetArg)??void 0:void 0;if(telemetry2.trackCliArgumentVersion(targetArg?targetArg==="latest"?"latest":target?"version":"invalid":void 0),parsedArgs.args.length>2)return output_manager_default.error(`Unexpected argument: "${parsedArgs.args[2]}".`),1;if(targetArg&&!target)return output_manager_default.error(`Invalid version: "${targetArg}". Use a major.minor.patch version or "latest".`),1;let dryRun=parsedArgs.flags["--dry-run"],enableAuto=parsedArgs.flags["--enable-auto"],disableAuto=parsedArgs.flags["--disable-auto"],bypassMinReleaseAge=parsedArgs.flags["--bypass-min-release-age"],disableMinReleaseAgeBypass=parsedArgs.flags["--disable-min-release-age-bypass"],enableBinary=parsedArgs.flags["--enable-binary"],disableBinary=parsedArgs.flags["--disable-binary"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagEnableAuto(enableAuto),telemetry2.trackCliFlagDisableAuto(disableAuto),telemetry2.trackCliFlagBypassMinReleaseAge(bypassMinReleaseAge),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(disableMinReleaseAgeBypass),telemetry2.trackCliFlagEnableBinary(enableBinary),telemetry2.trackCliFlagDisableBinary(disableBinary),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),enableAuto&&disableAuto)return output_manager_default.error("Cannot use --enable-auto and --disable-auto together"),2;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),2;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),2;let hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableBinary||disableBinary||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade flags."),2;let installerManaged=await isCurlInstall();if(installerManaged&&bypassMinReleaseAge&&!hasSettingsOnlyFlag)return output_manager_default.fatal("Can't use `--bypass-min-release-age` with a CLI installed by the Vercel installer. The installer downloads releases directly from the registry and has no minimum release-age setting.\nRun `vc upgrade` without the flag."),1;if(dryRun||asJson){let requestedPreference;disableMinReleaseAgeBypass?requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!1}:enableBinary||disableBinary?requestedPreference={name:"useNativeBinary",label:"native Vercel CLI binary",enabled:!!enableBinary}:enableAuto||disableAuto?requestedPreference={name:"autoUpdatesEnabled",label:"automatic CLI updates",enabled:!!enableAuto}:bypassMinReleaseAge&&(requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!0});let detectedUpdateCommand=hasSettingsOnlyFlag||installerManaged?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,installationType=installerManaged?"installer":await isGlobal()?"global":"local";if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType,...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1501
1510
  `)}else output_manager_default.print(`Current version: ${pkg_default.version}
@@ -1514,7 +1523,8 @@ Learn more: ${import_chalk324.default.cyan("https://vercel.com/docs/cli/about-te
1514
1523
  `):output_manager_default.print(`${context.upgradeError.message}
1515
1524
  `),output_manager_default.print(`Tip: the recommended way to manage the Vercel CLI is the installer: ${CURL_INSTALL_COMMAND}
1516
1525
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1517
- `);return 0}var import_chalk328=__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_chalk328.default.cyan(version2)} ${import_chalk328.default.dim("(current)")}
1526
+ `);return 0}var import_chalk328=__toESM(require_source(),1);var DEFAULT_COUNT=20;async function list29(client,asJson=!1){asJson||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(),asJson)return client.stdout.write(`${JSON.stringify({versions:versions2,currentVersion},null,2)}
1527
+ `),0;if(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_chalk328.default.cyan(version2)} ${import_chalk328.default.dim("(current)")}
1518
1528
  `:`${version2}
1519
1529
  `)}return versions2.length>shown.length&&output_manager_default.print(import_chalk328.default.dim(`\u2026 and ${versions2.length-shown.length} more
1520
1530
  `)),0}var import_chalk329=__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_chalk329.default.dim("(current)")}
@@ -1523,14 +1533,14 @@ Learn more: ${import_chalk324.default.cyan("https://vercel.com/docs/cli/about-te
1523
1533
  `),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]")}`),2}var import_semver4=__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}
1524
1534
  `),context.track==="production"&&context.activeVersion&&import_semver4.default.valid(context.activeVersion)&&import_semver4.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
1525
1535
  `),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
1526
- `),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_CONFIG69={list:getCommandAliases(listSubcommand27),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand11),check:getCommandAliases(checkSubcommand3),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(versionCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand27),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),0):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),0):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),0):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),0):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk330.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1536
+ `),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_CONFIG69={list:getCommandAliases(listSubcommand27),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand11),check:getCommandAliases(checkSubcommand3),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{let argv=client.argv.slice(2),{subcommand:typed}=getSubcommand7(parseArguments(argv,getFlagsSpecification(versionCommand.options),{permissive:!0}).args.slice(1),COMMAND_CONFIG69);parsedArguments=parseArguments(argv,getFlagsSpecification([...versionCommand.options,...typed==="list"?listSubcommand27.options:[]]))}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand27),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29(client,!!parsedArguments.flags["--json"]));case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),0):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),0):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),0):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),0):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk330.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1527
1537
  `),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk335=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils26=__toESM(require_dist(),1);var import_ms45=__toESM(require_ms(),1);import{DateTime}from"luxon";var LA_TIMEZONE="America/Los_Angeles";function toISOOrThrow(dt){if(!dt.isValid)throw new Error(`Invalid DateTime: ${dt.invalidReason}`);let iso=dt.toISO();if(!iso)throw new Error("Failed to convert DateTime to ISO");return iso}function getDefaultFromDateTime(){return DateTime.now().setZone(LA_TIMEZONE).startOf("month")}function getDefaultToDateTime(){return DateTime.utc()}function getDefaultFromDate(){let dt=getDefaultFromDateTime();return toISOOrThrow(dt.toUTC())}function getDefaultToDate(){let dt=getDefaultToDateTime();return toISOOrThrow(dt.toUTC())}function isRelativeTime(input){return(0,import_ms45.default)(input)!==void 0}function parseBillingDate(dateStr,isEndDate=!1){let relativeMs=(0,import_ms45.default)(dateStr);if(relativeMs!==void 0)return new Date(Date.now()-relativeMs).toISOString();if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601 (YYYY-MM-DDTHH:mm:ss), or relative (7d)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601, or relative (7d)`);let finalDateTime=isEndDate?laDateTime.plus({days:1}):laDateTime;return toISOOrThrow(finalDateTime.toUTC())}function getISOWeekNumber(dateStr){let date=new Date(dateStr);date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7));let yearStart=new Date(Date.UTC(date.getUTCFullYear(),0,1));return Math.ceil(((date.getTime()-yearStart.getTime())/864e5+1)/7)}function getISOWeekYear(dateStr){let date=new Date(dateStr);return date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7)),date.getUTCFullYear()}function getPeriodKey(chargePeriodStart,breakdownPeriod){if(!chargePeriodStart)return"Unknown";switch(breakdownPeriod){case"daily":return chargePeriodStart.substring(0,10);case"weekly":{let weekYear=getISOWeekYear(chargePeriodStart),weekNum=getISOWeekNumber(chargePeriodStart);return`${weekYear}-W${weekNum.toString().padStart(2,"0")}`}case"monthly":return chargePeriodStart.substring(0,7);default:return chargePeriodStart.substring(0,10)}}var VALID_BREAKDOWN_PERIODS=["daily","weekly","monthly"];function isValidBreakdownPeriod(value){return value!==void 0&&VALID_BREAKDOWN_PERIODS.includes(value)}var VALID_GROUP_BY_DIMENSIONS=["project","region"];function isValidGroupByDimension(value){return value!==void 0&&VALID_GROUP_BY_DIMENSIONS.includes(value)}var import_chalk332=__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_chalk331=__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_chalk331.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk331.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk331.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk331.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_chalk331.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_chalk332.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk332.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk332.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk332.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_chalk332.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_chalk332.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk332.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_chalk332.default.bold("Estimated total"),import_chalk332.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1528
1538
  `)}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_chalk332.default.bold(subtotalLabel),"",import_chalk332.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk332.default.bold(import_chalk332.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
1529
1539
  ${tablePrint}
1530
1540
  `)}var import_chalk333=__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_chalk333.default.bold(import_chalk333.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_chalk333.default.bold(import_chalk333.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1531
1541
  `)}outputHiddenServicesHint(hiddenCount)}var import_chalk334=__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_chalk334.default.bold(import_chalk334.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_chalk334.default.bold(import_chalk334.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1532
1542
  `)}log(""),log(`${import_chalk334.default.gray("Estimated total:")} ${import_chalk334.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)}
1533
- `)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner,warn}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(fromFlag!==void 0&&parsedArgs.flags["--since"]!==void 0)return error("Pass only one of --since or --from. (--from is deprecated.)"),2;if(toFlag!==void 0&&parsedArgs.flags["--until"]!==void 0)return error("Pass only one of --until or --to. (--to is deprecated.)"),2;fromFlag!==void 0&&warn("`--from` is deprecated, please use `--since` instead"),toFlag!==void 0&&warn("`--to` is deprecated, please use `--until` instead");let sinceFlag=parsedArgs.flags["--since"]??fromFlag,untilFlag=parsedArgs.flags["--until"]??toFlag;if(untilFlag&&!sinceFlag)return error("--until requires --since. Omit both to show the current billing cycle."),2;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),2;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),2;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),2;let sinceDate,untilDate;try{sinceDate=sinceFlag?parseBillingDate(sinceFlag,!1):void 0,untilDate=untilFlag?parseBillingDate(untilFlag,!0):void 0}catch(err){return error(err.message),2}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils26.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!sinceFlag,fromDate=sinceDate??(billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate()),toDate=untilDate??(sinceFlag?new Date().toISOString():billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()),fromDisplay=sinceFlag&&!isRelativeTime(sinceFlag)?sinceFlag:extractDatePortion(fromDate),toDisplay=untilFlag&&!isRelativeTime(untilFlag)?untilFlag:extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk335.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG70={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG70),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-AKUJ4VUV.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-OBNVJRYC.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"vcr add","vcr create"),(await import("./chunks/add-XZJ4G2MM.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-P42IQJDF.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-53YK7N2N.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-5VKAY2R5.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-3T6EUCCK.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-2NBXVOX2.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-YS7EQDJY.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-URNV2ABR.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-43WFISAY.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG70)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms46=__toESM(require_ms(),1),import_chalk336=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk336.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1543
+ `)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner,warn}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(fromFlag!==void 0&&parsedArgs.flags["--since"]!==void 0)return error("Pass only one of --since or --from. (--from is deprecated.)"),2;if(toFlag!==void 0&&parsedArgs.flags["--until"]!==void 0)return error("Pass only one of --until or --to. (--to is deprecated.)"),2;fromFlag!==void 0&&warn("`--from` is deprecated, please use `--since` instead"),toFlag!==void 0&&warn("`--to` is deprecated, please use `--until` instead");let sinceFlag=parsedArgs.flags["--since"]??fromFlag,untilFlag=parsedArgs.flags["--until"]??toFlag;if(untilFlag&&!sinceFlag)return error("--until requires --since. Omit both to show the current billing cycle."),2;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),2;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),2;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),2;let sinceDate,untilDate;try{sinceDate=sinceFlag?parseBillingDate(sinceFlag,!1):void 0,untilDate=untilFlag?parseBillingDate(untilFlag,!0):void 0}catch(err){return error(err.message),2}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils26.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!sinceFlag,fromDate=sinceDate??(billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate()),toDate=untilDate??(sinceFlag?new Date().toISOString():billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()),fromDisplay=sinceFlag&&!isRelativeTime(sinceFlag)?sinceFlag:extractDatePortion(fromDate),toDisplay=untilFlag&&!isRelativeTime(untilFlag)?untilFlag:extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk335.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG70={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG70),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-723HTK5U.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-PV6VVAN6.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"vcr add","vcr create"),(await import("./chunks/add-UPXURHDI.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-W3TVZPSK.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-ZF2F2ZE3.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-SKIDVUB7.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-JOGD3ZEF.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-6O3JAFDA.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-LVP4LVHL.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-NMQWZBTW.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-3ZMQVJAQ.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG70)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms46=__toESM(require_ms(),1),import_chalk336=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk336.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1534
1544
  `)}else output_manager_default.log(`${(0,import_pluralize28.default)("Webhook",webhooks.length,!0)} found under ${import_chalk336.default.bold(contextName)} ${import_chalk336.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
1535
1545
 
1536
1546
  `));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms46.default)(current-webhook.createdAt):"-",eventsDisplay=webhook.events.length>2?`${webhook.events.slice(0,2).join(", ")} +${webhook.events.length-2}`:webhook.events.join(", ");return[webhook.id,webhook.url,eventsDisplay,import_chalk336.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk337=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function get6(client,argv){let telemetry2=new WebhooksGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[webhookId]=args,getStamp=stamp_default();if(!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:getCommandNamePlain("webhooks ls")},{command:getCommandNamePlain("webhooks inspect <id>")}]},2),output_manager_default.error(`${getCommandName("webhooks inspect <id>")} expects one argument`),2;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk337.default.cyan(`${getCommandName("webhooks inspect <id>")}`)}`),2;output_manager_default.debug("Fetching webhook info");let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk337.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)}